for textmining

딥러닝 모델의 손실함수

|

이번 글에서는 딥러닝 모델의 손실함수에 대해 살펴보도록 하겠습니다. 이 글은 Ian Goodfellow 등이 집필한 Deep Learning Book과 위키피디아, 그리고 하용호 님의 자료를 참고해 제 나름대로 정리했음을 먼저 밝힙니다. 그럼 시작하겠습니다.

Why negative log-likelihood?

딥러닝 모델의 손실함수로 음의 로그우도(negative log-likelihood)가 쓰입니다. 어떤 이유에서일까요?

확률론적 접근

딥러닝 모델을 학습시키기 위해 최대우도추정(Maximum Likelihood Estimation) 기법을 씁니다. 주어진 데이터만으로 미지의 최적 모델 파라메터 $θ$를 찾아야 합니다. 입력값 $X$와 파라메터 $θ$가 주어졌을 때 정답 $Y$가 나타날 확률, 즉 우도 $P(Y$|$X;θ)$를 최대화하는 $θ$가 바로 우리가 찾고 싶은 결과라고 보면 되겠습니다.

그런데 학습데이터 각각의 우도를 스케일해도 전체 argmax의 결과는 바뀌지 않으므로 ‘우도의 곱을 최대’로 만드는 $θ$와 ‘로그우도의 기대값, 즉 $Σ_xP(y$|$x)\log{P(y}$|$x;θ)$를 최대’로 하는 $θ$는 같습니다. 이와 관련해 Deep Learning Book 128페이지에는 다음과 같이 설명돼 있습니다.

The argmax does not change when we rescale the cost function, we can divide by the total number of data to obtain a version of the criterion that is expressed as an expectation with respect to the empirical distribution $P_{data}$ defined by the training data.

다범주 분류를 학습하는 딥러닝 모델의 경우 말단에 다음과 같이 소프트맥스 함수가 적용됩니다. ($f(x)$는 소프트맥스 계층의 입력값)

\[P({ y }_{ i }|{ x }_{ i };\theta )=\frac { \exp \left\{ f\left( { x }_{ i } \right) \right\} }{ \sum _{ j }^{ }{ \exp\left\{ f\left( { x }_{ j } \right) \right\} } }\]

위 식에서 $f$는 범주 수만큼의 차원을 갖는 벡터로써 unnormalized log probabilities에 해당합니다. 소프트맥스 함수가 취해짐으로써 그 요소의 합이 1이 됩니다. 정답 인덱스에 해당하는 $f$의 요소값을 높인다는 말은 우도를 높인다(=입력값 $X$를 넣었을 때 $Y$ 관련 스코어를 높인다)는 의미로 해석할 수 있습니다.

정보이론의 접근

두 확률분포 $p$와 $q$ 사이의 차이를 계산하는 데에는 크로스 엔트로피(cross entropy)라는 함수가 사용됩니다. 식은 $-Σp(x)\log{q(x)}$입니다. 여기에서 $p$를 우리가 가진 데이터의 분포 $P(Y$|$X)$, $q$를 모델이 예측한 결과의 분포 $P(Y$|$X;θ)$로 두겠습니다. 이렇게 되면 크로스 엔트로피는 파라메터 $θ$ 하에서의 음의 로그우도의 기대값이라고 해석할 수 있습니다. 따라서 $-Σ_xP(y$|$x)\log{P(y}$|$x;θ)$를 최소화하는 $θ$가 바로 우리가 찾고 싶은 모델이 됩니다.

요컨대 우도의 곱이 최대인 모델을 찾는 것은 로그우도의 기대값이 최대인 모델을 찾는 것과 같으며, 이는 또한 학습데이터의 분포(distribution)와 모델이 예측한 결과의 분포 사이의 차이, 즉 크로스 엔트로피를 최소화하는 것과 동치입니다. 이 때문에 음의 로그우도가 딥러닝 모델의 손실함수가 되는 것입니다. 정보이론과 관련 자세한 내용은 이곳을 참고하시면 좋을 것 같습니다.

크로스엔트로피 계산 예시

음의 로그우도를 계산하는 예시와 관련 크로스 엔트로피로 설명해 보겠습니다. 우선 딥러닝 모델의 입력값으로 쓰이는 관측치는 이산변수(discrete variable)에 해당하므로 크로스 엔트로피 $H(P,Q)$의 식을 다시 쓰면 다음과 같습니다.

\[H\left( P,Q \right) =-\sum _{ x }^{ }{ P({ x })\log { Q({ x }) } }\]

예컨대 범주가 2개이고 정답 레이블이 $[1,0]$인 관측치 $x$가 있다고 칩시다. $P$는 우리가 가지고 있는 데이터의 분포를 나타내므로 첫번째 범주일 확률이 1, 두번째 범주일 확률은 0이라고 해석할 수 있습니다. $Q$는 $P$에 근사하도록 만들고 싶은, 딥러닝 학습 대상 분포(모델이 예측하는 분포)입니다. 그런데 모델 학습이 잘 안돼서 $Q$가 $[0,1]^T$로 나왔다고 하면 loss는 다음과 같이 무한대로 치솟게 됩니다.

