본문 바로가기

딥러닝

7. 손실함수 Loss function

이 포스트는 Do it 딥러닝 교과서 (윤성진 저)를 참고하여 만들어졌음!

 

 

  • 신경망 모델은 관측 데이터를 잘 설명하는 함수를 표현해야 한다.
  • 모델이 표현하는 함수의 형태를 결정하는 것이 loss function이다.
  • loss function은 모델이 관측 데이터를 잘 표현하도록 정의해야 한다.
  • 손실함수는 모델이 Error minimization이 되도록 정의하거나
  • 모델이 추정하는 관측 데이터의 확률이 최대화 되도록 maximum likelihood estimation (MLE) 방식으로 정의한다.

 

 

 

Error minimization에서의 Loss function 정의

신경망 모델의 파라미터를 $\vec{\theta}$로 두고 데이터를 $D={(\vec{x}_i, t_i): i=1, \cdots, N}$로 둔다. 이때 모델의 예측값을 $y(\vec{x}_i); \vec{\theta})$, target을 $t_i$로 두면 오차 $\epsilon_i$는 다음과 같이 표현된다.

$$\epsilon_i = t_i-y(\vec{x}_i; \vec{\theta})$$

 

오차는 절댓값으로 표현할 수 있으므로 $y(\vec{x}_i; \vec{\theta})-t_i=\epsilon_i$로 표현하여 noise = output-target으로 이해할 수 있다. 따라서 이 오차 $\epsilon_i$을 최소화하기 위한 관점에서의 loss function은 $\epsilon_i$의 크기를 포함하는 함수로 정의할 수 있다. 일반적으로 오차의 크기를 $L_1, L_2$ norm을 이용하여 정의하며, 이것을 MAE(mean absolute error)와 MSE(mean squared error)라고 한다.

 

 

 

 

MSE(mean squared error)

평균제곱오차(MSE)는 $N$개의 데이터에 대해 $L_2$ norm 제곱의 평균이며 $l_2$ loss라고 부른다.

$$J(\vec{\theta})=\frac{1}{N}\sum_{i=1}^{N}||t_i - y(x; \vec{\theta}) ||_2^2 $$

 

위 식에서 알 수 있듯이 MSE는 모든 데이터의 오차 $||t_i-y(x_i; \vec{\theta})||$의 제곱의 평균으로 구해진다. 제곱항때문에 오차가 크면 클수록 loss가 더 커지므로, 큰 오차에 대해 더 큰 패널티를 부과한다고 볼 수 있다. 하지만 데이터에 간혹 존재하는 이상치 때문에 loss가 급격히 커질 수 있다는 약점이 존재한다.

 

 

MAE(mean absolute error)

평균절대오차(MAE)는 $N$개의 데이터에 대해 $L_1$ norm 평균이며 $l_1$ loss라고 부른다.

$$J(\vec{\theta})=\frac{1}{N}\sum_{i=1}^{N}||t_i - y(x_i; \vec{\theta})||_1 $$

 

MAE는 제곱이 들어가지 않기 때문에 이상치가 껴도 loss가 크게 증가하지 않는다는 장점이 있다. 하지만 MAE는 절댓값 함수로써 미분이 불가능한 (drastic한) 지점이 한 포인트 이상 있기 때문에 미분이 불가능하다는 단점이 존재한다. (역전파를 수행하려면 loss function에 대하여 미분을 수행하여야 하기 때문이다. 따라서 미분 불가능점을 기준으로 구간을 나누어 미분을 처리해야 하므로 연산이 복잡해진다.) 

 

 

 

Error minimization optimization

예를들어 MSE를 사용하는 경우 optimization 문제는 다음과 같이 정의된다.

 

$$\vec{\theta}^*=\underset{\vec{\theta}}{\text{argmin}} \; J(\vec{\theta}) = \underset{\vec{\theta}}{\text{argmin}} \; \frac{1}{N}\sum_{i=1}^{N}||t_i-y(x_i; \vec{\theta})||_2^2 $$

 

즉, loss function $J(\vec{\theta})$를 최소화하는 weights $\vec{\theta}$를 찾아가는 과정이 optimization이다.

 

 

 

 

 

 

Maximum likelihood estimation에서의 loss function 정의

위에서와 마찬가지로 신경망 모델의 파라미터는 $\vec{\theta}$이고 주어진 데이터가 $D={(\vec{x}_i, t_i):i=1, \cdots, N}$이며 각 데이터 $(\vec{x}_i, t_i)$가 IID라고 할 때 신경망 모델이 추정한 관측 데이터의 확률은 likelihood $p(D|\vec{\theta})$로 주어진다. 모델이 추정한 확률분포가 입력 데이터의 분포를 얼마나 잘 표현할 수 있는지를 의미한다. 이때 가지고있는 데이터가 서로 IID를 만족한다면 전체 데이터에 대한 likelihood는 전체 $N$개 데이터의 likelihood의 곱으로 표현한다.

 

