4장. 신경망 학습

2022. 6. 12. 01:52TIL💡/AI

주제

학습이란?

훈련 데이터로부터 가중치 매개변수의 최적값을 자동으로 획득하는 것

 

이번 장에서는 신경망이 학습할 수 있도록 해주는 지표인 손실 함수(loss function)를 소개한다.

이 손실 함수의 결괏값을 가장 작게 만드는 가중치 매개 변수를 찾는 것이 학습의 목표이다.

이번 장에서는 손실 함수의 값을 가급적 작게 만드는 기법으로, 함수의 기울기를 활용하는 경사법을 소개한다.

 

 

기계학습은 데이터가 생명이다. 기계학습에서는 사람의 개입을 최소화하고 수집한 데이터로부터 패턴을 찾으려 시도한다.

기계학습 문제는 데이터를 훈련 데이터와 시험 데이터로 나눠 학습과 실험을 수행하는 것이 일반적이다. 우선 훈련 데이터만 사용하여 학습하면서 최적의 매개변수를 찾는다. 그런 다음 시험 데이터를 사용하여 앞서 훈련한 모델의 실력을 평가한다.

 

그러면 왜 훈련 데이터와 시험 데이터를 나눠야 할까? 그것은 우리가 원하는 것은 범용적으로 사용할 수 있는 모델이기 때문이다.

이 범용 능력을 제대로 평가하기 위해 훈련 데이터와 시험 데이터를 분리한다.

 

데이터셋 하나로만 매개변수의 학습과 평가를 수행하면 올바른 평가가 될 수 없다.

수중의 데이터셋은 제대로 맞히더라도 다른 데이터셋에는 엉망인 일도 벌어진다.

참고로 한 데이터셋에만 지나치게 최적화된 상태오버피팅(overfitting)이라고 한다. 오버피팅 피하기는 기계학습의 중요한 과제이다.

 

그렇다면 신경망의 능력은 어떻게 평가하는가? 신경망은 손실함수(loss funcion)을 기준으로 최적의 매개변수 값을 탐색한다. 이 손실함수는 임의의 함수를 사용할 수도 있지만 일반적으로는 오차제곱합교차 엔트로피 오차를 사용한다.

 

오차제곱합

가장 많이 쓰이는 손실 함수는 오차제곱합(sum of squares for error)이다.

 

$E = \frac{1}{2}\sum_k{(y_k - t_k)^2}$

 

$y_k$ : 신경망의 출력(신경망이 추정한 값)

$t_k$ : 정답 레이블

$k$ : 데이터의 차원 수

 

 

교차 엔트로피 오차

또 다른 손실 함수로서 교차 엔트로피 오차도 자주 이용한다. 교차 엔트로피 오차의 수식은 다음과 같다.

$E = -\sum_k{t_klogy_k}$

 

 

log는 밑이 e인 자연로그($log_e$)이다. $y_k$는 신경망의 출력, $t_k$은 정답 레이블이다.

또 $t_k$는 정답에 해당하는 인덱스의 원소만 1이고, 나머지는 0이다.(원-핫 인코딩)

그래서 위의 공식은 실질적으로 정답일 때의 추정($t_k$가 1일 때의 $y_k$)의 자연로그를 계산하는 식이 된다.

 

예를 들어 정답 레이블은 2가 정답이라 하고 이 때의 신경망 출력이 0.6이라면 교차 엔트로피 오차는 $-log0.6 = 0.51$이 된다.

이 그림에서 보듯이 $x$가 1일 때 y는 0이 되고 x가 0에 가까워질수록 y의 값은 점점 작아진다.

 

미니 배치 학습

데이터가 $N$개라면 $t_{nk}$는 $n$번째 데이터의 $k$번째 값을 의미한다.

마지막에 N으로 나누어 정규화한다. N으로 나눔으로써 평균 손실 함수를 구한다.

 

그런데 방대한 크기의 데이터를 대상으로 일일이 손실 함수를 계산하는 것은 현실적이지 않다.

이런 경우 데이터 일부를 추려 전체의 '근사치'로 이용할 수 있다. 신경망 학습에서도 훈련 데이터로부터 일부만 골라 학습을 수행한다.

이 일부를 미니배치라고 한다. np.random.choice()함수를 쓰면 훈련 데이터에서 무작위로 꺼낼 수 있다.

 

