HANA : Have A Nice AI

모두를 위한, 하나를 위한 AI

딥러닝을 위한/가이드(Guide)

[논문요약] Classification 학습방법 - Bag of Tricks(2018)

KM-Hana 2021. 4. 1. 20:39

*크롬으로 보시는 걸 추천드립니다*

 

이미지 Classification의 성능을 최대한도로 높이기 위한 방법을 제시하는 

논문 : Bag of Tricks for Image Classification with CNN [arxiv.org/pdf/1812.01187.pdf]

을 소개해 드리려고 합니다.

 

종합 : ⭐⭐⭐

1. 논문 중요도 : 4점

2. 실용성 : 5점

설명 : 최대한 성능을 끌어올려 보자! - 성능을 높이기 위한 종합 선물 세트

   - ResNet 모델을 학습할 때, 최대한의 성능을 뽑아내기 위한 여러 보조적인 방법들을 소개합니다

   - Learning Rate Schedule이나 Regularization, Decay 적용 등에 대한 Ablation Study를 진행했습니다

   - 성능 향상을 위한, 여러 팁들을 얻을 수 있는 재밌는 논문입니다.

   - 적용하기 쉬운 방법 부터 어려운 방법까지 다양하게 있어, 선별에서 사용하면 도움이 될 수 있습니다

   - Classification Task에 한정된 실험이라는 것은, 단점입니다.

 

( * 개인적인 의견이며, 제 리뷰를 보시는 분들에 도움드리기 위한 참고 정도로 봐주세요)

 

※ 참고 코드 자료

www.dlology.com/blog/bag-of-tricks-for-image-classification-with-convolutional-neural-networks-in-keras/

 

Bag of Tricks for Image Classification with Convolutional Neural Networks in Keras | DLology

Posted by: Chengwei 2 years, 3 months ago (Comments) This tutorial shows you how to implement some tricks for image classification task in Keras API as illustrated in paper https://arxiv.org/abs/1812.01187v2. Those tricks work on various CNN models like

www.dlology.com


Introduction

     - Image Classification에서 성능을 높이기 위한 주된 방법은 Data Augmentation이나 Optimization 정도이다.

     - 여러 보조적인 방법들(Bag of Tricks)의 비교실험(Ablation Study)을 통해, 정리하고자 함

     - ResNet → SE-ResNext 성능 : ACC 3.6 %↑향상

     - ResNet ResNet + Bag of Tricks 성능 : ACC 4 %↑향상

     - Object Detection과 Segmentation 적용(Transfer Learning)에도 더 좋은 성능을 보였다.

       ▶ 보조적인 방법들만으로도 더 높은 성능을 보일 수 있음 (Architecture를 향상시키는 것보다)

  ※ 논문 개요

     2 장 : Training 과정의 Baseline을 설정

     3 장 : GPU에서의, 효율적인 학습을 위한 트릭(Tricks)

             -  

     4 장 : ResNet 구조 변경

     5 장 : 성능 향상을 위한, Training 과정 개선

Training Procedures - Baseline

     - 기본 Architecture : ResNet

     1. Random Sampling + decode 32-bit float [0, 255]

     2. Random Crop : aspect ratio [3/4, 4/3] + area[8 %, 100%] → Resize 224x224

     3. Filp horizontal : 0.5 Prob

     4. Scale hue(색조), saturation(채도), brightness(명도) with Coef [0.6, 1.4]

        ※ Color Augmentation 예시 : 

더보기

        ※ Color Augmentation 예시 : 

   - mxnet.apache.org/versions/1.5.0/tutorials/gluon/data_augmentation.html : 더 자세한 예시 참고

     5. PCA noise 추가 : Normal dist ~ N(0, 0.1) ( * AlexNet에서 사용한, Random PCA Lightening Noise)

        ※ PCA noise 예시 : 

더보기

        ※ PCA noise 예시 : 

https://mxnet.apache.org/versions/1.5.0/tutorials/gluon/data_augmentation.html

     6. RGB 정규화 : 평균 [ 123.68, 116.779, 103.939 ] / 표준편차 [ 58.393, 57.12, 57.375]

