[인공지능 기초] 4. 신경망 학습

2021. 5. 25. 18:30인공지능/인공지능 기초

이번에는 신경망을 학습할 때 알아두어야할 핵심 요소들을 설명하겠다. 

 

신경망 학습은 이전에 말했던 것처럼 loss 값이 작아지도록 가중치를 최적화하는 것을 말한다. 

그렇다면 이제 어떻게 가중치를 최적화 하는지를 알아야한다.

 

이 가중치를 최적화 하는 모듈을 Optimizer라 하며, 머신러닝, 딥러닝이 발전하기 시작한 때부터 많이 발전해오면서 종류가 매우 다양하다.

 

이 글에서는 그 종류에 대해서는 다루지 않고, 핵심인 Gradient Descent Algorithm에 대해 얘기하도록 하겠다.


1. Gradient Descent Algorithm

이전에 Cost함수에 대해 짧게 이야기한 적이 있다. 보통 Convex함수가 사용되고, 이 함수의 값인 loss가 작아지도록 가중치(W, b)를 갱신해 나가는 것이 학습이라 하였다.

 

이 Convex함수의 모형을 잠깐 살펴보면 Gradient Descent Algorithm의 역할을 예측해볼 수 있다.

위의 오른쪽 그림이 Cost함수, 즉 Convex함수이고 기울기(Gradient)의 값과 방향을 따라서 점차 하강(Descent)해나가는 것이 Gradient Descent Method이다. 하강을 하는 이유는 Convex함수의 특성상 미분했을 때의 값(Gradient)이 0이 되는 부분이 최소점의 Cost(loss)를 가지기 때문이다.  

 

그리고 Gradient를 구할 수 있어야 "어디로 내려가야하는 지"에 대한 방향과 "얼마나 내려가야하는 지"에 대한 값을 알 수 있기 때문에 일반적으로 Cost함수는 모든 점에서 미분 가능(예외: L1 loss)하여야 한다. 

**기울기(Gradient)가 가르키는 방향이 각 점에서 함수의 출력 값(loss)을 줄이는 방향

**기울기(Gradient)가 클 수록 변화폭이 크고, 작을 수록 적다. 보통 최소점에 다가갈 수록 변화폭이 적어진다.  

 

1.1 Derive Gradient Method

다음 그림은 Cost함수를 MSE로 가정하고, Gradient를 미분하는 과정이다. 참고 정도로만 봐두면 된다.

**$\frac{1}{2}$은 미분 편의상 곱해져있는 값

 

1.2 Learning Rate

위의 그림들에서 Gradient Descent 식을 보았을 때, $\alpha와 \eta$ 상수 값이 곱해져 있는 것을 볼 수 있다.  이 값은 Learning Rate로 불리며, 하강할 때 Gradient를 어느정도의 비율로 적용하여 갱신시킬 지, 즉 얼마나 크게 또는 작게 갱신할 건지를 정해주는 하이퍼 파라메타라고 보면 된다.

 

당연하게 learning rate가 크면 최소점 방향으로 크게 이동하여 더 빠른 업데이트가 가능할 수 있고, 작으면 그만큼 하강하는데 오랜 시간이 걸릴 것이다. 그럼 learning rate는 무조건 커야 좋은가? 하면 또 아니다. (어느 것이던 너무 지나치면 단점이 되기 마련이다.)

Too Big Learning Rate

Learning rate가 너무 큰 경우에는 최소점으로 향하는 속도는 빠르지만 최소점을 넘어가 버리는 현상이 일어날 수 있다. 심지어 너무 심한 경우에는 최소점을 뛰어넘어 튕겨나가는 것처럼 발산하는 Over shooting현상도 생길 수 있다.  

Too Small Learning Rate

Learning Rate가 너무 작은 경우에는 갱신되는 step이 너무 작아서, 업데이트가 매우 느리게 진행이 된다. 따라서 학습 시간이 매우 오래 걸리고, 최악의 경우 local minimum에 빠져 최소점에 도달하지 못하고 학습이 종료될 수 있다.

 

local minimum이란, 최저점이 아니지만 gradient가 0이 되는 지점을 말한다. 설명에서는 convex함수가 2차함수지만 실제로는 훨씬 고차원이다. 이런 고차원에서 gradient가 0이 되는 부분은 한 곳이 아니라 여러 곳이므로 너무 작게 갱신하다가 local minimum에서 나아가지 못하고 학습이 동결되어 버릴 수 있다.

 

