티스토리 뷰

728x90

논문 제목 : Going deeper with convolutions

 

이번에는 ILSVRC 2014에서 VGGNet을 제치고 1등을 차지한 GoogLeNet을 다뤄보려 한다. 연구팀 대부분이 Google 직원이어서 아마 이름을 GoogLeNet으로 하지 않았나 싶다.

이 모델은 1 x 1 convlution layer의 사용이나 depth를 늘려 모델의 성능을 개선시키는 등 VGGNet과 유사한 점이 꽤 있다. 하지만 GoogLeNet은 아주 독특한 구조를 사용하는데, 그 이름은 우리가 잘 아는 영화의 이름과도 같은 인셉션 (Inception) 이다.

그럼 대체 왜 Google 팀에서는 이 구조의 이름을 인셉션이라 지었는지, VGGNet과는 어떤 점에서 다른지 알아보기 위해 출발해보겠다!

 

GoogLeNet의 전체 구조

 

1. Abstract

 

먼저 초록에서는 GoogLeNet의 특징에 대해 간략히 설명하고 있다.

이 모델의 주요 특징은 연산을 하는 데 소모되는 자원의 사용 효율이 개선되었다는 것이다. 즉, 정교한 설계 덕에 네트워크의 depth와 width를 늘려도 연산량이 증가하지 않고 유지된다는 뜻이다. 이때, Google 팀에서는 성능을 최적화하기 위해 Hebbian principle과 multi-scale processing을 적용하였고, 이 구조를 GoogLeNet이라 부른다고 한다. GoogLeNet은 22개의 layer를 가지며, 코드네임은 Inception이다.

 

2. Introduction

 

소개에서는 딥러닝의 발전 동향과 GoogLeNet이 나오게 된 배경, 그리고 설계 주안점에 대해 소개하고 있다.

지난 3년간, 딥러닝의 발전 덕에 CNN 분야에서 큰 발전이 이루어져 왔는데, 이러한 발전은 단지 더 좋은 하드웨어의 성능, 더 큰 dataset, 더 큰 모델 때문이기보다는 새로운 아이디어와 알고리즘, 그리고 개선된 신경망 구조 덕분이었다.

 

AlexNet과 GoogLeNet

 

즉, Google 팀에서도 Software 측면에서 이를 개선하기 위해 노력했고, 이들이 개발한 GoogLeNet은 AlexNet보다 파라미터가 12배나 더 적음에도 불구하고 훨씬 정확했다고 한다. 이러한 개선은 마치 R-CNN처럼 deep 한 구조와 클래식한 컴퓨터 비전의 시너지 덕분이었다.

 

 

Mobile 및 Embedded 환경에서는 특히 전력 및 메모리 사용량 관점에서 효율적인 알고리즘의 중요성이 대두되고 있기에, 이 논문에서는 모델이 엄격한 고정된 구조를 가지는 것보다 유연한 구조를 가지게끔 하였다. 또한 추론 시간에 1.5 billion 이하의 연산만을 수행하도록 설계하여, 단순히 학술적인 호기심에 끝나는 것이 아니라 현실에서도 적절히 사용되게끔 설계하였다.

 

 

GoogLeNet의 코드네임인 Inception이란 이름은 Network in Network(NIN)라는 논문에서 유래하였으며, 더 정확하게는 인셉션 영화의 대사인 "we need to go deeper"에서 착안하였다. 이때 "deep"은 두 가지 의미를 가진다.

 

1. "Inception module"의 형태로 새로운 차원의 구조 도입

2. 두 번째는 네트워크의 깊이가 증가하였다는 직접적인 의미

 

또한, Inception model은 theoretical work 측면에서 Arora 논문을 통해 고안되었다고도 할 수 있다.

 

3. Related Work

 

LeNet-5를 시작으로 CNN은 일반적인 표준 구조를 가지게 되는데, 이는 Convolutional layer가 쌓이고 그 뒤에 1개 또는 그 이상의 FC layer가 따라오는 구조이다. 또한 ImageNet과 같이 대용량 데이터에서의 요즘 트렌트는 layer의 수와 사이즈를 늘리고, 오버 피팅을 해결하기 위해 dropout을 적용하는 것이다. 따라서 GoogLeNet도 이와 같은 구조를 띤다.

 

 

