Fancier optimization
SGD(Stochastic Gradient Descent)의 문제점
Loss function의 수평방향이 간격이 짧고 수직방향이 간격이 넓을 때 Gradient의 방향이 고르지 못하고 지그재그로 움직인다. (고차원일수록 이런 문제가 빈번하게 발생)
Local minima에 빠질 위험이 있다. Gradient가 0인 구간에서 학습이 멈추게 된다. Saddle points의 근처는 Gradient가 작아서 느리게 업데이트 된다.
Neural network의 경우 local minima 보다 saddle point에 취약하다.
- Mini batch를 이용해 gradient를 구해주고 실제 loss값을 추정하기 때문에 부정확한 값을 얻게 된다. (noise가 생김), minima에 도달하는 시간도 오래 걸림
SGD + Momentum
> gradient의 방향뿐 아니라 velocity를 같이 고려한다.
> Local Minima, Saddle points에서 gradient가 0이 되더라도 velocity가 유지되어서 loss가 계속 내려갈 수 있게 된다.(관성을 이용한다고 쉽게 이해하면 좋다)
Nesrerov momentum
> 기본 SGD momentum은 현재 지점에서의 gradient를 계산한 뒤에 velocity를 섞어준 것
> Nesrerov momentum은 velocity로 옮긴 후에 gradient을 사용 (velocity의 방향이 잘못되었을 경우 gradient의 방향을 좀더 활용할 수 있도록 한다) – Convex problem에서 성능이 보장된다.
> momentum 방법들은 velocity에 영향을 받아 minima를 그냥 지나쳐 버리는 경향이 있다.
cf) 좁고 깊은 minima는 overfitting을 일으킬 여지가 있으며 평평한 minima는 일반화를 잘 할 수있다. 아주 평평한 minima는 training data의 변화에 좀더 robust하다. Train data가 추가 되어 loss function 지형이 바뀌더라도 영향을 덜 받는다.
AdaGrad
> over shootting하는 것을 막아주는 방법
> 훈련 도중에 계산되는 gradients를 제곱하여 사용해준다. 빠르게 변화하는 Gradient는 큰 수로 나누고, 느리게 변하는 Gradient는 작은 수로 나누어 Gradients에 경도되지 않는 효과를 가져온다.
> Step을 진행 할수록 gradients의 제곱 값이 증가하기에 step size(x)가 점점 작아진다.
> Non-Convex case의 saddle point에서 stuck할 가능성이 있다.
RMSProp
> decay_rate항을 이용하여 step(x)이 0에 가까워 지지 않도록 만들어준다(AdaGrad의 문제점을 보완). 학습이 잘 된다.
> decay_rate(일반적으로 0.9, 0.99 사용)
Adam
> 가장 일반적으로 사용하는 optimizer, velocity와 square_gradient를 동시에 사용한 방법
> 첫번째 second_moment의 초기값은 0 이며, beta2는 decay_rate로 0.9, 0.99이다. 이때 1회 update를 하였을때 Second_moment가 0에 가까운 값이 된다. 결국 step size가 커지는 문제가 발생 (0에 가까운 second_moment을 나누어 주기 때문에)
> 초기 Step이 커져 버리는 문제를 해결하기 위해서 bias correction 항을 추가
> learning rate를 선정하는 것은 쉽지 않은 일이기 때문에 learning rate를 크게 잡아놓고 학습이 진행될 수록 줄이는(decay) 방법을 사용한다.
> Learning rate decay 방법은 학습 초기부터 고려하는 방법이 아니다. Second-order 하이퍼 파라미터이다.
> Loss function의 1차 미분 값을 이용해서 loss를 최소화시킨다.
> 2차 미분 함수를 이용하여 1차 미분 함수보다 빠르게 loss값에 접근한다.
> hessian matrix를 사용하여 2차 미분 함수 문제를 해결, 단 딥러닝에서는 사용하지 못한다. (Hessian matrix는 N*N 행렬인데 N의 수가 커버리면 메모리에 저장할 방법도 없고 계산에 문제가 발생한다.)
> Loss function의 optimization을 끝마친 상태에서 test 데이터의 성능을 올리기 위해서 Ensembles 사용
모델을 독립적으로 학습
독립적으로 학습한 모델들의 평균을 이용한다.
> 학습 도중 중간 모델들을 저장(snapshot)하고 Ensemble시행
> learning rate를 엄청 낮췄다가 높였다가를 반복하면서 loss function이 다양한 지역에 수렴할 수 있도록 만들어준다.
Regularization
> Regularization term을 추가하여 train data에 overfitting 하는 것을 방지한다. 한번도 보지 못한 unseen data의 성능을 향상시킨다.
단) 딥러닝에선 L2를 잘 사용하지 않는다.
> 임의로 일부 뉴런(node)들을 0으로 만들어 준다. 일부의 뉴런으로 학습 진행 (Prevent co-adaptation of features – 불필요한 정보는 학습 X)
> 어떤 일부 features에만 의존하지 못하게 하여서 overfitting을 방지한다. dropout되지 않은 노드들은 dropout된 특성들을 커버하려고 한다.
> dropout은 ensemble효과를 가지고 있다. 살아남는 node들이 매번 바뀜 (즉 여러 sub network가 존재하며 network는 다르지만 동일한 가중치를 공유한다고 생각). 여러 sub network를 동시에 학습시키는 것으로 생각할 수 있다.
> Test time에 Randomness를 부과하는 것을 좋지 못하다 – 정확한 모델이 되지 않아 문제 발생
> Test data의 Randomness를 적분을 하여 average out을 하는 것이 좋지만 여기서는 다른 간단한 방법을 통해서 Randomness를 없애준다. Test time 기대값은 train time 기대값의 절반이 된다.
> dropout probability(0.5)를 Test time에 곱하여 동일한 모델이 되도록 만들어준다.
> Test time에 dropout probability를 곱하는 것은 Test time의 계산량이 증가하여 실제 Test를 하였을 때 시간이 오래 걸릴 수 있다. 이를 방지하기 위해서 train time에 dropout probability을 나누어서 식을 이전과 동일하게 유지해준다.
> 정리하면 dropout은 Train time에 randomness를 추가하여서 train data에 너무 fit하지 않게 만들어주는 것이며. Test time에서는 randomness를 평균화 시켜준다.
> Batch Normalization도 유사하게 작동한다. Train단계에서 데이터를 샘플링 하여 mini batch를 만들어 줄 때 매번 서로 다른 데이터를 만나게 된다(stochasticity 존재). Test time에서는 train time에서 모델의 가중치를 평균화하여 사용한다. 따라서 Batch Normalization는 regularization과 유사한 효과를 가진다.
> Data Augmentation을 통해서 Regularization효과를 나타낼 수 있다. 즉 무작위로 변환시킨 여러 이미지를 학습을 하여서 이미지 변형에도 robust하고 general한 모델을 만들어 낸다.
> Data Augmentation의 예 – Horizontal Flips, Random crops and scales, Color jitter
> DropConnect도 Regularization효과를 낼 수 있다. Edge(weight matrix)를 0으로 만들어 주는 방법
Transfer Learning
> Transfar Learning은 이미 학습된 모델을 이용하는 것, 작은 dataset만을 가지고도 문제를 해결 할 수 있다.
- ImageNet과 같은 아주 큰 데이터 셋으로 학습을 시킨다. (4096 * 1000)
- 새로운 문제를 풀기 위해서 마지막 layer를 초기화 (4096 * 10), 나머지 layer는 freeze, 결국 마지막 레이어만 가지고 데이터를 학습
> 데이터가 조금 더 많다면 마지막 layer만 학습하는 것이 아니라 좀 더 많은 layer을 이용해서 학습할 수 있다.