사전지식
ResNet -> Nas -> NasNet -> MnasNet -> EfficientNet 순으로 발전해왔습니다
이번 포스트에서는 Model Scaling method가 어떤식으로 발전해왔는지에 대해 중점을 두고 작성했습니다.
NASNet
기존의 딥러닝 모델들은 사람이 직접 모델을 구성하는 블록을 설계하고, 그 블록을 여러번 쌓아서 모델의 구조를 구축했었습니다.
대표적으로 ResNet은 Vanishing Gradient 문제를 해결하기 위해 사람이 residual block을 설계하고, 그 블록을 차곡차곡 쌓아서 구축한 모델입니다.
NasNet은 강화학습과 RNN을 활용하여 block을 사람이 아닌 모델이 딥러닝을 통해 설계하는 것이 특징입니다.
강화학습 : 최적의 보상을 얻을 수 있는 최적의 행동전략을 찾는 것
NasNet의 강화학습은 NAS(Network Architecture Search)라는 논문에서 영감을 받았습니다.
NAS의 강화학습 방법입니다.
RNN으로 구성된 controller를 이용해 child network를 만들고, 특정 데이터셋 (ex. CIFAR-10)에 대해 validation accuracy가 수렴할 때까지 child network를 학습시킵니다.
그러면 수렴한 validation accuracy를 reward로 설정하여 reward의 기댓값을 높이는 방향으로 policy gradient를 이용해서 controller의 가중치를 학습합니다.
policy gradient : https://talkingaboutme.tistory.com/entry/RL-Policy-Gradient-Algorithms
P값에 대한 설명 : https://www.investopedia.com/terms/p/p-value.asp
Nas는 위의 강화학습에서 1) 모델의 전체 구조를 search space로 설정했다는 점과 2) 큰 데이터셋 (CIFAR-10으로 당시에는 큰 데이터셋) 으로 러닝을 한다는점이 특징입니다.
(여기서 search space란 알고리즘이 탐색을 수행하는 공간을 의미합니다.)
이 특징들로 인해 모델의 전체 구조를 사람이 구성할 필요없이 만들 수 있고, 모든 데이터에 대해 범용적으로 사용할 수 있다는 장점들이 있습니다.
하지만 모델의 전체 구조를 찾는데에 엄청나게 긴 시간과 많은 자원이 소요되는 점(GPU 800대 한달간 러닝)과
작은 데이터셋에서의 성능이 타 모델과 비교했을때 떨어진다는 단점이 있습니다.
NasNet에서는 NAS의 단점을 보완하기 위해 Conv Layer만 search space로 설정하여 강화학습을 진행했습니다.
그로인해 모델을 구성하는데 소모되는 자원를 줄였으며(GPU 500대 4일간 러닝),
작은 데이터셋(CIFAR-10)에 대해 최적의 모델을 찾도록 러닝하고, 그 최적의 모델을 더 큰 데이터셋(ImageNet)에 대해 적용했음에도 높은 성능을 보여줬습니다.
NasNet은 앞서 말했듯이 CONV Layer만 강화학습을 진행해서 Normal Cell과 Reduction Cell을 생성합니다.
Cell들을 쌓아서 모델의 구조를 완성합니다.
(다만 Cell의 갯수 N과 각 Cell의 채널 수는 사전에 설정하는 하이퍼 파라미터입니다.)
Normal Cell은 input과 output의 dimension이 같은 convolutional cell이고,
Reductoin Cell은 output의 dimension이 input의 절반이 되는 convolutional cell입니다.
(어떠한 크기의 이미지가 들어와도 적용시킬 수 있도록 하기위해)
하나의 convolutional cell은 다시 B개(논문에서는 5로 설정)의 Block으로 구성되고, 각 Block은 5개의 Step을 거쳐서 생성됩니다.
각 Block은 두 개의 hidden state(기억과 비슷함, 지금까지의 입력 데이터를 요약한 정보)를 입력으로 받아 각각 모델이 결정한 특정 operation을 적용한 후, 특정 method ( (1) element-wise addition, (2) concatenation 두 가지중 하나를 선택합니다. ) 에 따라 두 결과를 combine하여 새로운 hidden state를 만듭니다.
좀 더 쉽게 말하자면 두 개의 레이어를 입력으로 선택하여 어떤 연산을 수행한 후 하나의 출력 레이어를 만드는 것입니다. 즉, 2개의 hidden state, 2개의 operation, 1개의 combine method로 총 5가지의 hyperparameter가 하나의 Block을 정의하게 되고, 이를 RNN Controller로 예측하는 것입니다.
ResNet은 처음으로 Human Recognization을 뛰어넘은 딥러닝 모델
NasNet은 처음으로 사람이 구성한 Layer보다 뛰어난 성능을 보인 딥러닝 모델
MnasNet
CNN의 성능은 모델을 점차 깊고 크게 만들면서 향상되어 왔는데, 이러한 모델의 크기 증가는 모바일 기기와 임베디드 시스템과 같은 resource가 제한적인 시스템에서 모델을 사용하기엔 적합하지 않았습니다.
CNN의 정확도를 유지하면서도 모바일 환경에 맞는 효울적인 CNN구조를 제안하는 여러 연구들이 진행되어서 MnasNet이 나왔습니다.
MnasNet은 앞서 말했듯이 computaional resource가 제한된 환경에서 CNN을 사용하기 위해 만들어진 모델
accuracy와 모바일 기기의 latency까지 함께 고려하여 만든 모델
연산량인 FLOPS가 latency와 비례하지 않는다는 점 때문에 아래와 같은 강화학습법을 적용
NAS의 강화학습법을 모방
Controller는 논문에서 새롭게 제안하는 factorized hierarchical search방식으로 search space에서 모델을 샘플링하는 역할을하고 Trainer는 이 샘플된 모델을 학습하는 역할을 한다. Trainer가 샘플링 된 모델을 학습한 후 나온 모델의 accuracy와 실제 모바일 기기에서 측정된 real-world latency를 고려한 multi-objective reward를 반영하여 새로운 모델을 샘플링하는 과정을 거친다.
Factorized Hierarchical Search (Layer -> Block -> CNN)
이전까지의 Depth Scaling은 복잡한 layer 구조 하나를 반복적으로 쌓은형태로 계산량을 늘려서 정확도를 높이는 방식이였습니다.
CNN을 block단위로 나누고 각 block 안에서 layer 구성을 찾을 수 있도록 설계하였다. 이렇게 CNN구조를 block-layer순으로 계층적으로 factorization 함으로써 per-layer방식대비 search space를 효과적으로 줄일 수 있다.
그 결과 이전의 동일한 Network를 여러겹 쌓은 방식 때문에 생겼던 문제점인
1) 계산량이 커서 latency가 늘어나고, 2) Network layer내에서 다양성이 없어서 정확도가 떨어지는 문제를 개선했습니다.
EfficientNet : Rethinking model scaling for convolutional neural networks
모델의 파라미터와 FLOPS를 크게 줄여서 모델의 Inference 속도가 매우 빠른데도 이전에 나온 모델들에 비해 정확도가 뛰어나다 해서 EfficientNet이라는 이름을 붙임
Model scaling
대표적인 Model Scaling 방법 3가지
1. Width Scaling
필터(커널)의 갯수를 조절
width가 넓은 네트워크일수록 더 세밀한 특징을 포착할 수 있는 경향이 있지만,
high level feture를 포착할때에는 어려움을 겪습니다.
2. Depth Scaling
이전까지 설명했던 딥러닝 모델과 같이 여러겹의 Layer를 쌓는 Scaling 방법입니다.
ResNet-50을 RestNet-200으로 확장하는게 대표적인 Depth Scaling의 한 예입니다.
다만 레이어가 늘어난다고 해서 항상 성능이 증가하는게 아니고, 자원만 더 많이 먹는 비효율적인 작업이 될 수 있습니다.
비효율적인 작업의 예로는 ResNet-1000은 ResNet-101은 유사한 정확도를 가지고 있다고 합니다.
3. Resolution Scaling
Input resolution (이미지 해상도) 확장
고 해상도 이미지에서는 특징들이 더 세밀하게 나타나기 때문에 저해상도 이미지보다는 정확도가 올라가지만, 일부 임계값 후에는 모델 성능에 큰 이득을 주지 못합니다.
그리고 세 가지 Scaling법 모두 자원을 많이 잡아먹는 특징이 있습니다.
이전까지의 딥러닝 모델들은 위의 세 가지 Scaling법 중 한 가지만 적용하거나 2개 이상의 Scaling법을 임의로 설정하여 진행했었습니다.
하지만 세 가지 Scaling법 모두 과유불급의 특성을 가지고 있기 때문에 비효율적인 경우가 많았습니다.
가로축은 FLOPS로 연산수를 의미, 세로축은 Accuracy 정확도
width는 2.6배 증가시켰을때가 효율적, depth는 6배, resolution은 2.5배
위 사진은 width를 고정하고 depth와 resolution의 변화에 따른 성능변화를 관찰한 결과입니다
depth 비교, resolution 비교
구글 브레인팀에서 위의 세 가지 Scaling법을 모두 적절하게 사용하는 방향으로 모델을 설계해서 정확도와 자원을 효율적으로 사용하는 솔루션을 고안해냈습니다.
복합 계수 ɸ를 사용하여 네트워크 폭, 깊이 및 해상도를 원칙적인 방식으로 균일하게 확장하는 단순하지만 매우 효과적인 스케일링 기법을 제안했습니다.
ɸ은 이용가능한 자원의 수를 제어하는 사용자 지정 계수이고, α,β,γ(알파,베타,감마)은 이들 자원을 네트워크 깊이, 폭, 분해능을 나타냅니다.
는 small grid search로 결정되는 상수입니다. 그리고, ϕ는 주어진 연산량에 따라 사용자가 결정하는 상수입니다.
이때 알파 베타 감마 세타, 4가지 파라미터는 MNASnet의 search space에서 영감을 얻어서 자원의 효율과 정확도의 효율 모두 따져서 파라미터를 결정하도록 합니다.
위의 식에서 width와 resolution에 제곱이 들어간 이유는 depth는 2배 키워주면 FLOPS도 비례해서 2배 증가하지만, width와 resolution은 가로와 세로가 각각 곱해지기 때문에 제곱 배 증가합니다. 그래서 제곱을 곱해서 계산을 하고 있습니다.
따라서 총 FLOPS가 2^³을 초과하지 않도록 하기 위해 적용되는 제약조건은 (α * β² * γ²) ≈ 2이다.
본 논문에서는 알파 값은 1.2, 베타 값은 1.1, 감마 값은 1.15를 사용하였으며, B0에서 B7으로 갈때에 3개의 scaling factor는 고정한 뒤 파이를 키워주며 모델의 사이즈를 키워주고 있습니다.
위 사진은 Class Activation Map으로 depth, width, resolution만 조정했을때, compound Scaling했을때의 영상내의 의미있는 부분에 대해 feature map의 활성화 차이를 볼 수 있습니다.
하나의 Model Scaling을 했을때와 Compound Scaling을 했을때의 차이
다른 모델과의 차이
EfficientNet은 2019년 당시 Image Classification 부문에서 SOTA를 기록했습니다.
'데이터 분석 > 딥러닝' 카테고리의 다른 글
[python] ArgumentParser(argparse) 정리 (0) | 2023.08.03 |
---|---|
Optimizer, Loss Funtion (0) | 2021.04.08 |
신경망 학습방법과 역전파(BP) (0) | 2021.04.07 |
Neural Network (0) | 2021.04.06 |