다음으로 Network in Network 논문 내용이 나오게 되는데, 이는 GoogLeNet에 많은 영향을 끼친 논문이다.

먼저 Network in Network는 신경망의 표현력을 높이기 위해 제안된 접근법이다. 이 방법은 1 x 1 Convolutional layer가 추가되며, ReLU activation이 뒤따른다. 이때, 1 x 1 Convolutional layer는 두 가지 목적으로 사용된다.

 

1. 병목현상을 제거하기 위한 차원 축소

2. 네트워크 크기 제한

 

즉, GoogLeNet에서도 위 두 가지 목적을 위해 1 x 1 Convolutional layer를 사용한다는 것인데, 그럼 Network in Network에서는 왜 1 x 1 Convolutional layer를 사용하였고, 이는 어떻게 위 두 가지 장점을 가져오는 것일까?

 

이에 대한 자세한 내용이 궁금하다면 아래 접힌 글을 클릭하면 확인할 수 있다.

 

더보기

Network in Network에서의 1 x 1 Convolutional layer 사용

 

일반적인 Convolutional layer는 필터가 움직이며, 사이즈에 해당되는 입력 부분과 Convolution 연산을 수행하고, 활성화 함수를 거쳐 결과를 출력한다. 하지만 데이터의 분포가 비선형적이라면, 특징을 추출하기가 힘들다.

 

왼쪽이 일반적인 Convolutional layer이고, 오른쪽은 MLP Convolutional layer이다.

 

따라서 Network in Network에서는 비선형적 관계를 잘 표현할 수 있도록 단순한 Convolution 연산이 아닌, Multi Layer Perception 즉, MLP를 중간에 넣게 된다. 따라서 이 논문의 제목이 Network in Network가 되는 것이다.

 

Cross Channel Pooling

 

이때 Network in Network에서 이용하였던 CCCP (Cascaded Cross Channel Pooling)라는 기법이 있다. 이는 하나의 feature map에 대하여 수행하는 일반적인 pooling 기법과는 달리 channel을 직렬로 묶어 픽셀 별로 pooling을 수행하는 것인데, 이러한 CCCP 연산의 특징은 feature map의 크기는 그대로이고, channel의 수만 줄어들게 하여 차원 축소의 효과를 가져온다.

 

1 x 1 Convolution

 

그런데 이 CCCP 기법은 1 x 1 Convolutional layer과 그 연산 방식 및 효과가 매우 유사하다. 따라서 GoogLeNet에서 1 x 1 Convolutional layer를 Inception module에 적용한 것이다.

 

4. Motivation and High Level Considerations

 

이제 GoogLeNet이 나오게 된 배경에 대해서 설명한다.

심층 신경망의 성능을 개선시킬 수 있는 가장 간단한 방법은 신경망의 크기를 늘리는 것이다. 이때, 크기를 늘린다는 것은 다음 두 가지 의미를 뜻한다.

 

1. depth의 증가 (level의 수 증가)

2. width의 증가 (각 level의 유닛 수 증가)

 

이는 좋은 성능의 모델을 얻을 수 있는 쉽고 안전한 방법이지만, 두 가지 문제점이 있다.

 

첫 번째로, 크기가 커진다는 것은 파라미터의 수가 늘어난다는 것인데, 이는 특히 학습 데이터의 수가 적은 경우에 오버 피팅이 일어나기 쉽다.

 

ILSVRC 2014에서 사용된 고품질의 분류 이미지

 

 

이는 주요한 병목현상이 될 수도 있는데 ImageNet처럼 세밀한 카테고리를 구별해야 하는 경우, 고품질의 트레이닝 셋을 생성하는 것은 매우 treaky 하며 비용이 높기 때문이다.

 

