본문 바로가기

갈아먹는 Image Classification [1] Noisy Student

들어가며

최근 Object Detection 분야의 SOTA 모델들을 살펴보면서 백 본으로 사용되는 Image Classification 모델들 논문을 읽게 되었습니다. DenseNet 이후로 잘 보지 않았는데 그동안 참 많은 변화들이 있었네요 ㅎㅎ 게으름에 반성을 많이 하게 되었고,  Image Classification 분야 논문들도 하나씩 제 스타일로 리뷰해볼까 합니다.

 

첫 번째 논문은 현재 Imagenet 리더 보드 상에서 2위를 기록하고 있는 Noisy Student[1]입니다. 이는 기존 EfficientNet 아키텍쳐에 이미지 넷 데이터 셋과 함께 라벨을 붙이지 않은 대량의 이미지를 self-training 기법을 적용하여 학습한 것입니다. 방식이 참 신선하면서도 라벨을 붙이지 않은 데이터를 추가하는 것만으로 정확도가 향상된다는 사실이 놀랍습니다.

 

그럼 리뷰 시작해보겠습니다!

Noisy Student Network

Noisy Student 모델은 다음과 같은 순서로 학습됩니다.

 

1. EfficientNet 아키텍쳐를 사용한 teacher network를 생성한 뒤, 이미지 넷 데이터로 학습시킵니다.

2. 학습 된 teacher network로 라벨이 매겨져 있지 않은 3억장의 이미지에 라벨을 매깁니다.

3. teacher network보다 크기가 같거나 큰 student network를 생성한 뒤, 이미지넷 데이터와 라벨을 매긴 데이터를 합쳐서 학습시킵니다.

4. 학습된 student 모델을 teacher network로 삼습니다. 그리고 2-4 과정을 반복합니다.

 

3단계에서 Student Network를 학습시킬 때 RandAugment, Dropout, Stochastic Depth 세 종류의 Noise를 적용합니다. 이 부분을 해당 논문에서는 핵심이라고 밝히며, 이를 통해서 더 robust한 모델을 학습시킬 수 있었다고 밝힙니다. 그렇다면 여기서 말하는 noise 기법들이 무엇인지 알아보겠습니다.

RandAugmentation

Noisy Student는 인풋 이미지에 RandAugmentation을 적용합니다. 이는 기존에 다양한 Data Augmentation을 싹 정리해놓은 기법입니다. 이미지를 회전하거나 대비를 키우는 등의 14가지 Augmentation 기법들을 모아놓고, 랜덤하게 N개를 뽑습니다. 그리고 얼마나 강하게 변화를 줄 것인지를 나타내는 magnitude M을 각각의 기법들에 전달하여 augmented 된 이미지들을 얻습니다. 코드를 보면 훨씬 이해가 빠릅니다.[2]

저자들은 이 magnitude M을 어떻게 결정하면 좋을지 방법들에 대한 실험도 진행했습니다. 매번 랜덤하게 주는 법, 학습이 진행될 수록 점점 키우는 법, 그냥 처음부터 끝까지 상수로 놔두는 법, 랜덤하게 뽑되, upperbound를 학습이 진행될 수록 점점 늘려가는 방법을 검증했습니다. 그 결과 놀랍게도 모든 방법이 거의 동일한 성능을 내었습니다. 때문에 연산이 가장 단순한 상수로 고정하는 방법을 채택합니다.

 

그렇다면 M을 어떤 수로 고정시키는 것이 좋을까요? M은 0부터 20 사이의 값을 가집니다. 숫자가 커질 수록 더 강한 변형이 일어납니다. 저자들은 학습시키고자 하는 모델의 크기나, 데이터 셋의 크기에 따라서 결정하면 된다고 합니다. 위 그래프를 참고하면 10에서 15 사이 지점에서 최적의 M값이 결정되는 것을 확인할 수 있습니다.

Deep Networks with Stochastic Depth

RandAugment가  Noisy Student 모델에 들어오는 인풋 값에 Noise를 주었다면, 모델이 학습하는 과정에서는 Dropout과 Deep Network with Stochastic Detph 방식으로 Noise를 줍니다. Dropout은 우리에게 친숙한 학습 과정에서 일부 노드들을 꺼버리는 개념입니다. Stochastic Depth는 이와 유사한 개념을 레이어에 적용한 것입니다.[3]

 

