아래 내용은 개인적으로 공부한 내용을 정리하기 위해 작성하였습니다. 혹시 보완해야할 점이나 잘못된 내용있을 경우 메일이나 댓글로 알려주시면 감사하겠습니다.
GoogLeNet은 ILSVRC-2014에서 우승한 CNN Network입니다.
GoogLeNet의 개발자들은 2014년 당시 딥러닝 모델의 수치적인 성능 향상이라는 수치적인 점 보다는 Convolution을 이용한 딥러닝 네트워크 구조의 혁신에 고무되었고, 더 깊으면서 더 효과적인 네트워크 구조 설계를 위해 노력했습니다.
그 결과 Inception module이라는 구조의 네트워크 구조를 설계했고, 이 Inception module을 활용해 AlexNet보다 더 깊지만 파라미터 수는 인 GoogLeNet을 설계했습니다.
이렇듯 GoogLeNet은 효율적인 구조설계로 이전보다 파라미터 수와 성능면에서 좋은 성능 보여주는 네트워크였지만, 복잡한 구조와 그로인한 적용의 어려움 때문에 같은 대회에서 2위한 VGGNet보다 덜 활용되는 비운의(?) 네트워크이기도 합니다.
아래에서는 GoogLeNet의 몇가지 특징과 향후 4번째 버전까지 어떤 점을 개선했는지 GoogLeNet에 대해 소개한 논문인 Going deeper with convolutions을 바탕으로 간략하게 정리하였습니다.
딥러닝 네트워크의 성능을 높이는 가장 간단한 방법은 네트워크를 깊게 하거나(depth 증가) 많은 채널수를 사용(width 증가)하는 등 크게 설계하는 것 입니다.
하지만 단순히 네트워크가 커지면 다음 과 같은 단점이 있습니다.
GoogLeNet에 논문 저자들은 위 두가지 문제를 해결하기 위해선 dense한 Fully-connected 구조 대신 sparsely connected 한 구조로 만드는 것 이며, 만약 dataset의 확률분포가 sparse하면서 조금 더 큰 신경망으로 표현할 수 있다면, layer 사이의 관계에서 이전 layer와의 상관관계 통계분석을 활용하여 최적의 네트워크를 만들 수 있다고 주장합니다.
현대의 컴퓨팅 환경은 GPU연산과 같이 dense한 데이터는 빠르게 처리할 수 있지만 균일하지 않은 sparse한 데이터를 처리하기에 매우 비효율적입니다. 많은 문헌에서 Sparse한 데이터를 효율적으로 처리하기위한 방법으로 sparse matrix를 군집화(clustering)하여 상대적으로 dense한 submatrix를 만드는 것을 제안하였는데, 이 방법은 좋은 성능을 보여주었다고 합니다.
이 내용의 흐름을 간략히 정리하면 아래와 같습니다.
GoogLeNet에서 사용하는 Inception 구조는 위의 개념을 연구하기 위해 시작되었다고 합니다.
아래 구조는 Inception module의 구조입니다.
Inception module의 구조를 보면 두 가지 특징이 있습니다.
Inception module은 1x1, 3x3, 5x5 세 개의 Conv layer와 1개의 Max-pooling을 사용합니다. 여러 스케일의 Convolution 연산을 활용해 다양한 스케일에서 효율적으로 특징을 뽑아낸 뒤 ReLU함수를 사용합니다. 각각의 결과를 연결해(concat) 하나의 output을 생성합니다.
3개의 필터를 사용하는 이유를 좀 더 자세히 살펴보면 아래와 같습니다.
Inception module의 핵심 아이디어는 Convolution network를 최적의 sparse한 matrix를 만들고, 연산에서는 최대한 dense하게 만드는 것 입니다.
GoogLeNet이 참고한 논문에서는 layer-in-layer구조를 제안했습니다. 이 구조에서 마지막 layer와 상관도 통계분석을 활용해 상관도가 높은(correlation 값이 높은) unit을 clustering합니다. clustering된 unit은 다음 layer의 unit이 되며 이전 layer와 연결됩니다.
입력 이미지와 가까운 네트워크의 초반에는 상관도가 높은 unit이 특정 영역에 집중됩니다. 이는 찾으려는 물체의 특징이 이미지 전체 중 일부에 집중되어 있기 때문입니다.
특정 영역에 unit이 집중되면 하나의 지역에서 수많은 unit이 clustering됩니다. 이렇게 unit이 단일 지역에 밀집된 경우는 1x1 Conv layer로 대응이 가능합니다.
반대로 물체의 특징이 별로 없는(공간 집중도가 낮은) 지역에서는 clustering되는 unit이 매우 적어질 수 있습니다. 이러한 경우는 큰 사이즈의 필터의 Conv layer를 사용해 넓은 영역을 관찰하면 상관도가 높은 unit이 많이 clustering될 수 있습니다.
이렇듯 여러 스케일에서 feature를 동시에 추출함으로 써 feature를 효과적으로 추출할 수 있습니다.
추가로, 여러 SOTA논문에서 Max-pooling의 성능이 입증되었기 때문에 Conv layer와 함께 Max-pooling 결과를 함께 사용합니다.
이때, Conv layer를 통과한 output과 해상도를 맞추기 위해 padding을 추가해줍니다.
Inception module의 (b)구조를 보면 3x3, 5x5 Conv Layer앞과 Max-pooling 뒤에 1x1 Conv layer가 붙는 것을 볼 수 있습니다.
여기서 추가된 1x1 Conv layer는 차원을 축소하여 연산량을 줄여주는 역할을 합니다.
네트워크에서 더 뒤쪽 layer로 갈 수록 추상적인 특징을 가지고 있으며, 공간 집중도가 낮아집니다. 따라서 뒤쪽 layer로 갈수록 3x3, 5x5 Conv layer이 증가해야 함을 의미합니다.
하지만 큰 필터크기를 갖는 Conv layer는 많은 연산량을 필요로 합니다. 따라서 Inception module (b)구조에서는 1x1 Conv layer를 사용해 먼저 차원의 수를 줄인 뒤 3x3, 5x5 Conv layer 연산을 수행하는 방식으로 연산량을 조절했습니다.
단, 1x1로 차원의 수를 줄인 경우 feature가 가지고 있는 정보가 압축되면서 원래의 (a)구조보다 성능이 떨어질 수 있습니다. 따라서 연산량이 클 때만 (b) 구조를 사용합니다.
GoogLeNet은 Inception module을 쌓아서 만든 네트워크입니다.
GoogLeNet은 메모리 효율을 고려하여 초반에는 일반적인 Conv layer를 사용하고, 뒤쪽에는 inception module을 사용합니다.
이러한 구조의 장점은 다음 layer의 input-filter 수를 조절하여 연산량 증가 없이 유닛 수를 증가시킬 수 있고, 여러 스케일에서의 feature를 동시에 뽑을 수 있는 것 입니다.
연산효율의 증가는 네트워크의 Depth(layer 수)와 Width(각 layer의 채널 수)를 증가시킬 수 있게 만들어 줍니다.
GoogLeNet 논문 저자들은 연산자원 밸런스를 조절하며 수작업으로 GoogLeNet 네트워크를 설계하였고, Inception module을 사용하지 않았을 때보다 2~3배 빠른 동작을 보여주었다고 합니다. 또한 적은 메모리 사용량으로 메모리와 연산자원이 한정된 기기에서도 동작 가능하다고 주장합니다.
위 표는 GoogLeNet의 상세 구조입니다.
GoogLeNet은 ILSVRC-2014에 참가했을 때 7개의 모델을 ensemble했는데, 그 중 6개의 모델이 위 테이블과 동일한 형태 입니다.
모든 Convolutional 연산 뒤에는 ReLU함수를 사용했고, 224x224 RGB 컬러이미지를 입력으로 받으며, 평균값을 빼는 전처리를 수행하했습니다.
위 표에서 #3x3 reduce와 #5x5 reduce는 차원의 수를 줄이기 위해 3x3, 5x5 Conv layer 앞에 붙는 1x1 필터의 개수를 의미합니다.
이전 네트워크들이 사용하는 Fully-connected layer 대신 Average pooling을 사용합니다. 이때 label의 개수가 바뀌더라도 fine-tuning이 가능하며, top-1 accuracy가 0.6%증가하는 장점을 얻습니다. FC layer는 제거했지만 dropout은 그대로 남겨뒀다고 합니다.
깊은 망에서 학습할 때는 back propagation에서 gradient가 사라지는 gradient vanishing이 발생할 수 있습니다.
GoogLeNet에서는 네트워크 중간에 auxiliary classifier를 붙임으로써 이 문제를 해결했습니다.
auxiliary classifier를 붙임으로 써 망 중간에서 결과에 대한 추가적인 back propagation을 발생시켜 gradient가 전달될 수 있게끔 하면서 추가적인 정규화 효과가 나타나도록 했습니다.
학습시에는 손실함수에서의 영향을 줄이기 위해 0.3을 곱한 값을 사용했습니다. 그리고 평가(Inference)시에는 망에서 auxiliary classifier를 제거한 뒤 사용합니다.
GoogLeNet팀은 ILSVRC-2014에 참가할 때 7개의 GoogLeNet모델을 학습한 뒤 7개 모델의 결과를 활용하는 ensemble방식으로 성능을 끌어올렸습니다. 이 때 6개 모델은 위에서 설명된 구조이며, 1개의 네트워크는 조금더 깊고 넓은 네트워크를 사용했습니다.
평가 방법은 AlexNet과 마찬가지로 256, 288, 320, 352의 4개 크기로 Resize한 뒤 왼쪽, 중심, 오른쪽의 3개 영역에서 정사각형 영역을 가져옵니다. 각각의 정사각형에서 4개의 코너부분과 중심에서 244x244로 Crop하는 Multi-crop 방식을 활용했습니다. 또한 crop된 이미지를 좌우 반전한 이미지도 활용했습니다. 결과적으로 1개의 이미지를 144개로 multi-crop한 결과에 대해 평가를 수행했습니다.
ILSVRC-2014에서는 top-5 error 6.67%로 1위를 차지합니다.
GoogLeNet은 지속적으로 개선해가며 4번째 버전까지 나왔고 최종적으로 ILSVRC-2016에서 다시한번 우승을 차지합니다.
아래에서는 V2 ~ V3까지 어떤 점이 개선되었는지 알아보겠습니다.
(V4의 경우 ResNet에 대한 배경지식이 필요하므로 나중에 다루겠습니다.)
VGGNet에서 보았듯 큰 크기의 convolution 은 3x3 convolution 의 중복으로 만들 수 있었고, 3x3 convolution으로 대체하면 파라미터 수가 감소하며 더 구별력을 가진 특징을 찾을 수 있습니다.
여기서 더 나아가 3x3 convolution filter는 3x1 또는 1x3크기와 같이 row 또는 column방향으로도 분해가 가능합니다. 3x3 filter를 1x3로 분해할 경우 파라미터 수는 로 줄어듭니다.
Inception module또한 3x3, 5x5, 7x7(맨 처음) Conv layer를 분해함으로 써 성능을 향상시킬 수 있습니다.
GoogLeNet V2와 V3에서는 factorizing convolution을 적용해서 성능을 끌어올렸습니다.
일반적인 CNN 네트워크는 네트워크를 통과시켜가며 해상도를 줄여가며 의미있는 특징정보를 추출합니다.
GoogLeNet의 설계자중 한명인 Szegedy는 좀더 효율적으로 해상도를 줄여나가기 위해 아래 그림과 같은 구조를 제시했습니다.
제시된 구조의 형태는 Inception module과 비슷하고, 해상도를 줄이기 위해 Concate하기 직전 stride를 2로 설정합니다.
이미지출처 : 라온피플 블로그
GoogLeNet-V2는 위에서 설명한 factorizing convolution과 Szegedy가 제시한 구조를 활용하여 네트워크를 개선했습니다.
구체적으로는 아래와 같은 점이 개선되었습니다.
GoogLeNet-V3는 V2와 구조는 동일합니다. 하지만 학습할 때 아래 내용이 개선되었습니다.
GoogLeNet은 CNN 구조에 대해 깊게 고민하여 설계된 효율적이고 높은 성능을 갖는 네트워크입니다.
개인적으로 Sparse한 구조를 Dense구조로 근사하는 등 놓치고 있었떤 깊은 내용들에 대해 다시 복습할 수 있어서 좋은 기회였습니다.
Going deeper with convolutions
라온피플 블로그
백광록님 블로그
Organize everything I know 블로그
좋은글 감사합니다!! 괜찮으시다면 제 티스토리에 재포스팅 하고 싶습니다!