두 번째로, 네트워크가 커질수록 컴퓨터 자원의 사용량이 늘어난다는 것이다. 만약 두 Convolutional layer가 연결되어 있다면, 필터의 수가 늘어날 때 연산량을 quadratic 하게 증가시킬 것이다. 여기서 quadratic하게 늘린다는 표현은 다음과 같다. 만약, 3 x 3 Conv filter C1 개와 3 x 3 x C1 Conv filter C2개가 연결되어 있을 시, 이는 3 x 3 x C1 $ \rightarrow $ 3 x 3 x C1 x C2 가 된다. 이는 C1과 C2가 동일하다고 가정할 시, 3 x 3 x $ C^2 $와 비슷한 꼴이 되기에 C의 값에 따라 연산량이 quadratic하게 증가하게 된다. 그런데 만약 대부분의 기울기가 0이라면 이러한 연산이 낭비된다.

 

이러한 상황에서 컴퓨팅 자원은 한정적이므로 네트워크의 크기를 늘리는 것보다 컴퓨팅 자원을 효율적으로 분배하는 것이 더욱 중요하다.

 

 

왼쪽은 Sparse한 네트워크이고, 오른쪽은 Dense한 네트워크이다

 

위 두 문제를 해결하는 방법은 dense 한 Fully-Connected 구조에서 Sparsely Connected 구조로 바꾸는 것이다.

만약 dataset의 분배 확률을 Sparse 하면서도 더 큰 심층 신경망으로 표현 가능하다면, 입력 layer에서 출력 layer로 향하는 layer 간의 관계를 통계적으로 분석한 후, 연관 관계가 높은 것들만 연결하여 최적의 Sparce 한 네트워크를 만들 수 있다.

 

 

하지만, 오늘날의 컴퓨팅 환경은 균일하지 않은 Sparse data 구조를 다룰 때 매우 비효율적이다. 이러한 격차는 더욱 커졌는데, Dense data는 꾸준히 개선되고 고도로 조정된 수치적인 라이브러리와 CPU 및 GPU의 사용으로 빠른 연산이 가능해진 반면, Sparse data의 연산은 발전이 미미했다.

 

초기에는 대칭성을 깨기 위해 CNN에 Sparse Connection을 적용했었지만, 병렬 컴퓨팅에 더 최적화하기 위해 Full Connection으로 트렌드가 다시 바뀌었다. 이와 더불어, 균일한 모델 구조와 많은 filter 수, 더 큰 배치 사이즈는 효율적인 Dense 연산이 가능하게끔 하였다.

 

 

 

이때, Sparse 매트릭스 연산을 다룬 많은 문헌에서는 Sparse 매트릭스를 클러스터링 하여 상대적으로 Dense 한 Submatrix를 만드는 것을 제안하였고, 이는 좋은 성능을 보였다고 한다.

 

Google 팀의 Inception 구조는 위에서 말한 유사 Sparse 구조를 시험하기 위해 시작되었다. 그리고 러닝 레이트와 하이퍼 파라미터를 조정하고 훈련 방법 등을 개선한 결과, Localization 및 Object detection 분야에서 특히 좋은 성능을 보였다고 한다.

 

5. Architectural Details

 

이제 본격적으로 Inception 구조에 대해 자세히 설명한다.

 

Inception 구조의 주요 아이디어는 CNN에서 각 요소를 최적의 local sparce structure로 근사화하고, 이를 dense component로 바꾸는 방법을 찾는 것이다. 즉, 최적의 local 구성 요소를 찾고 이를 공간적으로 반복하면 된다. 이를 쉽게 말하자면 Sparse 매트릭스를 서로 묶어 (클러스터링 하여) 상대적으로 Dense 한 Submatrix를 만든다는 것이다.

 

이때, 이전 layer의 각 유닛이 입력 이미지의 특정 부분에 해당된다고 가정하였는데, 입력 이미지와 가까운 낮은 layer에서는 특정 부분에 Correlated unit들이 집중되어 있다. 이는 단일 지역에 많은 클러스터들이 집중된다는 뜻이기에 1 x 1 Convolution으로 처리할 수 있다.

 

맨 오른쪽의 원형 모양은 필터가 더 커야 연관된 유닛을 더욱 많이 뽑아낼 수 있다.

 

