안녕하세요. 오늘은 ResNet에 이어 GooglLeNet(Inception v1) 에 대해서 알아보려고 합니다.
GoogLeNet은 2014년 VGGNet을 이기고 우승을 차지한 알고리즘 입니다. 해당 모델은 19층의 레이어를 가지는 VGGNet보다 좀 더 깊은 22층의 레이어를 가지고 있습니다.
또한 이름에서 알 수 있듯이 구글이 해당 모델 개발에 참여하였습니다.
해당 포스트에서는 GoogLeNet이 어떻게 VGGNet을 이기고 1등을 차지 할 수 있었는지 모델의 구조와 특징을 통해서 알아보도록 하겠습니다.
앞서 말했듯이 해당 모델은 2014년에 발표된 모델로, AlexNet이 세상에 발표된지 불과 2년후에 발표되었습니다. 해당 모델의 Error rate는 7%로 인간의 Error rate인 5%와 2%의 차이가 있습니다. 해당 모델의 경우 Inception Module을 사용하여 성능 향상을 이루었는데, 그 이전에 당시 CNN이 마주한 문제점에 대해서 먼저 알 필요가 있습니다.
딥러닝을 이용하여 ImaegeNet과 같은 큰 대회 혹은 서비스 가능한 수준의 인식률을 가지기 위해선 대용량의 데이터를 학습해야 하며, 이때 네트워크의 아키텍쳐에서 레이어가 넓고, 깊으면 인식률이 좋아지게 됩니다. 하지만 딥러닝의 고질병인 Overfitting, Vanishing Gradient Problem를 비롯한 학습시간 및 연산속도 문제가 있습니다.
이때 이미지, 다차원 포맷의 데이터를 학습하는데 대표적인 알고리즘인 CNN의 경우 문제가 잘 나타나게 됩니다. Deep한 Architecture를 갖는 FC뿐만 아니라 Convolution filter에서도 이런 문제가 나타납니다.
CNN에서 이미지 데이터가 Convolution 연산을 먼저 거치게 될 때, Channel이 커지고, Height, Width가 줄어듭니다. 이 첫번째 Convolution 연산은 원본 이미지와 함께 연산될 Filter가 필요한데, 이 Filter의 크기가 하이퍼 파라미터가 되며, 연산량이 크게 달라지게 됩니다. 또한 Convolution 연산을 위한 Stride, Padding값 역시 하이퍼 파라미터 이므로 Filter, Stride, Padding 값에 비래하여 엄청난 연산을 하게 됩니다.
그림1. CNN의 구조
GoogLeNet에 적용된 해결방법 중 하나가 Sparse Connectivity입니다. CNN은 Convolution layer, pooling , FC layer 계층들이 서로 Dense하게 연결 되어 있습니다.
이렇게 높은 관련성을 가진 노드끼리만 연결하는 방법인데, 연결을 Sparse 하게 바꾸어 연산량, 파라미트를 Computational Resource를 적게 사용하는 방법입니다. 이렇게 하면 Overfitting 또한 개선이 되는데, 이는 DNN에서 Drop out과 비슷한 방법입니다.
그림2. Sparse Connectivity
CNN의 이미지 데이터는 벡터값으로 처리되는데, 필터를 이용한 Conv연산, Pooling 모두 행렬 연산이 사용됩니다. 그래서 Sparse하게 연결 연산 대상이 적으면 연산량이 줄어들것이라 생각하지만, 실제로는 Dense Matrix연산보다 Sparse Matrix연산이 더 큰 Resource를 사용합니다.
GoogLeNet도 초기에는 CNN에 Sparse CNN연산을 사용했지만, 병렬적인 연산처리를 위해 Dense Connect를 사용하며 Dense Matrix 연산기술이 발전했습니다. 따라서 하이퍼 파라미터를 조정하여 부담스러운 Computational Resource를 해결하기 위한 Sparse Connectivity를 사용하는 것은 정답이 아니었지만 구글의 Inception 모듈을 통해 해당 문제를 해결했습니다.
Inception Module을 살펴보기 앞서 1x1 filter에 대해서 설명을 드리고자 합니다.
그림3. GoogLeNet 구조와 1x1 필터
먼저 주목해야할 것은 1 x 1 사이즈의 필터로 컨볼루션해주는 것입니다. 구조도를 보면 곳곳에 1 x 1 컨볼루션 연산이 있음을 확인할 수 있습니다.
1 x 1 컨볼루션은 어떤 의미를 갖는 것일까요? 왜 해주는 것일까요? GoogLeNet에서 1 x 1 컨볼루션은 특성맵의 갯수를 줄이는 목적으로 사용됩니다. 특성맵의 갯수가 줄어들면 그만큼 연산량이 줄어듭니다.
예를 들어, 480장의 14 x 14 사이즈의 특성맵(14 x 14 x 480)이 있다고 가정해봅시다. 이것을 48개의 5 x 5 x 480의 필터커널로 컨볼루션을 해주면 48장의 14 x 14의 특성맵(14 x 14 x 48)이 생성된다. (zero padding을 2로, 컨볼루션 보폭은 1로 설정했다고 가정했습니다.) 이때 필요한 연산횟수는 얼마나 될까요? 바로 (14 x 14 x 48) x (5 x 5 x 480) = 약 112.9M이 됩니다.
이번에는 480장의 14 x 14 특성맵(14 x 14 x 480)을 먼저 16개의 1 x 1 x 480의 필터커널로 컨볼루션을 해줘 특성맵의 갯수를 줄여보자. 결과적으로 16장의 14 x 14의 특성맵(14 x 14 x 16)이 생성된다. 480장의 특성맵이 16장의 특성맵으로 줄어든 것에 주목하자. 이 14 x 14 x 16 특성맵을 48개의 5 x 5 x 16의 필터커널로 컨볼루션을 해주면 48장의 14 x 14의 특성맵(14 x 14 x 48)이 생성된다. 위에서 1 x 1 컨볼루션이 없을 때와 결과적으로 산출된 특성맵의 크기와 깊이는 같다는 것을 확인하자. 그럼 이때 필요한 연산횟수는 얼마일까? (14 x 14 x 16)(1 x 1 x 480) + (14 x 14 x 48)(5 x 5 x 16) = 약 5.3M이다. 112.9M에 비해 훨씬 더 적은 연산량을 가짐을 확인할 수 있다. 연산량을 줄일 수 있다는 점은 네트워크를 더 깊이 만들수 있게 도와준다는 점에서 중요하다.
GoogLeNet은 총 9개의 인셉션 모듈을 포함하고 있다. 인셉션 모듈을 하나 확대해서 살펴보겠습니다.
그림4. GoogLeNet 구조와 Inception Module
그림5. Inception Module의 구조
GoogLeNet에 실제로 사용된 모듈은 1x1 컨볼루션이 포함된 (b) 모델입니다. 아까 살펴봤듯이 1x1 컨볼루션은 특성맵의 장수를 줄여주는 역할을 합니다. 노란색 블럭으로 표현된 1x1 컨볼루션을 제외한 나이브(naive) 버전을 살펴보면, 이전 층에서 생성된 특성맵을 1x1 컨볼루션, 3x3 컨볼루션, 5x5 컨볼루션, 3x3 최대풀링해준 결과 얻은 특성맵들을 모두 함께 쌓아줍니다. AlexNet, VGGNet 등의 이전 CNN 모델들은 한 층에서 동일한 사이즈의 필터커널을 이용해서 컨볼루션을 해줬던 것과 차이가 있습니다. 따라서 좀 더 다양한 종류의 특성이 도출됩니다. 여기에 1x1 컨볼루션이 포함되었으니 당연히 연산량은 많이 줄어들었을 것입니다.
AlexNet, VGGNet 등에서는 fully connected (FC) 층들이 망의 후반부에 연결되어 있습니다. 그러나 GoogLeNet은 FC 방식 대신에 global average pooling이란 방식을 사용합니다. global average pooling은 전 층에서 산출된 특성맵들을 각각 평균낸 것을 이어서 1차원 벡터를 만들어주는 것입니다. 1차원 벡터를 만들어줘야 최종적으로 이미지 분류를 위한 softmax 층을 연결해줄 수 있기 때문입니다. 만약 전 층에서 1024장의 7 x 7의 특성맵이 생성되었다면, 1024장의 7 x 7 특성맵 각각 평균내주어 얻은 1024개의 값을 하나의 벡터로 연결해주는 것입니다.
이렇게 해줌으로 얻을 수 있는 장점은 가중치의 갯수를 상당히 많이 없애준다는 것입니다. 만약 FC 방식을 사용한다면 훈련이 필요한 가중치의 갯수가 7 x 7 x 1024 x 1024 = 51.3M이지만 global average pooling을 사용하면 가중치가 단 한개도 필요하지 않습니다.
네트워크의 깊이가 깊어지면 깊어질수록 vanishing gradient 문제를 피하기 어려워집니다. 그러니까 가중치를 훈련하는 과정에 역전파(back propagation)를 주로 활용하는데, 역전파과정에서 가중치를 업데이트하는데 사용되는 gradient가 점점 작아져서 0이 되어버리는 것입니다. 따라서 네트워크 내의 가중치들이 제대로 훈련되지 않는다. 이 문제를 극복하기 위해서 GoogLeNet에서는 네트워크 중간에 두 개의 보조 분류기(auxiliary classifier)를 달아주었습니다.
오늘은 이렇게 2014년에 발표된 GooLeNet(Inception v1)에 대해서 살펴보았습니다. 해당 머델을 공부하면서 GooLeNet에서 Inception과 Sparse Connectivity부분이 가장 인상깊고 눈에 띠는 특징이었다고 생각하네요.
감사합니다.