본문 바로가기
논문 리뷰/Classification

[논문 리뷰] GoogLeNet(2014) 설명

by inhovation97 2021. 10. 3.

논문을 읽고 핵심 내용을 인용하고 제가 이해한대로 부연 설명합니다.

 

1. 당시 컴퓨터 비전과 인공지능의 배경 (1.introduction)
2. 저자들의 실험 초점 (2.related work & 3.Motivation and High Level Considerations)
3. 아키텍쳐 설명 (4.Architecture Details)
4. 개인적인 생각

 

 

 

 

< 1. 당시 컴퓨터 비전과 인공지능의 배경 >

 

이 부분은 논문 처음 introduction 부분의 내용입니다.

2014년도면 컴퓨터 비전 분야가 본격적으로 발전하기 시작한 때죠. 

 

당시 비전 분야가 하드웨어의 발전이라기보다는 엄청난 아이디어들과 알고리즘의 향상들로 인해 견인되었을 정도로 많은 연구가 시작됐고,

사람들의 모바일 & computer의 메모리 사용량이 폭발적으로 증가하던 시기라 구글팀은 이제 단순히 CV 분야가 학문적이라기 보다는 실용적으로 발전되어야 한다는 마인드를 가졌다고 합니다.

(논문 내내 obj detection( R-CNN )도 많이 언급을 합니다. 구글팀도 backbone으로서의 능력을 굉장히 염두한 것 같습니다.)

논문의 초점은 VGGnet처럼 큰틀에서 'deep'이라는 키워드로 집중했다고합니다.

 

 

 

 

< 2. 저자들의 실험 초점 >

 

저자들이 연구한 내내 신경썼던 방향성이 있을 겁니다.

2. related work 3. Motivation and High Level Considerations 부분의 핵심 내용을 설명합니다.

(2. related work의 1x1 Conv와 다양한 사이즈의 ConV의 내용이 대략적으로 나오지만 아키텍쳐 부분에서 설명합니다.)

 

구글팀도 모델을 깊게 쌓기 위해서 노력을 하는데, depth와 width를 언급합니다. 아키텍쳐의 그림을 보면 아시겠지만, 여러 사이즈의 Conv를 쓰기 때문에 width라는 단어가 나옵니다.

 

모델을 깊게 쌓기위한 문제점

 

1. 모델을 깊게 쌓으면, 당연히 오버피팅의 문제가 존재합니다.

또한 모델이 너무 깊으면 모델의 일반화도 힘들어져서 학습셋이 적은 경우는 이미지의 디테일한 부분을 잡기가 더 더욱 힘들어집니다.

 

2. 네트웍의 사이즈가 깊어질수록 연산량은 훨씬 가파른 기울기로 증가합니다.

3x3의 Conv를 2개 쌓는다고 예를들면,

HxWxC가 3x3을 거쳐 HxWxC1로 나옵니다. 이걸 다시 Conv를 거치면 HxWxC2가 되는데, C1채널로 나온 피쳐맵을 또 다시 C2로 바꿔주니까 layer를 한개 더 쌓았을 뿐인데 계산량은 제곱으로 늘어나는거죠.  

네트웍을 깊게 쌓되, 효율적으로 깊게 쌓아야 한다는겁니다.

 

 

계산 문제를 위해 저자들은 네트웍을 fully connected 형식이 아닌 sparsely 형식으로 matrix를 연산시키기 위해 많은 문헌들을 참고하며 노력했습니다. 

https://www.semanticscholar.org/paper/Sparsely-Connected-Neural-Networks%3A-Towards-VLSI-of-Ardakani-Condo/138ea97004fe7586977b4eb72835df615319c2df

아마 아키텍쳐 내부에 노드와 노드가 전부 fully connected로 연결되어 연산되는 것이 저자들은 비효율적이라고 생각한 것 같습니다. 위 그림처럼 좀 더 correlation이 높은 노드끼리 연산을 진행하고 싶은 겁니다. 

drop out처럼 일부 노드만 써서 연산량을 줄이고 싶은거죠.

 

