본문 바로가기

책/밑바닥부터 시작하는 딥러닝

4장 신경망 학습 (1)

앞 장에서 퍼셉트론과 달리 신경망은 데이터로부터 매개변수를 스스로 학습할 수 있는 능력이 있다고 했다.

 

손실 함수

근데 학습을 하려면 뭔가 기준이 있어야 한다. 마치 우리가 공부를 하고 시험을 친 뒤 시험 성적을 가지고 잘했네, 못했네를 판가름하는 것 처럼. 손실 함수가 시험 역할을 하는 것이다. 신경망이 학습을 하고 손실 함수를 지표로 삼아 학습을 잘했는지, 못했는지 판가름할 수 있다.

 

Sum of Squares for Error, 오차제곱합

$y_k$는 출력 $t_k$는 정답 레이블, k는 데이터의 차원수를 나타낸다.

y = np.array([0.1, 0.2, 0.3, 0.4])
t = np.array([0, 0, 0, 1])

y는 소프트맥스의 출력이고 t는 원-핫 인코딩이다. y가 인덱스 3일 확률이 가장 높다고 추정했고 실제로 정답도 3이다.

이에 대한 오차제곱합을 구해보자

def sse(y, t):
    return 0.5 * np.sum((y-t)**2)

print(sse(y, t))

0.25

이번엔 정답 레이블은 그대로이고 인덱스 0일 확률이 가장 높다고 추정해보자.

 

y = np.array([0.4, 0.2, 0.3, 0.1])
t = np.array([0, 0, 0, 1])

print(sse(y, t))

0.55

잘못된 예측을 하니까 손실 함수의 값이 커졌다. 즉, 첫 번째 경우가 오차가 더 작으니 정답에 더 가까울 것으로 판단할 수 있다.

 

Cross Entropy Error, 교차 엔트로피 오차

$y = log(x)$을 생각해보자 x값이 양의 무한대에서 0으로 가까워 질수록 y의 값이 음의 무한대에 가까워진다. 교차 엔트로피는 이 특성을 이용한것인데 잘못된 예측을 한 것에 대해서 오차제곱합보다 더 큰 벌을 가할 수 있다.

예를 들어보자

def cee(y, t):
    delta = 1e-7
    return -np.sum(t * np.log(y + delta))

y = np.array([0.01, 0.2, 0.3, 0.49])
t = np.array([0, 0, 0, 1])

print(cee(y, t))

0.713349683795853

제대로된 예측을 한 경우

y = np.array([0.49, 0.2, 0.3, 0.01])
t = np.array([0, 0, 0, 1])

print(cee(y, t))

4.605160186038091

잘못된 예측을 한 경우

 

미니배치와 정답 레이블이 원-핫이 아닌 경우를 고려한 교차 엔트로피 오차 구현은 다음과 같다.

def cross_entropy_error(y, t):
    if y.ndim == 1:
        t = t.reshape(1, t.size)
        y = y.reshape(1, y.size)
    
    # t가 원-핫 벡터라면 정답 레이블의 인덱스로 반환
    if t.size == y.size:
        t = t.argmax(axis=1)
    
    batch_size = y.shape[0]
    return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / batch_size

경사 하강법

손실 함수를 최소로 하는 매개변수(가중치, 편향)을 찾는 것이 신경망 학습의 목적이다. 

 

예를 들어, 손실 함수가 $f(x) = x^2$라고 생각해보자. x가 신경망에서는 가중치를 의미한다고 보면된다. 그리고 현재 x의 값은 2이다. 그러므로 현재 x(가중치)에 대한 손실함수의 gradient는 4가 된다.

 

손실 함수가 최소가 되려면 x = 0이 되어야 한다. 신경망은 x = 2에서 x = 0으로 학습하기 위해 gradient를 사용한다. 즉, $df/dx$을 이용한다.

 

$df/dx = 2x$이므로 x = 2인 지점에서 gradient는 4이다. 여기다가 마이너스를 곱해주어 -4로 만들어준다(이유는 뒤에 나옴). 이 스칼라 값에 방향이 있다고 생각하고 4는 2차원 평면에서 오른쪽 -4는 왼쪽을 가리킨다. 즉, gradient를 통해서 우리는 손실 함수가 최소가 되는 방향이 -4가 가리키는 방향인 왼쪽이라고 알 수 있다.

 

방향은 알았는데 얼만큼 움직이지? 이때 사용하는 것이 learning rate이다. 수식으로 나타내면 다음과 같다.

이 수식을 다음과 같이 이해하면 좋다. $x = x + (-{\eta}{df/dx})$

마이너스를 곱해서 방향을 맞춰준 후 기존의 x값에 더해서 x를 갱신한다고 생각하면된다. 그리고 에타가 learning rate을 나타내고 얼만큼 움직일지 결정한다.

 

신경망에서는 x를 가중치 행렬로 생각하면 되고 특별히 다를 것이 없다.

' > 밑바닥부터 시작하는 딥러닝' 카테고리의 다른 글

5장 오차역전파법 (2)  (0) 2023.09.19
5장 오차역전파법 (1)  (0) 2023.09.19
4장 신경망 학습 (2)  (0) 2023.09.14
3장 신경망  (0) 2023.09.13
2장 퍼셉트론  (0) 2023.09.13