Hyper Para. - Baseline

     1. Weight Initialization : Xavier - \( Uniform[-a, a] ; a = \sqrt{6/\left ( d_{in} + d_{out} \right )} \)

        - \(  d_{in}, d_{out} \) : input and ouput channel size

        - Bias : 0으로 초기화

     2. Batch Normalization 초기화 : r - 1 / beta - 0 

     3. Optimizer : NAG(Nesterov Accelerated Gradient)

더보기
Hands-On Machine Learning with Scikit-Learn and Tensorflow Book

* Hands-On Machine Learning with Scikit-Learn and Tensorflow :

  딥러닝 기초 개념을 잡는 용으로, 추천하는 책 중 하나입니다!

     4. 120 Epoch / Batch-size : 256

     5. Learning Schedule : 0.1로 시작 30, 60, 90 Epoch에서 10씩 Decay

Validation Procedures - Baseline

     1. 이미지의 비율 유지 + 짧은 면을 256으로 Resize → 224x224 Center Crop

     2. Training 설정과 같게 - Normalize RGB 

     3. 다른 Data Augmentation은 사용 X

   * 위에 간단한 설정만으로 ResNet Baseline은 Reference보다 높은 성능을 보였다.

     - 반면, Inception 계열은 성능이 조금 떨어졌다.

 

Efficient Training

     - GPU와 같은 HW의 성능이 빠르게 발전하고, 더 큰 Batch Size나 lower Numerical Precision을 사용할 수 있음

     - 모델의 정확도와 빠른 학습 속도는 Trade-off가 있음

     - 본 Section에서는 훈련 속도와 정확도를 모두 향상할 수 있는 Trick을 소개

 

Large-batch Training에 대한 고찰

    Large-batch size는 오히려 훈련 진행 속도가 느려질 수 있음

       - Convex problem관점에서, Convergence rate이 줄어듦 = 동일 Epoch 시, 정확도 ↓

       - 관련 논문 : Don’t decay the learning rate, increase the batch size(2017).

       - 요약 : Large Batch size를 사용하면, Training Function의 Sharp minima로 수렴할 가능성이 높으며,

                  Generalization 성능이 저하됨

                : Batch size를 키우는 건, Learning rate를 줄이는 효과가 있음

       - 결론 : Batch size를 키우는 만큼, Learning rate를 높야함

      참고자료 : honeyjamtech.tistory.com/43blog.lunit.io/2018/08/03/batch-size-in-deep-learning/

 

Large-batch 사용을 위한 해결 방안

     Linear scaling learning rate :

      - Batch Size 증가는, Gradient의 기댓값을 줄이지는 않지만, Variance를 줄임

      - 즉, Batch Size 증가는 Noize의 감소이므로, Local minimum에서 벗어나기 위해선 Learning rate(LR)를 키워야 함

      - Batch size의 증가만큼, Learning rate를 선형적으로 증가시켜야 함

      - 초기 Learning rate 0.1 일 때, Batch Size가 256 설정 → batch size \( b \) 증가만큼, LR도 \( b \) 만큼 증가

 

     Learning rate Warm-up :

      - Parameter가 Random values로 설정되므로,

        초기부터 큰 Learning rate(LR)는 학습의 불안정을 초래할 수 있음

      - 초기 5 Epoch동안 Warm-up을 시킨다

      * 텍스트 딥러닝 모델(BERT)에서도 자주 사용되는 방법

Warm-up Learning rate 예시

더보기

 Warm-up Learning rate 예시

 

     No bias decay :

      - Weight에만 L2 Regularization 적용 → Overfiting 방지를 위해서 사용

 

     Zero \( \gamma  \)

      - ResNet Block에서 마지막 Layer에는 Batch Normalization(BN)이 있음을 이용

      - Batch Normalization(BN)에서 \( \gamma  \)와 \( \beta \) 는 학습 가능한 Parameter

      - \( \gamma  \)는 input \( \hat{x} \)를 Scaling 시키는 Parameter

      - 초기에 Batch Normalization의 \( \gamma  \) 를 0, \( \beta \) 을 1로 초기화시키면,

        Block은 학습이 되지 않고, Skip Connection으로 만 Loss가 흐르게 됨 

        ▶ 초기 학습 단계 동안, ResNet50이 작은 크기의 모델과 같아지며, 안정적으로 초기 학습을 할 수 있음

