[ Deep Learning ] Optimization

0

DeepLearning

목록 보기
5/6

오늘은 Optimizaiton에 대해 공부해 보도록 하겠습니다.
Optimization은 deep learning에 있어서 매우 중요한 개념입니다. 최적의 W와 b를 찾는데 굉장히 중요하기 떄문입니다.
우선 우리가 아는 Gradient Descent에 대해 알아보도록 하겠습니다. Gradient는 다차원에서으 미분을 의미합니다.
그리고 Descent는 감소. 즉, 다차원에서의 기울기를 감소시키는 개념입니다.
이를 cost function에 도입하여 최저점인 곳이 gradient = 0이 되는 곳을 찾는 문제입니다.

경사하강법(gradient Descent)는 흔히 산에서 눈감고 내려오기로 비유가 많이 됩니다.
어디로 가야 내려올수있는지는 모르겠지만, 현재 상태에서 가장 기울기가 가파른 곳으로 이동한다는 개념입니다.

Gradient Descent

Gradient Descent란, 우리에게 주어진 모든 데이터를 확인해서 그레디언트가 가장 많이 줄어드는 방향으로 이동하는 개 념입니다.
그래서 현재 상황에서 가장 최적의 값을 찾아서 이동한다는 개념입니다.
하지만 Gradient Descent의 가장 큰 문제점이 있습니다.
저희게 Deep Learning을 풀다 보면 변수의 개수가 몇천, 몇만개가 됩니다. 하지만 이 모든 변수를 계속해서 본다는 것 자체로 너무 많은 연산량을 허비하게 됩니다.

실제로 GD를 사용할때 수치적으로 접근해보면, gradient의 반대 방향으로 이동하게됩니다.
만약 x가 증가함에 따라 함수의 값이 증가한다면 음의 방향으로, x가 증가함에 따라 함수가 감소한다면 양의 방향으로 이동하게 됩니다.
그래서 간단한 3차원 함수에서 이렇게 표현이 가능합니다.

그래서 특정 몇개만 보고 이동해보자! 라는 개념에서 나온것이 Stochastic Gradient Descent입니다.

Stochastic Gradient Descent

stochastic gradient descent는 모든 경우의수를 다 확인하는 것은 아니지만 배치 크기만큼의 데이터만 보고 이동한다는것입니다. 그래서 현재 상황에서 최적의 경로는 아니더라도, GD보다 빠른 연산량을 가질수 있습니다.

Batch에 속한 데이터들의 gradient를 구한다. 그리고 graident의 평균을 구해 해당 층의 파라미터들을 모두 동일하게 update 시켜준다.

그리고 연구 결과 GD보다 SGD가 더욱 빠르게 결과값을 가져온다고 알려져있습니다.

다음과 같이 GD와 SGD를 구분해 보았습니다.
GD의 경우 모든 데이터를 확인후 update를 진행하고, SGD의 경우 배치에 포함된 데이터만을 확인하고 이동하여 빠른 수렴을 할수 있게 도와줍니다.

다음은 SGD의 sudo code입니다. sudo code에서 알수 있듯이 GD와 다른점은 sample example을 사용한다는 점입니다.

그리고 이후에 나오는 모든 optimization 방법들은 SGD를 기반으로 되어있습니다.

그리고 optimization은 크게
1. step 방향 조절
2. step 사이즈 조절
이 2가지를 조절하는 방법으로 여러 optimziation들이 나타났다.
왜냐하면 learning rate를 어떻게 설정하느냐에 따라서 다음과 같이 빠르게 수렴할수도, 발산할수도, 느리게 수렴할수도 있습니다. 그래서 어떠한 optimization을 사용하는지에 따라 각 모델의 속도가 달라지게 됩니다.

그리고 저희가 살펴볼 optmiziation들은 다음과 같이 나타낼수 있습니다.

Momentum (step 방향)