하지만, 몇몇 위치에서는 위 그림에서처럼 좀 더 넓은 영역의 Convolutional filter가 있어야 Correlated unit의 비율을 높일 수 있는 상황이 나타날 수도 있다. 따라서 feature map을 효과적으로 추출할 수 있도록 1 x 1, 3 x 3, 5 x 5 convolution 연산을 병렬적으로 수행한다.

또한 CNN에서 pooling layer의 성능은 이미 입증되었으므로 이와 함께 높이와 폭을 맞추기 위해 padding도 추가해준다.

 

 

 

layer의 level에 따라 다르게 추출되는 특징

 

1 x 1, 3 x 3, 5 x 5 Convolutional filter의 수는 망이 깊어짐에 따라 달라지는데, 만약 위 그림처럼 높은 layer에서만 포착될 수 있는 높은 추상적 개념의 특징이 있다면, 공간적 집중도가 감소한다는 것을 의미한다. 따라서 높은 layer를 향해 네트워크가 깊어짐에 따라 3 x 3과 5 x 5 Convolutional filter의 수도 늘어나야 한다.

 

 

그런데 여기서 큰 문제가 발생한다!

3 x 3 Convolutional filter 뿐만 아니라, 5 x 5 Convolutional filter도 사용할 경우, 연산량이 많아지는데 입력 feature map의 크기가 크거나 5 x 5 Convolutional filter의 수가 많아지면 연산량은 더욱 증가하게 된다.

 

연산량 문제를 해결하기 위해 왼쪽 모델에서 1 x 1 Convolution layer를 추가하였다

 

따라서 이 문제를 해결하기 위해 1 x 1 Convolutional filter를 이용하여 차원을 축소하였다. 3 x 3과 5 x 5 앞에 1 x 1을 두어 차원을 줄이는데, 이를 통해 여러 Scale을 확보하면서도 연산량을 낮출 수 있다.

추가적으로, Convlution 연산 이후에 추가되는 ReLU를 통해 비선형적 특징을 더 추가할 수 있다.

 

 

 

또한, Google 팀에서는 효율적인 메모리 사용을 위해 낮은 layer에서는 기본적인 CNN 모델을 적용하고, 높은 layer에서 Inception module을 사용하는 것이 좋다고 한다.

 

이러한 특징들을 가진 Inception module을 사용하면 다음 두 가지 효과를 볼 수 있다.

 

1. 과도한 연산량 문제없이 각 단계에서 유닛 수를 상당히 증가시킬 수 있다. 이는 차원 축소를 통해 다음 layer의 input 수를 조절할 수 있기 때문이다.

 

2. Visual 정보가 다양한 Scale로 처리되고, 다음 layer는 동시에 서로 다른 layer에서 특징을 추출할 수 있다. 1 x 1, 3 x 3, 5 x 5 Convolution 연산을 통해 다양한 특징을 추출할 수 있기 때문이다.

 

6. GoogLeNet 

 

이제 Inception module이 적용된 전체 GoogLeNet의 구조에 대해서 알아본다.

먼저, GoogLeNet이라는 이름은 LeNet으로부터 유래하였으며, 이는 Inception 구조의 성체라고 한다.

 

Inception module 내부를 포함한 모든 Convolution layer에는 ReLU가 적용되어 있다. 또한 receptive field의 크기는 224 x 224로 RGB 컬러 채널을 가지며, mean subtraction을 적용한다.

 

표 1. Inception 구조에 대한 GoogLeNet 성체

 

위 표에서 # 3 x 3 reduce# 5 x 5 reduce3 x 3과 5 x 5 Convolutional layer 앞에 사용되는 1 x 1 필터의 채널 수를 의미한다. 그리고 pool proj 열은 max pooling layer 뒤에 오는 1 x 1 필터의 채널 수를 의미한다. 여기서 모든 reduction 및 projection layer에 ReLU가 사용된다.

 

GoogLeNet을 4가지 부분으로 나누어 살펴보자면 다음과 같다.

 

Part 1

낮은 레이어가 위치해 있는 부분

 

Part 1은 입력 이미지와 가까운 낮은 레이어가 위치해 있는 부분이다.