Zero \( \gamma \) 예시

Low-Precision Training을 위한, 테크닉

     Low-Precision이란

      - 32-Bit Float point(FP 32) → 16-Bit Float point(FP 16)으로 변경

      - Low-Precision을 적용할 경우, 2~3배 빠르게 학습할 수 있으나, 성능이 저하될 수 있음

        ( ∵ Numeric의 범위가 줄어들어, 정밀한 학습이 되지 않음)

[paper] : Mixed Precision Training(2017)

      1) FP16으로 모든 Parameter 저장

      2) FP16으로 Gradient 계산

      3) Weight Update를 위해서, FP32으로 모든 parameter 동시 저장

        ※ 추가 참고 자료 : hoya012.github.io/blog/Mixed-Precision-Training/

 

Efficient Training 실험 결과

더보기

   - 13.3 Min/Epoch → 4.4 Min/Epoch로 증가

 

   - 모든 heuristics 방법 + FP16 : 정확도는 약간 증가

   - Batch size 1024일 경우, 성능은 약간 저하됨

   - No bias Decay 사용 시, 성능은 저하되어 안 써도 될 것으로 판단됨

Model Tweaks 

     Model Tweaks란 

      - Computational Complexity는 거의 변경되지 않으면서, 모델의 Architecture를 조금 수정하여 성능을 높임

 

     기존 ResNet의 특징 

      - 기존 ResNet의 특징에 대해서 한번 더 짚고 넘어가겠습니다

ResNet 기본 구조

      - 1-Block(Stem) : 7x7 Conv(stride = 2) → 3x3 Max Pooling (stride = 2) : 1/4 배로 Input image를 축소

      - Stage 2 ~ 4 Block : 각 Block을 시작할 때, Down-sampling(stride = 2)을 적용한 후 Residual Block이 쌓임

      - Path A : Main Conv / Path B : Skip-Connection

 

     ResNet Tweaks(변형) 

    - ResNet-B : Torch 구현에서 처음 등장함.

      º Block에서의 Down-Sampling 방식을 변경함.

      º 기존의 방식에서는 Input Feature의 3/4가 1x1 Conv(Stride =2)를 통해, 무시됨

      º 무시되는 Feature를 줄이기 위해서, Path A의 Down-Sampling 방식을 3x3 Conv에서 수행 

 

    - ResNet-C : Inception-v2에서 아이디어를 가지고 옴

      º 7x7 Conv는 3x3 Conv 보다 5.4 배 더 계산량이 많음

      º 7x7 Conv를 3x3 Conv 3개(32, 32, 64 Channel로 구성)로 변환함

 

    - ResNet-D : ResNet-B에서 아이디어를 받음

      º Path B에서도, Input Feature의 3/4이 1x1 Conv(Stride =2)를 통해, 무시됨

      º 실험을 통해, AvgPool 2x2(stride =2) → 1x1 Conv을 선정함

 

     실험 결과 

    - ResNet-B~D까지 적용한 모델의 성능이 좋았음

    - ResNet-B~D까지 적용한 모델 시, FLOPs는 0.4G만큼 증가됨

 

  ※ ResNet Tweak vs ResNext에 대한 고찰

더보기

※ ResNet Tweak vs ResNext에 대한 고찰

 

   - ResNext의 FLOPs는 더 낮고, 성능은 더 높음

   - 개인적으로는, Tweak 보다 ResNext를 사용하는 게 더 좋아 보임

   - ResNext + ResNet-B~D를 사용해 보는 것도, 좋은 아이디어로 보임

Training Refinements 

      - 성능을 높이기 위한 4가지 방법

 

     Cosine Learning Rate Decay

      - Learning Rate 조정(Adjustment)은 학습에서 중요한 요소

      - "step decay" 란 : 30 Epoch마다 0.1 씩 줄이거나("He"), 2 Epoch마다 0.94 씩 감소시킨다("Szegedy")

      - Cosine Decay는 Warm-up과 함께, Cosine 함수를 사용한다

