본문 바로가기

카테고리 없음

[CS231n] Lecture 7: Training Neural Networks II

Optimization

Problem of SGD

수평 방향보다 수직 방향의 가중치 변화에 더 민감하다

때문에 지그재그 모양으로 그리면 학습함

이는 바람직하지 않으며 고차원 공간에서 더 심각하게 나타난다

local minimum이나 saddle point에서 학습이 멈출 수 있다.

valley가 있는 손실 함수에서 locally flat한 곳을 만나면 gradient 값이 0이 되어 학습이 멈출 수 있다.

saddle point에서도 local minimum은 아니지만 gradient가 0이 된다. saddle point 근처에서도 굉장히 작은 gradient 값을 갖게 되어 update가 느려지는 단점이 있다. 

 

고차원, very large network에서는 local minimum이 굉장히 드물지만 saddle point는 굉장히 자주 나타난다.

 

SGD Momentum

gradient를 계산할 때 velocity를 이용한다.

rho: momentum의 비율, 보통 0.9, 0.99로 설정함

velocity를 이용하면 gradient가 0이 되더라도 momentum때문에 멈추지 않고 이동할 수 있다.

수직 방향의 변동이 줄어들고 수평방향 움직임이 가속화된다.

 

Nesterov Momentum

gradient보다 velocity를 먼저 계산한다.

velocity를 따라 먼저 움직인 뒤에 그 지점에서 gradient를 계산하는 방법이앋,

Convex한 상황에서는 좋은 성능을 보이지만 Non-Convex한 상황에서는 성능을 보장할 수 없다.

 

AdaGrad

훈련 도중 계산되는 gradients를 활용한다

velocity term 대신에 grad sqaured term을 사용한다

계산된 gradient를 제곱해서 계속해서 더한다.

update를 할 때 update term을 앞서 계산한 gradient 제곱 합으로 나누어준다. 

small dimension의 경우 gradient 제곱 합의 값이 작기 때문에 update term을 나눴을 때 가속도가 붙는다.

large dimension의 경우 gradient가 큰 값을 갖기 때문에 update term을 나눴을 때 속도가 점점 줄어들게 된다.

하지만 학습이 계속 진행된다면 제곱합이 계속 커지게 되고, step이 계속해서 작아진다.

이는 convex case에서 좋은 특징이 될 수 있지만, non-convex에서는 saddle point를 만나서 멈출 수 있다.

 

RMSProp

gradient 제곱합의 값을 사용하지만 계속해서 누적시키지 않기 위해 decay_rate를 곱해준다.(0.9 또는 0.99)

각 차원마다 궤적에 맞게 수행된다.

 

Adam

momentum과 AdaGrad의 장점을 합친 방법

first moment와 second moment를 이용해서 이전의 정보(estimate)를 유지한다

first moment: gradient의 가중합

second moment: AdaGrad와 RMSProp처럼 gradient 제공

 

First-Order Optimization / Second-Order Optimization

First-Order Optimization: 1차원의 손실함수를 사용해소 gradient를 계산한다. 1차 테일러 근사. 멀리 움직일 수 없다.

Second-Order Optimization: 2차 근사 정보를 추가적으로 활용한다. 2차 테일러 근사 함수

다차원에서는 Newton Step이라고 한다.

Hessian matrix를 계산해서 2차 함수에서의 minimum 방향으로 이동한다. 때문에 learning rate가 없다.

하지만 Hessain matrix는 N*N행렬이기 때문에 딥러닝에서는 사용이 불가능하다. (N: Network의 parameter 개수)

따라서 딥러닝에서는 quasi-Newton method를 이용해 근사치를 구한다.

 

L-BFGS

Hassin 근사

DNN에서 잘 사용하지 않는다.

non-convex하거나 stochastic한 상황에서 잘 작동하지 않는다.

 

Model Ensemble

위에는 모두 training error를 줄이기 위한 방법들이다.

하지만 우리는 한 번도 보지 못한 데이터에서 성능을 높이는 방법도 필요하다.

 

model ensemble은 여러 개의 model들을 학습시켜 test할 때 값의 평균을 내는 방식이다. 많은 모델을 사용할 수록 overfitting을 줄일 수 있다.

모델을 여러 개 사용하지 않아도 단일 모델에서 여러 snapshots을 활용해 앙상블하는 방법도 있다.

이 외에도 learning rate scheduler를 사용하거나, 학습하는 동안 파라미터의 exponentially decaying average를 계속해서 계산하는 Polyak averging 방법도 있다.

 

Regularization

여러 모델을 사용하지 않고 단일 모델에서 성능을 올리는 방법이다.

Dropout

forward passing 과정에서 임의로 일부 뉴런을 0으로 만드는 방법이다.

이는 한 레이어씩 진행되며 뉴런의 일부만 사용하게 된다.

fc layer에서 흔히 사용되며, conv layer에서도 feature map이나 channel에 사용하기도 한다.

dropout을 통해 네트워크가 일부 feature에 의존하지 않도록 하며 overfitting을 방지한다.

dropout을 사용하면 Network에 z라는 입력이 추가된다.

z: random dropout mask

하지만 test 과정에서 이런 임의성이 존재하는 것은 적절하지 않다.

따라서 네트워크 출력 시에 dropout probabilty를 곱해준다.

 

Transfer Learning

충분한 데이터가 없을 때 overfitting되지 않기 위해 사용하는 방식이다.

ImageNet과 같이 대량의 데이터셋으로 이미 최적으로 학습된 모델을 활용한다.

모델에서 가장 마지막 layer는 최종 feature와 class scores가 연결되는 레이어이다.

이전 layer들을 freeze시키고 가장 마지막 layer만 학습 시키는 방식이다.

데이터가 조금 더 있다면 전체 네트워크를 학습시키는 fine-tuning을 할 수도 있다.

이 때 이미 성능이 좋은 가중치 값을 사용하고 있기 때문에 learning rate 값은 낮춰서 사용한다.