이제 우리가 만든 "신경망"이 직접 학습을 하도록 만들어야한다. 그렇다면 신경망이 스스로 올바른 답을 찾아 나갈 수 있어야한다. 그 기준이 무엇일까? 그리고 올바른 방향은 어떻게 정해야할까?
-손실함수
위에서 말한 것과 같이 신경망에게는 기준이 필요하다. 그 지표로 사용하는 것이 바로 손실함수이다. 학습을 다시 말하면 손실함수의 값을 최소로 만드는 과정인 것이다. 아래는 가장 많이 사용하는 손실함수들이다.
1. Mean Square Error (평균 제곱 오차)
MSE는 단순하게 실제값과 출력값의 오차 제곱의 평균을 계산하는 방법이다. 직관적으로도 손실함수라고 이해가 될 것 같다. 공식과 구현은 아래와 같다.


2. Cross Entropy Error (교차 엔트로피 오차)
교차 엔트로피 오차는 log함수를 사용한다. 0~1 사이의 확률을 기반으로 한다고 이해하면 된다. log 함수는 0~1의 범위에서 음수이기 때문에 앞에 마이너스 부호를 붙인다. 또한 log 앞에 곱하는 정답에 해당하는 확률이 one-hot 인코딩 되어있기에, 오답인 경우(0을 곱하는 경우)는 손실값에 아무런 영향을 미치지 않는다는 것을 알 수 있다. 즉, 정답인 경우(1을 곱하는 경우)의 출력값의 확률값만이 손실 값에 영향을 미친다.


아래와 같이 배치 처리도 가능하다.

-왜 손실함수인가?
그렇다면 왜 손실함수를 지표로 사용하는지 궁금해질 수 있다. 신경망 학습은 각 층의 최적의 가중치를 찾아내며 이루어져야한다. 어떤 방식이든 이 목표만 달성할 수 있으면 된다. 만약 우리가 정확도를 지표로 삼으면 어떤 일이 일어날까.
이전에 활성화 함수 중 계단함수를 사용하지 않는 이유를 보았을 것이다. 미분을 통해 가중치를 업데이트 할 때 적절한 역할을 하지 못했고 연속적이지 못한 특성 때문에 한 순간만 변화를 일으켰기 때문이었다.
마찬가지로 정확도를 지표로 삼으면, 매개변수 값을 조정할 때 연속적으로 변하는 것이 아니라 32% -> 33% -> 34% 등 갑자기 변화가 일어날 것이다. 어떻게 생각하면 미소한 매개변수의 변화에 반응하지 못하는 둔한 특성을 가지게 되는 것이다. 이런 이유에서 적절하지 못하다는 것을 알 수 있다.
반면에 손실함수를 사용한다면 매개변수가 연속적으로 변화할 때, 손실함수도 이에 맞게 변화하고 미세한 변화에도 반응할 수 있기에 손실함수를 지표로 이용하는 것이다.
-수치 미분
손실함수를 최소로 만들기 위해서는 매개변수 각각의 변화가 손실함수에 미치는 영향을 알아야한다. 이것을 가능하게 해주는 것이 바로 미분이다. 즉, 가중치에 대한 손실함수의 변화율을 구하는 것이다. 이를 코드로 구현하기 위해서는 "차분"의 개념을 이용해야하며 편미분의 개념을 이해하면 된다. 차분은 예전 미적을 배울 때 "미적의 정의" 라고 배웠던 부분을 기억하면 될 것이다. 미세한 변화가 이뤄질 때 함숫값의 차를 그 미세한 변화로 나누면 된다. 접선의 기울기로도 이해가 된다.

코드로 구현할 때는 반올림 오차에 주의해야하므로 미세한 변화(델타x 혹은 h 라고 표기함)의 값을 대략 1e-4로 잡는다. 또한 기존에 구하던 차분 방식은 전방차분으로 x 값이 충분히 작지 않은 경우에는 오차가 존재할 수 있다. 따라서 중앙 차분을 이용해서 그 오차를 최대한으로 줄여준다.


편미분은 여러 변수가 존재할 때 하나의 변수로만 미분을 진행하고 나머지는 상수로 취급하는 미분을 의미한다. 이것을 코드로 구현하면 아래와 같다. ( 예시: y = x1 ^2 + x2 ^ 2 의 편미분 )

손실함수에서도 이렇게 가중치에 대해서 미분을 진행하며 0인 부분을 찾아 나갈 것이다. 하지만 이것은 최솟값이라는 보장은 없다. 극솟값일 수도 있고, 평평한 곳으로 파곧르면서 학습이 되지 않는 정체기일 수도 있다. 입력 데이터와 그때 그때 상황으 잘 이해하며 학습을 진행해야 할 것이다.
-경사법
이제 정말로 손실함수와 그 미분을 사용하여 가중치를 업데이트 해주어야 한다. 이때 최적화 방법으로 사용할 수 있는 것이 경사법이다 (뒤에서 다른 최적화 방법을 다룬다). 경사법에는 경사 상승법과 경사 하강법이 있는데 여기서는 손실함수의 최솟값을 찾는 과정이므로 경사 하강법을 이용한다.

공식은 위와 같다.
상수인 에타는 학습률을 의마한다. 학습률이 너무 커지면 탐색하는 폭이 커지면서 최솟값을 찾지 못하고 발산해 버리는 경우가 생길 수 있다. 또한 학습률이 너무 작아져도 느린 속도로 인해 최솟값에 도달하지 못하는 경우가 생길 수 있으니, 적절한 학습률로 시작하여 조금씩 조절해가야 할 것이다.
경사 하강법에서는 x자리에 가중치 값이 들어가고 f함수 자리에는 손실함수가 들어가면 된다. 즉 손실함수의 가중치에 대한 미분값이 음수인 경우는 가중치가 더 커져야 미분값이 0에 가까워질 것이다. 만약 미분값이 양수인 경우는 가중치가 더 작아져야 미분값이 0에 가까워질 것이다. 따라서 마이너스 부호를 붙였다고 생각하면 된다.
우리의 목표는 손실함수를 최소로 하는 것이라는 것을 기억하자!
'딥러닝 > 밑바닥부터 시작하는 딥러닝1' 카테고리의 다른 글
| [밑바닥부터 시작하는 딥러닝1] Ch6.가중치의 초깃값 (2) | 2024.05.06 |
|---|---|
| [밑바닥부터 시작하는 딥러닝1] Ch6.최적화 방법 (3) | 2024.05.06 |
| [밑바닥부터 시작하는 딥러닝1] Ch3.신경망 (1) | 2024.04.28 |
| [밑바닥부터 시작하는 딥러닝1] Ch2.퍼셉트론 (2) | 2024.04.28 |