논문 읽기/Classification

[논문 리뷰] GoogLeNet (2014) 리뷰와 파이토치 구현

AI 꿈나무 2020. 12. 27. 22:33
반응형

 공부 목적으로 논문을 읽어보고 요약한 뒤에 파이토치로 구현해보았습니다

 

 이번에 공부할 논문은 'Going deeper with convolutions' (GoogLeNet)입니다.

 

 LeNet-5를 시작으로 CNN은 이미지 분류에서 일반적인 구조가 되었습니다. CNN 구조에 dropout, pooling, ReLu, GPU 기법이 적용된 AlexNet이 ILSVRC 2012년 대회에서 우승을 차지하고 CNN을 세상에 알리게 됩니다(이전까진 머신러닝 기법이 대회를 우승했습니다). 2년 뒤 Inception block을 적용한 CNN 모델인 GoogLeNet이 ILSVRC 2014년 대회에서 우승을 차지하게 됩니다. GoogLeNet을 우승으로 이끈 Inception block에 대해 알아보고, 추가적으로 적용된 기법에 대해 알아보도록 하겠습니다.

 

ILSVRC competition

 

등장 배경

 GoogLeNet은 22층을 가진 deep neural network 입니다. neural network는 깊이와 넓이가 증가할 수록 높은 정확도를 얻을 수 있지만 두 가지 단점을 가지게 됩니다. 첫 번째로 기하급수적으로 parameter가 증가하게 됩니다. parameter 수가 많아지면 network는 overfitting하기 쉬워지고 bottleneck을 만들어냅니다. 이는 network의 깊이와 크기를 증가시키는데 제한을 두게 됩니다. 두 번째로 메모리 사용량이 증가합니다. 계산 용량은 유한하므로 계산 자원의 효율적인 분포가 필요합니다.

 

 논문에서는 알고리즘을 메모리 용량이 제한되어 있는 모바일이나 컴퓨터에 embedded 하기 위해서 효율성이 있는 neural network 구조를 만들어야 한다고 말합니다. 실제로 GoogLeNet은 AlexNet보다 정확도는 뛰어나지만 parameter수가 12배 적은 모델을 구축하게 됩니다.

 

 어떻게 AlexNet보다 가볍지만 정확도가 뛰어난 모델을 구축할 수 있었을까요?

 

GoogLeNet의 철학

 GoogLeNet은 sparse한 data 구조에 집중합니다. 위에서 서술한 두 가지 문제점을 해결하기 위해 sparse하게 연결된 구조가 필요하다고 말합니다. 이를 위해 NIN(network in network) 논문을 인용합니다.

 

 NIN은 높은 상관관계에 있는 neuron들을 군집화 시키고 마지막 계층에서 활성화 함수들의 상관관계를 분석함으로써 최적의 network topology를 구축할 수 있다고 말합니다. NIN을 간단히 말하면 convolution을 수행할 때, 수행 후 feature map을 얻게 되는데, multilayer perceptron 네트워크를 convolution시 추가로 적용하여 feature map을 만듭니다.

 

 

 이를 통해 fully connected layer와 convolutional layer를 dense 구조에서 sparse 구조로 바꿀 수 있다고 말합니다. GoogLeNet에서 NIN을 구현하기 위해 Inception module을 적용하였는데 이는 나중에 설명하도록 하겠습니다.

 

 하지만 sparse 데이터 구조는 단점이 있었습니다. 불균일한 sparse 데이터에서 수치 계산은 매우 비효율적이었습니다. dense 데이터는 꾸준히 개선되고 고도로 조정된 수치적인 라이브러리와 CPU 또는 GPU의 사용으로 빠르게 계산할 수 있는 반면에 sparse 데이터를 다루는 연산의 발전은 미미했습니다. 참고로 LeNet-5에서는 break symmetry를 위해 sparse 연결을 해주었습니다.

 

 요약하자면 dense data 구조를 sparse data 구조로 바꾸어서 효율적인 데이터 분포를 만들어 낸다면, 더 깊고 넓은 network를 만들어 정확도도 높일 수 있다고 합니다.

 

