[CNN] 3. Training 기법들 (Optimizer, Regularization, Drop out, Batch Normalization)

happy_quokka·2023년 12월 18일
0

딥러닝

목록 보기
7/18

1. optimizer

  • loss 값을 줄이는 것이 목적

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ηLWW = W - \eta\frac{\partial L}{\partial W}

momentum

  • velocity가 포함되어있다
  • 이전의 방향을 유지하려는 영향이 있다
  • local minimum에서 벗어날 수 있다
  • v=avηLWv = av - \eta\frac{\partial L}{\partial W}
  • W=W+vW = W + v

AdaGrad

  • sum of gradient squared
  • 평균적인 값으로 학습이 진행된다
  • 느리게 수렴되거나 수렴이 잘 되지 않는 단점이 있다
  • hh+LWLWh \leftarrow h + \frac{\partial L}{\partial W} ⊙ \frac{\partial L}{\partial W}
  • WWη1hLWW \leftarrow W-\eta \frac{1}{\sqrt{h}}\frac{\partial L}{\partial W}

RMS-prop

  • AdaGrad에 지수 이동 평균 적용
  • 수렴이 잘 되도록 개선

Adam

  • RMS-prop + Momemtum

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=xE(x)Var[x]+ϵγ+βy = \frac{x - E(x)}{\sqrt{Var[x] + \epsilon}} * \gamma + \beta
  • 각 batch별로 평균과 분산을 이용해 정규화하는 것
  • conv - batch normalization - activation 순서로 진행
  • activation을 진행하기 전에 input 값들을 stable하게 만들어 주는 역할을 한다
  • 필수적으로 쓰이는 구조 중 하나이다
  • batch normalization이 없는 경우,
    • 예를 들어 relu를 사용하는데 input의 범위가 -40 ~ 5라고 하면 대부분의 경우 activation 결과가 0이 나오게 되는 문제가 발생
  • 이때 scale 파라미터(γ\gamma)와 shift 파라미터(β\beta)를 사용하여 평균과 분산을 다르게 학습할 수 있다
  • torch.nn.BatchNorm2D()에 affine 파라미터의 default가 True이기 때문에 이 두 파라미터를 학습한다

0개의 댓글