Posts 딥 러닝 - 5. 학습(1) 손실이란?
Post
Cancel

딥 러닝 - 5. 학습(1) 손실이란?

개요

이제 본격적으로 ‘러닝’에 들어갈 시간이다. MLP 구조의 신경망이 어떻게 스스로 학습하는지, 즉 어떻게 적절한 가중치를 찾아나가는지 알아본다. 오늘은 그 중 첫번째로, 손실이라는 개념에 대해서 집중적으로 알아본다.

손실?

신경망을 학습시키는 과정에서 우리는 훈련용 샘플과 모델의 결과값을 비교하게 된다. 이때 단순히 비교하는 것이 아니라 특정한 함수를 사용하는데, 이것을 손실 함수 (Loss function)이라고 하고 손실 함수의 함수값을 손실이라고 칭하는 것이다.

준비물

우선, 우리가 설계한 신경망 모델이 우리가 목표로 하는 기능을 표현할 수 있는 구조를 가지고 있다고 하자. 예를 들어, XOR 게이트를 구현하고자 하는데 단일 퍼셉트론으로 구성한 모델은 우리가 목표로 하는 기능을 표현할 수 있는 구조가 아니다.

다음으로, 모델을 학습시키기 위해서 입력-출력 간의 데이터 샘플이 필요하다.

\[(X_1, d_1), (X_2, d_2), ... , (X_N, d_N)\]

이때 d는 Desired output을 의미한다. 목표로 하는 함수가 g(x)라고 할 때, 다음의 관계를 가진다.

\[g(X_n) = d_n\]

손실 함수 정의하기

우리는 적절한 구조를 가진 신경망 모델의 가중치를 변경시켜서, 최종적으로 우리가 원하는 함수를 높은 정확도로 구현하고자 한다.

이때, 가중치를 변경시키는 과정이 바로 학습이다.

그렇다면 가중치를 어떻게 변경시켜야 하는 것인가? 우리가 목표로 하는 함수 g(X)와 신경망의 결과물 f(X; W)의 차이가 최대한 적으면 된다. 다시 말해서, 우리 모델의 결과물과 가지고 있는 데이터가 비슷하면 된다.

\[\hat{W} = \arg \min_W \int_X div(f(X; W), g(X))P(X) dX \\ = \arg \min_W E[div(f(X; W), g(X))]\]

수식으로 나타내면 위와 같다. div()는 두 함수 간의 차이를 의미하고, P(X)는 X의 확률 분포, E[]는 기대값을 의미한다. 이걸 다시 한번 말로 풀어 쓰면 아래와 같다.

최적의 가중치란 신경망 결과값과 데이터 결과값 간 차이의 기대값이 최소화될떄의 가중치이다.

그런데… 기대값을 계산하기 위해서는 적분이 필요하다. 적분을 하기 위해서는 ‘모든’ 구간에 대한 데이터가 필요하다. 문제는 우리가 일부 샘플만 가지고 있다는 사실이다!

\[E[div(f(X; W), g(X))] \approx \frac{1}{N} \sum_{i=1}^N div(f(X_i; W), d_i)= Loss(W)\]

그래서 위와 같이 가지고 있는 데이터 샘플을 이용해서 비교한 후 그 평균값을 사용한다. 이것을 Loss(W), 손실 함수라고 칭한다. 손실 함수의 값, 즉 손실이 작을수록 우리가 원하는 함수에 가까이 다가갔다고 볼 수 있다.

\[\hat{W} = \arg \min_W Loss(W)\]

이 손실 함수를 최소화하는 W가 바로 최적의 가중치 W이다.

다양한 손실 함수

앞서 우리는 div(f(X; W), d_i)를 단순히 함수 출력값과 정답 사이의 차이라고 하고 넘어갔는데, 이를 정의하는 것 역시 다양한 방법이 있다.

Mean Absolute Error

\[div(Y, d) = \sum_i|y_i - d_i|\]

f(X; W) = Y로 이해하면 되겠다. 두 값 간의 차이를 구해서, 그 절대값을 이용한다. 왜냐면 오차가 음수일 수는 없으니까!

Mean Squared Error

\[div(Y, d) = \frac{1}{2}\sum_i(y_i - d_i)^2\]

두 값의 차이를 제곱한 결과를 합한 뒤, 반으로 나눈다. 반으로 나누는 것은 큰 의미가 있는 것은 아니고, 이 함수를 미분했을 때 제곱 부분이 내려오기 때문에 이를 상쇄하는 효과를 내기 위함이다.

1
2
3
# t = target value => d와 같음
def mean_squared_error(y,t):
    return 0.5 * np.sum((y-t)**2)

Cross Entropy Error

\[div(Y, d) = -\sum_i d_i log\,y_i\]

교차 엔트로피 함수라고 하는데, 주로 분류 문제에 사용된다.

수식을 코드로 나타내면 아래와 같다.

1
2
3
4
5
def cross_entropy_error(y,t):
    # log 0 = -inf인데, 
    # 이를 막기 위해서 작은 delta를 더한 값을 계산해줌
    delta = 1e-7
    return -np.sum(t*np.log(y+delta))

이외에도 다양한 손실 함수가 있지만, 위의 두가지가 가장 기본이라고 볼 수 있다.

그래서 학습시키는 방법은?

아까 정의한 대로, 가중치 W를 조절해서 손실 함수를 줄이면 된다! 물론 그렇게 간단하지는 않지만, 앞으로 천천히 알아나가 보겠다.

힌트: 이 손실 함수는 미분 가능하다. 그러고 보면 Activation fuction도 미분 가능하다. 어떤 의미가 있을까?!

Reference

This post is licensed under CC BY 4.0 by the author.

논문 정리 - Juila Hirschberg, Advances in natural language processing, 2015

미분

Loading comments from Disqus ...