Inception module

 드디어 Inception module에 대한 설명입니다.

 

 Inception module의 주요 아이디어는 convolutional network에서 spase 구조를 손쉽게 dense 요소들로 근사화하고 다룰 수 있는 방법을 찾는 것에 근거합니다. 

 

 Inception module에서 feature map을 효과적으로 추출하기 위해 1x1, 3x3, 5x5의 convolution 연산을 각각 수행하며, 각각 Matrix의 height, width가 같아야 하므로 pooling 연산에서 padding을 추가해줍니다. pooling을 적용한 이유는 convolution network에서 pooling layer의 성능이 입증되었으므로 추가했다고 말합니다.

 

 

 Inception module을 보면 1x1 convolution이 보이는데, 이것이 inception module의 핵심입니다. 1x1 convolution의 목적은 dimmension reduction을 적용하여 필요한 연산량을 감소시키는 것입니다. 3x3와 5x5 convolution 연산 이전에 1x1 convolution이 적용되었는데 이는 dimmension reduction을 통해 input filter의 수를 조절하기 위함입니다. 예를 들어, 이전 layer에서 512개의 channel을 가진 output이 생성됬으면 256개의 1x1 convolution filter를 이용해서 256 channel로 줄일 수 있습니다. 이를 통해 다양한 크기의 filter(1x1, 3x3, 5x5)를 적용하여 여러 특징을 추출하지만 연산량을 낮출 수 있게 됩니다.

 

 이제 Inception network는 inception module을 쌓아 만들어지게 됩니다. 하지만 모든 layer에서 inception module이 이용되는 것은 아닙니다. 효율적인 메모리 사용을 위해 낮은 layer에서는 기본적인 convolution layer를 적용하고 높은 layer에서는 inception module을 사용한다고 말합니다.

 

 요약하면 inception module을 통해 두 가지 효과를 얻을 수 있습니다.

 

(1) 계산 복잡도에서 조절되지 않는 폭발없이 각 단계에서 unit의 수를 상당히 증가시킬 수 있습니다. dimension reduction을 통해 다음 계층의 input의 수를 조절할 수 있기 때문입니다.

 

(2) visual 정보가 다양한 규모로 처리되고 다음 계층은 동시에 서로 다른 규모에서 특징을 추출할 수 있게 됩니다. 1x1, 3x3, 5x5 convolution 연산을 통해 다양한 특징을 추출할 수 있기 때문입니다.

 

GoogLeNet

 Inception module을 통해 다양한 특징을 추출하고 parameter 연산량을 개선한 모델은 다음과 같습니다.

 

 전체 구조의 상세한 구성입니다. 각 convolution에는 relu가 적용되었습니다. 또한 optimizer는 0.9 momentum을 지닌 SGD를 이용합니다. 매 8 epoch마다 4%의 학습률을 낮춰주었다고 합니다.

 

 

 모델의 깊이가 매우 깊은 것을 확인할 수 있습니다. 깊이가 깊으면 gradient가 0으로 수렴하는 gradient vanishing 문제가 발생할 수 있습니다. 따라서 모든 layer에 효과적인 방법으로 기울기를 뒤로 전달하기 위해 auxiliary classifier를 중간 layer에 추가했습니다.

 

 auxiliary classifier가 등장한 배경은 다음과 같습니다. 상대적으로 얇은 신경망의 강한 성능은 신경망의 중간 layer에서 생성된 특징이 매우 차별적이라는 것을 나타냅니다. 이 중간 계층에 auxiliary classfiers를 추가하여 낮은 단계에서 차별점을 이용할 수 있다는 것과 뒤로 전달되는 기울기 신호를 증가하고, 추가적인 regularization 효과를 기대한다고 말합니다.

 

 이 작은 크기의 convolutional network 형태를 띄고 있는 classifier는 Inception module의 출력에 둡니다. training을 하면서 auxiliary classifier의 loss에 0.3을 곱해 전체 loss에 더해줍니다. 그리고 inference 때는 auxiliary network를 이용하지 않습니다.

 

Conclusion

 CNN의 성능을 높이는 방법에는 구조를 획기적으로 바꾸거나 다양한 hyper parameter를 tunning 하거나 더 큰 dataset을 이용하기 위한 data augmentation이 있습니다. inception network는 sparse 구조를 dense 구조로 근사화하면 성능을 높일 수 있을 것이라고 예측을 하였고 아이디어를 구현하여 새로운 구조를 만들어 냈습니다. 이는 CNN 성능을 높일 수 있는 새로운 가능성을 열게 된것입니다. 실제로 Google은 Inception model을 계속적으로 발전해나갑니다. 더욱 발전된 inception model은 추후에 포스팅하도록 하겠습니다.

 

GoogLeNet 파이토치로 구현하기

GoogLeNet을 구현하고 학습하는 포스팅은 여기에서 확인하실 수 있습니다.

 

[논문 구현] PyTorch로 GoogLeNet(2014) 구현하고 학습하기

 이번 포스팅에서는 GoogLeNet(Inception-v1)을 파이토치로 구현하고 학습까지 해보겠습니다.  논문 리뷰는 아래 포스팅에서 확인하실 수 있습니다. [논문 리뷰] GoogLeNet (2014) 리뷰와 파이토치 구현  

deep-learning-study.tistory.com

 


출처

[1] arclab.tistory.com/162

[2] ikkison.tistory.com/86

[3] poddeeplearning.readthedocs.io/ko/latest/CNN/GoogLeNet/

[4] arxiv.org/abs/1409.4842

반응형