※ 본 내용은 stanford에서 제공하는 cs231n 강의, 강의자료를 바탕으로 작성하였습니다.

 

Lecture 7에서는 fancier optimization, regularization 그리고 transfer learning에 대해 다루고 있다.

 

<Optimization>

● SGD의 문제점

앞선 강의들에서 training은 보통 SGD를 이용하여 진행하였다. 

그러나 단순 SGD는 몇 가지 문제를 갖는다.

 

(1) Slow progess

한 feature에 대해서는 loss에 대한 영향(미분)이 크고, 다른 하나의 feature에 대해서는 작다고 가정해보자.

 

그럼에도 불구하고 두 feature에 대해서 learning rate는 동일하기 때문에, 하나의 learning rate로 서로 loss에 대한 영향력이 크게 차이나는 features를 다루면 위 그림과 같이 한쪽 방향으로 치우친 step을 갖게될 것이다.

 

그림에서도 직관적으로 확인할 수 있듯이, 이러한 경우 global optima에 비효율적으로 수렴한다

 

(2) stuck

SGD는 local minima나 saddle point를 만나게 되면 더 이상 업데이트하지 않고 stuck하게 된다. 

 

Gradient descent를 사용하는 모든 알고리즘이 그렇지 않을까 생각이 들었지만,

뒤에서 소개하는 다른 방식들은 gradient descent를 사용함에도 불구하고 미분값이 0인 점에서 stuck하지 않음을 살표볼 수 있다. 

 

추가로 local minima보다 saddle points가 훨씬 더 흔한 경우라고 한다. 

 

local optima가 되려면 어느 방향으로 가도 loss가 증가해야 되는데, higher dimension에서 어느 방향으로 가도 증가하는 건 흔하지 않은 일이다. 

 

(3) gradients from minibatches can be noisy

noisy한 수렴

minibatches를 통해 loss를 계산하는 것이기 때문에 실제 미분값과는 약간의 차이가 존재한다.

따라서 수렴하는 과정자체도 noisy하다.

 

● SGD + Momentum

우선 수식과 코드를 통해 SGD와 SGD+Momentum 방식이 어떠한 차이를 보이는지 살표보자.

SGD와 SGD+Momentum

SGD+Momentum 방식은 '속도'의 개념을 최적화 과정에 도입한다. 

속도 = $ \rho$* 현재속도 + 가속도

위치 = 현재 위치 + learning rate*속도

위와 같이 속도를 통해 이동방향과 이동량을 결정하고, 현재의 미분값은 가속도로 속도에 변화를 주는 것과 같이 동작한다. 

(※ 수식을 계속 풀어서 써보면, 결국 속도는 미분값의 weighted sum이다.)

 

현재 속도의 영향을 감소시키는 $ \rho$, rho는 보통 0.9나 0.99로 설정하는게 흔하다고 한다. 

결론적으로 momentum을 추가함으로써 다음과 같은 효과를 얻을 수 있다.

- stuck을 예방

- 가능한 한 방향을 고집하도록 하여 빠르게 수렴

 

Nesterove Momentum

(좌) 일반적인 Momentum, (우) Neserov Momentum

일반적인 momentum과 조금 다르게 동작하는 Nesterov momentum 방식도 존재한다.

Gradient를 계산한 후 속도를 업데이트한 후 그 속도로 이동하는 기존 momentum 방식과 다르게,

현재 속도로 이동한 후, 이동한 위치에서 gradient를 계산하고 step을 결정하는 방식으로 동작한다. 

 

● AdaGrad

마찬가지로 수식을 먼저 살펴보고, 그 동작에 대해 알아보겠다. 

AdaGrad

일반적인 SGD와 유사하지만, learning rate와 미분값을 곱한 것을 $ \sqrt{grad^{2}} $로 나눠주는 scaling이 추가되어 있다.

(0으로 나누는 것을 예방하기 위해 1e+7이 더해진 값으로 나눠지기는 한다.)

 

해당 값으로 나눠줌으로써,

미분값이 큰 방향의 step은 크게 줄여주고, 미분값이 작은 방향의 step은 작게 줄여주는(오히러 가속시킬 수도 있다) 방식으로 step의 scale을  조정한다. 

 

결국 SGD에서 한쪽 방향으로 크게 진동하며 수렴하던 모습을 예방한다고 생각할 수 있다.

 

RMSProp

그러나 AdaGrad에는 문제점이 존재한다. 

grad_squared += dx*dx

위 식을 통해 grad_squared는 계속 누적합으로 커지기 때문에 training이 반복되면 

learning_rate*dx / np.sqrt(grad_squared + 1e-7)

의 값은 0에 수렴할 것이다. 

RMSProp

따라서 현재의 grad_squared값에 decay_rate(0 < decay_rate < 1)를 곱해줘서 계속해서 커지는 것을 방지하면서 grad_squred를 계산한다.

 

 

● Adam

Adam은 AdaGrad와 Momentum 두 방식을 모두 채용한 방식으로,

