
현재 ImageNet Accuracy에서 SOTA 모델인 EfficientNet. SOTA 모델을 쓰는 것이 당연히 좋지 않을까.. 싶어서 사용하고 있지만, 그리고 대회에서도 아마 data를 조정하고 hyper parameter를 조정하는 것이 점수를 높이는 방법이고 모델은 그냥 EfficientNet을 쓰는게 좋지 않을까 싶지만, 그래도 알고 쓰는게 좋을 것 같아 이 모델에 대한 정리를 한다.
모델의 크기 키우기
하드웨어 기술이 감당할 수 있는 모델의 크기가 증가하는 만큼 모델의 크기를 키워 성능을 높이는 방향의 연구가 이루어지고 있다. 모델의 크기를 키우는 3가지 주요 방법으로는
1. Layer의 깊이를 더 깊게 쌓는 것
2. Channel width(filter의 수) 를 늘리는 것
3. image data의 크기를 늘리는 것 (더 높은 해상도의 데이터)

EfficientNet은 이 3가지의 최적의 조합을 수동이 아닌 자동으로 찾을 수 있게 만들어 최고 효율의 모델을 만들 수 있는 compound scaling을 통해 SOTA를 달성했다.
Compound Model Scaling
ConvNet을 수식으로 표현하면

다음과 같다.
여기서 제한된 자원으로 모델의 정확도를 최대화하는 문제는

다음과 같이 정리된다.
depth, width, resolution 3가지 변수에 대해 각 레이어에서 수행하는 연산 (F)를 고정하고 d, w, r의 변수를 조정하여 search space를 줄이는 문제이다. (기존의 ConvNet 수식에서 F의 제곱인자에 d가, X 내의 각 함수들에 r, w 상수가 생겼다.)

이 w, d, r값은 일정 값 이상부터 수렴하기 때문에 이 중 하나를 조절하는 것보다 세 변수를 함께 조절해 최고의 효율을 찾는 과정이 Compound Scaling이다.

깊이에 비례하는 계산량과 나머지 두 변수에 대해 제곱으로 비례하는 계산량을 조절하기 위해 다음과 같은 비율로 변수들을 조정한다.
backbone Network로 MnasNet을 기반으로 두고, Grid search를 수행하며 최적의 변수값들을 찾는다.

Step 1 :
Step 2 :
작은 baseline network를 통해 최적값을 먼저 찾은 후, 전체적인 크기를 키우는 방식으로 큰 모델에 바로 Grid search를 진행하지 않아 소모되는 자원을 줄일 수 있다.
각 변수를 scale한 표를 보면 compound scaling의 성능이 압도적으로 높은 것을 볼 수 있다.

Pytorch Image Models (timm)
그렇다면 이 EfficientNet을 직접 구현해서 사용해야 할까? 아니다. 이미 똑똑한 사람들이 모두 구현을 했고, 오픈소스 라이브러리를 통해 배포하고 있다. 심지어 pretrained 모델을 사용할 수 있다. 이를 사용하기 위한 모듈이 timm 모듈이다.
EfficientNet을 사용하기 위해 timm.create_model("모델명") 을 사용할 수 있다.
학습 방법, 학습 데이터등을 통해 아주 다양한 모델이 있다. 이를 확인하기 위해서
import timm
timm.list_models("*efficientnet*")
를 실행하면
Output exceeds the size limit. Open the full output data in a text editor['efficientnet_b0',
'efficientnet_b0_g8_gn',
'efficientnet_b0_g16_evos',
'efficientnet_b0_gn',
'efficientnet_b1',
'efficientnet_b1_pruned',
'efficientnet_b2',
'efficientnet_b2_pruned',
'efficientnet_b2a',
'efficientnet_b3',
'efficientnet_b3_g8_gn',
'efficientnet_b3_gn',
'efficientnet_b3_pruned',
'efficientnet_b3a',
'efficientnet_b4',
'efficientnet_b5',
'efficientnet_b6',
'efficientnet_b7',
'efficientnet_b8',
'efficientnet_cc_b0_4e',
'efficientnet_cc_b0_8e',
'efficientnet_cc_b1_8e',
'efficientnet_el',
'efficientnet_el_pruned',
'efficientnet_em',
...
'tf_efficientnetv2_s',
'tf_efficientnetv2_s_in21ft1k',
'tf_efficientnetv2_s_in21k',
'tf_efficientnetv2_xl_in21ft1k',
'tf_efficientnetv2_xl_in21k']
다 안나올만큼의 다양한 모델을 제공한다. 큰 틀로 나눠서 각 어떤 모델인지 알아보고, 학습에 어떤 모델을 쓰면 좋을지 알아보자.
efficientnet_b0~b8
Original EfficientNet models. 별다른 기법을 가하지 않았고, ImageNet 데이터셋을 사용해 학습한 모델이다.
뒤에 붙는 b0 ~ b8의 차이는 위에서 설명했던 compound scaling 변수들의 크기이다.

