EfficientNet은 얼마나 효율적일까?
이 글에서는 Weights & Biases를 사용해 더 작은 ImageNet 유사 데이터셋에서 EfficientNet 패밀리를 평가합니다. 이 문서는 AI 번역본입니다. 오역이 의심되는 부분이 있다면 댓글로 알려 주세요.
Created on September 12|Last edited on September 12
Comment

이제 우리가 다루는 데이터셋이 1,400만 장 규모라는 점을 감안하면, 아마 당신이 지난 가족 여행에서 찍은 사진보다 약간 많을 겁니다. 그러니 “Efficient”라는 접두사는 넉넉한 희석을 해서 받아들이는 편이 좋습니다. 그럼에도 EfficientNet 패밀리가 특별한 이유는, 비슷한 연산 비용을 가진 다른 아키텍처들을 손쉽게 능가한다는 점입니다.
이 글에서는 EfficientNet 패밀리를 이루는 핵심 원칙을 다룹니다. 특히 compound scaling이라는 개념을 살펴보는데, 이는 사용 가능하거나 추가로 확보한 연산 자원을 효율적으로 활용할 수 있도록 신경망의 규모를 균형 있게 늘리는 기법입니다.
또한 실제 환경을 더 잘 반영하는, ImageNet보다 훨씬 작은 데이터셋에서 여러 EfficientNet 스케일을 시도해 얻은 결과도 함께 보여 드리겠습니다. 결과는 대화형으로 시각화하여, 이 글의 제목이 묻는 질문—EfficientNet은 얼마나 효율적인가?—에 직접 답을 찾아볼 수 있습니다.
시작해 봅시다.
목차
합성곱 신경망의 스케일링ResNet과 WideResNet으로 모델의 깊이와 너비 스케일링ProGAN에서 프로그레시브 이미지 리사이징으로 모델 해상도 스케일링하기아키텍처 스케일링의 체감 효익복합 스케일링EfficientNet 아키텍처그렇게 효율적이지 않은 넷들방 안의 코끼리결론
합성곱 신경망의 스케일링
EfficientNet 논문이 가장 먼저 지적하는 바는, 신경망을 스케일링하는 일은 많은 사람들이 늘 하는 일이지만, 전통적으로 네트워크를 어떻게 스케일할지 결정하는 방법은 동전을 던지거나 주사위를 굴리고, 불꽃 속 환영을 보려고 개구리 발을 제물로 바치는 것만큼이나 부정확하다는 것입니다.

구체적으로, 네트워크를 강화할 수 있는 주요한 세 가지 방법이 있다고 지적합니다: 깊이, 너비, 해상도.
- 깊이는 말 그대로 네트워크에 포함된 층의 개수입니다. 그러니까 딥러닝을 ‘딥’하게 만드는 그 요소죠…
- 너비는 각 합성곱 층이 사용하는 채널(또는 필터, 커널)의 개수를 말합니다. PyTorch에서는 이것이 out_channels Conv2d 층의 인자
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')
torchvision.transforms.Resize(size, interpolation=2)
주의할 점은, 이 내용은 어느 정도 ConvNet을 사용하는 컴퓨터 비전, 그중에서도 ImageNet과 같은 분류 중심 문제에 꽤 특화되어 있다는 것입니다. 다만, 일반적인 아이디어 자체는 다른 아키텍처나 도메인에도 충분히 응용할 수 있습니다.
여기서 알 수 있는 한 가지는, 이 모든 요소를 수정하는 일이 매우 쉽다는 점입니다. 어떤 경우에는 말 그대로 인자 하나만 바꾸면 됩니다. 하지만 실제로는 이들 모두가 모델 성능에 꽤 큰 영향을 줄 수 있습니다.
물론 모델 스케일링을 위한 이러한 하이퍼파라미터들은 각각 개별적으로 이미 상당히 깊이 탐구되어 왔습니다.
ResNet과 WideResNet으로 모델의 깊이와 너비 스케일링
ResNet은 이를 잘 보여주는 아주 좋은 예입니다. ResNet의 핵심 아이디어 중 큰 부분은 네트워크의 층 수를 어디까지 늘릴 수 있는지 탐구하는 것이었죠. 그리고 일반적으로는 층이 많을수록 성능이 좋아지는 경향이 있는 것으로 보입니다(여기에 큰 별표: 이 주장에 대해 조사한 연구가 매우 많습니다).
조금 덜 대중적인 아키텍처로 WideResNet이 있는데, 예상하셨겠지만 너비 차원으로 스케일링한 ResNet입니다(즉, Conv 층의 채널 수를 늘린 ResNet). 이 방식이 잘 작동하는 이유는 파라미터 수가 눈에 띄게 증가하기 때문만이 아니라, 기본이 되는 합성곱 CUDA 커널이 다수의 필터에 걸쳐 병렬화되도록 작성되어 있다는 추가적인 이점도 있기 때문입니다.
즉, 채널 수를 줄였을 때와 거의 같은 속도를 유지하면서도 더 나은 성능을 얻을 수 있습니다.
ProGAN에서 프로그레시브 이미지 리사이징으로 모델 해상도 스케일링하기
이미지 크기는 너무나 단순한 개념이라 특별히 지목할 만한 모델이나 논문이 있는 것은 아닙니다. 직관적으로, 이미지 크기나 해상도를 높이면 네트워크가 사용할 수 있는 정보가 더 많아집니다. 입력 정보가 늘어나면 모델은 더 나은 예측을 할 수 있지만, 그에 따른 계산량 증가라는 비용이 뒤따릅니다.
보다 최근에는 컴퓨터 비전 전반에서 프로그레시브 리사이징이 꽤 대중적인 기법이 되고 있습니다. 제가 아는 한, 이 방법이 효과적으로 처음 사용된 사례는 Nvidia의 ProGAN 학습이 진행될수록 이미지 크기를 점진적으로 키우는 모델입니다. 분명히 해두자면, EfficientNet과 복합 스케일링은 프로그레시브 리사이징과는 관련이 없습니다. 다만 짚고 넘어갈 가치가 있다고 보아 언급했습니다.
아키텍처 스케일링의 체감 효익
물론 깊이, 너비, 해상도를 각각 늘리면 네트워크 성능은 분명 좋아집니다. 하지만 오래된 격언이 말하듯, 좋은 것도 언젠가 끝이 오기 마련이죠.
어느 시점부터는 깊이, 너비, 해상도를 늘려도 성능 향상이 정체되기 시작합니다. 그리고 이 축들로 스케일을 키우는 데 드는 추가 계산 비용을 고려하면, 일정 임계값을 넘어서면 더 이상 큰 가치가 없습니다.
여기, 이 아이디어를 강조하는 EfficientNet 논문의 도표를 한번 살펴보세요:

세 개의 도표는 ImageNet에서의 top-1 정확도로 측정한 모델 성능이 너비(왼쪽), 깊이(가운데), 해상도(오른쪽)를 스케일할 때 어떻게 변하는지를 보여줍니다. 초기에는 모두 성능이 향상되지만, 어느 시점부터 점차 평준화되기 시작합니다.
하지만 그 도표들을 잠시 나란히 바라보고 있으면, 네트워크를 스케일하는 훨씬 더 나은 방법이 있다는 걸 알게 됩니다. 세 가지 핵심 스케일링 파라미터 중 하나만 크게 늘리는 대신, 너비·깊이·해상도를 고르게 함께 키우는 것입니다!
이 방식이 효과적인 이유는 각 하이퍼파라미터를 과하지 않게 조금씩만 늘리면, 성능이 크게 향상되는 구간을 따라 이동하게 되어 전체적으로 정체 구간에 도달하기까지 더 오랜 시간이 걸리기 때문입니다.
처음엔 “음, 그래. 뭐, 대충은 되는 것 같네” 정도로 보일 수 있지만, 곰곰이 생각해 보면 이 균형 잡힌 스케일링이라는 아이디어는 꽤 깊이가 있습니다.
이렇게 말해 보겠습니다. 오늘날 딥러닝의 상당 부분은 결국 모델에서 계산 자원을 어디에 배분할지의 문제로 귀결됩니다. 구체적으로, 여기서 말하는 “계산 자원”은 FLOPs(부동소수점 연산 수)와 네트워크의 파라미터 수로 측정하겠습니다.
FLOPs 수는 표준 도구로 계산할 수 있는, 연산량을 직접적으로 측정한 값입니다. 그리고 아시다시피 파라미터 수를 늘리는 일은 어떤 방식이든 공짜가 아닙니다. 그래서 우리가 생각해 낼 수 있는 가장 큰 층 수로 그냥 설정해 버리지 않는 것이죠.

