본문 바로가기

Machine Learning

Optimization 방법론

반응형
Gradient Descent
derivative-free optimization을 제외한 대부분의 기계학습 문제에서 optimization의 기본 전제는 Gradient descent이다.

 

cost function의 기울기를 통해서, 최저점을 찾아 가는 것이다.
 
위의 그림처럼 표시된 위치에 있는 사람은 길을 따라 난 경사진 방향보다 오른쪽의 샛길로 가는 것이 더 빠른길이지만, 
기울기 기반의 학습방식은 위와 같은 실질적인 길의 구조를 알 방법이 없고, 경사기반 하강을 한다.
따라서, 실제 더 빠른 갱신 방향이 있더라도, 현재 위치의 기울기를 기반으로 하기 때문에 다소 학습이 느릴 수 도 있다.
 
*Hessian? 

 

gradient는 1차 미분이고, 2차 미분을 통해(hessian) newton 메서드를 기반으로 2차곡선에 근사해서 최저점을 찾아내는 방식도 제안이 되었지만, 이는 n차원의 파라메터에서 2차미분계수로 인해 n*n이 되서 복잡도가 지나치게 올라가게되서 잘 사용되지 않는다. (위 사진에서는 전체적인 길의 모형을 파악하고 최적경로를 알아내서 가는 방법이 되겠다. 연산만 된다면, 매우 빠른 학습 속도를 기대할 수 있다.)
 
따라서, 일반적인 방식은 gradient만을 기반으로하여 optimizer한다고 생각하자.
 
 
 
*(참고)
hessian에서 출발한 L-BFGS 방법은 regression와 유사한 접근법으로 실제 그래프 모형을 추론해서 optimize하는 방법론이다. 일반적인 cnn에서는 dataset이 매우 크기 때문에 사용하기 어렵지만, 근래에 사용되기에 적절했던 모델로는 Style transfer 가 있었다. 
해당 논문에서는 dataset 자체가 매우 작았고 (style image, content image, input noise) 이로 인해 모든 연산 data를 memory에 상주시킬 수 있었고 연산자체도 비교적 간단하여, 잘 사용되지 않는 이 기법에 사용되기에 아주 좋았던 모델이었다.
 
 
 

 
크게 3종류의 Gradient Descent의 변형이 있다.
 
각각은 gradient를 계산할때, data양의 차이에 따른 분류.
 
우리는 정확도와 수행시간의 균형을 유지(trade off)해야한다.
 
  1. Batch Gradient Descent
  2. Stochastic Gradient Descent
  3. Mini-batch Gradient Descent
 

 

1. Batch Gradient Descent
가령 training data가 55000개 있을때, 
55000개를 한번에 모두 고려해서 계산하는 것을 batch gradient descent라고 함. 
55000개의 Gradient를 각각 계산해서, 평균을 내고, 한번 update하는 것.
한번의 update를 위해 다소 많은 시간이 소요.
시간이 적게 걸린다면, 현실적으로 가장 바람직해 보이지만, 메모리에 올리기 힘들뿐 아니라, 뒤에 언급할 regularization면에서도 좋지 않은 방식이다.
 
 
2. Stochastic Gradient Descent

 

한번에 한개의 data만 보는 것.
즉, 언젠가는 수렴하겠지만, 하나의 데이터가 전체에서 많이 벗어난 이상치일때, 영향을 많이받는다. 이로인해서, 그래프가 전반적으로 매우 흔들리며 수렴하는 방향을 보인다.
여기서 stochastic gradient는 random으로 하나를 보는데, 이를 통해 구해지는 gradient의 예측치가 원래 Batch Gradient descent를 통해 구해지는 것과 같아서 그렇다.
 
3. Mini-batch Gradient Descent

 

1개도 아니고, 전체를 64, 128, 256... 개의 데이터를 번갈아가며 사용함.
일반적으로 stochastic gradient를 말할때, Mini-batch를 전재로한다.
gpu사용 성능에 따라서 2의 n승 단위로 batch size를 정하는데, gpu의 메모리 할당단위가 2의 n승이기 때문이다.
즉, 64개와 65개의 batch간의 속도 차이가 심하게 날 수도있다. 또한, 65개~128개의 속도차이가 크게 나지 않을 수도 있다.
일반적으로 batch 사이즈가 작을수록 성능은 좋지만, 그만큼 소요 시간은 떨어진다. (trade-off)
 

 
 