ResNet이 등장한 이후로 딥 러닝 모델들의 깊이는 점점 깊어졌습니다. 그 결과 정확도가 향상되긴 하였으나 여전히 Vanishing Gradient 문제가 있었고, 학습에 더 오랜 시간이 걸리는 문제점이 있었습니다. Stochastic는 dropout과 유사하게 각각에 레이어를 일정한 확률에 따라서 학습 과정에서 생략하고 넘어가는 기법을 제안합니다.

Stochastic Depth는 각 레이어가 꺼질 확률을 계산하기 위해서 위 공식을 사용합니다. 얼핏 복잡해 보이지만 매우 단순합니다. pl은 각각의 레이어가 꺼질 확률이고, L은 전체 레이어의 개수입니다. 위 그림의 예시를 적용하면 5에 해당합니다. pL은 마지막 레이어가 꺼질 확률로 이는 실험을 통해 0.5로 고정하는 것이 안정적이라고 합니다. L과 pL 값을 고정한 채로 pl을 계산해보면 1, 0.9, 0.8, ... 0.5 값을 구할 수 있게 됩니다.

Data Balancing, Filtering

논문에서는 Noise 기법들 외에도 unlabeld 데이터를 전처리한 기법들이 효과가 있다고 밝혔습니다. 사실 논문에서 사용한 unlabeled 데이터 셋은 원래 라벨을 포함한 3억장의 이미지로 구성된 JFT라는 데이터 셋입니다.(구글 내부 데이터 셋으로 외부에는 극히 제한적으로 공개한다고 합니다.) 이를 라벨을 사용하지 않는 unlabeld 데이터 셋으로 사용한 것입니다.

 

Balancing이란 이 unlabeled 데이터 셋에서 클래스 별로 이미지 장 수의 균형을 맞추어 주는 것입니다. 부족한 클래스는 이미지를 복사하여 늘려주고, 너무 많은 클래스는 confidence가 높은 이미지들만 추려냈다고 합니다. 여기서 confidence란 teacher network를 통과시켜 얻은 라벨의 스코어 값입니다. 이 값이 낮을 수록 ImageNet 데이터 셋의 클래스에 속하지 않는 out of domain 데이터일 가능성이 큽니다.

 

Filtering이란 confidence가 낮은 이미지를 걸러주는 것을 의미합니다. 이러한 Filtering과 Balancing을 통해서 unlabeld 데이터 셋의 이미지 분포가 최대한 labeled 데이터 셋과 일치하도록 만들어줍니다.

Experiment

Student Model로 EfficienNet-L2 모델을 사용한 최종 모델이 이미지넷 데이터에 대해서 88.4%의 top 1 에러를 기록하며 당시의 State of the Art를 무려 1% 가까이 갱신하였습니다. top1 error가 60%대였던 시절이 어제 같은데 정말 감회가 새롭네요. 이 밖에도 저자들은 이런 저런 실험들을 통해서 흔들림이나 크기 변환, 회전 등의 변화에 robust 한 모델을 얻었음을 보여줍니다. 실험에 대한 더 자세한 내용이 궁금하신 분들은 원문을 참고해보시면 좋을 것 같습니다.

마치며

지금까지 unlabeld 데이터를 사용하여 Image Classification 테스크의 성능을 개선한 Noisy Student를 살펴보았습니다. 사실 개념적으로 복잡하거나 어려울 것이 없는 모델이었습니다. 다만 방대한 크기의 데이터 셋에 여러가지 noisy 기법들을 적용하고 balancing이라 filtering 기법들을 찾아내면서 성능을 끌어올린 저자들의 끈기와 노력에 감탄했습니다.

 

다음 논문으로는 데이터를 학습시키는 발상의 전환을 통해 새로운 SOTA를 찍은 fixing the train-test resolution discrepancy 논문을 리뷰해보도록 하겠습니다. 감사합니다.

Reference

[1] Self-training with Noisy Student improves ImageNet classification, Xie et al, Google Brain, 2020

[2] Cubuk et al, RandAugment: Practical automated data augmentation with a reduced search space, Google Brain, 2019

[3] Huang et al, Deep Networks with Stochastic Depth, ECCV, 2016