대부분의 경우 Adam optimization을 사용하게 될 것이다.

먼저 Bias correction으로 표시된 영역을 제외하고 빨간색과 파란색 사각형으로 표시된 영역을 살표보자.

 

'first_moment'로 momentum을 계산해주고, momentum 방식대로 업데이트를 수행할 때 'second_moment'를 통해 계산한 RMSProp의 scaling을 수행해주는 방식으로 두 방식을 모두 사용한다. 

 

Bias correction이 추가되는 이유는 다음과 같다.

second_moment는 0으로 초기화되고, 학습 초기에 second_moment는 0에 근접한 값이다.

따라서 해당 값으로 나눠서 scaling을 해주면 학습 초기의 step은 상당히 커지게 된다. 

 

따라서 second_moment를 ($ 1-\beta1^{2} $) 으로 다시 한 번 나눠준다.

$ \beta $는 1, 2를 각각 0.9, 0.999로 설정하는 경우가 일반적이라고 한다. 

 

※ first_moment와 second_moment가 모두 작은 값이니 상쇄되지 않냐는 질문이 있었다.

-> answer : 그럴 수도 있지만, 항상 그런 것은 아니다.

 

지금까지 다룬 최적화 기법들의 학습 과정을 비교한 예시이다.

 

- SGD :

약간씩 흔들리며 이동하는 모습을 볼 수 있다. 그림상으로 방향은 좋지만, 해당 방향으로 이동하는 속도는 느리다.

 

- Momentum :

한 뱡향으로 쭉 갔다가(약간의 over-shooting) 다시 돌아오는 모습이다. 그러나 overshooting 으로 이동하는 속도가 빠르다.

 

- RMSProp :

over-shooting이 적으면서 비교적 한 방향으로 적절하게 수렴한다.

 

- Adam :

두 방식의 특징이 모두 나타난다.

 

 

Learning Rate, Learning rate decay

앞서 소개한 optimization 방법에서 learning rate는 모두 가장 중요한 hyperparameter이고 적절하게 잘 설정해줘야 한다.

 

처음 적절한 learning rate를 탐색할 때는 양 끝에서는 최적화에 문제가 있을 정도로 매우 넓은 범위로 탐색해야 좋다고 한다.

 

Learing rate를 학습하면서 줄이는 방법도 좋은 방법이다.

위와 같은 방법으로 학습하면서 learning rate를 줄일 수 있다.

 

다만 learning rate decay를 적용하고자 할 때는, learning rate를 먼저 확실하게 설정한 후 적용해야 한다.

 

특히 Momentum 방식에서 learning rate decay는 중요한 편이다. (Adam에서는 덜 흔하다.)

 

Second-Order optimization

First-Order Optimization

지금까지는 미분을 수행할 때, linear approximation을 통해 방향을 찾고 learning rate를 통해 보폭을 결정하는 방식으로 최적화를 진행했었다. 

Second-Order Optimization

Hessian, quadratic approximaiton을 통해 최적화를 진행하는 방법도 있다. 

Quadratic approximation의 최소값으로 이동하면 되기 때문에, learing rate, hyperpameter가 필요하지 않다.

 

그러나 hyperparameter가 없다는 장점에도 불구하고, 위 최적화 기법은 deep learning에 적용하기 실용적이지 않다.

 

Hessian matrix의 크기자체가 $ N^{2}$으로 매우 크고(N : number of parameters), inverting하는 것도 $ O(N^{3})$이 소요된다. 

 

Approximate inver Hessian을 $ O(n^2)$으로 계산하고, full inverse hessian을 저장하지 않는 L-BFGS라는 방법이 있다고 한다. 

Full batch를 써야 유용하고, non-convex한 경우 잘 동작하지 않기 때문에 마찬가지로 deep learning에서 사용되는 경우는 흔하지 않다고 한다.

-> Full batch를 사용할 수 있다면 시도해볼만 하다.

 

<Regularization>

Training loss를 줄이는 방향으로 train이 이뤄지지만, 사실 실제로 필요한 것은 새로운 데이터에 대해서 좋은 성능을 보이는 것이다.

우측의 그래프와 같이 training data에 대한 정확도와 validation data에 대한 정확도의 gap이 발생한다면 overfitting 문제를 예상할 수 있고, regularization이 필요하다.

 

● Model Ensembel

Model ensemble은 여러 개의 독립적인 model을 학습시키고, test time에는 각 model들의 결과를 종합하는 방식이다.

엄청난 성능 증가가 이뤄지지 않지만 확실한 regularization 효과를 얻을 수 있다.

 

여러 개의 independent한 model을 학습시키는 대신, 하나의 모델의 여러 snapshot을 이용하여 ensemble 효과를 얻을 수도 있다.

하나의 모델을 트레이닝하는 과정에서 다양한 optima에 도달하게 만드는 원리이다. 

 

Polyak averaging