논문을 보면, 저자들이 많은 문헌들을 참고하며 이렇게 계산량을 줄이려고 많이 노력한 것 같은데 이 방식은 오히려 fully connected 아키텍쳐가 matrix들을 병렬적으로 gpu에 올려서 계산하면 수월하지만,

저렇게 sparsely 아키텍쳐는 확실히 파라미터 수는 줄어들 수 있겠지만 효율적인 계산 방법은 없는겁니다. (그런 계산 방법이 아직 연구가 덜 된거죠.)

저자들은 sparsely matrix 계산이 나중에는 발전이 되어 널리 쓰일 수도 있다고 굉장히 긍적적인 시선으로 바라봅니다.

(이제껏 dense한 방식으로 발전한 걸 보니 발전이 잘 안됐나봅니다.)

(위 연산은 각 노드들끼리의 correlation을 구해서 상관 관계가 높은 노드끼리 clustering을 해야하는데, 확실히 파라미터는 줄어들 수 있겠지만, 아마 병렬 처리하기에 힘든가 봅니다. ) 

 

논문 내용

제 생각에는 이게 저자들의 연구에서 가장 큰 줄기를 이룬 GooLeNet의 핵심인것 같습니다.

아키텍쳐는 최대한 sparsely하게 쌓고, 계산은 fully connected matrix로 만들어서 하고 싶은겁니다.

Inception이라고 불리는 새로운 형식의 아키텍쳐를 만들고, dense한 matrix를 계산하기 위해 1x1 Conv를 이용한 겁니다!

/

 

 

< 3. 아키텍쳐 설명 >

 

 

4. Architectureal Details 부분의 핵심내용을 설명합니다.

 

 

1. 인셉션 모듈

위에서도 말했듯이 저자들은 아키텍쳐를 densely하게 구성하고 싶었습니다. 

그래서 이렇게 한 블록에 여러 사이즈의 필터를 쓰는 모델을 구상하게 됩니다.

인셉션 모듈
그림 1

음 저도 이게 어째서 sparesly architecture인지 이해하기 힘들었습니다. 

위에서 2번째 그림처럼 각각 input image를 다양한 사이즈의 필터로 훑습니다. 그러면 저렇게 지정한 채널만큼 각각이 나오는데 이를 나중에 concat해서(feature map의 사이즈는 전부 같도록 padding, stride를 이용하기 때문에 concat이 가능해집니다.) 오른쪽의 최종 feature map을 출력합니다.

한 이미지에서 똑같은 region을 3x3과 5x5가 훑었다고 해봅시다.

그렇다면, 그 filter들은 각각 바라보는 집중도가 다를 겁니다. 출력되는 output에 둘 다 서로 담당하는 부분이 다른 전문가인 겁니다.

sparesely한 구조라고 생각할 수 있는거죠. 

 

좀 더 직관적으로 이해해보자면, conv layer에서 합성곱을 할 때 같은 region을 훑더라도 작은 객체일 경우 큰 filter size에는 낭비되는 값들이 많을 겁니다. 객체부분이 아주 중요한 값을 갖고 있으니 나머지 부분은 0이거나 쓸데없는 값이 되는 거겠죠.

반대로 그림 1처럼 큰 객체의 부분을 훑을 때는 작은 filter로는 한번에 훑을 수 없으니 주변의 중요하지 않은 픽셀들 까지 같이 여러번 훑어버리니 쓸데없는 값이 들어갑니다.

 

 

이런 부분들 때문에 여러 filter size를 쓴 인셉션 모듈을 sparesely하게 가져갔다고 하는 것 같습니다.

 

구조는 병렬적으로 쌓게되어, 계산이 병렬적으로 이루어집니다.

 

그런데 사실 이제는 이렇게까지 이해할 필요가 없습니다. 

그냥 같은 사이즈의 이미지를 여러 필터로 훑는다는 것을 이해하는게 중요합니다.

이후로 계속 그냥 densely하게 CNN이 진화합니다. 한 사이즈에서 여러 사이즈의 filter를 쓰는 방식도 많이 발전합니다. 여러 size의 filter를 쓰면서 정말 다양한 정보들을 가져올 수 있기 때문입니다. 

 