$$\text{likelihood} = p(D|\vec{\theta}) = \Pi_{i=1}^{N}p(t_i|\vec{x}_i;\vec{\theta}) $$

 

likelihood 식 $p(t_i | \vec{x}_i; \vec{\theta}) $를 보면 입력 데이터 $\vec{x}_i$가 주어졌을 때 모델의 파라미터 $\vec{\theta}$를 이용하여 target $t_i$를 맞출 확률을 의미한다. 쉽게 말해서 모델이 입력 데이터 $\vec{x_i}$에 대응하는 target $t_i$를 얼마나 잘 맞출 수 있는지를 의미한다.

 

 

 

 

Maximum likelihood estimation optimization

MLE 관점에서의 loss를 최적화하는 식은 다음과 같이 쓸 수 있다.

 

$$\vec{\theta}^* = \underset{\vec{\theta}}{\text{argmax}} \; p(D|\vec{\theta}) = \underset{\vec{\theta}}{\text{argmax}} \; \Pi_{i=1}^{N} p(t_i | \vec{x}_i ; \vec{\theta}) $$

 

likelihood를 최대화하는 모델의 weights $\vec{\theta}$를 찾는 것이 optimization 과정이 된다.

 

 

 

우리는 이 MLE를 바로 사용하지 않는다. 이걸 loss function으로 사용하기엔 $\Pi$항이 포함되어 수치연산이 복잡하다. 따라서 $\Pi$를 $\sum$으로 교체하기 위해 $\log$를 취한다.

 

 

 

 

MLE에 log 취하기

위에서 다룬 MLE에 log를 취하면 다음 식을 얻는다.

 

$$J(\vec{\theta}) = \log p(D|\vec{\theta}) = \log \Pi^{N}_{i=1} p(t_i | \vec{x}_i ; \vec{\theta}) = \sum_{i=1}^{N} \log p(t_i | \vec{x}_i; \vec{\theta}) $$

 

예를들어 확률분포 $p$가 Gaussian 혹은 Bernoulli 분포를 사용하는 경우 exponential 형태로 표현되는데 이것에 log를 취하면 지수가 사라지므로 연산과 해석면에서 크게 편리해진다. 또한 likelihood는 확률으로 [0,1] 범위에서 표현되는 작은 값인데, 이를 $N$번 곱하였을 때 $N$이 크다면 아주 작은 소수값이 되어 underflow가 쉽게 발생할 수 있다. 하지만 log를 취하여 곱이 아닌 합연산을 수행하면 underflow가 발생하지 않는다.

 

더하여 log는 증가함수이므로 log 취하더라도 목적함수의 최적해는 달라지지 않는다. 따라서 log를 취하면 최적해를 찾는 데 어떤 영향도 주지 않으면서 계산, 해석을 편리하게 해준다.

 

 

 

MLE에 log 취하고 - 붙이기

log likelihood에 -를 취하면 NLL(negative log likelihood)를 얻는다.

 

$$\text{NLL}(\vec{\theta}) = - \log p (D|\vec{\theta}) = - \sum_{i=1}^{N}\log p(t_i|\vec{x}_i ; \vec{\theta}) $$

 

-를 취했으므로 maximization에서 minimization으로 문제의 목적이 바뀐다.

 

$$\vec{\theta}^* = \underset{\vec{\theta}}{\text{argmin}}\; -\sum_{i=1}^{N} \log p(t_i|\vec{x}_i; \vec{\theta}) $$

 

 

 

 

 

회귀문제의 MLE loss function

회귀문제는 Gaussian distribution을 따라 도출되는 noise $\epsilon$을 포함한다는 것을 지난 포스트에서 다루었다. 따라서 likelihood $p(\cdot)$이 Gaussian distribution을 따라 정의되며 다음과 같이 표현된다.

 

$$\begin{align} p(t_i | \vec{x}_i; \vec{\theta}) &= \mathcal{N}(t_i | y(\vec{x}_i ; \vec{\theta}), \beta^{-1}) \\ & = \frac{1}{\sqrt{\beta^{-1} 2\pi}} e^{-\frac{(t_i-y(\vec{x}_i ; \vec{\theta}))^2}{2\beta^{-1}}} \end{align} $$

 

 