\[-P(x)\log { Q(x) } =-\begin{bmatrix} 1 & 0 \end{bmatrix}\begin{bmatrix} \log { 0 } \\ \log { 1 } \end{bmatrix}=-\left( -\infty +0 \right) =\infty\]

이번엔 학습이 잘 돼서 모델이 정답과 일치하는 $[1,0]$을 예측했다고 하면 loss는 다음과 같이 0이 됩니다.

\[-P(x)\log { Q(x) } =-\begin{bmatrix} 1 & 0 \end{bmatrix}\begin{bmatrix} \log { 1 } \\ \log { 0 } \end{bmatrix}=-\left( 0+0 \right) =0\]

단 여기에서 $0\log{0}$은 0으로 취급합니다.

negative log-likelihood 장점

손실함수로 음의 로그우도을 쓸 경우 몇 가지 이점이 생긴다고 합니다. 우선 우리가 만드려는 모델에 다양한 확률분포를 가정할 수 있게 돼 유연하게 대응할 수 있게 됩니다. 음의 로그우도로 딥러닝 모델의 손실을 정의하면 이는 곧 두 확률분포 사이의 차이를 재는 함수인 크로스 엔트로피가 되며, 크로스 엔트로피는 비교 대상 확률분포의 종류를 특정하지 않기 때문입니다. 이와 관련 Deep Learning Book 129페이지는 이렇게 서술돼 있습니다.

Any loss consisting of a negative log-likelihood is a cross entropy between the empirical distribution defined by the training set and the probability distribution defined by model.

예컨대 우리가 만들고 싶은 모델을 가우시안 분포로 전제한다면, 크로스 엔트로피 최소화는 우리가 가진 데이터의 분포와 모델의 가우시안 분포 사이의 차이를 최소화한다는 의미입니다. 특히 가우시안 분포를 가정할 때 크로스 엔트로피의 최소화는 평균제곱오차(Mean Squared Error)의 최소화와 본질적으로 동일합니다. 이와 관련해 이곳을 참고하시면 좋을 것 같습니다.

아울러 모델을 베르누이 분포로 가정한다면 우리가 가진 데이터의 분포와 모델의 베르누이 분포 간 차이가 최소화하는 방향으로 학습이 이뤄집니다. 이는 다항분포 또한 마찬가지입니다.

한편 딥러닝 모델의 최종 출력을 어떤 숫자 하나(예컨대 영화 관객 수)로 둘 경우 우리가 구축하려는 모델이 정규분포라고 가정하는 것과 깊은 관련을 맺고 있습니다. 최종 출력이 O, X로 이뤄진 이진변수(binary variable)일 경우 모델을 베르누이 분포로 가정하는 것과 사실상 유사합니다. 다범주 분류를 하는 딥러닝 모델은 다항분포를 가정하는 것과 비슷합니다.

위 세 종류 모델의 최종 output node는 각각 Linear unit, Sigmoid unit, Softmax unit이 되며, output node의 출력 분포와 우리가 가진 데이터의 분포 사이의 차이가 곧 크로스 엔트로피가 됩니다. 이 차이만큼을 loss로 보고 이 loss에 대한 그래디언트를 구해 이를 역전파하는 과정이 딥러닝의 학습이 되겠습니다. 바꿔 말하면 각각의 확률분포에 맞는 손실을 따로 정의할 필요가 없이 음의 로그우도만 써도 되고, output node의 종류만 바꾸면 세 개의 확률분포에 대응할 수 있게 된다는 이야기입니다. 매우 편리한 점이죠.

세 종류 간 구분은 다음 그림과 같습니다(출처 : 하용호 님의 자료) 다시 말씀드리지만 셋 모두 손실함수로 음의 로그우도, 즉 크로스 엔트로피를 쓰면 됩니다.

크로스 엔트로피를 쓰면 딥러닝 역전파시 그래디언트가 죽는 문제를 어느 정도 해결할 수 있고, 그래디언트를 구하는 과정 역시 비교적 간단하다고 합니다. 우리가 구축하는 모델을 다항분포라고 두고, 최종 output node는 3차원짜리 벡터를 입력으로 받는 소프트맥스, loss는 크로스 엔트로피인 경우를 그림으로 도식화하면 다음과 같습니다.

Softmax-with-Loss 노드는 $a$를 입력으로 받아서 소프트맥스를 취해 확률값으로 만든 뒤 이를 바탕으로 크로스 엔트로피 Loss $L$을 출력합니다. 반대로 역전파하는 그래디언트는 $y_k-t_k$가 됩니다. 예컨대 정답이 $t_3$이라면 역전파되는 그래디언트는 각각 $y_1, y_2, y_3-1$로 간단하게 구할 수 있습니다. 뿐만 아니라 정답이 아닌 노드의 손실에 대한 그래디언트는 소프트맥스 확률값이고, 정답 레이블에 해당하는 노드의 그래디언트는 여기에서 1을 빼준 값이기 때문에 그래디언트가 완전히 0으로 되는 경우는 많지 않으리라고 기대할 수 있습니다.



Comments