[딥러닝] 딥러닝 기초(2) 성능함수란

업데이트:

딥러닝 기초(2) 성능함수

참고링크

머신러닝 딥러닝 선형대수 기초통계 최적화
k-means 신경망이란 고유값,고유벡터 확률변수 컨벡스 셋
k-최근접이웃 성능함수 행렬식 확률분포 컨벡스 함수
선형회귀 신경망 학습 내적 모집단과 표본 라그랑주 듀얼
로지스틱회귀 교차연결 기저 평균과 분산 KKT 조건
릿지,라쏘회귀 합성곱 신경망 랭크, 차원 공분산, 상관계수 ROC 커브
의사결정나무 배치, 에포크 차이 선형변환 최대가능도추정 크로스 밸리데이션
서포트벡터머신 텐서플로기초(1) 직교행렬 베르누이,이항분포 실루엣 스코어
원클래스 SVM 텐서플로기초(2) 고유값분해 기하,음이항분포  
LDA seq2seq 특이값분해 초기하분포  
GMM opencv기초   포아송분포  
부스팅 resnet   정규분포  
사이킷런 실습 다각형내부판별   감마분포  
  엣지판별   지수분포  
      카이제곱분포  
      베타분포  
      균일분포  



신경망이 하는 일

뉴런의 집합, 즉 신경망이 하는 일은 무엇을까요? 아래 그림처럼 가운데 뉴런으로 가득찬 두개골이 있다고 합시다. 수많은 자극들이 두개골로가면 임계치와 가중치를 이용해 결과값을 출력합니다.

즉 신경망을 학습시킬 때 우리가 할 수 있는 것은 가중치와 임계치를 조절해 우리가 원하는 값을 구하는 것입니다. 즉, 신경망은 근사값의 함수라고 할 수 있습니다.

\[\vec{z} = f(\vec{x}, \vec{w}, \vec{T})\]

위의 식이 신경망의 결과값 벡터 ${vec}$에 대한 함수인데요. 함수 $f$를 보시면 $x$벡터는 인풋이니 주어진 값이고, 우리가 조절할 수 있는 부분은 가중치 벡터 $w$와 임계값 $T$입니다.

위 식을 보시면 우리가 얼마나 잘 하고 있는지를 알 수 있습니다. 바로 목표값 벡터(desire vector)와 신경망의 결과값을 비교함으로써 가능합니다. 비교하는 방법은 성능함수를 만들어 측정할 수 있는데요. 성능함수는 목표값과 결과값에의해 결정됩니다.

성능함수

성능함수를 만드는 방법은 여러가지가 있는데요.

위 그림에서 가장 먼저 생각할 수 있는 케이스는 (a)입니다. 바로 목표값과 결과값의 차이의 norm인데요. 물론 이 성능함수는 0에 가까울 수록 좋습니다. 0에 가깝다는건 목표값과 결과값의 차이가 거의 없다는 뜻이니까요. 하지만 (a)식에는 단점이 있습니다. 바로 0에서 미분이 되지 않는 것인데요. 이는 수학적 계산을 불편하게 합니다. 그래서 나온 방법이 (b)입니다. (a)에 제곱을 한 꼴인데요. 그러면 그래프가 스무스해집니다. (b)처럼 되면 0에서도 미분이 가능합니다. 하지만 (b)에서는 함수의 최소값이 성능의 최대가 됩니다. 음…이왕이면 함수의 최대값이 성능의 최대가 되는게 더 이해하기 쉽지 않을까요? 그렇게해서 나온것이 (c)입니다.

언덕 오르기 문제

다시 한 번 강조하면, 우리의 목적은 가중치와 임계치를 조절해서 성능을 최대화 하는 것입니다. 따라서 아래 그림처럼 등고선 지도가 있다고 합시다. 이 지도는 성능에 대한 $w_1, w_2$ 그래프가 인데요. 초기값 $x$에 대해 성능을 최대화시키는, 즉, 등고선의 중앙으로 이동시켜야합니다. 이는 언덕오르기 문제라고 볼 수 있습니다. 참고로 이방법은 연속적인 공간에서만 성립 가능합니다.

$x$근처의 화살표는 이동가능한 방향인데요. 우리가 움직이고 싶은건 분홍색 화살표 방향이겠죠. 모든 방향에 대해 전부 계산하는건 오래 걸리니 편미분을 이용하겠습니다. 즉, $\partial{\mathcal{P}}/\partial{w_1}$은 $w_1$방향으로 조금 움직였을 때 성능에 얼마나 효과가 있는지 알려줍니다. 마찬가지로 $\partial{\mathcal{P}}/\partial{w_2}$는 $w_2$방향으로 조금 움직였을 때 성능에 얼마나 효과가 있는지 알려줍니다. 만약 $\partial{\mathcal{P}}/\partial{w_2} > \partial{\mathcal{P}}/\partial{w_1}$라면 오른쪽($w_1$)방향으로 움직여야겠지요. 왜냐하면 성능함수는 작을수록 좋기 때문입니다.

이를 하나의 식으로 나타내면 위의 식과 같습니다. 위 식에서 저희는 속도상수 r을 조정함으로써 성능을 향상시킬 수 있습니다.

임계치 위치 문제 해결

이번 포스팅에서는 신경망을 사용하는데있어, 몇가지 해결해야하는 문제점들을 다뤄보겠습니다. 앞에서 임계치는 t라고 했습니다. 이 임계치를 넘느냐 마느냐로 결과값이 달라지는데요. 아래 그림에서보시면 임계치 기준이 t인데요. 그런데 만약 0이 임계치이면 좀 더 편하지 않을까요?

그래서 우리는 임계치를 t가 아닌 0으로 조정하기 위해 $w_{0}^{*}$를 도입했습니다. 아래 그림처럼 입력값 -1에 대해 가중치 $w_{0}=t$라고 합시다. 그러면 $w_{0}t$는 $-1\times t$이므로 $-t$가 됩니다. 이렇게 하면 인풋변수들의 영향력을 모두 더했을 때 0이 넘어가면 폭발합니다. 이렇게 임계치는 0이 되었고, 임계치 문제는 해결되었습니다.

임계치 곡선 문제 해결

이번에는 임계치 곡선 문제를 해결해보겠습니다. 사실 현재는 임계치 곡선을 계단함수(step function)로 사용하고 있는데요. 이 계단함수의 문제점은 수학적으로 계산하기 어려운 부분이 있습니다.

\[\vec{z}\textprime = f\textprime(\vec{x}, \vec{w})\]

성능함수의 변화정도를 알기위해서는 미분을 해야하는데 계단함수는 미분이 안되는 부분이 있죠. 따라서 스무스한 형태가 선호됩니다. 아래 그림에서 (a)가 아닌 (b)의 형태가 좋겠네요.

그래서 도입된 것이 아래의 시그모이드 함수입니다.

\[\frac{1}{1+e^{-\alpha}}\]

이렇게 임계치 곡선 문제도 해결되었습니다. 앞으로는 계단함수 대신 시그모이드 함수를 사용하도록하겠습니다.

3편으로 이동