$$  \eta_{t} = \frac{1}{2}\left ( 1 + \cos\left ( \frac{t\pi }{T} \right ) \right )\eta $$

      - Cosine Decay 방식이 조금 더 안정적으로 학습을 진행하며, 결국에는 더 높은 성능을 보여줌

 

     Label Smoothing 

      - Tensorflw 1.x 에서는 직접 구현했어야 했으나, Tensorflw 2.x부터는 자체 제공

      - Label Smoothing은 오-레이블링에 Robust 하게 학습을 하여, Overfitting 되지 않도록 함

      - 기존의 One-hot-encoding 에서는 정답 class =1, 나머지 class에는 0으로 할당해서 학습

      - 즉, Softmax가 나머지 Class에는 Confidence가 0에 수렴하도록 학습이 됨

      - 정답 Class에 \( \varepsilon = 0.1  \) 만큼을 빼고, 나머지 (K-1)개의 Class 에 대해선, \( \varepsilon / (K-1) \) 만큼 더함

      - 추가 효과 : 정답 Confidence Score와 정답이 아닌 나머지 Confidece Score 간의 Gap이 줄어듦.

      - Eps가 0.1일 때, 가장 효과적으로, Gap이 줄어듬

 

     Knowledge Distillation 

      - 더 크고 좋은 성능을 가진 Teacher Model을 활용하여, 작은 크기에 Student Model을 가이드하며 학습

      - ResNet-152를 Teacher Model로 사용, ResNet-50를 Student Model로 사용.

      - Distillation Loss를 추가하여, Penalize

$$ \ell \left(p, softmax(z) \right ) + T^{2}\ell \left ( softmax(r/T) , softmax(x/T) \right ) $$

      - \( z \) : Student Model의 Output of Last FC

      - \( r \) : Teacher Model의 Output of Last FC

      - \( p \) : True Prob. distribution

      - \( \ell \left(p, softmax(z) \right ) \) : Target과 Student Model과의 Cross-Entropy

      - \( T \) : Temperature Hyper-Parameter - 1보다 크면, Calibration을 진행한다 (\( T \) = 20 )

                    (가장 높은 값과, 낮은 값의 차이를 줄임)

     Mixup Training 

      - Data Augmentation 방법 : 두 개의 이미지를 뽑아서, 섞는다.

      - \( \mathbf{Beta} (\alpha , \alpha  ) \) 분포를 활용하여, 두 이미지 사이의 Weight를 줌

      - \( \alpha = 0.2 \) 으로 설정하며, 학습 Epoch을 120 → 200으로 증가 시킴

        ( ∵ 수렴하는데 까지 더 많은 학습량이 필요함)

      - Knowledge Distillation를 사용할 경우, Teacher과 Student Model 모두에 Mixup을 적용한다

 

[paper] : CutMix

실험 결과 및 해석

     Classification 성능 

      - Refine 기술까지 다 썼을 경우에, 정확도가 75.3 % 에서, 79.29 % 까지 약 4 % 향상이 있었음

      - 각각의 기술(Trick)들을 사용했을 때, 조금씩 성능이 향상됨을 볼 수 있음

      - Distillation 사용했을 경우에, ResNet Teacher Model과 Inception Student Model에서는 성능이 저하됨

        ∵ ResNet 과 Inception 계열은 각각 다른 Prediction Distribution을 가지고 있기 때문에 오히려 방해

     다른 Task에서의 확장성 

      - Detection Task에서는 다 사용한 모델이 좋았음

      - Segmentation Task에서는 Cosine Decay까지만 사용하는 것이 권장됨

        ( ∵ 나머지 Trick들은 픽셀 정보를 흩뜨림)


마치며  

      - 성능을 높이기 위한 여러 가지 Trick들에 대해서 소개했다

      - 효율적인 학습을 위한, 4가지 방법 + Low-Precision

      - ResNet Architecture의 변형 - 3가지 

      - 성능을 위한 Trick 4가지를 소개했다.

      - 위에 모든 방법을 쓰기보다는, 필요한 것만 목적에 따라서 쓰는 것을 추천하지만,

        한 번씩은 해보면, 많은 딥러닝 모델 학습에 대한 많은 Insight를 얻을 수 있다

      - 이 논문은 딥러닝 학습에 관한, 종합 선물 세트와 같다