해결과제
 
적절한 학습률을 정하는 것은 cumbersome(다루기 힘든)
-> 일반적으로 특정 Lr을 정하고 이를 *3또는 /3과 같이 조정을 해보며, 최적을 학습율을 구함.(Lr schedule)
 
Local Minima 문제
->초깃값에 따라서, 발생할 가능성이 다분하다.
 
초깃값, Lr등 시간이 한정적인 현실상황에서는 여러 요소를 고려해야한다.
 
 

 
Momentum
일반적인 stochastic g.d Optimizer를 썼을때, 발생할 수 있는 oscillation(지그재그, 진동) 상황.
y축 방향의 gradient는 다소 높은 형태여서, 학습이 진행될때, 비교적 최적점을 지나는 넓은 step을 이동하지만,
x축으로는 학습이 진행될 수록, gradient도 비교적 낮아서 값이 줄어 들지만, step size의 한계로 인해서, 느리게 갱신된다.
이를 보완한 Momentum 방식 기존에 속도에 갱신시에 관성을 더해준다는 개념이다.
자주 이동하는 동일한 방향에 대해서는 속도가 적응적으로 점차 빨라지고, 진동하는 차원에 대해서는 수시로 방향 전환으로 인해 발생하는 이전 momentum으로 속도를 상쇄해준다.
 
 
momentum을 쓰려면, 인자로 어느정도의 세기로 momentum을 줄것인지도 결정해야한다.
 

 
Momentum의 변형 Nesterov accelerated gradient
 
 
현재위치에서 Gradient 계산과 momentum을 같은 단계에서 적용하지 않고,
현재위치에서 Momentum step의 경우 이전 단계에서의 속도에 의해서 발생하는 step이므로 먼저 momentum step을 별도로 수행하고,
옮겨진 방향에서 gradient를 구해서 gradient step을 갱신하는 방식이다.
 
 
이는 특히 위의 oscillation상황에서 좋다. gradient계산을 하고 momentum과 gd step을 같이 갱신하면 위처럼 같은 방향으로의 힘이 강해서 최적점근처에서의 수렴이 다소 어려워 진다.
이와 달리, Nesterov를 쓰면, gradient가 momentum step이후에 갱신되기 때문에 momentum step이후 기울기가 비교적 작은 위치에서 이에 상응하게 gradient 측정이 된다. 결국 이로 인해서 안정적으로 갱신이 된다.
 
이러한 Momentum류의 optimizer는 이전의 갱신 정도를 고려해서, 적응적으로 다음 학습에 영향을 주는 것이 특징이다.
 

 
Adaptive Gradient descent(Adagrad)
 
  
G가 포함된 분모 항을 제외하면 이전 방식과 동일하다.
기존 방식은 위에서 분모가 없는 상태에서 η를 Learning rate으로 보는 형태이다.
즉 AdaGrad는 Learning rate을 고정했던 이전 방식과 달리 학습률을 적응적으로 변화시키는 분모 √G항을 추가한데서 차이가 있는 것이다.
G는 현재까지의 Gradient 제곱들의 합이다.
결국 Leraning rate을 결정하는 η에 대해 반복적으로 Gradient가 갱신되는 항에 대해서는 decay를 시키는 것으로 해석 할 수있다.
적게 변화된 parameter에 대해서는  gradient변화 정도를 크게하는 것이다. 즉, 현재 지점에서 같은 gradient라고 하더라도, 학습정도가 적은 것은 학습의 여지를 더 주고, 많은 갱신이 발생한 항은 다소 갱신 정도를 줄여준다고 생각하면 된다.
 

 
하지만, 치명적인 단점이 있다.
학습이 시작되는 순간부터 G의 감소가 없이 가산만 있으므로, 계속 커지는 것이다. 
이는 결국 학습이 진행될 수록 Learning rate을 0에 근사시키므로, 결과적으로 상대적으로 학습이 덜 되었더라도 학습을 정체시킬 수 있다.
 
 
AdaGrad의 Learning rate이 0에 가까워지는 문제를 해결하기 위한  Adadelta
 