결론적으로 Learning Rate는 여러 값들을 시도해보고 그 안에서 최적 값을 찾아내는 방법 밖에 없다.

**일반적으로는 1e-3 또는 1e-4를 시작으로 3배씩 늘리거나 줄여가면서 테스트를 한다.

 

1.2.1 Learning Rate Scheduler

요즘에는 Learning Rate Scheduler를 사용하여서 epoch마다 Learning rate를 다르게 주는 방식이 많이 사용된다. 주로 사용되는 Scheduler(Keras 기준)는 ReduceLROnPlateau Cosine Annealing, Cyclical Learning Rate가 있고, 각 scheduler마다 장단점이 있다.

 

살짝 설명하자면 ReduceLROnPlateau는 일정 epoch동안 loss가 내려가지 않으면 learning rate를 줄여가는 방식이며 수렴 속도가 빠르지만 local minimum에 대한 대처가 약하다.

 

Cosine Annealing은 Cosine함수처럼 위아래로 포물선을 그리면서 Learining rate 값을 주는 방식으로 수렴 속도는 느리지만 local mimimum에 강하다. Cyclical Learning Late도 이와 비슷하다.

 

필자는 개인적으로 문제가 너무 단순하고 쉽다면 ReduceLROnPlateau로 빠르게 학습을 시키고, 문제가 어렵다Cosine Annealing이나 Cyclical LR로 학습을 시킨다.(Cyclical LR을 선호...Cosine Annealing 너무 느려...)

 

1.3 Normalization(Standardization)

데이터 간의 크기 차이가 매우 크면, learning rate와 무관하게 발산할 수 있다.

계속해서 말하지만 학습이란 결국 목적을 잘 달성시키는 최적의 WX+xb 함수를 찾는 것이다. 

 

데이터 X의 값들 간의 차이가 크다면, 즉 분산이 크다면, 동일하게 그 결과 값(Y)의 분산도 커질 것이다.

$\mu : 평균, \sigma : 표준편차$

표준화(Normalization)는 평균을 뺀 값을 표준편차로 나눠줌으로써 데이터 간의 분산을 작게 만들어주어 이러한 문제를 해결해준다. 

**표준편차를 구하기 힘든 경우, 데이터의 (Max - Min) 값으로 대체해도 무관하다.

 

1.4  Batch Size

Batch라는 것은 input data를 나누는 단위라고 생각할 수 있다. 

한 iteration에 대해서 데이터셋 전체를 input으로 사용한다면 메모리가 감당하지 못할 수 있다.  

 

따라서 train dataset을 일정한 덩어리(batch)로 나누어서 한번의 iteration에서 그 batch만큼의 데이터만을 사용하고, 파라메터를 update한다.

 

Batch로 데이터를 1개만 사용하는 경우

  • 장점: iteration 한 번 수행하는데 소요되는 시간이 짧다.
  • 단점: 데이터 전체의 경향을 반영하기가 어렵기 때문에 잘못된 방향으로 업데이트가 이루어질 수 있다. 또한, 한번에 한개의 데이터만 학습을 하기 때문에 병렬연산을 거의 사용하지 않아 하드웨어 입장에서 비효율적이므로 전체적으로 보면 학습 시간이 더 길다.

Batch로 전체 데이터를 사용하는 경우

  • 장점: 전체 데이터를 잘 반영해, cost function의 값을 최소화하는 방향으로 훈련이 된다.
  • 단점: 데이터셋의 크기가 커질 경우, iteration 한 번 수행하는데 소요되는 시간이 매우 길어지게 되고, 병렬 처리가 가능하지만 데이터를 메모리에 올려야 될 뿐만 아니라, 전처리 결과나 레이어를 거친 아웃풋도 수시로 메모리를 드나들기 때문에 매우 큰 메모리 용량이 필요하다.

신경망 학습에 대해서 전체적으로 훑어보았다. 

이제 학습이 그래프로 볼 때,  어떤 방향으로 진행되는지 감을 잡았을 것이다.

 

다음 시간에는 실제로 학습 알고리즘을 구현해볼 것이다.