[CNN] 3. Training 기법들 (Optimizer, Regularization, Drop out, Batch Normalization)
1. optimizer
Gradient Descent
- train DB 전체의 loss값을 구하고 이 전체에 대한 gradient를 구해서 weight 갱신
- 전체 데이터를 보는 중에 weight를 갱신할 수 없고 weight 수렴할 기회가 적다는 단점이 있다
- local minimum에 빠질 수 있다
SGD (Stochastic Gradient Descent)
- 하나의 data를 forward하여 loss를 계산하고 그때마다 weight를 갱신
- weight가 갱신되는 횟수가 많아졌다
- noise가 있는 이미지, 어려운 이미지, 생소한 이미지인 경우 weight가 안좋게 갱신될 수 있다는 단점이 있다
- 수렴이 느리지만 가장 성능이 좋은 편에 속한다
- MSGD
- mini batch 사용
- 하나의 data가 아니라 batch들의 loss을 합친 후 weight 갱신
- SGD의 단점을 완화할 수 있다
- W=W−η∂W∂L
momentum
- velocity가 포함되어있다
- 이전의 방향을 유지하려는 영향이 있다
- local minimum에서 벗어날 수 있다
- v=av−η∂W∂L
- W=W+v
AdaGrad
- sum of gradient squared
- 평균적인 값으로 학습이 진행된다
- 느리게 수렴되거나 수렴이 잘 되지 않는 단점이 있다
- h←h+∂W∂L⊙∂W∂L
- W←W−ηh1∂W∂L
RMS-prop
- AdaGrad에 지수 이동 평균 적용
- 수렴이 잘 되도록 개선
Adam
2. overfitting & underfitting
overfitting
- 모델이 너무 train set에 학습되었을 때
- train dataset에서는 loss가 매우 낮게 수렴한다
- 하지만 새로운 dataset에서는 성능이 좋지 않다
Underfitting
- train dataset에서 학습이 잘 되지 않았다
- dataset이 너무 적거나, 하이퍼 파라미터가 적절하지 못할 때
3. Regularization
- overfitting을 방지하기 위한 것
- overfitted model의 경우 weight 값이 크다. regularization을 통해 그 값을 작게 만들어 준다
- regularization은 loss function 안에 존재
L1 Regularization
L2 Regularization
- 제곱 사용
- L1보다 smooth하게 나오는 경우가 많다
torch.optim.SGD()
의 weight_decay 파라미터로 regularization을 할 수 있다
4. Drop out
- overfitting 되는 이유 중 특정값이 너무 커서 그 값에 평향되는 경우가 있다. 이 경우를 방지하기 위해 drop out
- 학습할 때 지정한 drop out 비율만큼 랜덤하게 layer의 weight들을 안쓰는 방법
- 추론할 때는 사용하지 않는다
5. Batch normalization
- y=Var[x]+ϵx−E(x)∗γ+β
- 각 batch별로 평균과 분산을 이용해 정규화하는 것
- conv - batch normalization - activation 순서로 진행
- activation을 진행하기 전에 input 값들을 stable하게 만들어 주는 역할을 한다
- 필수적으로 쓰이는 구조 중 하나이다
- batch normalization이 없는 경우,
- 예를 들어 relu를 사용하는데 input의 범위가 -40 ~ 5라고 하면 대부분의 경우 activation 결과가 0이 나오게 되는 문제가 발생
- 이때 scale 파라미터(γ)와 shift 파라미터(β)를 사용하여 평균과 분산을 다르게 학습할 수 있다
- torch.nn.BatchNorm2D()에 affine 파라미터의 default가 True이기 때문에 이 두 파라미터를 학습한다