momentum optimization은 그레디언트에 관성을 주는 것이다.
관성을 주는 이유는 크게 2가지로 설명가능하다.

  1. gradient가 감소하는 부분을 너무 느리게 지나간다!
  2. Local minimum 빠지지 않게 도와준다. 다음고 같이 관성이 있다면 gradient가 작더라도 관성을 통해서 확률적으로 local minimum을 탈출할 수 있다.

그래서 단순히 SGD를 사용하는것보다 더 빠르게 수렴이 가능하다. 아래 그림처럼 momentum을 사용하는 것이 더 빠르게 수렴한다는 것을 확인할수 있다.

그리고 실질적인 이동은 gradient와 momentum의 벡터의 합을 사용하여 다음과 같은 방향과 크기로 이동하게된다.

그리고 sudo code를 살펴보면 다음과 같이 V를 더해주는 것을 확인할 수 있다. V앞에 붙은 변수는 hyperparameter로 모멘텀의 영향을 얼마로 설정할지에 대한 변수이다.

NAG(step 방향)

nastrov momentum은 momentum과 굉장히 개념적으로 유사하다. 하지만 moentum을 사용하는 순서에 약간의 차이가 있다.
바로. moment + gradient로 이동하지 않고, momentum으로 우선 이동후 해당 위치에서의 gradient를 사용해서 gradient 만큼 이동한다는 점이다.
이 점이 중요한 이유가, momentum을 사용하는 경우 local minimum은 잘 탈출하지만, 최적의 값에 수렴하는데 오래걸린다는 단점이 있다.
그림과 같이 graident까지 같이 더해주기 때문에 계속해서 optimal을 지나치게 된다는 것이다.
이를 보완하기 의해서 NAG가 나왔고, 이는 미래의 gardient를 사용한다 라고 개념적으로 이해하면 쉽다.

sudo code를 살펴보면 다음과 같이 2번의 업데이트가 진행됨을 확인 가능하다.

AdaGrad (step size)

Adaptive gradient의 개념은 다음과 같다.
1. 학습을 너무 많이한 w에 대해서는 학습을 억제한다.
2. 학습을 하지 않는 w에 대해서는 학습을 촉진한다.

sudo 코드를 먼저 보겠다.다음과 같이 gradient를 곱해서 r이라는 변수에 넣어준다.
그리고 r을 분모에 넣고 lr을 설정하는데, 이 말은 즉슨, gradient가 많이 변경된 w에 대해서는 lr을 낮게 설정해 천천히 움직이게 설정하고, graident가 많이 움직이지 않은 w에 대해서는 lr을 크게 설정하여 많이 학습 하도록 한다.

즉, Adagrad의 경우 희소한 특정 특징을 잘 잡아내서 해당 특징을 통해서 많은 정보를 얻을 수 있는 경우 굉장히 유리하게 동작합니다.

AdaGrad의 문제점 : r에 gradient의 제곱으로 저장하기 떄문에 기하급수적으로 r이 증가 하게되면, 충분히 학습을 하지 못했는데, lr이 너무 작아져서 온전한 학습을 하지 못하는 경우가 발생합니다.

RMSProp

AdaGrad의 문제점을 해결하기 위해서 나온 optimization입니다.

이 또한 sudo code를 먼저 살펴보면 다음과 같이 나타납니다.

해당 코드에서 r에 gradient의 제곱을 더해주는 것이 아니라, 특정 변수를 넣어서 graidnet의 영향을 억제 시켜줍니다.즉, 과거의 graident 누적을 조절함으로써, learning rate가 지나치게 작아져서 학습을 하지 못하는 문제점을 해결해 주었습니다.(지수 가중 이동 평균 을 사용했다고 한다)

Adam

Adam은 momentum과 RSMprop을 동시에 적용한 optimization으로 step 방향과 사이즈를 동시에 해결하는 optimization입니다.

그 밖에 다양한 optimizaiton function들이 존재하며, 각 모델에 맞는 optimization function을 사용하는것이 가장 중요합니다.

0개의 댓글