실제 parameter 대신 parameter vector의 이동평균을 저장해놓고, test time에는 그 값을 사용하는 Polyak averaging도 존재한다. 

 

마찬가지로 regularization 효과를 얻을 수 있다. 

 

● Regularization Term

Loss에 regularzation term을 추가하는 것은 대표적인 regularization 기법이다. 

 

Weight가 지나치게 커지는 것을 일종의 penalty로 취급하는 방식이다. 

● Dropout

Dropout

Dropout은 random하게 neuron의 출력을 0으로 만드는 기법이다(정확히는 activation function의 출력을 0으로).

 

0으로 출력할 확률 또한 hyperparameter이다.

 

Dropout의 장점은 다음과 같다.

 

- Co-adaption of features

먼저 하나의 feature에 지나치게 의존하는 것을 예방한다.

예를 들어 현재의 데이터셋에서는 하나의 특징이 classification에 큰 영향을 미친다면 해당 feature에 대해 과적합될 가능성이 있는데, dropout을 함으로써 다양한 feature에 대해 학습을 하게 된다.

 

- Ensemble

어떠한 neuron을 drop하냐에 따라 모두 다른 구조의 model이라고 볼 수 있고, 

따라서 일종의 ensemble로 인한 regularization 효과를 얻을 수 있다. 

 

- Test-time

Dropout을 사용하면 nueron의 출력에 확률의 개념이 들어가기 때문에, test-time시의 출력으로 기대값을 출력해야 한다.

그러나 f(x, z)가 매번 달라지는 상황에서 이러한 적분을 게산하는 것은 쉽지 않다.

 

따라서 이를 approximate하여 설정된 weight의 출력에 dropout possbility를 곱하는 방식으로 출력한다. 

 

반대로 train time에 neuron의 출력을 p로 나누고 test time에는 그대로 출력하는 inverted dropout도 존재한다.

효과는 결국 동일하면서, test time 시의 성능을 빠르게 하기 위해서이다.

 

Common pattern

Regularization의 흔한 패턴은 다음과 같다.

 - Traing time : 일종의 randomness를 추가

 - Test time : Randomness를 평균으로 출력

 

위의 dropout이 그랬고, lecture 6에서 다룬 batch normalization도 그렇다. 

 

● Data Augmentation

데이터를 증폭하는 기법으로 다양한 기법이 존재한다. 

 

 - Image를 좌우반전 시키기

 - Image의 특정 부분을 잘라서 사용하기

 - PCA를 적용하기

등등의 기법이 있다.

 

Regualrization을 다루다가 data augmentation을 다루는 이유는, data augmentation도 앞서 다룬 common pattern의 효과를 주어 regularization에 도움이 되기 때문이다.

 

뽑을 수 있는 batch의 조합이 훨씬 다양해지기 때문에 training시에 확률성을 제공하는 효과가 있기 떄문이다. 

 

● 기타

그 외에도 다양한 기법이 존재한다.

 

- DropConnect

Dropout과 거의 동일하다.

Neruon의 출력을 0으로 만들었던 dropout과 달리, random weight를 확률적으로 한번씩 0으로 만든다.

 

- Fractional Max Pooling

다양한 pooling 조합 예시

Max Pooling을 수행할 때, pooling의 구조를 다양하게 하는 것으로도 training 시에 randomness를 제공하여 regularization 효과를 얻을 수 있다.

 

- Stochastic Depth

깊은 layer가 있다고 할 때, 아예 random하게 어떤 layer를 없다고 가정하는 방식이다. 

 

<Trasnfer Learning>

Transfer learning은 CNN을 이용하기 위해서는 매우 많은 데이터가 필요하다는 관념을 반박하는 아이디어이다.

 

결론적으로 말하면 이미 traing된 모델을 fine tuning하는 방식으로 그렇게 많지 않은 데이터에 대해서 학습이 가능하다는 것이다.

 

ImageNet과 같은 큰 데이터셋에 학습된 모델을 불러와서, FC layer만 새롭게 학습 시키는 등의 방법을 이용하면 적은 수의 데이터로도 좋은 효과를 기대할 수 있다.

데이터셋이 조금 더 크다면 FC layer 여러 개를 다시 학습하는 등으로 확장할 수 있다.

 

 

Transfer learning을 적용할 때 고려할 점이 위의 표에 잘 정리되어 있다.

 

Transfer learning은 생각보다 훨씬 일반적으로 사용되고 있고, 아예 처음부터 모델을 training하는 경우는 이제 흔하지 않다고 하다. 

 

 

 

 

 

'Computer Vision > cs231n' 카테고리의 다른 글

[Lec 9 ]CNN Architectures  (0) 2022.01.17
[Lec 8] Deep Learning Software  (0) 2022.01.16
[Lec6] Training Neural Networks, Part 1  (0) 2022.01.10
[Lec5] Convolutional Neural Network  (0) 2022.01.09
[cs231n] Assignment1-Q5  (0) 2022.01.01

+ Recent posts