서론
앞에서 우리는 실제 신경망을 통해서 값을 예측하는 연산인 forward pass를 수행했다. 당연히 랜덤하게 가중치를 설정해서 연산한 값으로 예측이 잘 맞을리 없고, 이제부터 실제 정답과 비교하면서 가중치를 조정해야한다.
상단 그림을 잠깐 설명해보면, 파란색 원은 모델이 예측한 값이고 보라색 네모는 실제 정답이다. 자세히 보면, 보라색의 3번째 값만 1이고 나머지는 다 0인데 즉 정답은 손글씨로 숫자 3으로 적혀져있다고 보면 된다.
하지만 동일한 위치의 파란색 원은 0.4로 1과 비교했을 때 매우 작은 것을 볼 수 있다. 우리가 원하는 건 결국 모델의 가중치 W를 수정해서 0.4 -> 1에 가까워지길 원하는 것이 딥러닝의 목표라고 볼 수 있다. 또한 나머지 파란색 원들의 값(0.1, 0.03, 0.03)들이 모두 0으로 보내야 한다.
Loss Function
앞에서 우리는 0.4와 1을 비교하면서 이 차이를 줄이는 것이 목표라고 했다. 이 차이가 큰 것이 결국 모델에 있어서는 손실이기 때문에 모델에서는 이를 Loss Function이라고 부르며 모든 것이 숫자로 되어 있기 때문에 이것을 수식으로 표현해보자.
각 예측값과 실제 정답값의 차이의 제곱을 더해줬는데, 제곱을 더해준건 계산의 편의성이라고 보면 된다. 결국, 제곱을 하든 다른 값을 하든간에 값의 차이가 사라지진 않기 때문에 Loss Function을 위와 같이 지정해준다.
사실 이 모델에 대해서는 Loss Function을 제곱의 합으로 정의했지만 각 모델의 특성에 따라서 다양한 Loss Function을 사용한다. 이건 다음에 별도의 글에서 다루려고 한다.
최적화 - 경사하강법
이제 우리는 Loss Function을 줄이는 작업을 해야한다.
위쪽 그래프를 loss function이라고 하자. 우리는 y값을 최소화하는 것이기 때문에, x = 0이다. 이 0을 구하는 점은 그래프를 그려서 볼 수도 있지만, dy/dx = 0인 x를 찾으면 된다. dy/dx = 2x이고 이 값이 0이 되려면 x = 0이다.
우리가 만드려는 모델의 loss function이 이렇게 간단하면 매우 좋겠지만, 실제로 대부분의 function은 한번에 이렇게 dy/dx = 0을 찾기 쉽지 않다. 또한 신경망에는 활성화함수(단순 차수 함수가 아닌 e같은 어려운 값들이 섞여있는)도 있기에, 한번에 해를 찾는 것을 어렵다.
그렇다면 우리는 어떻게 빠르게 loss function이 최소가 되는 X로 찾아갈 수 있을까?
우리는 여기서 최적화 기법 중 경사하강법이라는 방법론을 사용한다. 최적화란 어떤 목적 함수가 있을 때, 이 함수를 최대로 하거나 최소로 하는 변수 값을 찾는 방법을 말한다. 경사라고 함은 기울기를 의미하는데 직관적 이해를 위해서 2차 함수를 기준으로 설명을 해보려고 한다.
분홍색 선은 x = 0.5일 때의 기울기이다. dy/dx = 2x이므로, 기울기 값은 "+1" 이다. 반대로 파란색 선은 x = -1일 때의 기울기로 그 값은 "-2"이다.
아까 위에서 loss function이 최소가 되는 x의 값은 0이라고 했다. 그렇다면 x가 0.5일 때는 0.5보다 작은 값으로 가야하고, x가 -1일 때는 -1보다 큰 값으로 가야한다. 위쪽 그래프를 따라 공을 놔둔다고 하면 경사를 따라서 공이 내려간다고 생각하면 편하다.
즉 각자가 가진 현재의 기울기 방향의 반대로 x값을 바꿔서 실험해보고 다시 또 기울기를 측정하고 계속 반복하는 것을 의미한다.
이를 식으로 표현해보면 다음과 같다.
lr = Learning rate의 약자로, 학습률이라고 불린다. 이 값을 우리가 직접 설정해주는 값이고 의미상으로는 기울기 방향으로 얼만큼 이동할지를 지정해준다는 것을 의미한다.
역전파와 연쇄 법칙
위에서 간단하게 한개의 층에 대한 경사하강법을 계산해보았다. 하지만 우리는 layer 갯수가 엄청 많기 때문에 여러개의 가중치에 대해서 경사하강법을 수행하는 작업이 필요하다.
뒷단의 경우에는 쉽게 계산할 수 있지만, W2의 경우에는 풀어서 써보면 굉장히 복잡한 함수로 되어 있다.
이게 2번째 레이어의 값인데 이게 5번째까지 간다고 하면 식이 매우 길어지는 것을 볼 수 있다. 그렇다면 우리는 이를 어떻게 빠르게 계산할 수 있을까? 이 때 미분의 연쇄법칙을 사용할 수 있다.
연쇄법칙이란, 모두 미분가능한 함수이고 함수들이 서로 각각의 입력값으로 이루어진다면 미분을 나눠서 곱셈의 형태로 표현할 수 있다.
이를 활용해서 각 층의 미분 연쇄방식을 정리해보면 아래와 같다.
역전파의 장점은, 이미 미분 함수 자체가 변화하는 것은 아니기 때문에 저장해놓고 여기에 해당하는 x들만 넣어주면 된다.
세부적인 방식은 해당 블로그 링크에 자세히 설명되어 있어서 참고하시면 좋을 것 같다.
요약
이제 모델이 예측하는 프로세스와 실제 가중치가 업데이트되는 전체 프로세스를 정리해보면 아래와 같다.
'Machine Learning > 개념 정리' 카테고리의 다른 글
전체 인공신경망 code 구현하기 (0) | 2023.09.22 |
---|---|
딥러닝 학습 - parameter와 hyper-parameter (1) | 2023.09.18 |
Forward Pass code의 수학적 이해와 code 구현하기 (0) | 2023.09.14 |
Deep Neural Network의 구성요소와 Forward pass (0) | 2023.09.13 |
머신러닝과 딥러닝의 개념적 이해 (0) | 2023.09.12 |