CNN의 종류가 너무 많습니다. 처음 접할 때는 LeNet, AlexNet, VggNet… 정도 였던 것 같은데, 지금 저런 모델은 구닥다리로 취급되고 훨씬 좋은, 그리고 멋진 테크닉이 적용된 모델이 등장했습니다. 이번에는 이런 CNN들이 흐름대로 발전해왔는지, 그 흐름을 기록해두겠습니다.
# 시작
CNN은 1989년 “Backpropagation applied to handwritten zip code recognition, LeCun, 1989” 에서 처음 소개되었습니다.
# 왜 CNN?
이미지를 flat하게 펼쳐 MLP로 학습하는 것은 분명 가능하나, flat하게 펼치는 행위에서 이미지의 지역적 정보(topological information)가 날아가버리며, 해당 데이터를 추상화시키지 않고 바로 연산을 시작하기에 학습 시간과 능률에 있어 굉장히 비효율적입니다. 때문에 이미지의 지역적 정보를 잘 살릴 수 있는 receptive field concept를 채용한 CNN이 도입되었고, 좋은 결과를 거두고 있습니다.
# 1998: LeNet – Gradient-based Learning Applied to Document Recognition
앞서 말한 LeCun이 만든 네트워크로, CNN의 기반을 구성했습니다. Pooling, Padding, Activation, Fully connected로 연계되는 일련의 과정을 사용했으며, MSE Loss를 활용했습니다. 당시 MNIST Dataset을 기준으로 99.05% 정확도를 달성했습니다.
# 2012: AlexNet – ImageNet Classification with Deep Convolutional Neural Network
비록 LeNet이 MNIST Dataset 정확도 99%라는 결과를 달성했지만, 그게 한계였습니다. 부족한 컴퓨터 연산 능력과 데이터로는 그 이상의 복잡한 과제 – 얼굴 또는 객체 인식 등의 – 를 해결할 수 없었고, 기존의 알고리즘(HarrCascade, SIFT feature extractor with SVM)이 더 널리 사용되었습니다.
그러던 중 등장했던 것이 AlexNet인데, ImageNet test(Top-5)에서 기존 정확도 73.8%를 83.7%로 대폭 증가시켰습니다. 이 친구들은 LeNet의 구조를 거의 계승하되, 그 사이즈를 키웠으며(애초에, 인풋 사이즈가 LeNet은 32x32인 것에 비해, AlexNet은 224x224), Activation function으로 ReLU를 적용하였습니다. 또 모델의 사이즈(=파라미터 수)가 커짐에 따라 발생할 수 있는 Overfitting 문제를 해결하기 위해 Dropout layer를 적용하였는데, 이로 인해 Batch normalization 등의 방법론이 대두될 수 있는 계기가 되었다고 합니다.
재밌었던 것은 당시 AlexNet을 학습하기 위해 GTX580 2개를 사용했다는데, 지금은 개인 컴퓨터에도 RTX2070이 달린 걸 보면, 연산 속도의 발전은 정말 빠른 것 같습니다.
# 2014: VggNet – Very Deep Convolutional Networks for Large-Scale Image Recognition
AlexNet이 좋은 결과를 거두면서, 학계 전체에서 CNN을 주목하기 시작했고, 대체 왜 CNN이 좋은 결과를 냈는지에 대한 논문과 관련 모델들이 쏟아져 나오기 시작했습니다. 그 중에서도 VggNet은 ImageNet test(Top-5)에서 93.2%라는 성과를 거두었습니다.
해당 모델이 AlexNet과 다른 점은, 첫째로 더 깊은 네트워크를 쌓았다는 점입니다. 기존 AlexNet이 고작 5개의 Conv filter를 사용했던 것에 비해, VggNet은 무려 19개의 Conv filter를 사용했습니다. 둘째로 Conv filter size를 3x3으로 통일했다는 점입니다. 기존 AlexNet의 경우, 이미지에 대한 다양한 특성을 추출하기 위해 7x7, 11x11 등 다양한 사이즈의 Conv filter를 사용했던 것에 비해, VggNet은 여러 개의 3x3 Conv filter를 중첩시켜, 계산 비용은 줄이고, 성능은 향상시켰습니다. 이런 구조 덕택에, VggNet은 Semantic segmentation, Object detection 등의 모델의 Back-bone network로써 활용되었습니다.
다만, 이런 Deep architecture 는 Gradient vanishing 문제를 다시금 수면 위로 끌어올렸고, 이후에는 이를 해결하기 위한 많은 방법들이 모색되었습니다.
# 2014: GooLeNet – Going Deeper with Convolutions
VggNet이 모델을 더 Deep 하게 만듬으로써 정확도를 상승시켰던 것 처럼, GoogLeNet(=Inception v1) 또한 22개의 레이어를 사용한 더 Deep한 구조를 채용하여 ImageNet 2014에서 최고 성적을 거두었습니다.
VggNet과 달랐던 점은, VggNet이 Gradient vanishing 문제를 pre-training과 weight initialization으로 해결하기 위해 노력했던 것과는 달리, 네트워크 구조를 수정하는 것으로 해결했다는 점입니다.
첫째로, GoogLeNet은 Inception module이라는 개념을 적용하여 Asymmetric network를 구성하였습니다.
둘째로, Network In Network 라는 논문의 내용을 채용해, 큰 사이즈의 Conv filter를 적용하기 전, 1x1 Conv filter를 통과시킴으로써, 연산 효율을 증대시키고, 이미지 내 비선형적인 특징을 추출할 수 있도록 하였습니다. 이 구조는 Bottleneck structure라고도 불리며, 이후 등장하는 모델들에 광범위하게 활용되었습니다. 또한 최종 Fully connected layer에 연결되기전 Average pooling layer를 통과시킴으로써, 효율을 높이고, 오버피팅을 방지하였습니다.
셋째로, Auxiliary classifier 개념을 적용하였습니다. 모델이 굉장히 깊어졌으니, 우려하던 Gradient vanishing 문제가 있을 것이고, 이것을 어떻게 해결할까 고민하다, 이미지가 모든 레이어를 통과하고, 가중치들을 업데이트하는 대신에, 레이어를 통과하는 중간중간에 한번씩 가중치를 업데이트 해주자, 라는 아이디어입니다. 위 사진을 보면, 중간중간 Softmax가 끼어들어 있는 것을 볼 수 있는데, 저 부분에서 중간 가중치를 업데이트 해주는 방식입니다. 물론, Auxiliary loss에 대해서는 main loss보다 작은 가중치를 두고 업데이트를 진행하며, 훈련시에만 적용하고, 테스트시에는 구성에서 제거합니다. 이런 구조는 굉장히 복잡하기에 추후 연구에서는 제거되었지만, Pose estimation 등의 과제에서 잘 활용되었습니다.
# 2014: SppNet – Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
해당 논문은 여태 보던 Image classification task가 아닌, Object detection task에서 크게 활약했던 놈으로, Fast R-CNN의 많은 부분이 해당 논문을 참고하여 만들어졌습니다. 해당 논문에서 제기하는 방향성은, 아니 시방 왜 CNN은 학습할 때마다 Input image size를 다 맞춰줘야하는 것이냐. 솔직히 Conv filter는 Input image size 관계없이 먹일 수 있는 거 아니냐. Fully connected layer? 이 놈이 문제라 이거제. 그럼 FC 도착 하기 직전에 사이즈만 다 맞춰볼랑게- 가 됩니다. 그걸 어떻게 하느냐? 위 그림과 같은 Spatial pyramid pooling layer를 적용해서 처리합니다.
# 2015: ResNet – Deep Residual Learning for Image Recognition
2015년에는 Image classification뿐만 아니라, Semantic segmentation, object detection 등에서도 큰 발전이 있었습니다. 그 중에서도 Microsoft research 에서 발표한 ResNet은 가장 큰 주목을 받았습니다. 앞서 GoogLeNet은 Gradient vanishing 문제를 해결하기 위해 Asymmetric inception module과 auxiliary classifier를 활용했지만, 이조차도 50개, 또는 그 이상의 레이어를 쌓은 구조에서는 큰 효과를 거두기 어려웠습니다. 이를 해결하기 위해 ResNet은 사진과 같은 Residual module을 제시하여 큰 성과를 거두었습니다. Residual learning은, x로부터 F(x)+x를 학습할 때에, 그 전체를 학습하는 것 보다는, x는 그대로 넘겨주고, 잔여물인 F(x)만을 학습하는 것이 더 효율적일 것이라는 생각에서 시작되었고, GoogLeNet의 Bottleneck, Batch normalization idea와 결합되어 152개의 Conv layer를 채용하면서도 ImageNet test(Top-1)에서 80.72%의 정확도를 달성하였으며, 추후 등장한 Xception, Darknet 등 다양한 후속 모델에 기본 옵션으로 적용되었습니다.
# 2016: Xception – Xception: Deep Learning with Depthwise Separable Convolutions
ResNet이 등장하면서, 기존의 Conv layer에서 빼먹을 수 있는 단물은 다 빼먹었다는 생각이 들기 시작했고, 연구진들은 Conv layer의 구성을 조금 다르게 잡아보고자 했습니다. Xception이라는 이름처럼 이는 Inception을 근간으로 두고 있는데, Inception module이 여러 개의 Conv feature map을 Concat하여 사용했던 것을 응용하여, Depthwise convolution을 적용하였습니다. 위의 Figure 5.를 보면 SeparableConv라는 게 있는데, 이게 아래 그림과 같은 역활을 시행합니다.
이는 위 그림처럼, 얻어진 기존의 Conv layer로부터 얻어진 Feature map을 각 채널별로 다른 Conv layer를 적용하여 각각에 대한 feature map을 얻어내고, 이들을 Concat한 뒤, 1x1 Conv(=Pointwise convolution)를 통해 채널의 수를 줄이게 됩니다. 이렇게 Seperable convolution을 적용하게되면, 채널간의 정보 교환은 차단된다는 단점이 있지만, 그로 인해 연산량의 측면에서 많은 이득을 취하게 되며, 결과적으로는 ResNet과 Inception v3보다 우위에 설 수 있었습니다. 이러한 아이디어는 추후 MobileNet, DeepLabV3 등에도 적용 되었습니다.
# 2017: MobileNet – MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Application
비록 Xception이 ImageNet test에서 79%(Top-1), 94.5%(Top-5)를 달성했으나, 이전의 SOTA 모델인 Inception V3에 비해서 겨우 0.8%, 0.4%만큼의 성능 향상 밖에 없던 셈이었기 때문에, 연구자들은 다른 영역으로 초점을 옮기기 시작했습니다. 그 중 하나가 리소스의 제약이 큰 환경에서도 좋은 이미지 분류를 시행하기 위한 ‘효율’의 영역인데, 알파고가 바둑을 둘 때, 판후이와의 대결에서는 1202개의 CPU와 176개의 GPU를, 이세돌과의 대결에서는 48개의 TPU를 사용했다는데, 오히려 이런 환경이 이상적인 것이고, 실제로는 GPU 조차 없는 디바이스들이 더 많을 것이라는 점을 바라본 것입니다. 이를 MobileNet이 주도했습니다.
잠깐 돌아보면, 모델의 크기 또는 연산 속도를 줄이고자하는 움직임 자체는 MobileNet이 처음이 아닙니다. Fully connected layer를 없애도 보고, Kernel reduction(3x3 -> 1x1)을 적용하기도 했고, Xception은 Seperable convolution을 구성하였으며, Downsampling을 초반에 넣을 것인지 후반에 넣을 것인지를 비교하며 적절한 비율을 찾아냈습니다. MobileNet이 이들과 달랐던 점은, 아래 그림과 같이 Depthwise conv와 Pointwise conv 사이에도 Batch normalization과 ReLU를 끼워넣어놨다는 점. 그리고 중간중간의 Pooling layer의 경우 stride=2 인 Conv layer로 대체했다는 점. 그리고 Width multiplier 와 Resolution multiplier라는 2개의 parameter를 활용해, 성능과 전체 파라미터 수 간의 trade-off가 가장 적절한 지점을 찾아내고자 했다는 점 정도가 있습니다.
결과적으로는 일반적인 Conv layer를 활용한 모델과 MobileNet이 정확도는 거의 비슷하면서도 계산량은 약 9배, 파라미터 수는 약 7배를 줄일 수 있었습니다. MobileNet은 이후로도 Inverted residual, Linear bottleneck, Neural architecture search technique과 결합하여 계속 발전하고 있습니다.
# 2017: DenseNet – Densely Connected Convolutional Networks
이는 ResNet의 아이디어를 이어받아, 제목처럼 밀도 높은 네트워크를 구성한 논문입니다. 위 그림과 같이 앞단 Layer의 Feature map이 지속적으로 뒷단 Layer의 Feature map에 연결되고 있는 것을 볼 수 있는데, ResNet과 다른 점은 Add 연산이 아닌 Concat 연산이라는 점입니다. 여기서 당연히 생각할 수 있는 건, 그렇게 밀도높게 Concat을 남발하면, 기존 네트워크들은 Conv layer 의 채널 하나하나가 64개 막 이러는데, 감당을 우째 하느냐- 라는 점인데, DenseNet은 그냥 그 채널 자체를 굉장히 작은 수(예: 4) 이렇게 줄여서 해결합니다. 4라는 수가 몇 개씩 더해지든 사실 그렇게 커지지는 않겠지요. 쨋든 이게 핵심이고, 1x1 Conv layerd를 사용하는 Bottleneck layer, Feature map를 Compression해주는 Transition layer(=BN+ReLU+1x1Conv+2x2AvgPool), Pre-activation structure(=BN+ReLU+Conv) 등을 활용하여, CIFAR10 Dataset에서 약 96% 정확도를 달성하게 됩니다.
# 2017: SeNet – Squeeze and Excitation Networks
앞선 GoogLeNet의 Inception module, ResNet의 Residual connection, DenseNet의 Dense connection처럼 SeNet에서는 Se block이라는 독특한 구조를 활용하여 좋은 성과를 이루어냈습니다. Squeeze and Excitation 이라는 이름처럼 Feature를 쥐어짜냈다가, 다시 증폭시키는? 느낌인데 위 그림을 보시면 됩니다. C’에 일반적인 Conv filter를 씌워 C를 얻어내고, 이를 쥐어짜내서 1x1XC의 텐서를 만들어내는데, 이는 채널별로 GAP(Global Average Pooling)을 적용한 것입니다. 이후 해당 텐서를 오토인코더 구조마냥 Reduction ratio라는 값을 통해 압축시켰다가 다시 같은 사이즈로 펼쳐내는 Fully connected layer를 적용하여 각 값들을 증폭시키고, 이렇게 얻어진 1x1XC 텐서를 앞에 구했던 C와 Channelwise multiplication을 적용합니다. 위 과정이 이해가 되었다면 이런 Se block은 기존의 네트워크에 가져다 붙여 사용하면 될 것이라는 느낌을 받을 수 있는데, 실제로, 저자들은 아래와 같이 Inception과 ResNet에 해당 모듈을 붙여 테스트 과정을 진행했습니다.
결과적으로는 ImageNet Dataset에 대해 기존 모델의 정확도를 0.6%가량 향상시킬 수 있었습니다.
# 2017: ShuffleNet – ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
ShuffleNet은 MobileNet과 그 방향성이 같습니다. 파라미터 수를 쥐어짜면서, 성능은 높이고자하는 것입니다. 그러면 어떻게 올렸을까. 왜 Shuffle 이라는 이름이 들어갈까- 를 생각해야하는데, 이를 위해서, 위와 같은 그림을 생각해볼 수 있습니다. 앞서 설명되었던 Seperable convolution에서 Depthwise 연산은 사실상 채널별 연산을 의미하고, Pointwise 연산은 사실상 필터별 연산을 의미합니다. 때문에 일반적인 Convolution을 Factorization했다는 표현을 사용하기도 합니다. 그런데 이런 과정에서, Pointwise 연산이 연산량을 줄여주기는 하지만, 정보의 손실을 가져오고 있는 것은 아니냐- 라는 의문이 제기되었고, 이를 개선하기 위해, 위의 (c) 와 같은 Channel shuffle이 도입되었습니다. 다시 (a) 부터 보면, 이건 AlexNet에서 부터 적용되었던 Group conv입니다. 다른 것이 아니라, 전체 인풋을 Channel 별로 그룹을 지어, 그 그룹별 Conv filter를 씌운 뒤 그대로 진행하는 것입니다. 이렇게 되면, 딱보더라도 다른 그룹간의 정보 교류가 전혀 일어나지 않습니다. 사실 추후 설명할 EfficientNet 논문에서의 실험 결과에 따르면, 높은 수의 Channel(=Resolution)을 사용하는 것은 계산 비용이 문제가 되는거지 정확도 향상에는 분명히 긍정적인 영향을 – 물론 데이터셋에 맞는 사이즈에 한하여 – 미치는 것이 확인되었기 때문에, 이렇게 그저 작은 수의 Channel을 여러 그룹으로 만들어 정보 교류 없이 결과를 뱉어봐야, 그 한계점이 명확할 것입니다. 때문에 (b) 와 같이, 다음 레이어로 넘어갈 때 정보가 서로 뒤죽박죽 섞이게끔 설계한다면, 다른 그룹간의 정보가 서로 융화되어 조금 더 좋은 Representation을 찾을 수 있게 될 겁니다. 그걸 어떻게 하면 좋냐, (c) 처럼 Feature map들을 Shuffle하자. 결과적으로, 같은 Complexity 아래에서 ShuffleNet은 MobileNet에 대비하여 3~8% 정도의 성능 향상을 이루어낼 수 있었습니다.
# 2018: NasNet – Learning Transferable Architectures for Scalable Image Recognition
지금껏 보아온 네트워크 구조는, 결국 사람이, 계속 디자인해왔습니다. 그런데 어떤 레이어를, 어떤 순서로, 어떤 너비로, 어떤 깊이로 배치하면 가장 좋은 네트워크인가- 라는 질문을 생각해보면, 이렇게 사람이 디자인한 것이 정말 최적의 구조일까요? 무식하게 Complete search를 해서 구조를 찾아내면 안될까요? 물론 사람이 안하고, 컴퓨터가 자동으로 해내면 참 좋을 것 같습니다.- 라는 아이디어를 기반으로 나왔던 논문이 “Neural Architecture Search with reinforcement learning(2017)”[https://arxiv.org/abs/1611.01578] 입니다. 해당 논문에서는 RNN Controller와 Reinforcement learning을 활용해 CIFAR-10 Dataset에 대한 최적의 네트워크를 찾아냈고, 결과적으로 DenseNet과 비슷한, 약 96%의 정확도를 얻어냈습니다. (그러나 20.08.31 기준 CIFAR-10의 최고정확도는 약 99%) 그러나 이런 구조를 뜯어내기 위해 800개의 K40 GPU를 28일간 굴렸다는 것을 생각해보면, 영 남는게 없는 장사입니다. 때문에 이러한 비효율을 개선하기 위해, NasNet이 등장하였는데, 핵심적인 차이는 Search space 자체를 크게 줄였다는 점입니다. 기존 Nas의 경우, 네트워크를 구성하는 Layer 하나 하나를 탐색해 나간 반면, NasNet은 Convolution cell이라는 단위를 먼저 추정하고, 이들을 조합해 전체 네트워크를 구성합니다. (Convolution cell이라는 단위를 탐색한다는 말에서 느낄 수 있듯, NasNet의 경우 Nas와는 달리 Image classification architecture에 한정되어 있다는 단점이 있습니다.)
쨋든 NasNet은 위의 Conv cell을 조합하여 네트워크를 구성하였는데 , CIFAR-10 Dataset에서 최고 97.6%의 정확도를 달성했습니다. 기존 Nas는 Layer별 탐색을 시도했기 때문에 완성된 구조가 굉장히 지저분한 형태였던 것에 비해, NasNet은 Cell별 탐색을 시도했기에 (그나마…) 사람이 이해해볼 법한 형태를 띄며, 흥미로운 것은 가장 최근까지의 결과였던 Seperable conv가 채택된 것이 대부분이라는 점입니다.
마지막으로 왜 논문의 제목에 Transferable-이라는 단어가 사용되었는지를 살펴보겠습니다. 사실 NasNet이 Nas의 효율을 개선시켰다고는 하나, 이 친구도 P100s GPU 500대를 4일간 학습시켰습니다. 어지간한 대기업도 사실 시도도 못하겠지요. 다만, 이렇게 CIFAR-10에 대해 학습한 구조에 대해 마지막 Softmax layer만 ImageNet Dataset에 맞춰 수정한 모델이 달성한 성취가 굉장히 대단합니다. 재학습한 것이 아니라 그저 마지막단만 수정했을 뿐인데, 무려 82.7%(Top-1), 96.2%(Top-5)의 정확도를 달성했습니다. 이는 당시 SOTA를 달성했던 SeNet과 동일한 수치이며, 필요 파라미터 수와 연산량은 오히려 절반 정도로 감소했습니다. 더 놀라운 것은, MobileNet처럼 필요 파라미터 수를 대폭 감쇄시켜도 기존 모델보다 좋은 성능를 내며, Object detection의 Backbone network로 사용했을 때에도 좋은 성능을 내준다는 점입니다. ImageNet Dataset에 최적화된 구조도 아닌데, 이만큼의 Transferability를 보이는 것이 사실 이 논문의 가장 큰 의미가 아닐까 싶습니다.
# 2018: Bag of Tricks – Bag of Tricks for Image Classification with Convolutional Neural Networks
이번 논문은 그 이름처럼, Image classification 성능을 향상시키기 위해 제기되었던 다양한 아이디어들을, 싸그리 끌어모아 이건 해보니 좋더라 저건 해보니 안좋아질 때도 있더라… 등의 많은 실험을 진행한 것입니다. 결과부터 말씀드리면, ResNet-50을 Baseline으로 하여 다양한 Trick들을 적용시켰을 때, ImageNet dataset 기준 약 4%(Top-1)의 정확도 상승을 성취할 수 있었습니다.
지금까지 발표된 다양한 Trick들을 Efficient training, Model tweaks, Training refinement 3분야로 나누어 비교 및 설명하고 있는데, 모든 내용을 상세히 설명하기보다는, 정말 간략히 줄줄줄 이어 말하도록 하겠습니다..
첫째, Efficient training
Linear scaling learning rate는 Batch size에 Linear하게 Learning rate를 조절해야한다. Learning rate warmup은 Learning rate를 일정 step 마다 줄여나가는 방식과는 반대로, 오히려 초기 Learning rate를 0으로 세팅한 뒤, 이것이 Initial learning rate에 도달할 때 까지 키웠다가 다시 서서히 줄여나가는 방식을 의미합니다. Zero gamma는 Batch normalization layer의 hyper parameter 중 하나인 gamma를 0으로 입력하는 테크닉인데, Residual block이 존재하는 경우에 사용하면 좋더라-하는 내용입니다. No bias decay는 L2 regularization을 적용할 때 Bias에는 적용하지 않고, Weight에만 적용하는 것이 Overfitting에 효과적이라는 내용입니다.
이런 Efficient training 부분에서는 사실 정확도의 상승은 약 0.4% 정도에 지나지 않았지만, 학습속도의 측면에서 약 2배 이상의 이득을 챙길 수 있었습니다.
둘째, Model tweaks
해당 파트에서는 ResNet의 Input stem과 Output layer로 들어가기 직전이 Dwon sampling layer의 일부를 수정한 ResNet-B, C, D를 설계하고 이들간의 정확도 변화를 체크했습니다. 단순히 레이어를 조금 수정하는 것 만으로도 약 1%의 정확도 향상이 있었습니다.
셋째, Training refinement
Cosine learning rate decay는 이름처럼, Learning rate를 decay할 건데, 이것을 Cosine 그래프마냥, Learning rate를 키웠다가, 줄였다가, 다시 키웠다가, 줄였다가- 를 반복하게끔 하는 방식입니다. Label smoothing의 경우, Inception V2에서부터 적용된 방식인데 기존에 0또는 1로 구성된 라벨 데이터를 원핫벡터로 변환하여 사용했던 것과는 달리, 1을 1이라 말하지 않고 쪼오금 더 작은 값으로, 0을 0이라 말하지 않고 쪼오금 더 큰값을 할당해서 = 라벨을 부드럽게 처리해서 학습하는 방식입니다. Knowledge distillation. 지식 증류? 한글로 해석하니 저런 의미가 되는데, 음 그 목적은 지식의 액기스를 쮜어짜낸다는? 그런 느낌입니다. 좀 더 구체적으로, 어떤 Task를 굉장히 잘 처리하는 어떤 모델이 있다고 가정합시다. 이러한 모델들은 대개 사이즈도 크고, 앙상블도 쓰고, 뭐 꽤나 무겁겠지요. 그런데 우리는 이런 무거운 모델을 별로 원하지 않아요. 이런 무거운 모델이 알고있을, 배웠을, 어떤 지식이란 추상적 개념을 조그마한 싱글 모델에다 그대로 주입을 시켜보고싶습니다. Knowledge distillation은 이러한 행위를 목적으로 진행되는 일련의 과정입니다. 그 방법 중 하나를 설명드리면, 무겁고 아는게 많은 Teacher model과 가볍지만 아는게 적은 Student model이 있다고 가정합시다. Teacher model의 지식을 어떻게 Student model에게 주입시킬 수 있을까. 답은 아래 그림처럼 Softer softmax를 사용한 Distillation loss와, 기존 우리가 알던 Student loss를 동시에 고려하면서 모델을 학습시키는 방법입니다. 단순한 분류 결과(이건 고양이야, 이건 개야)보다, Softmax layer의 결과가 사실상 모델이 가진 어떤 지식에 대한 정보를 더 많이 가질 것이라는 생각에서 나온 개념입니다.
마지막으로 Mixup training은 Data augmentation 기법 중에 하나인데, 서로 다른 라벨을 가진 두 이미지를 적당히 섞고, 라벨도 섞어서 내놓겠다- 라는 내용입니다.
이런 Training refinement에 나온 각 기법들은 적용할 때마다 약 0.3%이상의 정확도가 상승했습니다.
# 2019: EfficientNet – EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks
이후 ImageNet의 SOTA를 확연하게 앞지르는 구조의 등장이 뜸해지기 시작했고, ImageNet에서 적용되던 많은 아이디어들이 다른 Task에서는 제대로 동작하지않는다는 점이 식별되면서, 지금의 연구방향이 맞는 것인가- 하는 비판이 시작되던 와중, 기존 랭커 모델들보다도 파라미터 수는 적으면서, 정확도는 상회해버리는 EfficientNet이 등장했습니다. 앞서 말한 NasNet이 82.7%(Top-1)이었던 것에 비해, 해당 네트워크는 무려 84.4%(Top-1)을 달성했으며, 현재(20.08.31)기준으로도 88.5%를 달성한 SOTA 모델은 EfficientNet 기반입니다.
이러한 EfficientNet은 어떻게 구성된거냐- 를 이해하기 위해서는 Model scaling에 대한 이해가 필요합니다. EfficientNet은 기존 SeNet처럼 사람이 일일이 구성한 네트워크가 아니라, MnasNet을 통해 얻어진 EfficientNet-B0라는 작은 모델을 주어진 Task에 최적화된 구조로 수정해나가는 형태인데, 기존 모델은 작다고 했으니, 주어진 복잡한 Task에 맞추기 위해서는 모델의 Capacity를 늘려야겠지요. 그러려면 방법은 당연히 기존 모델을 Wide하게 하거나, Deep하게 하거나, Input resolution을 늘리거나- 하면 되겠죠. 이들을 각각 Width scaling, Depth scaling, resolution scaling 이라 지칭합니다. ResNet, MobileNet 등도 이러한 기법을 적용했었습니다. 다만 이 3가지를 동시에 적용하지는 못했었는데, EfficientNet은 Compound scaling이라는 이름 하에 이를 진행했습니다.
이를 위해 위 사진처럼 depth, width, resolution에 대한 파라미터 및 조건을 정의하고 Grid search 기법으로 alpha, beta, gamma 값을 찾습니다.
이후, 위 실험 결과처럼, [width, depth, resolution]이 조화롭게 커지는 것이 모델에 긍정적 영향을 미칠 것이라 생각하고, phi 값(최종 모델들은 0.2~0.5를 사용)을 통해 [width, depth, resolution]이 같은 비율로 조정될 수 있게끔 하였습니다. (실험 결과에서 흥미로운 점은, Depth에 의한 성능 정체가 width, resolution에 비해 가장 빨리 일어난다는 점이었습니다. 깊을 수록 좋다! 라는 최초 접근과는 다른 양상인 느낌이네요.)
쨋든 이렇게 만들어진 다양한 아키텍쳐들은, 필요 파라미터 수와 연산을 굉장히 줄이면서도, 기존 모델과 비슷하거나, 오히려 높은 정확도를 달성할 수 있었습니다. 마지막에는 CAM을 통해 depth, width, resolution, compound scaling의 효과를 비교하는데, 이 역시 인상깊은 자료입니다.
끗.
'머신러닝 > [기타]' 카테고리의 다른 글
그래프 임베딩(Graph embedding, Deepwalk, Node2Vec, SDNE, ETC) (1) | 2020.09.05 |
---|---|
그래프와 인접 행렬, 라플라시안 행렬(Adjacent matrix, Laplacian matrix) (4) | 2020.09.04 |
Universal Approximation Theorem, UAT (0) | 2020.06.17 |
Ordinary Least Squares, OLS (0) | 2020.06.10 |
Senna's Embedding / Gazetteer feature? (0) | 2020.06.02 |