*크롬으로 보시는 걸 추천드립니다*
이미지 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에 한정된 실험이라는 것은, 단점입니다.
( * 개인적인 의견이며, 제 리뷰를 보시는 분들에 도움드리기 위한 참고 정도로 봐주세요)
※ 참고 코드 자료
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 예시 :
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 :
딥러닝 기초 개념을 잡는 용으로, 추천하는 책 중 하나입니다!
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/43 와 blog.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이 작은 크기의 모델과 같아지며, 안정적으로 초기 학습을 할 수 있음
Low-Precision Training을 위한, 테크닉
○ Low-Precision이란 :
- 32-Bit Float point(FP 32) → 16-Bit Float point(FP 16)으로 변경
- Low-Precision을 적용할 경우, 2~3배 빠르게 학습할 수 있으나, 성능이 저하될 수 있음
( ∵ Numeric의 범위가 줄어들어, 정밀한 학습이 되지 않음)
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의 특징에 대해서 한번 더 짚고 넘어가겠습니다
- 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을 적용한다
실험 결과 및 해석
○ 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를 얻을 수 있다
- 이 논문은 딥러닝 학습에 관한, 종합 선물 세트와 같다
'딥러닝을 위한 > 가이드(Guide)' 카테고리의 다른 글
[논문요약] Transformer 등장 - Attention Is All You Need(2017) ② (0) | 2021.08.03 |
---|---|
[논문요약] Transformer 등장 - Attention Is All You Need(2017) ① (4) | 2021.07.27 |
딥러닝을 위한 논문 가이드 (8) | 2021.02.13 |