논문 읽기/Classification

[논문 읽기] Bag of Tricks(2019) 리뷰, Bag of Tricks for Image Classification with Convolutional Networks

AI 꿈나무 2021. 4. 5. 18:20
반응형

 안녕하세요! 이번에 읽어볼 논문은 Bag of Tricks for Image Classification with Convolutional Networks 입니다.

 

 Bag of Tricks는 정확도를 높일 수 있는 여러 가지 학습 tricks를 소개합니다. 모델 구조를 변경하는 것이 아니라 tricks를 사용해서 성능을 높이는 것입니다. classification 분야를 공부하시는 분들이라면 이 논문에서 제시하는 방법들을 사용해보면 좋을 꺼 같네요ㅎㅎ

 

 우선 결과부터 확인하겠습니다.

 

 ResNet-50에 tricks를 사용했더니 정확도가 75.3%에서 79.29%로 상승했네요. 어떤 tricks를 사용했는지 살펴보겠습니다.

 

Large-batch training

 큰 batch를 사용하면 gradient의 variance를 낮춰주어 noise를 감소시키는 효과가 있습니다. 또한 parallelism 활용도를 높일 수 있습니다. 하지만 batch size를 키우면 learning rate를 낮춰야 하기 때문에 수렴하는 데에 오랜 시간이 걸려 학습 속도가 느려집니다. 또한, 작은 batch를 사용했을 때와 비교했을 때 정확도가 더 낮습니다. 논문에서는 정확도와 학습속도에 악영향을 최소화하고 batch size를 높이는 4가지 방법을 소개합니다.

 

(1) Linear scaling learning rate

 논문에서는 batch size가 256일 때, 초기 learning rate를 0.1로 설정하고, batch size를 변경하면 초기 learning rate를 0.1 x b/256으로 설정하라고 추천합니다.

 

(2) Learning rate warm up

 학습 초기에는 모든 파라미터가 임의의 값이기 때문에 불안정합니다. 따라서 learning rate를 크게 설정하면 수렴하는 데에 오랜 시간이 필요합니다. 논문에서는 warmup heuristic을 추천합니다. 학습을 시작할 때, learning rate를 작게 설정하고 학습이 안정되었을 때, 초기의 learning rate로 설정하는 것입니다. learning rate를 초기의 learning rate로 높일 때는 한 번에 높이는 것이 아니라 여러 단계에 걸쳐서 높이는 것을 추천합니다. 예를 들어, 초기 learning rate가 $\lambda$, m개의 배치라고 할때, 1 < i < m인 i번째 배치는 i$\lambda$/m으로 서서히 증가하는 것입니다.

 

출처: https://hoya012.github.io/blog/Bag-of-Tricks-for-Image-Classification-with-Convolutional-Neural-Networks-Review/

 

(3) Zero $\rho$

 batch normalization에서 학습 가능한 파라미터는 $\rho$와 $\beta$ 입니다.

 residual block의 끝에 위치해있는 모든 BN의 $\rho$를 0으로 initialize 합니다. 이렇게 하면 모든 residual block은 입력값을 그대로 반환하게 되어 초기 학습에 도움이 된다고 하네요.

 

(4) No bias decay

 weight decay는 weight와 bias에 적용하여 모든 파라미터에 L2 정규화를 사용하는 효과가 있습니다. 논문에서 weight decay를 오버피팅을 방지하기 위해 weight에만 적용하는 것을 추천합니다. bias에 weight decay를 적용하는 것은, 이미 BN에 bias가 포함되어 있기 때문에 효과가 없다고 하네요.

 

 아래 표는 실험 결과입니다.

Low-precision training

 다음에 소개할 내용은 floating point 입니다. 일반적으로 신경망은 32-bit floating point(FP32)에서 학습을 합니다. 하지만, 현재 GPU는 FP32보다 FP16에서 연산 속도가 더 빠르다고 합니다. 모든 parameter와 activation을 FP16에 저장하고, gradient를 계산하는 데에 FP16을 사용하는 것을 추천합니다. 그리고 parameter updating할 때는 모든 파라미터를 FP32에 저장합니다. 또한 FP16을 사용하면, 더 큰 batch를 사용할 수 있습니다.

 

 

 이 표는 BS=256 with FP32와 BS=1024 with FP16을 비교한 표입니다. FP16을 사용했을 때, 정확도가 더 높네요 그리고 학습 속도는 2배 이상 빨라졌습니다.

 

Model Tweaks

 ResNet의 residual block을 수정하여 성능을 1% 향상시킵니다. 기존의 resnet 구조를 확인하겠습니다.

 resnet의 초기 레이어에 7x7 conv가 사용하는 것을 확인할 수 있습니다. 이것을 3x3 conv 3개로 대체합니다. 또한, down sample을 진행할 때, residual block과 shortcut connection에서 stride=2인 1x1 conv를 사용합니다. 이것을 residual block에서는 3x3 conv에서 stride=2를 사용하고, shortcut connection에서는 avg pool을 사용하여 다운 샘플링을 진행합니다.

 

 

 위 그림처럼 모델을 수정했더니, 1% 정확도가 향상되었습니다.

 그만큼 연산량도 증가했네요.

 

Training Refinements

 모델의 정확도를 향상시키는 4가지 training refinements를 소개합니다.

 

(1) Cosine Learning rate decay

 앞서 설명한 learning rate warm up 이후에 learning rate scheduler로 cosine annealing을 추천합니다. cosine annealing은 초기에 학습률을 느리게 감소하고, 중간에는 선형으로 학습률을 감소하고, 마지막에는 다시 천천히 학습률을 감소합니다.  아래 그림은 step scheduler와의 비교입니다.

 

 

(2) Label Smoothing

 label smoothing은 Inceptionv4에서 제안된 방법입니다. 기존의 true label은 1또는 0으로 설정했습니다. 이렇게 하면 과적합이 발생할 수 있다고 하네요. label smoothing은 classification에서 true label을 1또는 0으로 설정하는 것이 아니라 다음과 같이 설정합니다. 따라서 true label은 0.95 또는 0.005 와 같이 됩니다.

 

(3) Knowledge Distillation

 Knowledge distillation은 모델을 학습하기 위해 pre-trained된 모델을 teacher model로 사용하는 것입니다. 학습하려는 신경망을 student라고 할때, teacher와 student의 결과값의 차이를 loss function에 활용합니다. 

 

 r은 teacher의 출력값, z는 student의 출력값입니다. student의 loss function을 위와 같이 수정합니다. 첫 번째 항은 기존의 loss function이고 두 번째 항이 distillation loss 입니다. T는 하이퍼파라미터 입니다.

 

(4) Mixup training

 mixup은 augmentation 기법중 하나입니다. (xi, yi), (xj, yj) 두 개의 이미지가 있을 때, 이 이미지들로 새로운 이미지를 만들어 냅니다.

 

 위 4가지 기법을 적용했을 때의 실험 결과입니다.

 


참고자료

[1] arxiv.org/abs/1812.01187

[2] hoya012.github.io/blog/Bag-of-Tricks-for-Image-Classification-with-Convolutional-Neural-Networks-Review/

반응형