안녕하세요~
이번에는 지난시간에 이어 ILSVRC 2014 대회에서 VGGNet을 뛰어넘은 GoogLeNet에 대해서 설명해드리도록 할거에요
저자의 대부분이 Google 팀원들이었기 때문에 해당 논문에서 제시한 CNN 모델 이름을 GoogLeNet이라 명명했어요. (그래서 이 블로그에서는 이 논문을 쓴 저자를 그냥 통칭해서 Google이라고 간주하고 글을 작성했어요)
<0. Abstract>
이번 abstract에서는 특이하게 밑에서부터 읽어 올라가 볼게요. 저자는 ILSVRC 2014에 진출한 CNN 모델을 GoogLeNet이라고 이름지었어요. GoogLeNet은 22 depth layers를 갖고 있고 hebbian과 multi-scale processing을 적용했다고 하네요 (뒤에서 자세히 언급하겠죠?ㅎㅎ). 그리고 보통 CNN 모델이 깊이를 늘리면서 연산량도 늘어나게 되는데, GoogLeNet에서는 길이(CNN depth)를 늘리면서도 연산량은 유지하고 있다고 언급하고 있네요 (=improved utilization of the computing resources). 그리고, 이러한 GoogLeNet 구조의 codename을 inception이라고 부르고 있어요 ㅎㅎㅎ. 아마 inception이라는 개념이 GoogLeNet에서 중요한 역할을 할거 같다는 생각이 드네요.
<1. Introduction>
(여기서도 중간중간 object detection관련 개념들이 나오는데 설명은 하지 않도록 할게요. 나중에 Object detection 챕터를 개설하면 그곳에서 좀 더 자세히 언급하도록 하겠습니다)
역시 software corporation 답게 google이 주목하고 있는 부분은 hardware보다는 software(new ideas, algorithms and improved network architectures)영역이었어요. 그 중에서 alexnet보다 12배나 적은 가중치로도 더 좋은 성능을 내었다는것을 첫 문단에서 이야기하고 있어요. (어떻게 줄이게 되었는지는 뒤에서 나오겠죠? 앞에서 언급한 inception(codename) 개념과 관련있으려나요?ㅎㅎ)
<사진1>
역시 google답게 CNN모델이 academic한 관점(academic curiosity)뿐만이 아니라 이것이 우리 현실(real world)에서도 사용되야 한다고 생각했어요. 그래서 CNN을 구성할때 엄격하게 고정된 architecture 구조를 사용하는것보다 CNN 모델이 mobile or embedded computing 등 다양한 곳에서 자유롭게 사용될 수 잇는 유연한 구조를 갖고 있어야 된다고 주장하고 있어요.
Inception이라는 이름을 붙인 이유는 "Network in network (NIN)" 논문에서 유래가 되었는데요. 좀 더 정확하게는 inception이라는 용어가 "we need to go deeper"라는 의미를 지니고 있는 internet 용어라고해요. Inception 모듈을 통해 AlexNet보다 더 깊은 CNN network를 구성할 수 있었기 때문에 inception이라는 이름을 붙인듯해요. 하지만 theoretical work 측면에서는 Arora 논문을 통해 inception module이 고안되었다고 하는게 맞다고 할 수 있겠어요.
<2. Related Work>
Related Work chapter는 저자가 논문을 쓸때 차용한 개념들이 어떤 논문에서 비롯된건지 간략하게 설명하는 성격의 chapter에요. Google은 이전 CNN 모델들에 대한 언급을 하고 있는데요. 이 중에서 단락하나를 이용해서 설명하고 있는 논문이 Network in network(NIN)라는 논문이에요.
NIN의 motivation을 한 문장으로 요약하자면 "conv filter를 이용하여 feature를 추출할 때, non-linear feature를 더 잘 추출하기 위해서 conv filter를 추출하는 중간에 MLP를 더해주어 CNN 모델이 non-linear representation (non-linear한 성격을 잘 표현)해준다"라고 할 수 있어요.
NIN에서 독창적으로 사용했던 연산이 Cascaded Cross Channel (Parametric) Pooling (CCCP)라는 기법이에요.
먼저 Cross Channel Pooling에 대해서 설명드릴게요. 아래 '사진2'를 보시면 8개의 channel수가 나와 있어요. 그런데 이것이 cross channel pooling을 거치면 2개의 channel수로 줄어들어요. 보통 우리가 아는 pooling은 하나의 feature map에 대해서 수행되는 것이지만 아래 '사진2'의 연산은 몇 개의 channel을 직렬(cascade) 묶음(=가로질러서; cross)으로 해서 해당위치(빨간색,노란색 등)간에 pooling을 하기 때문에 cross channel pooling이라고 불려요. 이러한 cross channel pooling연산의 특징은 feature map size는 그대로고 channel 수만 줄어들게 해주어요. 그래서 이러한 연산을 적용하면 'channel reduction'효과가 일어난다고 이야기해요.
<사진2> <사진3. cross channel pooling(max pooling)>
그런데 자세히보면 Cross channel pooling과 1x1 conv filter가 연산하는 방식과 효과(channel reduction)가 닮았다는 것을 알 수 있을거에요. 그래서 NIN 논문 저자는 다음과 같은 표현 "The cross channel parametric pooling layer is also equivalent to a convolution layer with 1x1 convolution kernel. "을 했는데요. Google은 이러한 1x1 conv filter를 inception module에 적용하려고 했습니다.
<사진4>
그런데 cascaded cross channel pooling 방식이 아래 그림에서 어떻게 적용된다는건지 잘 모르겠네요;; 그림과 수식을 번갈아 보고는 있지만 뭔가 조금 직관적으로 이해가 안되는거 같습니다;; (이 부분은 나중에 공부를 더하고 다시 정리해서 올리도록 할게요~)
중요한건 논문에서 아래와같이 설명한 것처럼 1x1 conv filter를 이용해 channel(dimension) reduction을 얻을 수 있었고, 이 효과를 통해 CNN depth와 width(CNN size)를 늘릴 수 있게 되었다는 점이에요.
<3. Motivation and High level considerations>
이제부터 GoogLeNet이 탄생하게된 이유에 대해서 자세히 설명해드리도록 할게요. Google은 CNN 모델의 depth와 size(width; the number of parameter)를 증가시키는 것이 중요하다고 봤어요. 하지만 depth와 size를 증가시키면 두 가지 문제가 생기게 되는데요.
첫 번째는 size(the number of parameters)가 증가하게 되면 overfitting이 증가된다는 점이에요. 만약 training data개수가 제한적(적다는 의미로 이해하시면 될거 같아요)이고, training data가 high quality(high resolution)이면 연산시 tricky하고 expensive할 수 있어서 overfitting을 일으킬 소지가 커지게 된다는 뜻이에요 (물론 input data가 preprocessing을 통해 size가 rescaling되거나 crop되겠지만 기본적으로 higher resolution and fewer training dataset 이면 overfitting을 일으킬 소지가 커지겠죠?
아래용어에서 언급하고 있는 quadratic increase는 quadratic growth(참고링크)를 의미하는것 같아요. 예를들어, conv layer가 2개 연결(3X3 conv filter C1개 -> 3X3XC1 conv filter C2개) 되어있다라고 하면 연산은 "3x3xC1->3x3xC1XC2"가 될거에요. 이때 C1, C2 (filter 개수에) 따라 최종결과(3X3XC1XC2)에 대한 함수식을 f(C)=3X3XC^2 라고 할 수 있어요 (C1, C2은 개념적으로 filter 개수라는 동일한 개념으로 quadratic increase(growth) 관점에서는 C1,C2를 따로 분리하고 생각하지 않는거죠). 어쨌든 이렇게 quadratic 증가하게 되는 weights가 대부분 zero값을 갖는다면 computation이 낭비된다고 볼 수 있을거에요.
그래서 이러한 낭비를 줄이기 위해서 sparse connection이란 아이디어를 언급하는데요. Arora 논문에서 제기된 주장 다음과 같아요. "Fully connection을 갖는 Deep Neural Network 구조에서 노드나 layer가 증가하게되면 이 문제는 optimization 측면(DNN을 커다란 함수로 보는 측면)에서 NP hard문제로 귀결되지만, CNN 같은 구조를 갖고 있을 때는 sparse connection을 통해 충분히 polynomial 문제로 귀결시킬 수 있다는 주장이에요.
예를들어, 본래 Fully connted 된 Neural Network 구조에서 입력 layer (아래 사진의 빨간색 테두리 부분)에서 output layer로 나가는 layer간의 관계를 통계적(statistics)으로 분석한 후, 연관관계(correlation)가 강한 것들끼리만 연결시켜주어 sparse connection 구조의 Neural Network를 만드는 방식이에요. 그리고 이러한 개념은 생물학적 원리인 Hebbian principle에서 아이디어를 얻었다고 합니다.
<사진5>
그런데 이러한 sparse connection을 적용시키는데 현실적으로 문제가 되는경우가 많았어요. 사실 Dense connection 같은경우는 행렬연산(dense matrix multiplication)으로 생각하여 GPU(computing infrastructure; cuDNN or numpy)로 병렬처리할 수 있는데요. 반면에 Sparse connection은 dense connection 연산에 비해 까다롭기 때문에 이와 관련된 연산식 연구가 발전되지 않았어요.
사실 CNN같은 경우에도 LeNet에서는 아래 테이블처럼 conv filter를 sparse하게 사용했는데요. 아래 테이블로 예를들면, 6개의 모든 필터를 16 feature map에 적용하는게 아니고 sparse하게 적용하도록 만들었어요.
<사진6>
하지만 AlexNet으로 넘어가면서 mini batch, uniform한 성격의 conv filter 등 dense calculation 하기 편한방식으로 CNN 모델이 발전하게 되었어요.
Google은 미래에 위와 같은 sparse connection을 다음과 같은 방식으로 적용될 수 있다고 했어요. Arora의 주장(the theory)을 통해 filter 단계에서 sparsity를 사용하는 구조를 이용하되 현재 dense matrices를 연산하기 최적화 되어 있는 hardware를 이용하고, sparse matrices들 상대적으로 sub-dense matrices로 만들어주어 기존 dense matrices 연산을 적용할거라고 하네요 (제 생각에는 입,출력 노드들 끼리의 correlation을 분석해 sparse구조를 clustering하여 dense하게 만들어주는거 같아요). Google은 이러한 연구모델을 non-uniform deep-learning architectures라고 언급하고 있네요 (아마 기존 deep learning 모델들은 node, filter 들이 전부 일정하게(uniform or dense or fully connected)연산되는데 반해서 sparse connection 개념은 상대적으로 규칙성없이 non-uniform 하게 연산되기 때문에 'non-uniform deep-learning architectures'라고 부른거 같아요.
Google은 Inception 구조를 통해 sparse (connection) structure를 어느정도 유사하게 구현해냈다고 하는데요. 그외에도 learning rate, hyperparameters, CNN 학습 방법과 같은 것들에 대해 신경을 쓰면서 GoogLeNet(or Inception) 모델이 특히 object detection 영역에서 좀 더 좋은 효과를 불러일으켰다고 주장하고 있어요 (object detection 영역에 얼마나 파장을 일으켰는지는 object detection 영역에서 살펴볼게요 ㅎㅎ. 논문에서는 이렇게 설명했어도 실제 object detection분야에서는 어떻게 생각했는지 모르는거니까요 ㅎ)
결국 Motivation 부분을 요약하자면 다음과 같아요.
"수학적(or algorithm)으로 sparse 구조가 더 좋은건 알겠는데 hardware 적으로는 dense 구조가 더 efficient 하기 때문에 이론(sparse connection)과 현실(hardware)을 잘 조합하면 좋은 모델이 나오지 않겠느냐"
<4. Architectural Details>
결국 local sparse structure를 어떻게 구성해 줄것인지를 고민하다가 inception module을 만들어내게 되었는데요. Conv filter라는 구조 자체가 input image의 일정부분(ex; 3x3)에 이전 units (conv filter's weights)들이 반응(operation; correspond)하는거라고 볼 수 있는데요.
lower layer들은 굉장히 적은 범위 지역에 correlated units 들이 집중되어있다고 설명했어요. 이것이 무엇을 의미하냐면, conv filter와 input image의 일정부분(conv filter size와 대응(correlated)되는부분(local regions))의 conv filter를 적용(conv operation; correlated)한 값이 높다(concentrate)라는 뜻이에요.
Input image와 같이 큰 feature map에서는 5x5와 같은 큰 filter size를 갖는것 보단 3x3과 같은 클 filter size가 더 correlated units이 local region에 concentrate하게 분포하고 있어요 (저는 이 개념을 한 filter에 낭비(=0값)되는 부분이 없는 것이라고 이해했어요). 하지만 몇몇 위치에서는 좀 더 넓은 영역의 conv filter (larger patches)가 더 correlated units 비율이 높을 수 있어요. 하지만 이런 경우는 상대적으로 드물긴 (a smaller of more spatially spread out clusters) 하겠죠?).
위와 같은 상황들을 범용적으로 잘 대처하기 위해서 inception 모듈에 1x1, 3x3, 5x5 filter를 병렬적으로 사용하기로 결정했어요. (alternative parallel pooing 부분은 뒤에서 설명드릴게요)
<사진7> <사진8>
이렇게 병렬적으로 사용하는 개념을 sparse connection을 했다라고 이해하기가 힘들어서 나름대로 아래와 같이 정리해봤어요.
"아래와 같은 inception 모듈로 구성되어 있을 때, input image의 A라는 구역은 1x1 conv와 5x5 conv filter를 적용시켰을 때, correlated units이 굉장히 많을 수 있어 결과적으로 두 filters가 output(filter concatenation)에 sparse하게 correlated(clustering)되어 있을 수 있다고 보는것이다. 하지만 conv filter의 모든 연산은 dense하게 처리한다."
1x1, 3x3, 5x5 conv filter들의 개수는 망이 깊어짐에 따라서 달라진다고 하네요.
처음에는 inception module이 아래와 같이 형성되었습니다. 3x3 max pooling은 좀 더 다양한 resolution을 학습하기 위해서 추가시켜준것이라고 하더군요 (논문에서 언급하길 이 부분은 higher resolution에 갈 수록 더 효과가 크기 때문에 GoogLeNet 구조의 앞단 부분은 일반적으로 사용되던 CNN 모델구조를 사용했다고 언급했어요. 자세한건 GoogLeNet 그림을 보시면 이해가 쉬울거에요). 그런데 아래와 같은 구조에서는 문제가 있어요. 일단 그냥 일반적으로 사용했던 3x3 conv filter만 사용한 것보다 5x5 conv filter가 사용되기 때문에 연산량이 많아진다는 점이에요. 특히 입력 feautre map의 크기가 크거나 5x5 conv filter 개수가 많아지면 연산량은 더욱 증가하게 될거에요.
위와 같은 연산량의 문제를 해결하기 위해서 1x1 conv filter를 통해 channel수를 조절하게 되요. 1x1 conv filter를 통해 channel reduction의 효과를 볼 수 있고, 추가적으로 conv 연산후에 추가되는 ReLU activation function을 통해 non-linearity 성격을 더 추가해줄 수 있게 되었어요.
실제, 위의 inception module이 아래와 같이 연산된다고 보시면 되요.
<테이블1>
결국 이런 inception module을 통해 Google은 좀더 깊고(deeper) 큰(wider) CNN 모델이 GoogLeNet을 발표할 수 있게 되었어요.
<5. GoogLeNet>
GoogLeNet이라는 이름은 LeNet에서 기인했다고해요. 그리고 GoogLeNet을 inception 구조의 성체라고 표현하네요.
GoogLeNet의 구조는 아래와 같이 구성되어 있어요. 대부분 Inception module로 구성되어 있지만 좀 더 디테일하게 만들기 위해서 4개의 파트로 나누어 설명드리려고 해요
<사진9>
Part1
GoogLeNet 이전 모델이 AlexNet이어서 그런지 몰라도 AlexNet의 처음 부분을 그대로 사용했어요. 물론 1x1 conv를 해서 channel reduction을 꾀하긴 했지만 기본적인 구조는 AlexNet을 연상시켜요. 논문에서 Google은 아래와 같은 언급을 하면서 inception module을 처음부터 사용하지 않은 이유를 설명했어요. 아마 이론적인 이유를 밝히긴 힘들었던것 같고 경험적으로 아래와 같은 결론을 내린게 아닌가 싶어요.
" it seemed beneficial to start using Inception modules only at higher layers while keeping the lower layers in traditional convolutional fashion."
추가적으로 'Conv 7X7+2(S)'라는 표기에서 S는 stride라는 의미로 conv 7X7의 stride가 2라는 뜻이에요. 그런데 표현을 왜 덧셈 연산으로 했는지 모르겠네요. V라는 표현식의 의미도 잘 모르겠네요;;
Part2
이부분은 inception module이 그대로 적용된 부분이에요. 연산이 어떻게 진행되는지는 위의 table1 부분을 참고하시면 될거에요. Padding이나 3x3, 5x5 conv filter를 적용할 때에는 모두 output feature map size가 동일하도록 padding을 알맞게 적용해준답니다.
Part3
모델 중간중간에 보면 softmax와 관련된 layer가 추가가 되는데요. 이 부분은 auxiliary classifier (layer)라고 해요. GoogLeNet에서도 ReLU를 쓴다고는 하지만 워낙 layer가 깊다보니 vanishing gradient문제를 고려해야만 했어요. 그래서 중간중간에 classifier를 추가해주어 추가적인 Backpropagation을 통해 가중치가 수월하게 업데이트 될 수 있도록 보조할 수 있는 layer를 추가시켜주었다고 합니다. 이러한 아이디어는 “Deeply supervised nets (by C.Y.Lee, S. Xie 등)”과 “Training Deeper Convolutional Networks with Deep SuperVision (by Liwei Wang, Chen-Yu Lee)등) 와 같은 논문 아이디어에서 기인했다고 해요.
Part4
마지막으로는 GoogLeNet의 최종 classifier 부분이에요. 아래 그림에서 Average Pool이라는 용어는 실제로 Globa Average Pooling (GAP)을 의미해요. 사실 GAP를 둔건 classification의 성능을 높여주기 위함은 아니었고, 보통 CNN 구조가 FC layer로 연결될때 1x1 (뉴런) n개의 구조로 이루어져야 하기 때문에 GAP를 추가해주었다고해요 (더 자세한건 바로 아래에 설명이 되어있어요). 이렇게 GAP를 추가하여 classifier 부분을 기존 CNN 구조와 비슷하게 만들어주면 나중에 fine tuning해서 쓰기도 더 수월해지겠죠?
아래 테이블과 위의 그림을 자세히 보면 연산이 어떤방식으로 진행되는지 알 수 있을거에요. GAP를 통해 1024개의 7x7 feature map을 1x1 feautre map 1024개로 만들고 이를 1024개의 노드(뉴런)를 갖고 있는 FC layer로 연결시켜요. 그리고나서 softmax로 연결시켜 최종적으로 classifiation을 하게 된답니다.
<테이블2>
<6. Training Methodology>
먼저, GoogLeNet에서 사용된 하이퍼파라미터는 아래와 같이 요약할 수 있어요.
Optimizer: momentum(=0.9)
Learning rate: 4% decrease every 8 epochs
GoogLeNet은 영상의 <가로:세로> ratio를 <3:4>, <4:3> 의 범위를 유지하면서 원 영상의 8%~100% 까지 포함할 수 있도록 다양한 크기의 patch를 학습에 사용하였어요. 또한 photometric distortion 을 통해 학습 데이터를 늘렸습니다. 그외 다양한 방법들이 학습방법에 사용되었다고는 하지만 이러한 방법들이 실제로 도움이 되었는지는 몰랐다고하네요.
<7. ILSVRC 2014 Classification Challenge Setup and Results>
GoogLeNet은 dataset을 아래와 같이 구성했어요.
그리고 GoogLeNet을 조금씩 다르게 구성하여 7가지 version으로 validation을 진행했다고 합니다.
Validation 방식은 multi-crop 방식을 택했는데요. GoogLeNet의 경우에는 test 영상을 256x256 1개의 scale만 사용하는 것이 아니라, 256, 288, 320, 352 로 총 4개의 scale로 만들고(scale을 변형시키는 방법 AlexNet과 동일해요) 각각의 scale로부터 3장의 정사각형 이미지를 선택하고, 다시 선택된 이미지로부터 4개의 코너 및 센터 2개를 취해 총 6장의 224x224 크기의 영상을 취하고, 각각을 좌우반전 시키면 4x3x6x2 총 144개의 test 영상을 만들어 냅니다.
그리고 144개를 모두 validation 했을 때, 각각의 validation 결과값 (softmax를 거친 확률값)을 모두 더한것을 평균을 내어 최종 결과값(확률값)을 얻게 되요. (본인들이 다른 방법으로 validation을 시도해보긴 했는데 잘 안됐었나봐요)
아래 결과표를 보시면 multi-crop을 통해 validation을 수행했을 때가 더 좋은 성능을 보였어요. 그리고 이전에 7개의 모델을 사용했다고 했는데, 7개의 모델에 대해서 앙상블 기법을 적용시켰을때 더 좋은 성능을 보여줬네요.
그리고 ILSVRC 대회에서 얻은 최종결과를 보여주고 있습니다.
<사진10>
이렇게 inception Version1이라고 할 수 있는 GoogLeNet에 대한 설명을 마무리하게 되었어요. Inception Version2,3를 다룬 논문에 대한 글도 쓰긴했는데요. 아직까진 제 수준에서 쉽게 이해시켜드릴 수 있도록 설명하지 못하는것 같아 비공개로 설정했어요. 나중에 혹시 요약글을 쓰게되면 짧게 다루도록 해볼게요. 그럼 다음글은 resnet에 대해 설명해드리도록 하겠습니다~!
[논문 래퍼런스]
"Going deeper with convolutions"/ Szegedy. C et al/ 2014/ https://arxiv.org/abs/1409.4842
[글 래퍼런스]
https://www.youtube.com/watch?v=V0dLhyg5_Dw
[사진 래퍼런스]
사진1
사진2
https://www.mdpi.com/2072-4292/12/2/219/htm
사진3
https://light-tree.tistory.com/147
사진4
사진5
https://www.youtube.com/watch?v=V0dLhyg5_Dw
사진6
https://world4jason.gitbooks.io/research-log/content/deepLearning/CNN/Model%20&%20ImgNet/lenet.html
사진7
https://www.slideshare.net/JaewookKang1/180624-mobile-visionnetbaeksuconjwkangpub
사진8
https://www.youtube.com/watch?v=cwBdAQXpDZM
사진9
https://kangbk0120.github.io/articles/2018-01/inception-googlenet-review
사진10
'Deep Learning for Computer Vision > Convolution Neural Network (CNN)' 카테고리의 다른 글
10. DensNet (0) | 2020.01.17 |
---|---|
9. ResNet (12) | 2020.01.17 |
7. VGGNet (5) | 2020.01.17 |
6. AlexNet (4) | 2020.01.17 |
5. CNN 성능은 어떻게 평가하게 되나요? (0) | 2020.01.17 |