[딥러닝] EfficientNet V1, V2 정리 (Compound Scaling, NAS(Neural Architecture Search) 간단 소개, MB(Mobile Inverted Bottleneck)Conv + SE)
- 이번 포스팅에서는 현 시점 CNN 계열 이미지 분류 모델의 백본 중 가장 경량화와 정확도의 균형 및 전체 성능이 좋은 EfficientNet 에 대해 알아보겠습니다.
(EfficientNet V1)
- 논문 : EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks (2019)
- EfficientNet 은 2019 년 Google Brain 팀이 발표한 이미지 분류 모델을 뜻합니다.
EfficientNet 의 의의를 먼저 알아보겠습니다.
대부분의 CNN 모델들은 모델의 깊이를 깊이, 파라미터를 더 많이 하는 것을 목표로 연구됩니다.
CNN 모델은 모델이 깊고 파라미터가 많을수록 정확도가 올라가는 것은 CNN 모델이 각광받기 시작한 초기에서부터 결과로 증명되었기 때문입니다.
이를 위하여 CNN 모델들은 레이어 깊이를 깊게 했을 때 발생하는 기울기 소실 문제를 해결하기 위하여 Residual Block 이라는 개념을 만들었고, 연산량이 많아졌을 때의 속도 저하를 해결하기 위해 Depthwise conv 와 같은 개념을 만들었습니다.
하지만 모델 증량을 할 때 명확한 수학적 방법론이나 뚜렷한 기준은 없죠.
입력 이미지의 해상도만 늘려보거나, 레이어 층을 추가하거나, 채널을 증가시키는 방식으로 신행됩니다.
이러한 상황 속에서 EfficientNet 은 모델의 증량 파트를 Depth(모델 레이어 깊이), Width(레이어별 채널 수), Resolution(입력 이미지의 해상도) 로 규정하였고, 이 요소들이 독립적인 것이 아닌, 상호 연관 관계가 있으며, 그렇기에 하나를 증량할 때에는 나머지 요소들을 균형있게 증량해야하는 Compound Scaling 이라는 기법을 제안하였습니다.
- Compound Scaling 기법이란,
모델을 확장할 때, 깊이, 너비, 해상도를 균형있게 동시에 확장하는 전략입니다.
위와 같은 수식으로 이루어져 있으며,
ϕ: 리소스 증가 정도 (예: FLOPs를 2배, 3배로 증가시키는 기준)
α,β,γ: 각각 깊이, 너비, 해상도의 scaling 계수
를 의미합니다.
α,β,γ 의 세 계수는 실험적 grid search로 찾아내며,
다음 제약 조건을 만족해야 합니다
α⋅β^2⋅γ^2≈2
즉, 모델 확장을 할 때, 계산량(FLOPs)이 2배 증가하도록 균형을 맞추는 것이죠.
이 방식의 장점은,
비대칭보다 균형있는 증량으로 인해 성능 효율성이 높아지고, α,β,γ 를 한번만 찾아두면, 이후 손쉽게 경량버전 증량버전을 생성할 수 있습니다.
특히 효율성이 높아진다는 것은 적은 계산으로 높은 성능을 달성할 수 있다는 것이므로 효율과 더불어 효과 역시 커지게 됩니다.
EfficientNet 은 실제로 위와 같은 방식을 통해 EfficientNet‑B0 라는 기본 모델을 찾았고, 이에 Compound Scaling 을 적용하여 B1, B2, B3 로 위에서 소개한 수식과 같이 증량시키는 방식으로 구현되었습니다.
이로써 Efficient(효율적인) Net 이 왜 이렇게 작명된지 알 수 있습니다.
- 앞서 FLOPs 에 대해 언급했는데, 이에 대해 간단히 정리하겠습니다.
FLOPs(FLoating-point OPerations) 는 딥러닝 모델의 연산 복잡도, 즉 계산량을 측정하는 중요 지표입니다.
부동 소수점 연산의 총 횟수를 의미하며, 덧셈, 곱셈, 나눗셈 등의 실수값 계산량을 카운팅하는 것입니다.
이를 사용하는 이유는, 모델의 연산량을 측정하여 모델 복잡도와 속도를 예측할 기준으로 사용할 수 있고, 다른 모델과 현재 개발중인 모델을 비교하거나, 배포하려는 환경을 고려한 모델 개발의 척도가 되기에 유용하고 중요한 지표이기 때문이죠.
일반적으로 FLOPs 를 경량화 지표로 삼고, 파라미터 수를 모델 크기로 삼습니다.(FLOPs 가 속도 측면에서 절대적이지는 않습니다. 병렬 처리가 가능한 계산과 그렇지 않은 계산도 있고, 실행 디바이스 구성에도 관계가 있기에 속도 지표는 시간당 처리 속도를 실제로 측정합니다.)
- 모델 구조
EfficientNet 의 구조는 NAS(Neural Architecture Search) 를 사용해 만들었다고 합니다.
NAS 란, 최적의 모델 구조를 만들어주는 인공지능 추론기라고 생각하면 됩니다.
예를들어 CNN 모델을 구현하는데의 재료가 되는 Conv, Skip, SE 등의 블록을 등록해두면, 인공지능이 자동으로 그에 맞는 최적의 모델 구조와 파라미터를 찾아준다고 하죠.
즉, 인공지능 모델 구조 설계를 인간이 아닌 인공지능이 한 것입니다.(모델 구조 설계는 NAS 가 했지만, 앞서 설명한 Compound Scaling 의 모수는 Greed Searching 으로 구했습니다.)
NAS 는 강화학습이나 진화 알고리즘 등을 적용하는 상당히 고급 기술이므로 추후에 정리하도록 하며, 그만큼 외부에서 구해서 사용하는 비용이 엄청 큰 기술이라고 알아두면 됩니다.(인공지능을 만드는 인공지능은 구글, Facebook 과 같은 인공지능 기술 경쟁력이 있는 일부 기업에서나 활용 가능한 실험적이고 어려운 기술이죠)
이렇게 찾아낸 EfficientNet 의 구조는 MobileNetV2 와 유사하며, 이에 SE 블록을 추가한 형태로,
동 사이즈의 기존 모델들(ResNet, DenseNet, SENet, GPipe, etc...) 대비 확연한 성능 향상을 보이며 최고 성능(B7 : Top-1 ACC 84.3, Top-5 Acc 97.0 으로, 동 성능의 GPipe 모델과 동일한 정확도지만, 파라미터수가 66M 로, 557M 인 GPipe 보다 훨씬 가벼움)을 달성했습니다.
- 모델 구조 상세
구조는 위와 같이 블록 단위로 9개 레이어로 구성되어 있습니다.
가장 처음에는 어느 CNN 에서나 그렇듯 3x3 conv 2 stride 로 224x224 이미지를 112x112 로 만드는 것에서 시작됩니다.
이때 출력되는 채널 수도 일반적으로 사용하는 것과 같은 32 네요.
두번째 레이어는 출력값 16으로 시작되는데, 이전보다 작아진다는 것이 특이하기는 합니다.
아마 제 생각에는 첫 레이어의 32 는 관습적인 값으로 설정한 것 같고, 두번째부터가 차근차근 크기가 커지는 개념인 것 같네요.
Resolution 변경 방식도 조금 특이합니다.
2 stride 로 2배씩 줄어드는 것이 일반적인데, 1 stride 로 정체시킨 구간이 3곳이 있습니다.
커널 크기도 5x5 와 3x3 을 혼용한 이유를 모르겠네요.
앞서 말씀드렸듯, NAS 가 자동으로 만든 구조인데, 신기하게도 성능이 좋은 것을 보아 사람의 직관으로 판단하기 어려운 어떠한 계산 방식이 있는 것 같습니다.
인공지능의 설계는 가독성보다는 목적지향적으로 되어있어서 사람이 이해하기 어려울 수 있다던데 사실인 것 같네요.
그런 이유로 같은 인공지능인 ChatGPT 에게 해석을 의뢰하였습니다.
위 모델이 효과적인 이유는,
1. MBConv + SE 조합으로 효율성을 극대화
2. 커널, 채널, 반복 수 조합이 정밀하게 최적화됨
3. NAS 기반 설계로 주어진 정보 내에서 최적의 설계를 계산
위와 같다고 합니다.
결국 사람 직관보다 더 객관적인 방법론을 지닌 NAS 가 설계했기 때문에 그렇다는 것이네요.
그러면 핵심이 되는 MBConv 블록에 대해 알아보고 V1 은 마치겠습니다.
- EfficientNet MBConv 블록 상세
MBConv 는, Mobile Inverted Bottleneck Convolution 의 줄임말로, MobileNetV2 에서 처음 등장한 구조입니다.
즉, 보틀넥 구조라는 것인데,
기존의 보틀넥과의 차이점은,
입력 → 축소 (1x1) → Conv (3x3) → 확장 (1x1)
이라는 전통적인 보틀넥 구조가 Conv 연산을 하기 전에 차원을 축소하여 연산량을 줄인 후에 다시 차원을 확장하는 구조임과 달리,
입력 → 확장 (1x1) → Depthwise (k×k) → 축소 (1x1)
이처럼 Inverted Bottleneck 은, 먼저 채널을 확장해놓고, Depthwise 로 연산량을 줄인 후 여기서 확장된 채널을 1x1 conv 로 줄이는 방식으로 연산량을 축소한 보틀넥 블록이라 보시면 됩니다.
위 레이어 설계 자료를 보시면 아실 수 있듯, 처음 3x3 conv 를 제외하고는 depthwise 기반의 mbconv 로 이루어진 백본 구성입니다.
이는 GhostNet 과 같이, 처음 핵심 정보를 제외하고는 Depthwise 를 적용하여 연산량을 아낀 방법으로 볼 수 있겠네요.
기본 MBConv 와 EfficientNet 의 MBConv 의 차이점을 확인해보면,
Input
↓
[1] Expand (1x1 Conv)
↓
[2] Depthwise Convolution (3x3 또는 5x5)
↓
[3] Squeeze-and-Excitation (SE block)
↓
[4] Project (1x1 Conv)
↓
[5] Skip connection (if applicable)
↓
Output
위와 같이 SE 와 Skip Connection 이 추가되어 있는 것을 볼 수 있습니다.
MBConv 가 효과를 보이는 이유는, 일반 conv 와 달리 채널간 2d 차원 형태에만 집중해도 충분하기 때문이라 생각했습니다.
일반 conv 가 CxHxW 의 전체 조합을 살펴보는데, 이렇게 되면 무수한 파라미터가 필요하고 무수한 연산이 필요합니다.
일단 일반 conv 로 데이터 핵심 특징을 추출해내면, 각 채널별 형태 파악에만 집중하고, 1x1 conv 를 통해 채널간 Projection 만 하기만 해도 충분히 효과가 있다는 것이죠.(일단 실제로 효과가 나왔으므로 그렇게 받아들입시다.)
처음에는 1x1 conv 로 채널을 확장해서 표현력을 높이고, depthwise 연산으로 위치 정보를 파악한 후, 다시 1x1 로 원하는 의미로 특징들을 projection 하는 구조인데, 마지막 1x1 conv 축소(의미를 규명하는 단계)의 전에는 SE Block 을 사용하여 채널간 특징의 중요도를 파악하여 의미 투영에 반영하는 개념이며, Skip Connection 으로 이전 결과값을 반영하여 기울기 소실 문제를 해결한 블록 형태입니다.
일단 설명 단계에서 보니 지극히 이치에 맞는 구조인데, 가장 중요한 것은 실제로 성과가 있었다는 것이겠죠.
(Efficient-Net V2)
- 논문 : EfficientNetV2: Smaller Models and Faster Training (2021)
- Efficient-Net V2 는 V1 을 만든 Google Brain 이 V1 을 개선하여 발표한 Efficient-Net 의 차세대 버전입니다.
이미 최고 성능을 달성했던 것으로 평가된 V1 을 어떤 면에서 개선했는지를 확인해보겠습니다.
- V2 의 개선점은 아래와 같습니다.
1. NAS 를 더 개선하여 모델 구조 설계를 개선하였습니다.
2. 개선된 NAS 로 설계된 모델 구조는, 기존의 MBConv + SE 구조에 더하여 Fused-MBConv 가 적용되었습니다.
3. Progressive Learning 방식을 사용하여 이미지 크기 증가에 맞춰 정규화를 점진적으로 증가시키는 새로운 방식을 제안하였습니다.
위와 같은 개선사항 반영 결과,
기존 모델 대비 5 배 이상 빠른 학습 속도를 보여줬으며, 최대 6.8배의 파라미터를 감소하였습니다.
- NAS 의 개선점은,
기존에는 파라미터 수 + FLOPs 중심으로 아키텍쳐를 탐색하였다면,
V2 에서는 학습 시간까지 고려하는 Training-aware NAS 로 발전했다는 것입니다.
결과적으로 더 작고 빠르며 정확한 모델의 설계가 가능해졌습니다.
- V2 에서 도입된 Fused-MBConv 란, DepthwiseConv 를 일반 Conv 로 대체한 것입니다.
MBConv 가 1x1 expand -> depthwise -> 1x1 project 라면,
Fused-MBConv 는, 3x3 conv -> 1x1 project 의 구조입니다.
입력 (in_ch)
↓
Conv3x3 (in_ch → hidden_ch = in_ch * expand_ratio) ← 확장
↓
[SE Block (optional)]
↓
Conv1x1 (hidden_ch → out_ch) ← 축소
↓
출력 (out_ch)
위와 같은 구조이므로 작은 채널의 값을 3x3 으로 받아서 확장하고, conv 1x1 로 다시 축소하는 방식으로 되어있습니다.
- V2 전체 구조
Fused-MBConv 는 입력 채널 수가 적은 곳에서 유리합니다.
고로 위와 같이 앞쪽 레이어에 적용하고, 여기서 얻어낸 핵심 정보를 MBConv 에서 연산량을 줄여서 처리하는 것이죠.
- 학습 방식의 변화로는, Progressive Learning 을 사용하였습니다.
초기 학습시에는 이미지를 작게 하고, 정규화를 약하게 하는 방식을 사용했으며,
후에는 이미지를 키우며 강한 정규화를 적용하는 방식입니다.
이유는,
작은 이미지가 연산량이 적고, 더 큰 배치를 사용할 수 있으므로 빠르게 초기 학습을 진행하며,
점차 해상도를 키워 정밀도를 높이기 위해서입니다.
정규화 역시 오버피팅이 발생할 확률이 적은 초기 학습에서는 너무 강한 정규화를 사용시 학습에 방해가 되므로, 처음에는 정규화가 약했다가, 점차 강한 정규화를 적용하는 것이고요.
- V2 의 개선점을 요약하자면,
1. NAS 를 더욱 고도화하여 더 나은 모델 설계를 만들어냄
2. 빠른 초기 학습 속도를 위한 방법을 만들어내고, CNN 모델 학습에 대한 새로운 방법론을 제시함
위와 같습니다.
2번의 경우는 모든 연구 개발자들이 참고가 가능하겠지만,
1번 개선점은 구글이나 전문 팀단위 지원과 장비가 없으면 어려운 내용이네요.
새삼 이러한 구글을 놀라게 만든 Mistral 이나 DeepSeek 가 대단해보이네요.
반대로 말하자면 이렇게 대단해보이는 구글이라고 하더라도 아직까지는 의표를 찌를 수도 있는 것이 딥러닝의 현 상태라고 보여집니다.
- 이상입니다.
현 시점에서도 CNN 계열 백본으로 가장 균형적으로 성능이 좋은 EfficientNet V2 를 알아보았습니다.
즉, CNN 계열 백본의 최신 정보까지를 이해한 것이죠.
이를 기준으로 하여 이전에 소개드린 제 백본 모델의 성능을 향상시키거나,
차기 최고 성능의 모델을 이해하는것,
응용하여 좋은 서비스를 만드는 것이 현재 저의 목표입니다.