그러니 EfficientNet 논문의 저자들이 실제로 답하려는 질문은 이것입니다 — 내 네트워크에 추가로 x만큼의 FLOPs/파라미터 예산이 있다고 할 때, 최상의 성능을 얻도록 그 예산을 어떤 방식으로 분배해야 할까?
그들이 제시한 해답은 복합 스케일링을 위한 알고리즘입니다.
하지만 먼저, 깊이, 너비, 해상도를 정확히 어떻게 스케일링할지 엄밀하게 정의해야 합니다. 저자들은 이를 세 개의 수치 w, d, r로 설명합니다.
기준 네트워크로, 예를 들어 입력으로 224 x 224 이미지를 받는 ResNet18을 생각해 봅시다. 기본 네트워크에서는 세 값이 모두 처음에는 1입니다. 이제 층 수를 36으로 늘린다고 가정해 보겠습니다(즉, 층 수를 두 배로). 이는 d=2에 해당합니다. 마찬가지로 w를 3으로 늘리면, 각 합성곱 층에서 필터 수를 3배로 늘린다는 뜻입니다. 해상도도 비슷한 개념입니다. r=1.5로 설정하면 입력 이미지 크기를 336 x 336으로 바꾸는 것에 해당합니다(224 × 1.5 = 336이므로).
이 간단한 규칙은 앞으로 EfficientNet 논문에서 소개한 정확한 복합 스케일링 기법을 설명할 때 큰 도움이 될 것입니다. 바로 지금부터 세 줄 뒤에서 그 내용을 본격적으로 다루겠습니다.
아, 그런데 말씀드렸던가요? 객체 탐지를 위한 EfficientNet 버전도 있습니다.
제 의견으로는 꽤 웃긴 이름인데, EfficientDet라고 합니다(보셨죠? 탐지를 뜻하는 “Det”).
좋습니다, 이제 약속을 지키려 괜히 시간을 끄는 건 그만하고 본론으로 들어가죠. 복합 스케일링으로 갑니다!
복합 스케일링
이제 필요한 것은 위에서 언급한 세 가지 수치, 즉 w, d, r을 설정하는 방법입니다(저처럼 금붕어 수준의 집중력을 가지셨다면 혹시 잊으셨을까 봐요).
EfficientNet에서 사용하라고 제안하는 방법은 다음과 같습니다:
위의 식에서 는 각각의 차원을 얼마나 스케일링할지를 나타내는 상수이며, 는 추가로 사용할 수 있는 계산 자원의 양을 나타내는 변수입니다.
이런! 너무 쓸데없이 복잡한데요. 왜 거듭제곱이니 지수니 하는 복잡한 것들을 끌어들이는 거죠? 원래는 간단한 아이디어 아니었나요?
자, 집중하세요. 이 문장이 지금 이 글을 읽는 분들 중 2%의 정신을 날려버릴 겁니다.
ConvNet에서 가장 흔한 연산은 무엇일까요? 맞습니다. 바로 합성곱입니다. FLOPs 관점에서 합성곱의 비용은 d에는 선형으로, w와 r에는 제곱으로 증가합니다. 즉, 깊이(depth)를 두 배로 늘리면 계산 비용도 두 배가 되지만, 너비(width)나 해상도(resolution)를 두 배로 늘리면 계산 비용은 네 배로 늘어납니다.
수식을 종합해 보면, 이는 매개변수 를 사용해 합성곱 신경망을 스케일링한다는 것이 의미하는 바는 다음과 같습니다. 이 규칙을 적용하면 계산 비용이 대략 다음과 같은 새로운 네트워크가 됩니다 , 이는 비용을 깔끔하게 측정하고 그에 맞춰 네트워크를 스케일링하는 방법을 제공합니다.
위의 수학이 잘 이해되지 않았다면, 직관적으로는 설정값을 0으로 설정하면 기준(baseline) 모델이 됩니다. 설정값을 1로 설정하면 원래 모델보다 총 용량이 대략 두 배이고, 계산 비용도 대략 두 배가 되는 모델이 됩니다. 설정값을 2로 설정하면 두 번째 모델보다 총 용량이 대략 두 배이고, 계산 비용도 두 번째 버전의 약 두 배가 되는 모델이 됩니다. 그리고 같은 방식으로 계속됩니다…
복합 스케일링을 바라보는 또 다른 관점은, 스케일링을 한 번 적용할 때마다 네트워크의 깊이, 너비, 해상도를 각각 일정한 상수값(예: 1.5)으로 곱해 주는 것으로 이해하는 것입니다. 이런 관점에서 보면, 스케일링 절차에서 반복 인덱스를 나타냅니다. 즉, 값을 설정하면 네트워크를 5번 스케일링한 결과가 됩니다.
좋습니다. 하지만 한 가지 작은 문제가 눈에 띄었을 수 있습니다 — 그 스케일링 상수들을 어떻게 설정할까요? (논문에서는 이를 alpha, beta, gamma라고 부릅니다.)
논문에서는 작은 그리드 서치를 사용해(여러 값을 시도해 보고 무엇이 잘 작동하는지 확인하는 방식으로) 결정할 것을 제안합니다.
궁금하다면, EfficientNet 아��텍처(곧 자세히 다룰 예정)로 실험을 돌려 얻은 구체적인 값들은 다음과 같습니다. .
완벽합니다! 이제 우리는 알게 되었네요 정확히 정확한 의미에서 네트워크를 어떻게 스케일링할지. 하지만 우리가 아직 다루지 않은 EfficientNet 논문의 또 하나의 중요한 부분이 있습니다 — 바로 EfficientNet 자체죠!
EfficientNet 아키텍처
지금까지 이야기의 핵심은 모델 스케일링입니다. 다만 이는 처음부터 잘 설계된 시작 모델이 있어 그 이점을 활용할 수 있다는 전제를 깔고 있습니다.
이 문맥에서 “좋은 모델”이란, 우리가 스케일링의 기준으로 삼을 총 FLOPs를 최소화하면서도 우수한 성능을 낼 수 있는 모델을 의미합니다.
가능했기 때문에, 저자들은 아키텍처 서치를 사용합니다(이 경우에는 스케일링 계열에서 가장 작은 네트워크만 찾으면 되니까 그렇게 나쁘진 않겠죠). 그리고 다음과 같은 형태의 결과를 제시합니다:

MBConv에 익숙하지 않다면, 이는 MobileNetV2와 함께 도입된 레이어입니다. 그 외에는 뭘 더 말할 수 있을까요? 아키텍처 서치로 만들어진 모델이고, 잘 작동합니다.
다음은 무엇일까요? 스케일링입니다!
기준 네트워크의 이름은 EfficientNetb0첫 번째로 스케일된 버전으로, 대략 두 배의 용량을 가진 모델은 EfficientNetb1이라고 불리며, 이런 식으로 일곱 번째까지 이어집니다.
얼마나 잘 작동할까요? 논문에는 이를 정확히 보여주는 정말 멋진 표가 있습니다. ImageNet에서의 최신 성과와, 유사한 성능의 네트워크와 비교했을 때 개선 폭이 몇 자릿수 규모에 이르는 결과까지 포함되어 있으니, 그 결과가 스스로 말해 주도록 하겠습니다:

그렇게 효율적이지 않은 넷들
Run set
방 안의 코끼리
좋아요, 이제쯤이면 EfficientNet의 각 버전이 어느 정도의 연산 비용을 요구하는지 꽤 잘 감이 오셨을 겁니다.
하지만 우리는 가장 거슬리는 질문에 아직 답하지 못했습니다. 왜 컴파운드 스케일링이 작동하지 않았을까요?
구체적으로 말하면, 정확도가 오르지 않았더라도 모델 간 성능은 최소한 일관되게 나왔어야 합니다. 그런데 왜 더 큰 모델들이 오히려 성능이 떨어졌을까요? 가능한 이유는 다음과 같습니다:
- 하이퍼파라미터: 같은 하이퍼파라미터가 모든 모델에 통하지 않는다는 것은 잘 알려져 있습니다. 만약 그랬다면 우리 모두 전역적으로 “최적”의 학습률, 배치 크기 등을 그냥 쓰면 될 테니까요. 더 큰 모델일수록 좋은 성능을 내기 위해 더 높거나 더 낮은 학습률이 필요할 수도 있습니다.
- 과다한 파라미터화: 우리가 사용한 가장 큰 EfficientNet인 EfficientNetb7은 6천만 개가 넘는 파라미터를 가지고 있습니다. 이는 ImageNette처럼 작은 데이터셋에는 너무 많은 규모이며, 더 큰 모델들이 필요 이상으로 훨씬 많은 파라미터를 가진 탓일 가능성이 큽니다.
- 정규화: 과도한 파라미터화 문제를 억제하는 데는 아마 도움이 되었을 것입니다. 하지만 정규화를 큰 모델에만 추가하면 공정하지 않은 비교가 됩니다.
결론
축하합니다. 이제 여러분은 두 가지 강력한 도구를 갖추게 되었습니다. 네트워크를 체계적으로 스케일링하는 원칙적 방법과, 이러한 모범 사례를 기본으로 구현한 최신 모델들의 모음입니다.
또한 더 작은 데이터셋에서 EfficientNet 모델을 시도한 제 실험 결과를 살펴보며, EfficientNet이 주장하는 FLOPs 감소가 실제로 벽시간 단축으로 이어졌는지 확인했습니다.
하지만 딥러닝 커리어에서 EfficientNet을 쓰지 않기로 결심하더라도, 여러분이 훨씬 더 값진 교훈을 얻었기를 바랍니다. 즉, 압도적인 성능이 흔히 거대한 GPU 배열이라는 갑옷을 두른 거구의, 메모리를 집어삼키는 골리앗들이 장악하는 이 분야에서도, 매끈한 가죽 새총과 작지만 효율적인 훈련 기법들로 가득한 주머니를 든 어린 목동 다윗에게 여전히 설 자리가 있고, 불가능해 보였던 일을 이뤄낼 수 있다는 사실 말입니다.
아마도, 가끔은 조금 더… 효율적으로 굴어 보는 게 이득일지도 모릅니다.
Add a comment
This is a pleasant read, however too general to be useful. There is no description of MBConv. and the main idea of EfficientNet which is to use different filter sizes. After reading the article, I still do not really know what EfficientNet is.
Reply