Adagrad에서 계속 감소하는 Learning rate을 방지하기 위해, exponential moving average(EMA)를 취해준다. (γ와 1-γ를 통해 값을 update하는 방식을 EMA라고 함)
위의 경우 지금 들어온 g_t(gradient)의 제곱을 통해 갱신하는 것이다.
update의 의미는 다음과 같다.
γ에 의해 g_t^2가 계속 커지면, E[g^2]_t는 커진다.
하지만, g_t^2이 한동안 작은 값이 나오면, E[g^2]_t도 상응하게 작아진다.
Δθ는 parameter의 변화량인데, 마찬가지로, 이에대한 변수도 tracking해서 적응적으로 update된다.
ε은 초기에 E[-]_t값이 0으로 지정되는데, 0으로 나눠지지 않게 하기위해 있는 값이다.
 
Adadelta의 큰 특징은 Exponetial moving average를 통해 Learning rate을 조정하는데 있다.
즉, 학습시점 부근에서 최근에 gradient가 많이 변했으면, 학습률을 줄이고, 적게 변했으면, 학습률을 크게 한다. 
결국, 학습률이 전체 Gradient의 변화에는 영향을 받지 않고, 그 시점 부근 (window와 비슷한 느낌 그 창을 통해 보이는 부분)에 만 영향을 받아 갱신된다.
 
또한, η항이 없다. 즉, learning rate term이 없다
 
*EMA의 보충설명은 '1.8.*Exponential Moving Average 보충 설명' 노트를 참고.
 
 
 


 
Adadelta에서 η(Learning rate)를 다시 도입한 RMSprop
 
Adadelta에서는 gradient의 변화량에 따른 EMA를 가지고 parameter를 갱신.
RMSprop은 EMA를 분모에 넣고 update한다.
 

정리
Oscillation 해소를 위한 Momentum
단순한 SGD의 경우 oscillation(진동)상황에서 매우 느린 학습 속도로 인한 문제가 발생했다.
Momentum은 이를 해소하기 위해, 관성과 유사한 momentum이라는 term도입하는데, 이전 갱신한 gradient의 일부를 더해주는 것이다. 차원별로 지속적으로 같은 방향으로 변화가 일어나면 이에 힘을 실어주고, 반대로, 특정 차원에서 지속적으로 방향이 바뀐다면, 이를 상쇄해주는 효과를 얻을 수 있다.
Momentum에서 gradient step과 momentum step을 분리해서 순차적으로 더해 좀 더 효율적인 gradient step을 유도한 것이 Nesterov 방식이다.
 
Adaptive Learning rate(Saddle point 탈출)을 위한 Adagrad
Adagrad의 경우 학습이 진행될 수록 학습률을 decay시켜서 학습 초반과 학습 후반부의 갱신 속도에 차별화를 두기 위해 고안된 것이다. 
Saddle point 탈출에 효과적인 방식이다.
하지만, 지금까지의 gd변화량 제곱을 더했기 때문에, adaptive learning rate은 얻었으나, learning rate이 지속적으로 감소해서 문제가 되었다.
Adadelta와 RMSprop은 이를 막기위해, 지금까지의 gd변화량을 모두 보지는 않는다. EMA를 통해 특정 window 즉,  학습 시점에서의 최근 gd변화량을 한정해서 본다.
Adadelta와 RMSprop의 차이점은 Global learning rate (상수인 learrning rate(η))의 유무이다.
 

 
Adam (RMSprop+ Momentum)
 
Adagrad의 Learning rate decay 개념과 momentum을 합친 방식이다.
momentum에 해당하는 m을 마찬가지로 EMA를 통해 갱신하고, 
지금까지의 gradient변화량에 해당하는 v역시 EMA를 통해 갱신한다. 따라서, 이전과 달리 파라메터가 두개가 된다.
결국 위치를 의미하는 θ의 갱신에는 이전과 마찬가지로 gradient 변화량의 제곱근을 나눠주고, gradient에 momentum 개념을 합친 m_t와 learning rate(η)의 곱을 step으로 한다.
1-β에 대한 식을 자세히보면, t제곱을 하는데, β는 0과 1사이의 수이므로, 갱신을 반복할수록 해당 식은 1에 가까워진다. 이 식의 의미는 구해진 gradient가 원래의 gradient 대비 unbiased estimate를 보정하기 위해 고안된 것이다.
 
 
Adam에서 중요한 parameter
    1.  
  1. ( momentum parameter 약 0.9로 줌).
  2. ε
 
