이번에 읽어볼 논문은 Rethinking the Inception Architecture for Computer Vision 입니다. 본 논문에서는 Inception-v2와 Inception-v3을 소개합니다.
일반적으로, 모델 크기를 증가시키면 정확도와 연산량이 증가합니다. 예를들어, ResNet은 skip connection을 활용해서 모델의 깊이를 증가시켜 성능을 끌어올렸습니다. 하지만 깊어진 만큼 연산량이 많아져 학습하는데에 시간이 오래 걸립니다. 이처럼 모델 크기를 증가시키면 연산량이 증가하게 되는데, 이는 mobile이나 제한된 메모리에서 활용해야 할때, 단점으로 작용합니다.
저자는 convolution 분해를 활용해서 연산량이 최소화 되는 방향으로 모델의 크기를 키우는데 집중합니다. 그리고 논문에서 소개하는 Inception-v3 모델은 적은 파라미터를 가진 42-layer의 깊은 신경망으로 VGGNet와 비슷한 연산량을 갖습니다. 이 모델은 앙상블 기법을 활용하여 ILSVR 2012 dataset으로 top-1 17.2% error, top-5 3.58% error를 달성합니다.
Inception-v3은 이 논문에서 설명하는 기법을 모두 Inception-v2 구조에 적용하여 가장 높은 성능을 나타내는 모델입니다.
합성곱 분해하기(Factorizing Convolutions)
GoogLeNet은 1x1 convolution로 차원을 축소시키고 3x3 convolution을 여러개 활용하여 파라미터 수를 감소시켰습니다. 이처럼 합성곱을 분해하는 것은 파라미터수를 감소시킬 수 있습니다. 파라미터 수가 감소하면 연산량도 감소하여 빠른 학습이 가능합니다.
1. 더 작은 합성곱으로 분해(Factorization into smaller convolutions)
5x5 convolution, 7x7 convolution을 3x3 convolution으로 분해하면 연산량과 파라미터가 감소합니다.
예를 들어, 위 그림처럼 5x5 convolution은 3x3 convolution 두 개로 분해할 수 있습니다. 5x5 convolution은 25번의 연산을 하고, 3x3 convolution 2번은 각각 9번의 연산을 수행합니다. 따라서 연산량은 18/25배가 됩니다. 파라미터 수 또한 18/25배가 됩니다. 이는 VGGnet에서 소개된 방법입니다.
3x3 convolution을 2번 사용하여 5x5 convolution을 분해할 때, 첫 번째 3x3은 linear activation, 두 번째 3x3은 ReLU activation을 사용하는 것과 둘 다 ReLU activation을 사용하는 것을 실험합니다. 아래 그림이 결과입니다. 두 3x3 convolution에 ReLU를 사용한 것이 정확도가 더 높았습니다. 추가적으로 배치 정규화(Batch normalization)을 사용하면 더 정확도가 높아지게 됩니다.
따라서 3x3 convolution보다 큰 filter는 언제든지 3x3 convolution으로 분해하여 사용하는 것이 좋습니다.
실제로 Inception module에서 5x5 convolution 부분을 두 개의 3x3 convolution으로 대체합니다.
2. 비대칭 합성곱(Asymmetric Convolutions) 분해
그러면 3x3 convolution을 더 작은 convolution으로 분해할 수 있을까요? 예를 들어, 2x2 convolution으로 분해하는 것입니다. 하지만 저자가 실험해보았고 2x2 convolution으로 분해하는 것보다 nx1 비대칭 convolution으로 분해하는 것이 더 효과가 좋았다고 합니다. 3x3 convolution을 1x3 convolution, 3x1 convolution으로 분해하는 것입니다.
위 그림과 같이 3x3을 1x3, 3x1로 분해하면 33%의 연산량 절감 효과가 있습니다. 반면에 2x2 conv로 분해하면 11%의 연산량 감소 효과가 있었습니다.
그러면 nxn convolution을 nx1과 1xn convolution으로 대체하면 어떻게 될까요?
이는 feature map 사이즈가 12~20 사이일 때 효과가 좋았다고 합니다. 그래서 실제로 feature map 사이즈가 17이 되는 구간에서 Inception v2는 위와 같은 inception module을 사용합니다.
보조 분류기의 활용(Utility of Auxiliary Classifiers)
GoogLeNet논문에서 Auxiliary Classifiers를 활용하면 신경망이 수렴하는데 도움을 준다고 소개합니다. 하지만, 실험 결과 별다른 효과가 없는 것으로 밝혀졌습니다. 하지만 Auxiliary classifiers에 drop out이나 batch normalization을 적용했을 때, main classifiers의 성능이 향상된 것으로 보아, auxiliary classifiers는 성능 향상의 효과보다 정규화 효과가 있을 것이라고 추측합니다.
보조 분류기에 배치 정규화를 적용했더니 0.4% 정확도가 개선되었다는 것을 설명하는 그림입니다.
효율적인 그리드 크기 축소(Efficient Grid Size Reduction)
일반적인 CNN 신경망은 feature map의 사이즈를 줄이기 위해서 pooling 연산을 사용합니다. 그리고, representational bottlenet을 피하기 위해 필터 수를 증가시킵니다. 예를 들어, dxd 크기를 가진 k개 feature map은 pooling layer를 거쳐서 (d/2)x(d/2) 크기의 2k개 feature map이 됩니다. 연산량을 계산하면, 전자는 $2d^2k^2$가 되고, 후자는 $2(d/2)^2k^2$가 됩니다. 이는 연산량을 감소시켜주지만 신경망의 표현력(representation)도 감소시킵니다.(표현력이 감소하는 이유는 pooling 연산을 거치면 정보가 손실되기 때문입니다.)
위 그림을 보면 왼쪽은 연산량이 낮은 대신에 표현력도 감소합니다. 오른쪽은 연산량이 많습니다.
논문에서 표현력(representation)을 감소시키지 않고 연산량을 감소시키는 방법을 소개합니다.
stride 2를 지닌 pooling layer와 conv layer를 병렬로 사용합니다. 그리고 둘을 연결합니다. 아래 그림에서 살펴볼 수 있습니다. 이 방법을 이용하면 표현력을 감소시키지 않고, 연산량을 감소시킬 수 있다고 말합니다.
Inception-v2
이제 지금까지 설명한 개념을 결합하여 구축된 Inception-v2를 소개합니다.
Inception-v2는 42층의 신경망이지만 연산량은 GoogLeNet보다 2.5배 많고, VGGnet과 비슷하다고 합니다.
각 inception module에서 conv 연산은 0-padding을 적용하였고, 그 이외의 conv layer에는 0-padding을 적용하지 않습니다.(0-padding은 피쳐맵의 크기를 유지시키기 위해 사용합니다.)
Inception-v2에는 3종류의 inception module을 사용합니다.
Model Regularization via Label Smoothing
여기서 소개하는 Label Smoothing 기법은 데이터 정규화 테크닉 하나로 간단한 방법이면서도 모델의 일반화 성능을 높여 주목을 받습니다. 하지만 이 기법의 작동 원리 등 밝혀진 것이 없습니다. 2019년에 제프리 힌튼 교수님이 When Does Label Smoothing Help? 논문에서 Label Smoothing이 왜 잘 작동하고 효과적인지를 고찰합니다. 관심있으신 분은 arxiv.org/abs/1906.02629 여기에서 논문을 확인할 수 있습니다. 저도 아직 안읽어 봤네요ㅎㅎ
간단히 설명하자면 기존 label이 [0, 1, 0, 0]이면 레이블 스무딩을 실시하고 [0.025, 0.925, 0.025, 0.025]가 됩니다. 이처럼 정답에 대한 확신을 감소시켜 일반화된 성능을 나타낼 수 있다고 말합니다.
논문에 나와있는 수식입니다.
작은 이미지 크기에서의 성능(Performance on Lower Resolution Input)
object detection 분야에서 작은 물체를 검출하는 것은 항상 고질적인 문제였습니다. 그래서 작은 물체를 포함하는 영역을 crop해서 학습시키기도 합니다.(예를 들어 MultiBox, R-CNN) 그래서 논문 저자도 입력 이미지 크기를 변화해가면서 성능을 측정해 실험을 해봅니다.
세가지의 크기에서 실험을 했고 다음과 같은 결과를 얻었습니다.
Inception-v3
여기서 Inception v3에 대한 내용이 언급됩니다.
Inception-v2 구조에서 위에서 설명한 기법들을 하나하나 추가해 성능을 측정하고, 모든 기법들을 적용하여 최고 성능을 나타내는 모델이 Inception-v3입니다.
즉, Inception-v3은 Inception-v2에서 BN-auxiliary + RMSProp + Label Smoothing + Factorized 7x7 을 다 적용한 모델입니다.
참고자료
'논문 읽기 > Classification' 카테고리의 다른 글
[논문 읽기] SqueezeNet(2016) 리뷰, AlexNet-Level Accuracy with 50x fewer parameters and <0.5 MB Model SIze (0) | 2021.03.15 |
---|---|
[논문 읽기] WRN(2016) 리뷰, Wide Residual Networks (0) | 2021.03.14 |
[논문 읽기] Pre-Activation ResNet(2016) 리뷰, Identity Mappings in Deep Residual Networks (0) | 2021.03.11 |
[논문 읽기] ResNet(2015) 리뷰 (2) | 2021.02.26 |
[논문 리뷰] VGGNet(2014) 리뷰와 파이토치 구현 (4) | 2020.12.31 |