가령 이런 이미지가 있다고합시다. 

빨간색 박스는 3x3, 파란색 박스는 5x5라고하면 같은 사이즈의 이미지에서 빨간 박스는 저렇게 작은 object들을 파란 박스는 큰 object를 포함한 정보들을 잘 담을 수 있습니다. 아주 다양한 정보들을 가져갈 수 있는 장점이 있는 겁니다. 

 

 

 

 

 

https://light-tree.tistory.com/147

그렇게 인셉션 모듈을 만들고, naive version이 아닌 b를 선택하게 됩니다. 

5x5 filter를 사용하면, 연산량이 너무 커지게 됩니다. 그래서 오른쪽과 같이 1x1 Conv로 channel reduction을 해줍니다. 

1x1 filter가 vggnet에서도 그렇고 굉장히 중요한 역할을 한다는 것을 알 수 있습니다. 

위 방식은 Cross Channel Pooling방식입니다. 

maxpooling을 채널별 픽셀로 해줌으로써 같은 사이즈의 feature map을 원하는 사이즈로 down시킬 수 있는 기법입니다. 

1x1 Conv는 학습할 수 있는 파라미터가 있습니다. 즉 down size도 좀 더 의미있게 할 수 있고, relu 함수도 거치기 때문에 비선형성도 한번 더 가해줄 수 있습니다. 여러 필터 사이즈로 나온 feature map들을 채널 수를 줄일 때 또 한 번 그것에 대해 고려해줄 수 있는 비선형성을 고려해줄 수 있으니 아주 좋은 방식인 거죠.

 

3x3 max pooling은 좀 더 다양한 resolution을 위해 추가해준 것이라고 합니다. 

3x3 맥스 풀링을 할 때, 나와있지는 않지만 아마 사이즈 다운을 방지하기 위해 stride를 겹치게 할 겁니다.

그럴 경우 계속해서 특징이 강한 의미있는 픽셀의 값이 여러 번 겹치기 때문에 또 그런 부분의 장점이 있을 겁니다.

 

filter들의 output channel 같은 하이퍼 파라미터들은 layer depth마다 다르게 설정해줍니다.

 

(개인적으로는 이미 다른 발전된 모델은 보고나서 느낀 점은 이때의 구글넷이 너무 헤비해서 쓸모없는 정보도 많이 포함돼있지 않나 싶습니다. 이렇게 짜고도 비교적 간단한 vggnet과 크게 차이가 나지 않았고, backbone으로도 vggnet이 더 많이 쓰입니다. )

 

2. 전체 아키텍쳐

핵심인 인셉션 모듈을 봤으니, 이제 전체 구조를 봅시다.

 

처음 부분은 AlexNet의 구조를 그대로 가져갑니다. 

vggnet과 큰 차이점은 vggnet은 처음에 큰 사이즈의 filter로 합성곱을 하는 것에 부정적이었습니다. 

 

vggnet의 configuration은 이제껏 우승했던 모델(AlexNet)과는 다르다고합니다. 
첫 Conv layer를 비교적 큰 사이즈인 7x7, strid는 2를 쓴 AlexNet과는 달리 vggnet 저자들은 전체 모델에 stride는 1이며, 아주 작은 3x3필터를 쓴게 포인트라고 합니다.
https://inhovation97.tistory.com/44

 

vggnet은 모델의 효율성을 위해 작은 필터만을 고집했지만, 구글넷 저자들은 관점이 달랐습니다.

input에 가까운 layer들은 굉장히 적은 범위에 correlated unit들이 분포하고 집중돼있다고 합니다.

이걸 제 생각대로 해석해보자면, 이미지 사이즈는 input일 때에 가장 사이즈가 큽니다. 

그러다보니, 필터들이 그것을 전부 훑으면, 낭비되는 값들이 당연히 많을 겁니다. 그래서 AlexNet처럼 일단은 resolution을 큰 filter로 크게 줄여버리고나서 본격적인 인셉션 모듈로 들어가자는 의도였던 것 같습니다.

 