우리는 전체 $N$개 데이터의 likelihood를 전부 곱한 것($\Pi_{i=1}^{N}p(t_i|\vec{x}_i ; \vec{\theta})$)에 log, -를 취하여 loss function으로 사용하기로 했다. 따라서 loss function은 다음과 같이 정의된다.

 

$$\begin{align} J(\vec{\theta}) &= -\log\Pi_{i=1}^{N} p(t_i | \vec{x}_i; \vec{\theta}) \\ &= -\log \Pi_{i=1}^{N} \frac{1}{\sqrt{\beta^{-1}2\pi}} e^{-\frac{(t_i-y(\vec{x}_i ; \vec{\theta}))^2}{2\beta^{-1}}} \\ &=-\sum_{i=1}^{N} \log \frac{1}{\sqrt{\beta^{-1}2\pi}} e^{-\frac{(t_i-y(\vec{x}_i ; \vec{\theta}))^2}{2\beta^{-1}}} \\ &= \frac{\beta}{2}\sum_{i=1}^{N} (t_i - y(\vec{x}_i; \vec{\theta}))^2 + \frac{N}{2} \log \beta^{-1}2\pi \\ &= \frac{\beta}{2}\sum_{i=1}^{N} ||t_i-y(\vec{x}_i;\vec{\theta}) ||_2^2 + \text{const} \end{align}$$

 

 

위 식에서 $\beta=2$로 놓고 $\text{const}$를 무시하면 다음과 같은 오차제곱합을 얻는다.

 

$$J(\vec{\theta}) = \sum_{i=1}^{N}||t_i-y(\vec{x}_i ; \vec{\theta}) ||_2^2 $$

 

위 식에 $\frac{1}{N}$를 곱하면 Error minimization에서 봤던 MSE와 동일해진다. 어떤 loss function에 상수배를 곱해도 최적해는 여전히 동일하므로 likelihood를 최대화하는 것과 error를 최소화하는 것은 결국 같은 최적해를 찾는다는 것을 알 수 있다.

 

 

 

 

이진분류에서의 MLE loss function

이진분류에서는 확률분포로 베르누이 분포를 사용한다. 따라서 likelihood $p(t_i|\vec{x}_i; \vec{\theta})$는 $\mu(\vec{x}_i; \vec{\theta})$로 둘 수 있으며 이는 다음과 같이 표현된다.

 

$$\begin{align} p(t_i|\vec{x}_i ; \vec{\theta}) &= \mathcal{B}\text{ern}(t_i; \mu(\vec{x}_i; \vec{\theta})) \\ &=\mu(\vec{x}_i ; \vec{\theta})^{t_i}(1-\mu(\vec{x}_i ; \vec{\theta}))^{1-t_i},\; t_i \in {0, 1} \end{align}$$

 

이 likelihood를 이용하여 MLE loss function을 구하면 다음과 같다.

 

$$\begin{align} J(\vec{\theta}) &= -\log \Pi_{i=1}^{N} p(t_i|\vec{x}_i ; \vec{\theta}) \\ &= -\log \Pi_{i=1}^{N}\mu(\vec{x}_i ; \vec{\theta})^{t_i}(1-\mu(\vec{x}_i ; \vec{\theta}))^{1-t_i} \\ &= -\sum_{i=1}^{N} \log \mu(\vec{x}_i ; \vec{\theta})^{t_i}(1-\mu(\vec{x}_i ; \vec{\theta}))^{1-t_i} \\ &= -\sum_{i=1}^{N}t_i \cdot \log \mu(\vec{x}_i ; \vec{\theta}) + (1-t_i) \cdot \log (1-\mu(\vec{x}_i ; \vec{\theta})) \end{align} $$

 

일반적으로 위 식에 $\frac{1}{N}$을 곱하여 최종적으로 다음 식을 loss function으로 사용한다.

 

$$J(\vec{\theta}) = -\frac{1}{N}\sum_{i=1}^{N}t_i \cdot \log \mu(\vec{x}_i ; \vec{\theta}) + (1-t_i) \cdot \log (1-\mu(\vec{x}_i ; \vec{\theta})) $$

 

$\frac{1}{N}$을 곱하여 loss의 평균을 사용하면 loss값이 작아져 안정된 값을 사용할 수 있다는 장점을 가진다. 또한 위 식의 $\mu(\vec{x}_i; \vec{\theta})$는 위에서 언급한 것 처럼 모델이 class 1이라고 예측할 확률을 의미한다.

 

 

 

 

 

다중분류에서의 MLE loss function

다중분류 문제에서의 likelihood는 다음과 같이 정의된다.

 

