딥러닝 학습의 핵심은 아래와 같다.
- 입력에 따른 모델의 결과와 실제 결과와의 차이를 손실 함수(loss function)로 나타낸다.
- 손실 함수의 최솟값을 찾는 방법을 적절히 이용하여 둘 사이의 오차를 구한다.
- 손실 함수에서 얻은 오차를 편미분을 이용하여 역전파를 이용해 모델의 가중치를 갱신한다.
- 이를 계속적으로 반복한다.
이 순환이 마치 사람이 학습을 하는 것과 비슷하여 학습이라는 단어를 사용한다.
그렇다면 처음부터 차근차근 확인해보자. 딥러닝 모델은 엄연히 비선형 함수다. 함수이기 때문에 아래의 수식을 당연하게도 만족한다. 여기서

하지만 딥러닝 모델의 초기 설정은 누군가가 학습을 시킨 것이 아닌 이상 말 그대로 초깃값으로만 채워져 있다. 즉, 학습되지 않은 인공지능 모델인
그렇다면 처음부터 하나씩 짚어보면서 가자.
1. 손실 함수는 어떤 의미를 갖고 있는가?
우리는 꽤 많은 손실 함수를 알고 있다. 평균 절대 오차(MAE, Mean Absolute Error)라던지, 평균 제곱 오차(MSE, Mean Square Error)라던지, 교차 엔트로피(Cross entropy)라던지 말이다. 하지만 대다수(주로 회귀)의 경우엔 평균 제곱 오차를 쓰는 것이 보편적이다. 실제로 여러 손실 함수의 결과 차이가 크게 없다면 평균 제곱 오차를 쓰는 게 일반적이다.
이 글에서는 평균 제곱 오차에 대해서만 설명하며, 분류 문제와 회귀 문제에서 사용되는 손실 함수는 평균 제곱 오차를 제외하고도 굉장히 많이 있음을 첨언한다.
아래는 평균 제곱 오차의 수식이며,

평균 제곱 오차를 자주 사용하는 이유는 매우 간단한데, 평균 제곱 오차가 손실 함수에 취해주는 제곱이 함수를 볼록(convex)하게 만들어주기 때문이다. 볼록 함수(convex function)의 정의는 아래와 같다. 정의 자체가 볼록한 함수라는 것을 일러주는 것이기에 그림과 함께 찬찬히 살펴보면 된다.

볼록 함수는 유일한 최솟값을 갖는 것이 특징이다. 그렇기에 이때에는 고전적이거나 적당한 경사 하강법을 이용하면 된다.

여기서 경사 하강법(gradient descent rule)은 말 그대로 함수의 경사를 따라 하강하는 것이며, 함수의 최솟값을 gradient를 이용하여 수치적으로 찾아주는 방법이다. 가장 기본적인 경사 하강법은 아래의 식과 같다.
이 식은 손실 함수

하지만 이는 어디까지나 입력

활성화 함수는 말 그대로 해당하는 노드 출력의 활성화와 비활성화에 관여하며, 이를 비선형 함수로 설정하는 이유는 선형적인 결과가 되지 않게 만들기 위함이다. 만일 이 활성화 함수가 선형이라면, 최종 결과마저도 선형적이게 된다. 인공지능은 이 비선형적인 활성화 함수로 인해 내부 해석은 어렵지만 복잡한 데이터에 대한 결과를 잘 내놓게 되었다.
하지만 이에 대한 반대급부로 함수의 가장 작은 값을 구하는 것이 매우 어려워졌다. 기존의 고전적인 방법으로는 매우 복잡한 손실 함수의 최솟값(global minimum)에 도달하질 못하고 극솟값(local minimum)에 멈춰서 빠져나오질 못하게 되었다.
언제나 그랬듯, 석학들은 답을 찾아냈다. 어떻게 답을 찾아냈는지 크게 두 가지 방면으로 확인해보자.
2. 데이터의 크기를 조절한 경사 하강법
데이터의 크기를 적당히 조절해서 경사 하강법의 결과를 좋게 만들 수 있다.
가장 먼저 기본이 되는 경사 하강법은 풀 배치 경사 하강법(full-batch gradient descent rule)이다. 여기서 배치(batch)는 모델의 가중치를 한 번 갱신하기 위해 사용되는 데이터의 묶음으로 이해하면 된다. 풀 배치 경사 하강법은 모든 데이터에 대해 gradient를 계산하여 반영한다. 즉, 매번 값을 갱신할 때마다 모든 데이터에 대해 gradient를 구하는 연산을 수행해야 하며, 당연히 이는 수렴 속도의 저하를 불러온다.
이를 조금 더 개선한 것이 바로 미니 배치 경사 하강법(mini-batch gradient descent rule)이다. 기존의 풀 배치는 너무 많으니 이를 적당히 나눈 서브 데이터셋 덩어리로 쪼개 주는 것이 핵심이다. 여기서 서브 데이터셋의 데이터 크기를 배치 사이즈(batch size)라고 부른다. 즉, 풀 배치는 배치 사이즈가 모든 데이터인 경우다. 하지만 경사 하강법의 갱신 종료 조건인 gradient = 0으로 인해 배치만을 이용한 경사 하강법은 안장점(saddle point)에서 벗어나는 것이 안되고 local minimum에 빠지기 쉬운 단점이 존재한다. 안장점은 한 점이 함수의 minimum이면서 동시에 maximum인 점이다.

이 문제점을 고치기 위해 나온 것이 바로 확률적 경사 하강법(stochastic gradient descent rule, SGD)이다. 왜 확률적이 붙었느냐면, 모든 데이터를 하나씩 보는 것이 아니라 무작위로 하나의 데이터를 뽑아서 그 데이터를 가지고 경사 하강을 하기 때문이다. 즉, 배치 사이즈는 1이고, 그 한 개의 데이터를 랜덤하게 뽑는 것이다! 그렇기에 위의 두 방법보다는 수렴 속도가 매우 빨라지고 shooting이 일어나 local minimum에 빠질 가능성이 적어졌으나, shooting으로 인해 global minimum 수렴을 보장하기 어렵다는 단점이 있다. 아래 첨부된 사진의 오른쪽을 보면 삐죽삐죽하게 튀는 것을 볼 수 있는데, 그것이 바로 shooting이다.

배치를 이용한 경사 하강법의 안정성과 확률적 경사하강법의 빠른 수렴을 합치면 좋겠다는 생각이 확 든다. 그 방법이 당연하게도 있으며, 미니 배치 확률적 경사 하강법(mini-batch stochastic gradient descent rule)이다. 미니 배치와 확률이 합쳐진 것으로, 기존의 확률적 경사 하강법의 하나의 데이터 고르기가 아닌 미니 배치를 랜덤하게 고르는 것으로 바뀐 것이다. 이는 배치를 이용한 경사 하강법보다 매우 효율적이며, 하나의 데이터만을 고르는 확률적 경사 하강법보다 더 나은 결과를 얻는다. 현재는 이 방법을 많이 쓴다.
3. 업데이트 방법을 바꾸는 경사 하강법
앞서 가장 기본적인 경사 하강법의 수식이

이 부분은 다음 포스트에서 정리해보고자 한다. 여기서 더 쓰면 너무 길어진다...
댓글