ε의 물리적인 역할은 초창기에 gradient 제곱에 대한 EMA가 0이기 때문에, 0으로 나누는 것을 방지하기 위한 것이다.
단순 보정하는 term으로 보일 수 있지만, g^2이 초창기에 작으면, 초기에 얻어지는 gradient가 매우 큰 영향을 준다. 
exponential이 작은것은 v가 조금만 작아져도, 최근의 gradient가 조금만 들어와서 작아지면, 그 방향으로 prameter가 overshooting될 수도 있다.
논문에서는 초기 ε의 parameter를 10^(-8)로 매우 작은 값으로 지정하는데, 실제 적용시에는 잘동작 하지 않은 경우가 많다. 따라서, tensorflow에서도 1.0, 0.1를 디폴트로 쓰고 경험적으로 10^-2, 10^-4정도를 써보는게 효과적이다.
특히나 regression에서는 10^-8를 사용하면 학습이 거의 잘 안된다.
 

 
정리
학습은 디폴트로 Adam을 쓴다.
입맛에 따라서, momentum을 사용하고 싶지 않다면(이전 gradient가 중요하지 않을때, RMSProp을 사용)
 
위와 같은 안장점이 있는 모형의 학습 곡선에서, saddle point 인근에서 보면, adaptive learning rate을 사용한 adagrad, adadelta, rmsprop은 비교적 saddle point를 빨리 탈출하는 것을 확인할 수 있다.
왜냐하면, adaptive를 쓰면, 지금까지, 이동이 적었던 방향에 조금이라도 정보가 들어오면 그 방향에 큰힘을 더해 확 밀려나게 해준다. 
이와 달리 adaptive Lr을 사용하지 않은 방식(momentum, sgd, nag)은 saddle을 탈출하기 위한 방도가 부족한 편이다.
반면, 특정차원에서 불필요하게 진동하는 oscilation문제를 해소하기 위한 방식은 momentum에서 해소해준다.
즉, 근본적인 학습 정체를 해소하기 위한 학습의 개선은 adaptive learning에서 출발하는 것이다.
momentum 등의 term은 학습 속도 개선을 위한 느낌이 더 강하다. 특정 차원에서 좀더 신중한 step을 진행 하기위해 고안된 momentum term이라고 생각할 수 있다. 
 
정리해보면, 디폴트로 adaptive와 momentum 개념을 함께 사용한 adam을 쓰고, 이전 gradient가 중요하지 않을때는 RMSprop을  사용하는 편이다.
Adam은 
(bias-correctio)과
(momentum)을 RMSprop에 추가한 학습 방식이다.
 
 


그 외 학습시에 사용해야할 Technique 
 
 
Data Shuffling 
학습에서 Optimizer 못지 않게 중요한 것은, data shuffling 이다. 매 epoch 마다 섞어주는 것이 매우 중요하다.
 

 
Curriculum Learning
 
모든 data를 쓰기보다 쉬운 data를 먼저 학습시키고, 어려운 data를 나중에 학습 시키는 것이 좋다.
 
Batch Normalization
매우중요.
 
Early stopping
validation acc가 떨어지면 중단해야한다. regulize 측면에서 중요하다.
 
Gradient noise
역시 regulize측면에서 유용함.
 


Learning rate 에 대한 learning curve 분석
일반적으로, 4번 curve가 가장 우리가 원하는 곡선이다.
1번 curve의 경우 학습이 조금 진행되다가 갑자기 shooting이 발생하는 경우인데, 이때는 learning rate을 낮춰 주면 된다.
만약 adam을 사용할때, ε의 크기를 키워 learning rate을 제한해주는 것도 좋은 방법이다.
 
2번 curve의 경우 학습이 linear하게 진행되는 경우인데, 시간이지나도 linear하다면, 이는 learning rate이 낮아서 발생하는 문제로 learning rate을 높여주면 된다.
 
3,4번 curve를 실제로 구분하는 것은 거의 불가능하다. 따라서, 많은 경험을 통해 간접적으로 해결하는 것이 가장 좋은 방법이다.

 

반응형

'Machine Learning' 카테고리의 다른 글

Linear Model  (0) 2019.01.22
KNN Classifier, Regression  (0) 2019.01.21
Restricted Boltzmann Machine  (0) 2019.01.19
Bias term의 필요성  (0) 2019.01.13
Overfitting을 막는 Regularization  (0) 2019.01.09