-강의 영상
- Problem with optimizer SGD
지난 강의에서 설명한 optimizer 중 SGD는 실제 학습을 하는 과정에서 많은 문제에 직면한다.
첫번째 문제로, 위와 같이 파라미터에 대한 공간이 비균등할 경우 어느 한 차원에 대한 가중치 변화에 더 민감하게 반응하여 다음과 같이 지그재그로 update되는 양상을 보이며, 가장 낮은 loss값의 optima에 접근하는 속도가 매우 느려질 수 있다.
두번째 문제는 local minima와 saddle point 문제이다. local minima는 위의 첫번째 그림처럼 gradient가 0이지만 최적의 optima가 아닌 지점을 말한다. saddle point는 양 쪽 뱡향에 대한 gradient의 부호는 같지만, 중간에 0이 되는 지점이 있는 상황이다. 두 상황 모두 학습을 멈추게 하는 문제점이 있다. 실제 상황에서 local minima는 saddle point 보다 더 심각한 문제처럼 보여질 수 있지만, 고차원으로 갈수록 local minima보다 saddle point 문제가 더 빈번하게 발생을 한다.
세번째는 우리는 실제로 full batch를 사용하지 못하고 mini-batch를 사용하기 때문에 발생하는 문제이다. mini-batch를 사용하게 되면 full batch를 사용하는 방향에 대해 noise값이 더 추가가 되기 때문에 위의 그림처럼 최적의 경로가 아닌 극단적으로 여기저기 움직이면서 optima를 찾을 수 있다. 이렇게 된다면 학습 속도가 저하되는 문제가 발생할 것이다.
- SGD + Momentum
강의에서는 위와 같은 문제를 해결하기 위해서 기존의 SGD에 momentum term을 추가한 optimizer를 소개한다.
위의 식은 기존의 SGD와 momentum을 추가한 식의 차이점을 보여준다. 아이디어는 매우 간단한데, update를 할때, gradient만을 고려하지 말고 기존의 velocity도 함께 고려한다는 idea이다. 여기서 rho값은 velocity의 영향력이며, 해당 값은 일반적으로 0.9로 세팅한다. 결과적으로 기존의 gradient vector 뿐 만 아니라 velocity vector도 고려를 하므로, 앞에서의 문제점이 였던 local minima, saddle point에 대한 문제를 쉽게 해결할 수 있다. 또한 첫번째 문제였던 지그재그로 가는 문제에 대해서도 momentum이 변동을 상쇄시키고 민감한 축에 대한 변동을 줄이고 덜 민감한 축에 대한 움직임을 가속시켜 문제를 해결한다.
-Nesterov Momentum
강의에서는 non-convex 문제에서는 잘 working하지 않지만, convex에서는 잘 working하는 Nesterov Momentum을 소개한다. 왼쪽이 기존의 momentum을 나타내는 그림이고, 오른쪽은 Nesterov Momentum에 대한 개념을 나타낸다. 그림으로 알 수 있듯이 Nesterov Momentum은 velocity만큼 움직인 지점에서 gardient를 구하고 update한다. 이는 velocity 방향이 잘못 되었을 경우에 현재 gradient의 방향을 좀 더 활용할 수 있도록 하는 개념이다.
위의 첫번째 박스는 Nestrov Momentum을 식으로 나타낸 것이고, 구현의 편의성을 위해서 아래식을 일반적으로 사용한다. (대학원 교수님 말씀에 의하시면, Nestrov momentum은 실제로 잘 사용하지 않는다고 한다.)
- AdaGrad
AdaGrad는 velocity term을 사용하지 않고 훈련도중 계산되는 gradient를 이용하는 방법이다. gradient의 제곱 값들이 계속해서 더해주고, update하는 termdp서 계속 제곱해서 더해준 값들을 나눠준다. 이렇게 되면, 위의 그림과 같은 상황에서 수직축과 같이 gradient 값이 큰 축 방향은 점점 더 느리게 이동할 것이고, 수평축과 같이 gradient 값이 작은 작은 축 방향은 점점 더 가속도가 붙어 SGD의 3가지 문제점 중 첫번째 문제를 해결할 수 있을것이다.
하지만 AdaGrad의 문제점이 있는데, iteration이 많이 질수록 분모값이 커져서 step size가 점점 줄 것이고, 이는 convex한 상황에서는 좋은 상황이지만, non convex한 상황에서는 saddle point와 local minima 같은 문제에 직면했을때 학습이 멈춰버릴수 있다.
- RMSProp
RMSProp은 AdaGrad의 문제를 해결하기 위해 등장했다. 위의 식을 살펴보면, grad_squared는 그대로 사용하고, 대신 현재 가중치의 제곱을 기존의 grad_squared에 일정비율 더해주는데, 이는 momentum과 같은 개념으로 보면 이해하기 쉽다. 이를 통해서 saddle point와 같은 곳에서 속도가 주는 문제를 해결한다.
- Adam
Adam은 RMSProp과 momentum의 개념을 동시에 사용하고자 하는 아이디어에서 나왔다. first_moment는 momentum의 개념을, second_moment는 RMSProp의 grad_squared의 개념을 나타낸다. 또한 현재 step에 맞는 적절한 unbias term을 각각 계산한다. 예를들어 second_moment가 초깃값으로 0이 주어지면, beta2값이 0.99로 x를 업데이트하는 값이 매우 작아져서 x값이 매우 커질수 있기 때문에, 축에 가파른 정도에 따른 올바른 업데이트를 하도록 도와주기 위해서 unbias를 이용하여 update한다. 일반적으로 이러한 Adam은 매우 잘 작동하기 때문에 많이 사용한다.
- Regularization
우리는 지금까지 train하는 과정에서 error를 줄이기 위해서 노력했다. 하지만 실제로 우리는 train error보다 test error에 대해 집중해야한다. 지금까지 한번도 보지 못했던 data에 대해 잘 맞춰야하기 때문이다. 강의에서는 train error와 test error의 gap을 줄이기 위한 몇가지 방법을 소개한다.
처음으로 소개하는 것은 model ensembles이다. 해당 아이디어는 아주 간단한다. 하나의 모델이 아닌 여러개의 모델을 독립적으로 학습하여, 여러개 모델에 대한 평균을 사용하는 것이다. 해당 방법은 일관적으로 2%의 성능을 올린다고 한다. 또한 학습하는 중간 중간 model의 snapshot을 만들고, 이러한 모델들을 앙상블로 이용하는 방법도 소개한다.
다음으로 소개하는 방법은 Dropout이다. 해당 방법은 일반적으로 많이 사용하는 regularization 방법이며, 그림과 같이 임의의 뉴런을 0으로 만드는 방법이다. forward pass마다 0이 되는 뉴런을 임의로 선택하고, 레이어마다 모든 출력을 구하고 출력값을 0으로 바꾸고 다음 레이어로 넘어가는 방식이다.
그렇다면, Drop out이 좋은 이유가 무엇일까? drop out은 Neural network를 심각하게 훼손시킨다. 이는 위의 그림처럼 네트워크가 어떤 일부 feature만 의존하는 현상을 막아준다. 다양한 feature를 이용할 수 있는 여지를 주는것이다. 예를들어보면, 우리가 만약에 위와같이 고양이를 찾고 있는다고 가정하자. 그러면 위와같이 ear와 furry, mischievous look이라는 특징이 off된다면, 우리는 해당 특징들 없이 tail과 claw를 가지고 고양이를 찾으려고 노력할 것이다. 이렇게 특징들을 골고루 이용하게 하여 regularization 효과를 준다고 직관적으로 이해할 수 있다.
또한 drop out은 단일 모델에 대한 서브 네트워크의 앙상블로 간주 할 수 있다. Drop out을 적용하게 되면, 모든 노드를 사용한 단일 network의 일부만 사용한 서브 네트워크가 될것이다. 따라서 drop out은 파라미터를 공유하는 서브네트워크들의 앙상블이라고 생각할 수 있는것이다.
그렇다면 dropout을 사용하면 test time에 어떻게 될까? test time에서는 inference하는 행위가 임의적으로 바뀌면 안되기 때문에 randomness를 주는것은 옳지 않다. 그래서 이러한 임의성을 없애주는 문제를 해결하기 위한 방법으로 적분근사가 있고, 이를 위해 위와 같은 과정을 거친다.
test time에서의 a를 위와 같이 w1*x + w2*y라고 해보자. train time에서 a에 대한 dropout 0.5 확률을 적용하게 되면, 기댓값이 위의 오른쪽 아래 식과 같이 전개 됨을 알 수 있다. 값이 mask 되는 경우의 수는 4가지로 각 경우에 따른 확률을 곱해준 것이다. 따라서 train time에서 a의 기댓값은 1/2(w1*x + w2*y) 임을 알 수 있다.
이는 test time a에 기댓값과 train time a의 기댓값이 다르다는 것을 알 수 있다. 이러한 기댓값을 맞춰주기 위해서 test time에서 layer마다의 출력에 dropout probability를 곱해준다.
predict하는 코드를 구현할 때 위와같이 p를 곱해줌으로써 매우 간단하게 구현할 수 있다.
- Data Augmentation
Regularization 패러다임에 부합하는 또 한가지 전략은 Data augmentation이다.
Data Augmentation은 original 이미지에 대해서 레이블은 그대로 놔둔체 이미지를 무작위로 변형한다. 이미지를 변형하는 많은 방법이 있는데, 강의에서는 Horizontal Flip(좌우반전), Random crop / scales, Color Jittering, contrast 또는 brightness 변경 방법 등을 소개한다.
추가적으로 다양한 Regularziation에 대해서 소개하며, weight를 random하게 만드는 Drop connect, pooling 구역을 random하게 사용하는 Fractional Max Pooling, train time에서 layer 일부를 drop하고 test time에는 전체 layer를 사용하는 Stochastic Depth 방법을 간단히 소개한다.
- Transfer Learning
충분한 양의 데이터가 없을 경우에 발생하는 overfitting을 막는 방법에서 Regularization 말고도 일반적으로 많이 사용하는 방법은 Transfer learning이다.
수행하는 방법은 간단하다. 먼저, 왼쪽 위와 같은 그림의 네트워크를 데이터셋 크기가 큰 imagenet으로 학습을 시킨다. 그러면, 해당 네트워크는 충분히 잘 학습이 될 것이다. 그 후 내가 수행하고자 하는 task가 기존 학습된 모델과 다른 class의 갯수를 갖는 이미지를 분류하는 task라면, task에 맞게 마지막 layer의 차원을 수정해주고 초기화시킨다. 그 후 해당 task의 데이터를 가지고 초기화한 부분을 제외하고는 freeze 시킨 뒤 학습을 진행한다. 이렇게 하면 작은 데이터 셋을 사용하더라도 overfitting 문제를 해결할 수 있다.
새로 적용하는 task의 데이터셋 크기가 어느정도 크다면, 위의 오른쪽 그림과 같이 더 많은 layer를 초기화 시키고 학습할 수 있다. 이때, 기존의 학습된 파라미터가 크게 변하지 않도록 learning rate는 작게 설정한다.
따라서 transfer learning에 대해서 위와 같은 테이블로 시나리오를 정리할 수 있을 것이다. 새로운 task 데이터로 재학습 하는 과정을 finetune 한다고 한다.
Transfer learning은 위와 같은 Object Detection과 Image Captioning 과정과 같은 image task에서 많이 사용된다.
출처 : Stanford University School of Engineering, http://cs231n.stanford.edu/
'AI > cs231n' 카테고리의 다른 글
[강의정리] Lecture 6: Training Neural Networks, Part 1 (0) | 2021.12.24 |
---|---|
[강의정리] Lecture 5: Convolutional Neural Networks (0) | 2021.09.24 |
[강의정리] Lecture 3: Loss Functions and Optimization (0) | 2021.09.16 |
[강의정리] Lecture 4: Backpropagation and Neural Networks (2) | 2021.09.13 |
[강의정리] Lecture 2: Image Classification pipeline (0) | 2021.08.29 |