여기 속하는 각
efficientnet_b0~b8_ap
AdvPorp를 통해 학습된 모델. Adversarial Attack를 한 이미지를 추가로 학습시킨다. Adversarial attack을 가한 이미지는 사람의 눈으론 이미지에 차이가 없지만, 컴퓨터가 이미지를 알아볼 때 큰 차이가 생긴다.

이렇게 적대적인 데이터를 동시에 학습해 성능이 높아지며, EfficientNet 기준 성능이 다음과 같이 차이가 난다.

더 좋을 수 있는 모델이겠지만, 사용해봐야 알 것 같다. 뒤의 크기 b0~ b8는 Vanilla model과 의미하는 바가 같다.
efficientnet_b0~b8_ns
semi-supervised learning인 Noisy Student model을 사용해 학습한 모델. 이 기법에 대해선 전에 data Efficient Learning에서 기술한 적 있다.
https://gameisdata.tistory.com/37
[CV basic] Data Efficient Learning
Data augmentation 데이터셋은 대부분 편향되어있다. 훈련 데이터와 실제 데이터 사이에는 항상 차이가 있기 때문에 data augmentation을 통해 실제 세상에 있는 데이터와의 차이를 매꿔야 한다. 데이터
gameisdata.tistory.com
efficientnet_lite0~lite4
EfficientNet의 Lite 모델. 모바일 기기에서 CPU와 GPU를 사용해 lite하게 사용할 수 있게 한 모델. 킹갓 클라우드의 v100이 있는데 이걸 사용하지는 않을 것 같다.
efficientnet_v2_b0~s,m,l
2021년 논문에 나온 EfficientNetV2 모델. 간단히 요약하면 학습을 진행시키며 이미지의 크기를 점진적으로 증가시키는데, 여기서 이미지의 크기에 따른 정규화 방법을 다르게 적용해 정확도도 높이 학습 시간을 빠르게 하고, 연산량도 줄였다고 한다.

흠... 모델이 더 무거운 것도 아니고 가벼우면서도 정확도도 높다면 안 써볼 이유가 있을까?
게임이 아닌 딥러닝 모델에서의 후속작은 일단 실패하지 않는다. 서든어택이 아니기 때문이다.

일단 사용해보도록 하자.
efficientnet_oo_pruned
pruned가 쓰인 모델은 일명 가지치기. dropout처럼 신경망을 좀 쳐내서 과적합을 방지하며 학습한 모델이다. 과적합이 심한 것 같으면 써볼만 할듯하다
efficientnet_oo_gn
Batch Normalization 대신 Group Normalization을 수행한 모델. 굳이 국룰 배치 정규화를 안하고 선택할 필요가 있을까.. 애초에 몇개 있지도 않다. 기각.
결론은 V2 사용해보기, 모델 크기별 efficientnetb0~b7 사용해보기.(메모리가 허락하는 한계까지)
이후 ap, ns, pruned등의 추가 방법론이 적용된 모델 사용해보기 정도가 있을 것 같다.
Reference
https://greeksharifa.github.io/computer%20vision/2022/03/01/EfficientNet/
Python, Machine & Deep Learning
Python, Machine Learning & Deep Learning
greeksharifa.github.io
EfficientNet — tfimm 0.1 documentation
efficientnet_{b0, b1, b2, b3, b4, b5, b6, b7, b8}
tfimm.readthedocs.io
'네이버 부스트캠프 학습 정리 > 6주차' 카테고리의 다른 글
[P-stage 1] Image Classification Loss에 대한 고찰 (3) | 2023.04.15 |
---|---|
[P-stage 1] 실험 환경 세팅 (0) | 2023.04.15 |
P stage 돌입과 학습 정리 방식 변경 (0) | 2023.04.15 |