[CV Study] GoogLeNet: Going Deeper With Convolutions

2020. 6. 13. 03:12Research

Inception이라는 이름은 "Network In Network"에서 영감을 받아서 지어진 이름이다.

 

딥러닝 모델의 성능을 높이는 방법 중 하나는 모델 depth와 width를 늘리는 것이다. 하지만 이는 곧 더 많은 파라미터, 더 큰 용량, 더 많은 연산량, 오버피팅 가능성으로 이어진다는 문제가 있다.

이 문제를 해결 하기 위한 방법 중 하나는 fully connected layer를 sparsely connected layer 구조로 바꾸는 것인데, dropout을 통해 정규화(regularization) 효과를 거두는 경우가 이에 해당한다. 하지만, CPU/GPU 특성상 non-uniform sparse data에 대해서는 효율적인 커널 연산이 어렵다는 문제가 있다. (연산량을 100배 줄이더라도 cache miss, memory copy 오버헤드 등으로 인해 성능이 나아지지 않을 수 있다.)

이러한 이유로 Inception에서는 sparse matrix operation 대신 sparse connectivity를 통해 정규화 및 파라미터 감소 효과를 거두는 방안을 택하였고, 행렬 연산은 densely 수행하도록 하였다.

 

 

NIN (Network In Network)

 

 

 

GoogLeNet에서 사용하는 inception 모듈은 NIN에서 소개한 MLPConv의 개념에 기반을 두고 있기 때문에 이를 먼저 알아야 한다. Convolution 연산은 데이터의 linear한 특징을 추출하는 데에는 유용하지만 non-linear한 특징을 추출하려면 conv layer 이후에 오는 activation function(ReLU...)의 도움을 받아야 한다. 이로 인해 의미있는 특징을 학습하기 위해 네트워크를 더 깊게 만들어야하는 문제가 생기는데, 이는 곧 파라미터 수의 증가, 연산량의 증가, 오버피팅과 같은 문제로 이어진다. 따라서 conv layer 자체가 비선형 연산을 하도록 만들어주면 매우 효율적일 것이다. 위의 그림에서 (a)는 filter가 입력 feature map을 훑으면서 새로운 feature map을 뽑아내는 일반적인 conv layer의 동작을 보여준다. 반면, (b)는 filter를 가지고 합성곱 연산을 하는 것이 아니라 grid에 걸린 원소들에 대해서 MLP 연산을 수행한다.

 

"The cross channel parametric pooling layer is also equivalent to a convolution with 1x1 convolution kernel."

 

MLPConv layer에서 주목할 부분은 layer 한 개로 이루어진 MLP를 1x1 conv로 치환이 가능하다는 점이다. (이 때 MLP 뉴런 개수는 1x1 conv의 필터 개수와 동일하다.) 즉, 일반적인 linear conv layer 뒤에 1x1 conv를 붙이면 MLPConv와 같은 기능을 하게 된다. 1x1 conv는 그 자체로 연산량이 적고(3x3 conv보다 9배 적음), 필터 수(=출력 채널 수)를 적게 하면 차원 축소의 효과도 거둘 수 있기 때문에 매우 효율적이다. 또한 VGG에서 밝힌 바와 같이 ReLU를 통한 비선형성 증대 효과도 거둘 수 있어 feature 추출에도 효과적이다.

 

 

 

 

 

위 그림은 NIN의 전체 네트워크 구조인데, 마지막에 FC layer 대신 GAP(Global Average Pooling) layer가 들어가 있다. FC layer는 dropout과 같은 정규화 연산을 따로 하지 않는 한 오버피팅의 위험이 큰 반면, GAP는 그 자체로 정규화 효과를 가지고 있기 때문에 효율적이다. 앞에서 MLPConv layer들을 통해 특징 추출이 잘 이루어졌기 때문에 이와 같이 FC layer를 제거할 수 있다.

 

 

AlexNet의 op별 latnecy: FC layer에서 매우 많은 시간이 소요됨을 알 수 있다.

 

 

 

Inception Module

 

 

 

(a)에서는 1x1, 3x3, 5x5 convolution과 3x3 max pooling을 따로 수행하고, 이를 concat하고 있다. 각각 다른 크기의 필터를 사용하는 이유는 보다 다양한 feature를 뽑아내기 위함이고, max pooling을 하는 건 정규화 목적 때문이다.

 

이 때 5x5 conv는 연산량이 매우 크다는 문제가 있는데, 이를 해결하기 위해 NIN에서 살펴본 1x1 conv가 활용된다. 1x1 conv는 (1) 비선형성 증대, (2) 연산량, 파라미터 감소, (3) 차원축소의 효과가 있기 때문에 연산량이 큰 3x3 conv와 5x5 conv 이전에 1x1 conv를 두어 채널 수를 줄인다. 

 

앞서 inception module의 디자인 철학은 sparsity와 density를 동시에 잡는 것이라고 언급하였는데, 실제로 inception module을 구조를 보면 이러한 아이디어가 반영된 모습을 볼 수 있다. 우선, 1x1 conv, 3x3 conv, 5x5 conv를 각각 병렬적인 구조로 연산을 수행하여 connection에서의 sparsity를 확보하여 정규화의 효과를 얻을 수 있다. 또한 connection 자체는 sparse하지만 각각의 op은 dense matrix operation이기 때문에 GPU utilization 문제가 적다.

 

 

GoogLeNet

다음은 최종적인 GoogLeNet의 구조이다. 기본적으로 9개의 inception module들로 구성되어 있고, 네트워크의 초반부에는 inception module 대신 일반적인 conv + (bn) + relu 연산을 수행한다.

 

또한 중간과 끝에 auxiliary classifier로 FC + softmax 연산을 수행하는데, 이는 gradient signal이 보다 잘 전파될 수 있도록 하기 위함이다. ResNet에서 shortcut connection을 두는 것과 비슷한 원리라고 보면 된다. Inference 단계에서는 gradient vanishing이 고려사항이 아니기 때문에 auxiliary classifier 부분은 제거한다. 

 

 

 

 

Torchvision GoogLeNet (Inference Dataflow Graph)