네이버 부스트캠프/LEVEL-1

[부스트캠프][WK-02 / Day7] Optimization

1. 강의 내용

Optimization (최성준 교수님)

1) Optimization의 주요 개념

  • Generalization
    학습시 train error는 꾸준히 감소하지만 test error는 그렇지 않을 수 있습니다. 이 경우 Generalization performance는 Test Error와 Training Error의 차이를 말입니다. Generalization이 좋다는 것은 네트워크의 성능이 학습데이터와 비슷하게 나올 것이라는 보장입니다.
  • Overfitting & Underfitting
    Overfitting은 학습데이터에서 잘 동작하지만 test 데이터에서 잘 동작하지 않는 것을 말하며 Underfitting은 네트워크가 너무 간단하거나 학습을 조금 시켜 학습데이터도 잘 맞추지 못하는 것입니다. 사실상 학습데이터가 학습하고자 하는 목적에서 나온 데이터라고 가정하고 있을 뿐이지, Overfitting처럼 많이 변하는 것이 target일 수도 있습니다.
  • Cross-validation
    학습데이터로 학습시킨 모델이 validation을 기준으로 얼마나 잘되는지 보는 것입니다. validation을 쓰면 학습데이터가 적어지는 문제가 생기기 때문에 Cross-validation을 사용해 학습 데이터를 k개로 파티셔닝을 하고 k-1개로 학습시킨 뒤 나머지 1개로 검증하는 과정을 k번 거치게 됩니다. Neural network에는 많은 하이퍼 파라미터가 존재하는데, 어떤것이 좋은지 모르므로 Cross-validation을 통해 최적의 하이퍼 파라미터셋을 찾고 해당 하이퍼 파라미터로 전체 데이터를 학습시킵니다.
  • Bias & Variance
    Variance는 입력을 넣을 때 출력이 얼마나 일관적으로 나오느냐를 말합니다. Bias는 출력이 평균적으로 true target에 접근하게 되면 낮아집니다. Bias-Variance tradeoff는 한쪽의 값이 커지게 되면 다른 한쪽의 값은 자연스럽게 작아지게 된다는 것을 의미하며 이 과정에서 tradeoff가 발생하게 됩니다. 결국 Bias와 Variance를 모두 줄이는 것은 얻기 힘듭니다.
  • Bootstrapping
    Bootstrapping은 통계학에서 많이 활용되는데, 학습데이터의 일부를 사용해 여러개의 모델을 만들어 각 모델들이 예측하는 값이 얼마나 일치하는지를 보고자 할 때 사용합니다.
  • Bagging & Boosting
    Bagging은 boostrapping처럼 여러 모델을 만들어서 모델들의 예측값을 평균을 내는 방법입니다. 이를 앙상블이라고도 하며 자주 쓰입니다. Boosting은 모델을 하나 만들고 학습데이터에 대해 돌려봐서 두번째 모델부터는 잘 예측하지 못하는 데이터에 대해서만 학습해 이런 각각의 모델을들 sequencial하게 합쳐 강한 모델을 만드는 방법입니다.

2) Gradient Descent Methods

  • Stochastic gradient descent: 1개의 샘플로만 그레디언트를 구하고 업데이트하는 방식
  • Mini-batch gradient descent: 미니 배치의 샘플로 그레디언트를 구하고 업데이트하는 방식. 보통 Mini-batch gradient descent를 사용합니다.
  • Batch gradient descent: 모든 데이터를 사용해서 그레디언트를 구하고 평균으로 업데이트하는 방식

Batch-size는 굉장히 중요한 파라미터입니다. 큰 배치 사이즈를 사용하게 되면 sharp minimizer에 도달하게 되고, 작은 배치 사이즈를 사용하게 되면 flat minimum에 도달하게 됩니다. flat minimum에 도달하는 것이 좋은데, flat minimizer가 Generalization 성능이 높기 때문입니다. 즉, 배치 사이즈를 줄이면 일반화 성능이 좋아집니다.