train_size = x_train.shape[0]
batch_size = 10
batch_mask = np.random.choice(train_size, batch_size)
x_batch = x_train[batch_mask]
t_batch = t_train[batch_mask]

왜 손실 함수를 설정하는가?

정확도라는 지표를 놔두고 손실 함수의 값이라는 우회적인 방법을 택하는 이유는 무엇일까?

 

이 의문은 신경망 학습에서의 '미분'의 역할에 주목한다면 해결된다.

자세한 것은 다음 절에서 설명합니다만, 신경망 학습에서는 최적의 매개변수(가중치와 편향)를 탐색할 때 손실 함수의 값을 가능한 한 작게 하는 매개변수 값을 찾는다. 이때 매개변수의 미분(정확히는 기울기)을 계산하고, 그 미분 값을 단서로 매개변수의 값을 서서히 갱신하는 과정을 반복한다.

 

가령 여기에 가상의 신경망이 있고 그 신경망의 어느 한 가중치 매개변수에 주목한다고 하자.

이때 그 가중치 매개변수의 손실 함수의 미분이란 '가중치 매개변수의 값을 아주 조금 변화시켰을 때, 손실 함수가 어떻게 변하나'라는 의미이다. 만약 이 미분 값이 음수면 그 가중치 매개변수를 양의 방향으로 변화시켜 손실 함수의 값을 줄일 수 있다. 반대로, 미분 값이 양수면 가중치 매개변수를 음의 방향으로 변화시켜 손실 함수의 값을 줄일 수 있다. 그러나 미분 값이 0이면 가중치 매개변수를 어느 쪽으로 움직여도 손실 함수의 값은 줄어들지 않는다. 그래서 가중치 매개변수의 갱신은 거기서 멈춘다.

 

정확도를 지표로 삼아서는 안되는 이유는 미분 값이 대부분의 장소에서 0이 되어 매개변수를 갱신할 수 없기 때문이다.

만약 정확도가 지표였다면 가중치 매개변수의 값을 조금 바꾼다고 해도 정확도는 그대로 32%일 것이다. 즉 매개변수를 약간만 조정해서는 정확도가 개선되지 않고 일정하게 유지된다. 혹, 정확도가 개선된다 하더라도 그 값은 32.0123%와 같은 연속적인 변화보다는 33%나 34%처럼 불연속적인 띄엄띄엄한 값으로 바뀌어버린다.

 

정확도는 매개변수의 미소한 변화에는 거의 반응을 보이지 않고, 반응이 있더라도 그 값이 불연속적으로 갑자기 변화한다.

이는 '계단 함수'를 활성화 함수로 사용하지 않는 이유와도 들어맞는다. 만약 활성화함수로 계단 함수를 사용하면 지금까지 설명한 것과 같은 이유로 신경망 학습이 잘 이뤄지지 않는다. 계단 함수의 미분은 대부분의 장소에서 0이다. 그 결과 계단 함수를 이용하면 손실 함수를 지표로 삼는 게 아무 의미가 없다. 매개 변수의 작은 변화가 주는 파장을 계단 함수가 말살하여 손실 함수의 값에는 아무런 변화가 나타나지 않기 때문이다.

 

계단 함수는 한순간만 변화를 일으키지만, 시그모이드 함수의 미분(접선)은 출력(세로축의 값)이 연속적으로 변하고 곡선의 기울기도 연속적으로 변한다. 즉, 시그모이드 함수의 미분은 어느 장소라도 0이 되지는 않는다. 이는 신경망 학습에서 중요한 성질로, 기울기가 0이 되지 않는 덕분에 신경망이 올바르게 학습할 수 있는 것이다.

 

편미분

변수가 2개일 때 미분을 구할 때는 어느 변수에 대한 미분인지를 구별해야 한다.

덧붙여 이와 가팅 변수가 여럿인 함수에 대한 미분을 편미분이라고 한다. 이 편미분을 수식으로는 $\frac{\sigma f}{\sigma x_0}, \frac{\sigma f}{\sigma x_1}$처럼 쓴다.

 

편미분은 변수가 하나인 미분과 마찬가지로 특정 장소의 기울기를 구한다. 단 여러 변수 중 목표 변수 하나에 초점을 맞추고 다른 변수는 값을 고정한다.

 

