본문 바로가기

컴퓨터공학

[CS231n 7강 정리] 신경망 학습 (Training Neural Networks II)

반응형

6강 살짝 복습하고 가겠습니다.

데이터 전처리를 해야 하는 이유

원점을 중심으로 조금만 움직여도 왼쪽 그림같은 전처리가 되어있지 않은 데이터들의 경우 classification이 잘 되지 않는다. 손실함수는 아주 약간의 가중치 변화에도 민감하다

학습 그래프에 대한 직관

train set 성능은 계속 올라가고 loss도 줄고 있는데 validation이 침체중이라면 오버피팅되고있는 것이다. + 추가적인 regularization이 필요한 것!

hyperparameter Search

Block Coordinate Descent(BCD) 같은 방법도 있음

Q. Low Learning rate를 주면 local optima에 빠질 수 있지 않냐?

- 그런일이 많이 발생하지는 않는다


오늘 배울 것은

Fancier optimization

Regularization

Transfer Learning


Optimization

위 그래프의 x,y축은 가중치이며, 색깔은 해당 가중치일때 loss값을 의미한다. 지금까지는 SGD(Stochastic Gradient Descent)를 이용했지만 사실 단점이 많다.

 

SGD 단점

- 가중치마다 변하는 속도가 다를때, 지그재그 형태로 업데이트가 진행되어 비효율적이다

- High condition number: 이 지점의 Hessian matrix의 최대/최소 singular values값의 비율이 너무 크다.

- local minima

위와 같은 손실함수의 경우 중간 valley에서 gradient가 0이되어 업뎃이 멈춤

- saddle points: 마찬가지

saddle points가 더 빈번하게 발생

saddle points 근처에서 업뎃 상당히 느림

- train상의 시간단축을 위해 미니배치 데이터로 loss를 추정하게 되는데, 이게 정확한 gradient가 아니다보니 최적화시간이 오래걸리게 된다.

 

momentum term

그래서 이런 문제들을 해결하기 위해 SGD에 momentum term을 추가하여, gradient를 계산할 때 velocity를 이용한다.

이제 물리적으로 공이 굴러내려오는것처럼 떨어지면서 속도가 빨라지고, gradient가 0이 되더라도 업데이트가 될 수 있도록 한다. 따라서 아까와 같이 지그재그 상황일때, momentum이 변동을 상쇄시켜 주게된다.

Q. SGD Momentum이 poorly conditioned coordinate 문제를 어떻게 해결하는 것인가요?

gradient가 작아도 velocity가 실제 gradient보다 더 커지면 더 빨리 학습될 수 있음

 

Nesterov accelerated gradient

이걸 약간 변형해서 만든것이 Nesterov accelerated gradient이다. gradient를 계산하는 지점만 조금 다르다. velocity의 방향이 잘못되었을 경우에 현재 gradient로 보정해준다고 생각하면 된다.

- convex에서는 뛰어나나 NN과 같은 non-convex에서는 별로 안좋다.

- 평평한 minima가 더 Robust하다.

Q. velocity 초기값? 0

 

AddGrad

velocity 대신에 grad squared term을 사용한다.

small dimension에서는 제곱합이 작으니까 가속이 붙고, large dimension에서는 속도가 줄어든다.

단점: 진행할수록 step이 작아진다. convex에서는 좋으나 non convex에서 saddle 걸리면 멈춤

 

RMSProp

ADDGRAD랑 같으나 decay rate(0.9, 0.99)를 곱해줌

위의 문제 해결

자, 이제 결과를 보자

SGD보다 다 좋으나 행동양상이 다른것을 볼 수 있다. 가령 momentum의 경우 overshoot한 뒤에 minima로 돌아오는것이 보인다.

Q. 여러 알고리즘간에 같은 학습률로 비교하는 것은 공정하지 못함

Adam

위의 두 방법 momentum과 ada 계열을 합치자!해서 나온 것이 Adam이다. first moment와 second moment를 이용

first moment는 gradient의 가중 합 -> velocity 담당 -> 앞의 momentum 역할

second momnet는 제곱을 이용 -> 이걸로 나눠줌. 속도조절 -> 앞의 제곱항 역할

여기서 문제는 second moment를 0으로 초기화하는데 이로인해 step이 너무 커지게 된다. 이게 손실함수가 가팔라서 step이 커진게 아니기때문에 bias correction term을 추가해서 보정해준다.