Gradient Descent Methods

  • Stochastic gradient descent: learning rate를 적절히 설정하는게 어려움

  • Momentum: 관성을 통해 한번 흘러간 방향을 어느 정도 이어갈 수 있습니다.

  • Nesterov Accelerated Gradient: Lookahead gradient를 계산하는데, Momentum과 달리 한 번 이동해서 그레디언트를 계산해보고 넣어주는 것입니다. 이것을 사용해주면 local minima에 빠르게 수렴하는 효과가 있습니다.

  • Adagrad: 지금까지 많이 변한 파라미터($G_t$)는 조금만 변하게 해주고, 조금 변한 파라미터는 많이 변하도록 해주는 방법. 하지만 $G_t$는 계속 커지게 되기 때문에 결국 분모가 무한대로 가까워져 학습이 멈추게 되는 문제가 생깁니다.

  • Adadelta: EMA(Exponential Moving Average)를 통해 $G_t$를 업데이트 함으로써 Adagrad의 문제를 해결하고자 한 방식이지만 learning rate가 없어 많이 활용되지 않습니다.

  • RMSprop: Adadelta의 방식을 사용해 $G_t$를 업데이트하는데 Adagrad처럼 step size를 넣어주어 보완한 방식입니다.

  • Adam: 가장 무난히 사용되고 잘되는 방식입니다. gradient scale에 따라 adaptive하게 learning rate를 바꾸는 방식에 momentum의 방식을 합쳐 만들었습니다.

3) Regularization

Generalization이 잘되게 하기 위해 학습에 규제를 거는 방식입니다.

  • Early Stopping: validation error가 줄어들다가 커지는 시점에 멈추도록 하는 방법
  • Parameter norm penalty: 파라미터가 너무 커지지 않도록 하는 방법. 함수의 공간속에서 함수를 부드러운 함수로 바꿔줍니다. 부드러운 함수일수록 Generalization 성능이 높을 것이라는 가정을 가집니다.
  • Data augmentation: 데이터가 많으면 그만큼 학습이 잘됩니다. 하지만 데이터가 한정적이기 때문에 이 방법을 사용합니다. 데이터에 변화를 줘 늘리는 등 다양한 방법을 사용하는데 Label이 변경되지 않는 선에서 사용해야 합니다.
  • Noise robustness: Noise를 input과 weight에 넣어주는 방법입니다.
  • Label smoothing: Data augmentation과 비슷한 방법이지만 차이점을 이야기하면 데이터 두 개를 섞어주는 방식으로 decision boundary를 부드럽게 만들어주는 효과가 있습니다. Mixup, Cutout, CutMix 등의 방식이 있습니다. 효과가 생각보다 많이 좋습니다.
  • Dropout: neuron들을 0으로 바꿔줘서 좀 더 각 neuron들이 robust 한 feature들을 잡을 수 있다고 해석합니다. 성능이 올라가는 효과가 있습니다.
  • Batch normalization: 적용하고자 하는 layer의 statistics를 정규화 시키는 것입니다. 활용했을 때 깊게 쌓인 레이어에 대해서 성능이 좋아지는 현상을 확인할 수 있습니다. 비슷한 방법으로 Layer Norm, Instance Norm, Group Norm 등이 있습니다.

2. 과제 수행 과정 / 결과물 정리

Optimizer 별로 모델에 적용해 시각화
Adam이 가장 빠르게 원하는 값에 도달하는 것을 확인할 수 있었습니다. SGD의 경우 다른 Optimizer에 비해 가장 느리게 적합하는 것을 볼 수 있었습니다. 물론 긴 시간동안 학습한다면 SGD가 성능이 제일 잘 나올 수 있지만 빠른 시간내에 결과를 내야한다면 Adam이나 RAdam을 먼저 사용하는 것이 좋아 보입니다.


3. 피어세션 정리

https://hackmd.io/_Gxd8fH-SwCvzKAZAFDKSA?view


4. 학습 회고

  • TimeseriesCV, AdamP, RAdam 등에 대한 추가적인 공부 및 정리가 필요
  • Optimizer에 대해 대략적으로 파악했으며 조금 더 깊은 공부가 필요