기울기

앞에서는 $x_0$와 $x_1$의 편미분을 변수별로 따로 계산했다. 그럼 $x_0$와 $x_1$의 편미분을 동시에 계산하고 싶다면 어떻게 해야할까? 이때 $(\frac{\sigma f}{\sigma x_0}, \frac{\sigma f}{\sigma x_1})$처럼 모든 변수의 편미분을 벡터로 정리한 것을 기울기라고 한다.

기울기가 가리키는 쪽은 각 장소에서 함수의 출력값을 가장 크게 줄이는 방향이다.

 

경사법(경사 하강법)

기계학습 문제 대부분은 학습 단계에서 최적의 매개변수를 찾아낸다.

신경망 역시 최적의 매개변수(가중치와, 편향)을 학습시에 찾아야 한다.

여기에서 최적이란 손실 함수가 최솟값이 될 때의 매개변수 값이다. 그러나 일반적인 문제의 손실 함수는 매우 복잡하다. 매개변수 공간이 광대하여 어디가 최솟값이 되는 곳인지를 짐작할 수 없다. 이런 상황에서 기울기를 잘 이용해 함수의 최솟값(또는 가능한 한 작은 값)을 찾으려는 것이 경사법이다.

 

경사법은 현 위치에서 기울어진 방향으로 일정 거리만큼 이동한다. 그런 다음 이동한 곳에서도 마찬가지로 기울기를 구하고, 또 그 기울어진 방향으로 나아가기를 반복한다. 이렇게 해서 함수의 값을 점차 줄이는 것이 경사법이다. 경사법은 기계학습을 최적화하는 데 흔히 쓰는 방법이다. 특히 신경망 학습에는 경사법을 많이 사용한다.

 

$x_0 = x_0 - \eta \frac{\sigma f}{\sigma x_0}$

$x_1 = x_1 - \eta \frac{\sigma f}{\sigma x_1}$

 

$\eta (eta)$는 갱신하는 양을 나타낸다. 이를 신경망 학습에서는 학습률(learning rate)라고 한다. 한 번의 학습으로 얼마만큼 학습해야 할지, 즉 매개변수 값을 얼마나 갱신하느냐를 정하는 것이 학습률이다.

 

또한 학습률 값은 0.01이나 0.001 등 미리 특정 값으로 정해두어야 한다. 일반적으로 이 값이 너무 크거나 작으면 '좋은 장소'를 찾아갈 수 없다. 신경망 학습에서는 보통 이 학습률 값을 변경하면서 올바르게 학습하고 있는지를 확인하면서 진행한다.

 

학습률 같은 매개변수를 하이퍼파라미터라고 한다. 이는 가중치와 편향 같은 신경망의 매개변수와는 성질이 다른 매개변수이다.
신경망의 가중치 매개변수는 훈련 데이터와 학습 알고리즘에 의해서 '자동'으로 획득되는 매개변수인 반면, 학습률 같은 하이퍼 파라미터는 사람이 직접 설정해야 하는 매개변수인 것이다.
일반적으로는 이 하이퍼 파라미터들은 여러 후보 값 중에서 시험을 통해 가장 잘 학습하는 값을 찾는 과정을 거쳐야 한다.

 

학습 알고리즘 구현하기

🌱 전제

신경망에는 적응 가능한 가중치와 편향이 있고, 이 가중치와 편향을 훈련 데이터에 적응하도록 조정하는 과정을 '학습'이라 한다.

신경망 학습은 다음과 같이 4단계로 수행한다.

 

🌱 1단계 - 미니배치

훈련 데이터 중 일부를 무작위로 가져온다. 이렇게 선별한 데이터를 미니배치라 하며, 그 미니배치의 손실 함수 값을 줄이는 것이 목표이다.

 

🌱 2단계 - 기울기 산출

미니배치의 손실 함수 값을 줄이기 위해 각 가중치 매개변수의 기울기를 구한다. 기울기는 손실 함수의 값을 가장 작게 하는 방향을 제시한다.

 

🌱 3단계 - 매개 변수 갱신

가중치 매개변수를 기울기 방향으로 아주 조금 갱신한다.

 

🌱 4단계 - 반복

1 ~ 3단계를 반복한다.

 

시험 데이터로 평가하기

