IT_World
[논문리뷰]EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks 리뷰 본문
[논문리뷰]EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks 리뷰
engine 2021. 6. 3. 17:21컨볼루션 신경망(ConvNets) 일반적으로 고정 자원 예산으로 개발된다. 더 많은 경우에는 정확성을 높이기 위해 scaled up하며, 리소스를 사용할 수 있다.
본 논문에서는 모델 스케일링을 체계적으로 연구하고 다음을 식별한다. 네트워크 깊이(network depth), 폭(width), and 해상도의 균형(resolution)을 주의 깊게 조정하면 성능이 향상되고, 이 관찰을 기반으로 새로운 확장을 제안한다.
단순하면서도 매우 효과적인 복합 계수를 사용하여 깊이/폭/해상도 모든 차원을 균일하게 스케일링하는 방법을 MobileNet 및 ResNet에 이 방법의 효과를 보여준다.
EfficientNet은 이전 ConvNet보다 훨씬 높은 정확도와 효율성을 달성한다.
특히, EfficientNet-B7은 ImageNet에서 최첨단 84.3%의 상위 1위 정확도를 달성하는 동시에 최고의 기존 ConvNet보다 추론 속도가 8.4배 작고 6.1배 빠르다.
또한 EfficientNets는 훨씬 적은 매개 변수를 사용하여 CIFAR-100(91.7%), 꽃-Flowers (98.8%), 기타 3개의 전송 학습 데이터 세트에서 잘 전송되고 최첨단 정확도를 달성한다.
Source code : https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet
1. Introduction
ConvNet의 스케일 업은 더 나은 정확도를 달성하기 위해 널리 사용된다. 예를 들어 ResNet은 더 많은 계층을 사용하여 ResNet-18에서 ResNet-200으로 확장할 수 있다.
최근 GPipe 는 기준 모델을 4배 더 크게 확장하여 ImageNet top-1 정확도를 84.3% 달성했다. 그러나 ConvNet을 확장하는 프로세스는 아직 제대로 이해되지 않았으며 현재 여러 가지 방법이 있다. 가장 일반적인 방법은 깊이 또는 폭에 따라 ConvNet을 스케일업하는 것이다. 또 다른 덜 흔하지만 점점 더 인기를 끌고 있는 방법은 이미지 해상도에 따라 모델을 스케일업하는 것이다.
이전 작업에서는 깊이, 너비, 이미지 크기 등 세 가지 차원 중 하나만 확장하는 것이 일반적이다.
임의로 2~3차원을 확장할 수 있지만, 임의 스케일링은 지루한 수동 조정이 필요하며 여전히 차선의 정확도와 효율성을 산출하는 경우가 많다.
본 논문에서는 ConvNet의 확장 프로세스를 연구하고 재고하고있다.
1. 더 나은 정확성과 효율성을 달성할 수 있는 원칙적인 ConvNet 스케일업 방법이 있는가?
우리의 경험적 연구는 네트워크 폭/깊이/해상의 모든 차원의 균형을 맞추는 것이 매우 중요하다는 것을 보여주며, 놀랍게도 그러한 균형은 각 차원을 일정한 비율로 확장하기만 하면 달성할 수 있다. 이러한 관찰을 기반으로 간단하면서도 효과적인 복합 스케일링 방법을 제안한다.
임의적으로 이러한 요인을 스케일링하는 일반적인 관행과 달리, 우리의 방법은 고정 스케일링 계수 세트를 사용하여 네트워크 폭, 깊이 및 분해능을 균일하게 스케일링한다. 예를 들어, 만약 우리가 2N배 더 많은 계산 자원을 사용하고 싶다면, 우리는 단순히 네트워크 깊이를 αN, 너비 βN, 이미지 크기를 βN으로 늘릴 수 있다. 여기서 α, β는 원래 작은 모델에서 작은 그리드 검색에 의해 결정되는 상수 계수이다. 그림 2는 우리의 스케일링 방법과 기존 방법의 차이를 보여준다.
- 이 논문의 목적은 그림 맨 오른쪽에 있는 compound scaling 을 잘 해보겠다는 것이다.
- 직관적으로 생각해보면 compound scale up을 잘 만들기 위한 가장 손쉬운 방법은 depth/width/resolution 을 모두 다 크게 키우는 것이다.
- 당연히 이 논문에서 이를 검증해 본다.
- 논문에서는 MobileNet 과 Resnet 을 이용하여 이를 확인한다. (이름은 EfficientNet 으로 지었다.)
- 그림.1 에서 알 수 있듯 EfficientNet-B7 이 GPipe 를 눌렀다.
- 그럼에도 불구하고 파라미터의 사용량은 1/8 수준이다.
- 실제 Inference 시간도 6배 빠르다.
Compound Model Scaling
- 여기서는 compound model scaling 을 어떻게 수행하는지를 다룬다.
- 표기법
- 신경망 : Yi=Fi(Xi)Yi=Fi(Xi)
- FiFi 는 연산자, YiYi 는 출력 텐서, XiXi 는 입력 텐서.
- XiXi 의 크기는 <Hi,Wi,Ci>1<Hi,Wi,Ci>1
- NN 는 레이어의 결합체
- N=Fk⊙…⊙F2⊙F1(X1)=⨀j=1,…kFj(X1)N=Fk⊙…⊙F2⊙F1(X1)=⨀j=1,…kFj(X1)
- 신경망 : Yi=Fi(Xi)Yi=Fi(Xi)
- 일부 망들은 전체 레이어(layer)를 몇개의 스테이지(stage)로 나눌 수 있다.
- ResNet 은 5개의 stage 로 구분된다.
- 모든 stage 는 모두 동일한 conv 연산을 수행한다.
- 단, stage의 첫번째 layer 는 조금 다르게 downsampling 기능이 추가되어 있다.
N=⨀i=1,...,sFLii(X<Hi,Wi,Ci>)(1)N=⨀i=1,...,sFiLi(X<Hi,Wi,Ci>)(1)
- 참고로 그림 2(a) 에서 입력 크기는 <224,224,3><224,224,3> 이고, 출력 크기는 <7,7,512><7,7,512> 이다.
- 이제 최종 목표를 간단하게 식으로 정리해보자.
maxd,w,rAccuracy(N(d,w,r))maxd,w,rAccuracy(N(d,w,r))
N(d,w,r)=⨀i=1,...sF^d⋅L^ii(X<r⋅H^i,r⋅W^i,w⋅C^i>)N(d,w,r)=⨀i=1,...sF^id⋅L^i(X<r⋅H^i,r⋅W^i,w⋅C^i>)
Memory(N)≤target_memoryMemory(N)≤target_memory
FLOPS(N)≤target_flopsFLOPS(N)≤target_flops
- 이 문제의 어려운점은 d,w,rd,w,r 이 서로 독립적인 관계가 아닌데다가 resource 의 제약도 존재한다는 것.
- 이런 어려움으로 인해 지금까지는 하나의 factor 에 대해서만 변화를 가하는 작업들이 이루어졌다.
- Depth(d)
- 가장 흔한 scale-up 방법으로 깊은 망은 더 높은 성능을 내는 것은 이미 잘 알려진 사실.
- 하지만 망을 계속 깊게 쌓는 것은 한계가 있다. ResNet-1000 은 ResNet-101 과 거의 비슷한 성능을 가지게 된다.
- Width(d)
- width 를 제어하는 모델은 대개 작은 크기의 모델들이었다.
- 기존의 연구에 따르면 width 를 넓게 할수록 미세한 정보 (fine-grained feature)들을 더 많이 담을 수 있다는 것이 알려져있다
- Resolution(d)
- 입력에 더 큰 이미지를 넣으면 성능이 올라간다.
- 이전의 다른 연구에서 입력 크기가 224×224224×224 인 모델보다 331\tims331331\tims331 이미지를 사용했을 때 더 좋은 성능을 냄을 확인하였다.
- 최신 연구인 GPipe 에서는 480×480480×480 크기를 사용한다.
- 또한 object-detection 영역에서는 600×600600×600 을 사용하면 더 좋은 성능을 보임을 확인했다.
- 관찰.1
- width/depth/resolution 을 키우면 성능이 올라가지만 점점 커질수록 얻어지는 이득이 적어진다.
Compound Scaling
- depth/resolution 을 고정한 채로 width 값을 변하시키면서 테스트.
- 이 때 다양한 크기의 depth/resolution 을 테스트하여 확인.
- 동일한 FLOPS 에서 width/depth/resolution 조합에 따라 다양한 성능 차이를 보이게 된다.
- 관찰.2
- 최고의 정확도를 갖기 위해서는 가장 최적의 with/depth/resolution 조합을 찾아내야 한다.
- 사실 이전에도 이런 연구가 없었던 것은 아니다.
- 하지만 이를 수동으로 찾는 작업으로 시도했다.
- 이 논문에서는 새로운 방식의 compound scaling method를 제안한다.
depth:d=αϕdepth:d=αϕ
width:w=βϕwidth:w=βϕ
resolution:r=γϕresolution:r=γϕ
α⋅β2⋅γ2≃2(α≥1,β≥1,γ≥1)α⋅β2⋅γ2≃2(α≥1,β≥1,γ≥1)
- α,β,γα,β,γ 는 상수이고 grid search 를 이용하여 찾는다.
- ϕϕ 는 사용자가 제어할 수 있는 factor 로 가용한 resource 에 따라 적당한 값을 취한다.
- 제곱의 식이 들어가 있는 이유는 FLOPS 의 배수 문제 때문.
- depth 는 2배가 되면 2배의 FLOPS 가 되지만,
- width, resolution 은 2배가 되면 4배의 FLOPS가 된다.
- 최종적인 FLOPS는 (α,β2,γ2)ϕ(α,β2,γ2)ϕ 에 의해 결정된다.
- 이 논문에서는 α⋅β2⋅γ2≃2α⋅β2⋅γ2≃2 라는 제약을 사용한다.
- 최종 FLOPS는 2ϕ2ϕ 정도가 된다.
EfficientNet 구조
- base 모델이 어떤 모델이냐에 따라 기본 성능 차이가 많이 발생하므로 좋은 base 모델을 사용하는 것이 중요하낟.
- 이 논문에서는 기존에 알려진 좋은 모델을 사용한다.
- MNasNet 에서 영감을 받아 accuracy 와 FLOPS를 고려하는 최적화 방식을 사용한다.
- MNasNet과 동일한 search space 를 사용하였다.
- ACC(m)×[FLOPS(m)/T]wACC(m)×[FLOPS(m)/T]w 를 최적화 식으로 사용함.
- 여기서 mm은 모델을 나타낸다.
- 대신 이 논문에서는 응답시간(latency) 대신 FLOPS 를 최적화하였다.
- FLOPS 를 최적화하는 것이 특정 device 에 덜 영향을 받는다고 생각하였다.
- MNasNet 에서 영감을 받아 accuracy 와 FLOPS를 고려하는 최적화 방식을 사용한다.
- 이렇게 사용된 기본 모델을 EfficientNet-B0 로 명명하였다.
- MNasNet 과 거의 같으나 더 큰 FLOPS target을 설정하였으므로 모델이 좀 더 크다. (FLOPS 가 약 400M)
- 여기에 SE(Squeeze-and-Excitation) block 도 추가하였다.
- EfficientNet-B0 을 시작으로 다음 순서에 따라 scale 을 확장한다.
- STEP.1
- 먼저 ϕ=1ϕ=1 로 고정한 뒤 grid search 를 수행하여 α,β,γα,β,γ 값을 찾는다. (식 2,3을 이용)
- EfficientNet-B0 에 대해 논문에서 찾은 값은 α=1.2,β=1.1,γ=1.15α=1.2,β=1.1,γ=1.15 였다.
- 이 값은 α⋅β2⋅γ2≃2α⋅β2⋅γ2≃2 를 만족한다.
- STEP.2
- α,β,γα,β,γ 값을 고정한 뒤 서로 다른 ϕϕ 값을 조절한다. (식3 참고)
- 이렇게 해서 얻어진 결과가 EfficientNet-B1 ~ B7 까지이다.
- 자세한 사항은 Table.2 를 참고하자.
- α,β,γα,β,γ 값을 고정한 뒤 서로 다른 ϕϕ 값을 조절한다. (식3 참고)
실험
- 제시한 방법이 타당한지 확인하기 위해 MobileNet 과 ResNet 에도 적용하여 scale-up 해보기
- 표에서 보면 알 수 있듯 단순히 scale 을 독립적으로 증가시키는 것 보다 compound scale 에서 얻어진 결과로 scale-up 하는 것이 효과가 더 좋다.
ImageNet 결과
- EfficientNet 을 ImageNet 기반으로 학습.
- RMSProp optimizer (decay: 0.9, momentum: 0.9)
- batch-norm momenterm: 0.99
- weight decay: 1e-5
- init lr: 0.256 (decay: 0.97, every 2.4 epochs)
- swish activation 사용 (링크)
- stochastic depth with drop ratio:0.3 (링크)
- 보통 큰 모델은 좀 더 강한 regularization 이 필요하다.
- 그래서 EfficientNet-B0 에는 0.2 의 dropout을, EfficientNet-B7 에는 0.5의 dropout 을 적용.
- 잠깐 다시 그림.1 을 소환해보자.
- 그림.5는 그림.1 과 거의 같으나 model size 말고 FLOPS를 기준으로 그린 그림이다.
- 어짹거나 결과를 보면 애부 적은 수의 FLOPS 를 가진다.
- 실제 성능을 확인하기 위해 CPU 에서 이를 테스트해본다.
- FLOPS는 GPU보다 CPU 응답속도에 잘 비례한다.
- (의견) 뭐 EfficientNet 이 당연히 FLOPS 가 적으니 빠르겠지만서도, 실제 그렇게 빠른 것인지는 의문이다.
- 어쨌거나 CPU 에서 20회 측정 후 평균을 낸 값이라고 한다.
Transfer Learning 결과
- 다음 데이터에 대한 Transfer learning 을 실험하였다.
- Table.5 는 NASNet-A 와 Inception-v4 등 다른 모델과의 transfer learning 성능을 비교한다.
- 파라미터 수와 성능을 요약한 그림은 다음과 같다.
토의
- 논문이 제시한 방식이 맞는지 확인하기 위해 서로 다른 scale 로 평가한 ImageNet 성능은 다음과 같다.
- 그림만 봐도 compound scale 방식이 좋다.
- 실제 더 좋은 결과를 가져오는지 확인하기 위해 activation map 도 확인하였다.
- 당연히 compound scale이 더 좋다.
참조 : EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks 논문
참조 : git blog
참조 : Youtube