bias correction term은 first/second moment를 업뎃하고 현재 step에 맞는 적절한 unbiased term을 계산해준다.

Adam은 진짜 좋은 최적화방식이다. beta1=0.9, beta2=0.999, 학습률 e-3,e-4 정도로만해줘도 거의 모든 아키텍쳐에서 잘 동작함

그럼에도 불구하구 adam 문제점도 있는데,

- 각 차원마다 속도를 조절할 수 있으나 언제까지나 축방향으로만 가능하다. 회전된 타원문제는 아직 알고리즘들이 다루지 못한다.


Learning Rate

학습에 있어서 learing rate도 정말 너무 중요한 요소 중 하나이다. Learning rate을 여러 방법들로 조절할 수 있다.

그렇다면 learning rate를 언제 낮춰야 할까?

수렴을 잘 하고 있는데 gradient가 점점 작아짐 -> learning rate가 너무 높아서 깊게 들어가지 못하는 것.

 

지금까지는 1차근사를 이용하여 optimization을 진행했다. 이걸론 부족하니 2차도 사용하자. 아래의 2차 테일러 근사함수에서 Hessian의 역행렬을 이용해서 실제 손실함수의 2차근사를 이용해 minima로 곧바로 이동할 수 있다.

이방법을 이용하면 learing rate가 필요엾다. 근사함수만들고, 그 최소값으로 이동만하면된다. 각 step 마다 항상 minima 방향으로 이동한다. 근데 사실 근사가 완벽한것이 아니라서 실제 학습에서는 learning rate가 필요하긴 하다고 한다. 근데 Hessian 행렬이 NxN이기때문에 연산량이 너무 많아져 딥러닝에서는 사용하지 않는다.

그래서 quasi Newton method를 사용한다. low rank 근사를 이용하는 방법.

L-DFGS도 있다.

-stocahstic case에서는 안좋음

-non convex에도 안좋음

지금까지 training error을 줄이기 위해 손실함수를 최소화시키는 optimization을 배워봤다. 하지만 중요한 것은 언제나 test data이다. test 데이터에서의 성능을 올리기 위한 방법들을 살펴보자.


Model Ensembles

-10개의 모델을 독립적으로 학습시키고 결과의 평균을 이용함. 성능 2퍼정도 향상

- 학습 도중 모델을 저장하고 앙상블로 사용하는 경우도 있음

-Learning rate을 낮췄다 높였다를 반복. 손실함수가 다양한 지역에 수렴할 수 있도록 해줌


Regularization

앙상블말고 단일 모델 성능 올리려면 regularization을 적절히 사용해야 한다.

Dropout

Dropout: forward pass 과정에서 일부 뉴런을 0으로 만듬. 한 레이어의 출력을 전부 구한 후 일부를 0으로 만듬. fc나 conv에서 사용.

- 네트워크가 특정 feature에만 의존하지 못하게 해줌

- 단일모델로 앙상블 효과

- test time에서는 dropout probablity를 출력에 곱해서 train과 기댓값을 같게 만든다. 반대로 train에서 p를 나눠서 사용

- dropout을 하면 각 스텝마다 업뎃되는 파라미터 수가 줄어들어 학습시간이 늘어나지만 일반화능력이 좋다.

- bn과 유사한 효과. 둘중하나만 사용

결국 regularization은 train time의 stochasticity가 추가되고, test time에 marginalize out하는것이다.

Dropconnect

- weigth matrix를 임의로 0으로 만듬

fractional max pooling

- pooling 연산 어디서할지 랜덤 선정

stochastic depth

- train time에 네트워크 레이어를 랜덤 drop. 일부만 사용해서 학습. test에서는 전체 다 사용

overfit 조짐이 보일때 하나씩 추가한다. 보통 BN이랑 dropout을 사용한다.


Data Augmentation

flip, crop,color jittering


Transfer Learning

모델 빠르게 학습시키기 전이학습

- CNN을 가지고 ImageNet같은 아주 큰 데이터셋으로 학습 한번 시킴

- 마지막 FC layer을 지금 필요한 거로 바꿈

- 마지막 레이어만 가지고 데이터 학습가능

- 학습률 낮춰서 사용

- 가중치 조금만 수정하면됨

전이학습 체크리스트

요즘 많이 사용중임. 유사 데이터셋으로 학습된 pretrained model을 이용해서 fine tune 시킴.

8강에서 뵙겠습니다!

반응형