위와 같은 반복을 거치면서 손실 함수의 값이 서서히 내려가는 것을 확인할 수 있다. 이때의 손실 함수의 값이란, 정확히는 '훈련 데이터의 미니 배치에 대한 손실함수'의 값이다. 훈련 데이터의 손실 함수 값이 작아지는 것은 신경망이 잘 학습하고 있다는 방증이지만, 이 결과만으로는 다른 데이터셋에도 비슷한 실력을 발회할지는 확실하지 않다.

 

신경망 학습에서는 훈련 데이터 외의 데이터를 올바르게 인식하는지를 확인해야 한다.

다른 말로 오버피팅을 일으키지 않는지 확인해야 한다. 오버피팅되었다는 것은, 예를 들어 훈련데이터에 포함된 이미지만 구분하고, 그렇지 않은 이미지는 식별할 수 없다는 뜻이다.

 

신경망 학습의 원래 목표는 범용적인 능력을 익히는 것이다. 범용 능력을 평가하려면 훈련 데이터에 포함되지 않은 데이터를 사용해 평가해봐야 한다. 이를 위해 다음 구현에서는 학습 도중 정기적으로 훈련 데이터와 시험 데이터를 대상으로 정확도를 기록한다.

여기에서는 1에폭별로 훈련 데이터와 시험 데이터에 대한 정확도를 기록한다.

 

에폭(epoch)은 하나의 단위이다. 1에폭은 학습에서 훈련 데이터를 모두 소진했을 때의 횟수에 해당한다.
예컨대 훈련 데이터 10,000개를 100개의 미니배치로 학습할 경우, 확률적 경사 하강법을 100회 반복하면 모든 훈련 데이터를 소진한 게 된다.
이 경우 100회가 1에폭이 된다.

여기 예에서는 1에폭마다 모든 훈련 데이터와 시험 데이터에 대한 정확도를 계산하고, 그 결과를 기록한다.

정확도를 1에폭마다 계산하는 이유는 for문 안에서 매번 계산하기에는 시간이 오래 걸리고, 또 그렇게까지 자주 기록할 필요도 없기 때문이다.

에폭이 진행될수록(학습이 진행될수록) 훈련 데이터와 시험 데이터를 사용하고 평가한 정확도가 모두 좋아지고 있다. 또, 정확도에는 차이가 없음을 알 수 있다. 이를 통해 이번 학습에서는 오버 피팅이 일어나지 않았다.

 

만약 오버피팅이 일어나면 이 모습은 어떻게 달라질까? 훈련이란 훈련 데이터에 대한 정확도를 높이는 방향으로 학습하는 것이니 그 정확도는 에폭을 반복할수록 높아진다. 반면 훈련 데이터에 지나치게 적응하면, 즉 오버피팅되면 훈련 데이터와는 다른 데이터를 보면 잘못된 판단을 하기 시작한다. 어느 순간부터 시험 데이터에 대한 정확도가 점차 떨어지기 시작한다는 뜻이다. 이 순간이 오버피팅이 시작되는 순간이다. 여기서 중요한 인사이트! 이 순간을 포착해 학습을 중단하면 오버피팅을 효과적으로 예방할 수 있다. 이 기법을 조기 종료(early stopping)라 하며, '가중치 감소', '드롭 아웃'과 함께 대표적인 오버피팅 예방법이다.

 

정리

- 기계학습에서 사용하는 데이터셋은 훈련 데이터와 시험 데이터로 나눠 사용한다.

- 훈련 데이터로 학습한 모델의 범용 능력을 시험 데이터로 평가한다.

- 신경망 학습은 손실 함수를 지표로, 손실 함수의 값이 작아지는 방향으로 가중치 매개변수를 갱신한다.

- 가중치 매개변수를 갱신할 때는 가중치 매개변수의 기울기를 이용하고, 기울어진 방향으로 가중치의 값을 갱신하는 작업을 반복한다.

- 아주 작은 값을 주었을 때의 차분으로 미분하는 것을 수치 미분이라고 한다.

- 수치 미분을 이용해 가중치 매개변수의 기울기를 구할 수 있다.

- 수치 미분을 이용한 계산에는 시간이 걸리지만, 그 구현은 간단하다. 한편, 다음 장에서 구현하는 (다소 복잡한) 오차역전파법은 기울기를 고속으로 구할 수 있다.