$$\begin{align} &p(\vec{t}_i | \vec{x}_i ; \vec{\theta}) = \text{Category}(\vec{t}_i;\mu(\vec{x}_i ; \vec{\theta})) = \Pi_{k=1}^{K} \mu(\vec{x}_i ; \vec{\theta})^{t_{ik}}_k  \end{align} $$

 

$$\begin{align} &p(\vec{t}_i | \vec{x}_i; \vec{\theta}) = \text{Category}(\vec{t}_i; \mu(\vec{x}_i); \vec{\theta})=\Pi_{k=1}^{K} \mu(\vec{x}_i;\vec{\theta})^{t_{ik}}_{k}  \\ &\mu(\vec{x}_i ; \vec{\theta})=(\mu(\vec{x}_i; \vec{\theta})_1, \mu(\vec{x}_i; \vec{\theta})_2, \cdots, \mu(\vec{x}_i ; \vec{\theta})_K)^T, \; \sum_{k=1}^{K}\mu(\vec{x}_i; \vec{\theta})_k=1 \\ &\vec{t}_i =(t_{i1}, t_{t2}, \cdots, t_{iK})^T, \; t_{ik }= \begin{cases} 1, & k=i \\ 0, &  k\neq i \end{cases} \;, i \in {1,2, \cdots, K} \end{align}$$

 

 

  • $k$ = class number, $1~K$
  • $\mu(\vec{x}_i ; \vec{\theta})_k$ = 예측값으로 $k$번째 class가 도출될 확률

 

 

그냥 식만 보면 굉장히 난해하므로 눈이 6개인 주사위 굴리기를 예시로 들어본다. 주사위의 눈이 1 ($i=1$)이 나올 확률은 다음과 같이 쓸 수 있다.

$$\Pi_{k=1}^{6} \mu(\vec{x}_1 ; \vec{\theta})^{t_{1k}}_{k} $$

 

이때 $\mu(\vec{x}_i ; \vec{\theta})_k$는 모델이 $k$번째 class라고 예측할 확률을 의미한다. 따라서 해당 모델이 추측한 '주사위 눈이 1이 나올 확률'은 $\mu(\vec{x}_i; \vec{\theta})_1$ 된다.

 

더하여 우리가 확률을 구하고싶은 사건은 $i=1$인 사건이므로 $t_{11}$을 만족하는 경우 즉, $k=1$인 경우에만 확률을 얻어온다.

 

$$\begin{align} \Pi_{k=1}^{6} \mu(\vec{x}_i ; \vec{\theta})^{t_{1k}}_k &= \mu(\vec{x}_1; \vec{\theta})^{t_{11}}_1 + \mu(\vec{x}_1; \vec{\theta})^{t_{12}}_2, \cdots, \\ &= \mu(\vec{x}_1; \vec{\theta})_1 +0+0+0... \end{align}$$

 

 

 

위 Likelihood에 log와 -를 취한 음의 로그 우도를 유도하고 이를 loss function으로 사용한다.

 

$$\begin{align} J(\vec{\theta}) &= -\log \Pi_{i=1}^{N} p(t_i|\vec{x}_i ; \vec{\theta}) \\ & = -\log \Pi_{i=1}^{N}\Pi_{k=1}^{K} \mu(\vec{x}_i ; \vec{\theta})^{t_{ik}}_k \\ &= -\sum_{i=1}^{N} \log \Pi_{k=1}^{K} \mu(\vec{x}_i ; \vec{\theta})^{t_{ik}}_k \\ &= - \sum_{i=1}^{N}\sum_{k=1}^{K} t_{ik} \cdot  \log \mu(\vec{x}_i;\vec{\theta})_k \end{align}$$

 

 

이 loss function을 cross entropy loss라고 부르며 최적화에 사용할 때는 sample 개수인 $N$으로 나누어 샘플에 대한 평균 loss를 사용하기도 한다. 이 경우 loss 값이 작아지므로 수치적으로 안정화 될 수 있다.

 

$$J(\vec{\theta}) = -\frac{1}{N} \sum_{i=1}^{N}\sum_{k=1}^{K}t_{ik} \cdot \log \mu(\vec{x}_i ; \vec{\theta})_k $$

 

 

 

 

정리

 

회귀 (가우시안 분포) $\rightarrow$ 평균제곱오차 : $J(\vec{\theta}) = \frac{1}{N} \sum_{i=1}^{N} ||t_i - y(\vec{x}_i ; \vec{\theta})||_2^2$

 

분류 (카테고리 분포) $\rightarrow$ 크로스 엔트로피 : $J(\vec{\theta}) = -\frac{1}{N} \sum_{i=1}^{N}\sum_{k=1}^{K} t_{ik} \cdot \log \mu(\vec{x}_i ; \vec{\theta})_k$