이는 위에서 설명했듯이 효율적인 메모리 사용을 위해 낮은 layer에서는 기본적인 CNN 모델을 적용하고, 높은 layer에서 Inception module을 사용하라고 하였기에 Inception module이 사용되지 않은 것을 볼 수 있다.

 

Part 2

Inception module

 

Part 2는 Inception module로서 다양한 특징을 추출하기 위해 1 x 1, 3 x 3, 5 x 5 Convolutional layer가 병렬적으로 연산을 수행하고 있으며, 차원을 축소하여 연산량을 줄이기 위해 1 x 1 Convolutional layer가 적용되어 있는 것을 확인할 수 있다.

 

Part 3

 

auxiliary classifer가 적용된 부분 (softmax)

 

Part 3는 auxiliary classifier가 적용된 부분이다.

모델의 깊이가 매우 깊을 경우, 기울기가 0으로 수렴하는 gradient vanishing 문제가 발생할 수 있다. 이때, 상대적으로 얕은 신경망의 강한 성능을 통해 신경망의 중간 layer에서 생성된 특징이 매우 차별적이라는 것을 알 수 있다. 따라서 중간 layer에 auxiliary classifier를 추가하여, 중간중간에 결과를 출력해 추가적인 역전파를 일으켜 gradient가 전달될 수 있게끔 하면서도 정규화 효과가 나타나도록 하였다.

추가로, 지나치게 영향을 주는 것을 막기 위해 auxiliary classifier의 loss에 0.3을 곱하였고, 실제 테스트 시에는 auxiliary classifier를 제거 후, 제일 끝단의 softmax만을 사용하였다.

 

Part 4

 

모델의 끝 부분

 

Part 4는 예측 결과가 나오는 모델의 끝 부분이다.

여기서 최종 Classifier 이전에 average pooling layer를 사용하고 있는데 이는 GAP (Global Average Pooling)가 적용된 것으로 이전 layer에서 추출된 feature map을 각각 평균 낸 것을 이어 1차원 벡터로 만들어 준다. 이는 1차원 벡터로 만들어줘야 최종적으로 이미지 분류를 위한 softmax layer와 연결할 수 있기 때문이다.

 

FC 방식와 GAP 방식의 차이

 

이렇게 평균하여 1차원 벡터로 만들면 가중치의 개수를 상당히 많이 줄여주는데, FC 방식을 이용할 경우에는 가중치의 개수가 7 x 7 x 1024 x 1024 = 51.3M이지만, GAP를 사용하면 단 1개의 가중치도 필요하지 않다. 또한 GAP를 적용할 시, fine tuning을 하기 쉽게 만든다.

 

7. Training Methodology

 

여기서는 모델 훈련을 어떻게 하였는지에 대해 설명하고 있다.

Google 팀에서는 0.9 momentum의 Stochastic gradient descent를 이용하였고, learning rate는 8 epochs 마다 4%씩 감소시켰다.

 

또한, 이미지의 가로, 세로 비율을 3 : 4와 4 : 3 사이로 유지하며 본래 사이즈의 8% ~ 100%가 포함되도록 다양한 크기의 patch를 사용하였다. 그리고 photometric distortions를 통해 학습 데이터를 늘렸다고 한다.

 

8. Conclusions

 

Inception 구조는 Sparse 구조를 Dense 구조로 근사화하여 성능을 개선하였다. 이는 기존에 CNN 성능을 높이기 위한 방법과는 다른 새로운 방법이었으며, 성능은 대폭 상승하지만 연산량은 약간만 증가한다는 장점이 있다.

 

참고 문헌

1. arxiv.org/abs/1409.4842

2. 89douner.tistory.com/62?category=873854

3. kangbk0120.github.io/articles/2018-01/inception-googlenet-review

4. deep-learning-study.tistory.com/389

5. towardsdatascience.com/a-comprehensive-introduction-to-different-types-of-convolutions-in-deep-learning-669281e58215

6. www.researchgate.net/figure/Hierarchical-representation-learning-by-a-Convolutional-Neural-Network-where-the-initial_fig4_317558591

7. bskyvision.com/539

728x90