중간 중간에 손잡이 모양의 분류기가 있습니다. 

저자들은 Auxiliary classifier라고 하는데, 이것을 추가함으로써 backward 과정에서 깊은 네트워크의 기울기 소실 문제를 방지할 수 있습니다. 

 

이 보조 분류기에도 똑같이 softmax 1000 class output을 설정하는데,

train시에는 Auxiliary classifier에서의 loss가 total loss에 더해지는데 0.3의 가중치를 곱해 영향력을 낮춰서 더해줍니다. 그렇기 때문에 저자들은 regularization의 효과도 기대해 볼 수 있다고 합니다. 약간의 앙상블(?) 효과도 기대해 볼 수 있는거죠.

추론 시에는 쓰지 않는다고합니다.

학습때만 이용합니다.

 

보조 분류기, 최종 분류기를 보면 Global Average Pooling이 쓰입니다.

 

https://bskyvision.com/539?category=635506

이렇게 기존 flatten방식으로 하면, 연산량이 너무 많이 생기므로 각 feature map들을 평균내어 channel 수 만큼 레이어에 가져온 것이죠.
만약 FC 방식을 사용한다면 훈련이 필요한 가중치의 개수가 7 x 7 x 1024 x 1024 = 51.3M이지만 global average pooling을 사용하면 가중치가 단 한개도 필요하지 않죠.
 
앞선 레이어들에서 효과적으로 다양한 필터를 통해 feature map을 통과 시켰기 때문에 과감하게 에버리지 풀링을 했다고 합니다.
파라미터 수도 많이 줄어서 과적합도 방지합니다.
https://inhovation97.tistory.com/25

저자들이 GAP를 쓴 이유는 성능의 이유가 주요한건 아니었습니다. FClayer에서 GAP로 바꿧을 때는 0.6 accuracy의 성능향상 뿐이었고, 가장 큰 이유는 finetuning의 용이성을 위해서였다고합니다.

FC layer에서 GAP로 바꿨어도 Drop out은 필수라고 합니다. 

 

GAP 이후에 dropout(40%)가 추가되는 것을 알 수 있습니다. 

요구되는 파라미터 수도 없어서 과적합 방지 효과를 기대할 수 있습니다. 

 

 

 

 

< 4. 개인적인 생각 >

 

구글넷 이후에 같은 사이즈의 피쳐맵에 여러 필터를 사용하는 아이디어는 계속해서 쓰이기때문에 아주 중요한 부분을 잘 캐치한 것 같다는 생각입니다. 

결과론적인 해석이지만 상대적으로 단순한 vggnet과 성능이 비슷하기 때문에 쓸모없는 정보까지 너무 많이 포함하는 모델이 아닌가 싶습니다.

실제로 vggnet이 finetuning으로 더 많이 쓰이죠.

 

이미 안다고 생각했지만, 확실히 논문을 읽으니 제가 모르거나 저자들이 실제 의도했던 내용들이 나와서 공부가 되네요. sparsely matrix, architecture같은 부분은 정말 처음 듣습니다

 

cs231n을 보면, 주요 cnn 아키텍쳐 모델들을 공부하실 수 있습니다.

https://inhovation97.tistory.com/25

 

cs231n 9강 CNN Architectures 요약

9강은 CNN 아키텍쳐를 이용했던 모델들을 구체적으로 파헤쳐봅니다. LeNet AlexNet VGG GoogLeNet ResNet 특히 이미지넷에서 우승했던 모델들을 위주로 살펴봅니다. 먼저 일전에도 언급했던 LeNet부터 살펴

inhovation97.tistory.com

 

vggnet 논문 리뷰

https://inhovation97.tistory.com/44

 

[논문 리뷰] VGGnet(2014) 설명

CNN모델 중에서도 아주 대표적이고 현재도 Backbone으로 널리 쓰이고 있는 VGGnet 논문을 리뷰하겠습니다. 논문을 리뷰하기 전에 간단한 배경을 설명하겠습니다. 논문을 리뷰하면서 제가 생각하기에

inhovation97.tistory.com

 

댓글