아래 글에서 이 블로그에서 리뷰한 논문들의 흐름과 분야별 분류를 한 눈에 볼 수 있다.
이번 논문은 Google에서 발표한 GoogLeNet이라는 모델에 대한 것이다.
이 글 이전에 살펴봤던 AlexNet, VGGNet과 함께 현대 모델의 기틀을 마련했다고 할 수 있다.
가장 큰 특징은 성능을 높이면서 연산 효율도 높였다는 점이다.
논문은 아래 링크에서 볼 수 있다.
1. Introduction
네트워크를 넓거나 깊게 만드는 것은 정확도를 높이기에 가장 쉬운 방법이다.
하지만 파라미터도 그만큼 증가한다.
GoogLeNet은 고정된 자원 안에서 깊이와 넓이를 늘리는 것에 초점을 맞추었다.
이를 위해 Inception모듈이라는 구조를 설계했다.
2. Related Work
일단 이 모델도 이전에 봤던 AlexNet, VGGNet을 베이스로 삼았다.
아래의 연구들에서 영감을 얻어 설계했다.
Network-in-Network (NiN)
위 연구에서 영감을 얻어 $1 \times 1$ Convolution을 사용하여 표현 능력(Representational power)을 높이면서도 차원을 축소하는 기법을 도입했다.
가로세로는 동일할지라도 채널 개수가 줄어들기 때문에 차원 축소라고 부를 수 있다.
1x1층 뒤에 ReLU도 추가하면서 비선형성도 증가한다.
Hebbian Principle
뇌과학적으로 상관관계가 높은 뉴런들은 연결된다는 것을 보고,
상관관계가 거의 없는 경우 가중치를 제거하는 식으로 효율성을 챙겼다.
Multi-scale Processing
전통적인 컴퓨터 비전(SIFT 등)에서 다양한 크기의 특징을 잡기 위해 여러 스케일의 필터를 썼던 것처럼, 인셉션 모듈도 $3 \times 3, 5 \times 5$ 필터를 병렬로 배치해 다양한 시야각을 확보했다.
R-CNN
객체 검출(Detection) 분야의 당시 최신 기술인 R-CNN의 아이디어를 인용하며, 자신들의 모델이 분류뿐만 아니라 검출에서도 강력한 성능을 낼 수 있음을 언급했다.
3. Motivation and High Level Considerations
여기서는 왜 그냥 깊게 층을 쌓지 않고 왜 Inception이라는 복잡한 구조를 만들었는지 설명한다.
<기존 문제점>
- 과적합 가능성 : 파라미터 수가 많은데 레이블링 된 데이터가 한정적이라면 과적합 가능성이 올라간다.
- 연산 자원 증가 : 당연히 크기가 크면 연산량이 증가한다. 만약에 가중치들이 0에 가까우면 별로 큰 의미없는 계산에 낭비될 수 있다.
<이론적인 해결법>
희소 연결(Sparse-connection) 도입: 위에서 잠시 얘기했듯이 0에 가까운 가중치는 제거하는 것이다.
반대로 AlexNet, VGGNet에서 사용된 밀집 연결(Dense Connection)은 0에 가까운 값도 저장하는 것이다.
<현실적 해결법>
위에서 이론적 해결법이라고 한 이유는 현대의 CPU/GPU또는 수치 라이브러리는 dense한 행렬 연산을 더 잘하기 때문이다.
따라서 이 희소행렬을 조밀한 하위행렬로 묶어서 병렬로 계산하는 현실적인 해결법을 사용했다.
4. Architectural Details
여기서는 인셉션 모듈에 대해 더 자세히 알아본다.
먼저 처음에는 아래처럼 인셉션 모듈을 설계했었다.

빠른 이해를 위해 예시를 하나 들어보자.
예를 들어 입력이 $28 \times 28 \times 192$라면 먼저 1x1,3x3,5x5층에 각각 padding을 0,1,2를 주어 출력 크기가 똑같아지도록 한다.
max-pooling에는 stride=1, padding=1을 주어 크기를 맞춘다.
그러면 결과는 모두 같은 $W \times H$를 가지게 될 것이다.
예를 들어 결과가 아래 같았다고 하자.
$1\times1$ 경로 결과: $28 \times 28 \times 64$
$3\times3$ 경로 결과: $28 \times 28 \times 128$
$5\times5$ 경로 결과: $28 \times 28 \times 32$
Max Pool 경로 결과: $28 \times 28 \times 32$
이러면 최종 결과는 $28 \times 28 \times (64+128+32+32) = 28 \times 28 \times 256$이 된다.
단점 : 계산 과정을 보면 알겠지만 층별로 연산이 진행될 수록 점차 차원이 커질 것이다.
따라서 아래처럼 수정된 구조를 생각해냈다.
처음에 잠깐 언급했듯이 1x1 convolution을 넣어서 채널 수를 줄였다.
즉 위 예시에서 64,128,32 등의 채널 깊이가 더 작은 숫자로 바뀌므로 concatenate가 되더라도 크기가 유지될 수 있다.

이 방식 덕분에 너비와 깊이를 크게 확장하는 것이 가능해졌다.
그러면 여기서 한가지 의문이 있을 수 있다.
"맘대로 차원을 줄여도 정보 손실이 없을까?"
결론적으로는 줄여도 괜찮다.
자연어 처리를 할 때 one-hot벡터를 dense하게 만드는 것과 같다고 생각하면 된다.
계산도 빨라지고 정보도 잘 남아있다. 하지만 단점은 데이터 처리의 난이도가 증가한다는 점이다.
따라서 필요할 때만 dense하게 만드는 방식을 사용한다. 즉 3x3,5x5을 거치기 전에만 사용되는 것이다.
일반적으로 인셉션 모듈들 사이사이에 stride2인 max pooling 레이어를 가끔 배치해 해상도를 절반으로 줄이는 흐름도 사용되었다.
학습 효율을 위해 아주 낮은 층에서는 인셉션 모듈을 쓰지 않고 전통적인 컨볼루션 방식을 유지하다가, 상위 층부터 인셉션 모듈을 쌓기 시작했다.
또 이 구조는 작은 패턴, 중간 패턴, 큰 패턴, 지역 요약을 병렬적으로 수행한다고도 해석할 수 있다.
이렇게 하면 다음 층은 더 추상적인 특징을 만들 수 있다.
5. GoogLeNet
이런 인셉션 모듈들을 어떻게 사용해 GoogLeNet을 만들었는지 설명한다.
- 깊이: 파라미터가 있는 층만 계산하면 22층, 풀링층까지 포함하면 약 100층에 달하는 구조이다.
- Global Average Pooling (GAP): 마지막에 AlexNet이나 VGG처럼 무거운 FC 레이어를 쓰는 대신, 채널별 평균을 내는 GAP를 사용했다. 이 덕분에 파라미터 수를 획기적으로 줄여 과적합을 방지했다.
- 입력 크기: $224 \times 224 \times 3$ (RGB) 이미지이다.
아래 표가 이 모델의 구조를 설명하는 표이다.
<표 설명>
초반에는 인셉션이 사용되지 않은 것을 볼 수 있다.
#1x1,#3x3,#5x5는 위 그림에서 파란색으로 표시된 부분의 채널 수를 의미한다.
reduce가 붙은 것들은 노란색으로 표시된 1x1부분의 채널 수를 의미한다.
pooling이후의 1x1채널 수는 pool proj 이다.
<예시>
inception (3a)의 output size가 어떻게 해서 28x28x256이 나오는지 계산해보자.
이전 층의 입력(28x28x192)이 병렬적으로 총 네 갈래로 나눠 계산된다.
위 그림기준 가장 왼쪽의 그냥 1x1은 채널 수가 64이므로 결과는 28x28x64이다.
왼쪽에서 두번째를 보면 먼저 1x1을 통과해 28x28x96으로 줄어든다.
이후 128개의 채널을 가진 3x3필터를 거치면서 28x28x128이 된다.
같은 방식으로 5x5필터를 나오면 28x28x32가 된다.
마지막으로 풀링 이후 1x1을 통과해서 28x28x32가 된다.
이 네 가지를 모두 합치면 28x28x256이 된다.

Auxiliary Classifiers(보조 분류기)
네트워크가 너무 깊어서 발생하는 그래디언트 소실(Gradient Vanishing) 문제를 해결하기 위한 장치이다.
테스트 시에는 제거한다.
네트워크 중간 지점(inception 4a와 4d 뒤)에 두 개의 작은 분류기를 추가로 달았다.
이 위치는 대략 전체 신경망의 1/3, 2/3부분 정도이다.
따라서 총 3개의 분류기(보조1, 보조2, 최종)가 있고 이를 기준으로 구역을 3개로 나눌 수 있다.
- 초반 부분은 0.3 * 보조1 gradient + 0.3 * 보조2 gradient + 최종 gradient
- 중앙 부분은 0.3 * 보조2 gradient + 최종 gradient
- 최종 부분은 최종 gradient
구역별로 위 방식으로 계산된 값들을 통해 학습을 한다.
<보조 분류기 구조>
1. average pooling layer에서
(4a) → 4×4×512
(4d) → 4×4×528
로 바뀐다.
2. 1x1 , 128개 필터를 통과한다.
4x4x128로 줄어든다.
3. flatten후 이 2048개를 FC층을 지나면서 1024개로 줄인다.
4. 드롭아웃은 70%로 된다.
5. 이 결과를 1000차원으로 바꾼다. softmax를 사용해 확률로 나타낸다.
5-1. 전체 구조
이런 모든 부차적인 층까지 포함된 그림이 아래의 그림이다.
매우 길다.
각 구성요소에 보면 7x7처럼 필터의 사이즈를 표시한 것을 볼 수 있다.
뒤의 +2같은 숫자는 Stride를 의미한다.
뒤의 괄호에는 (S), (V)같은 표시가 있다. padding 정책을 얘기한다.
S는 same padding의 약자로 연산 후 이미지 크기를 유지시키는 padding값을 사용하겠다는 것이다.
예를 들면 5x5필터에서는 stride가 1일 때, padding=2로 설정해야 연산 후 이미지 크기가 유지된다.
stride가 2일 때는 입력 사이즈가 224x224라면 연산 후 112x112가 되도록 하는 padding값을 의미한다.
stride가 2일 때 숫자로 계산하면 padding이 소수가 되야할 수 있는데 그럴때는 올림을 하면 된다.
V는 패딩을 사용하지 않는다는 뜻이다.
LocalRespNorm은 LRN을 말한다. 이전글에서 살펴본 방법이다.
Depth Concat이번 글에서 알아봤던 병렬 계산 결과를 합치는 작업이다.

6. Training Methodology
<학습 방법>
알고리즘은 momentum=0.9로 SGD를 사용했다.
8epoch마다 learning rate를 4%씩 감소시켰다.
<데이터 증강>
1. 원본 이미지 면적의 8~100%를 랜덤으로 골라서 크기를 다양하게 하여 입력을 주었다.
크롭의 가로세로 비율은 3/4~4/3사이로 제한했다.
따라서 랜덤한 면적이더라도 너무 얇고 길쭉한 이미지는 선택되지 않도록 했다.
2. 또 조명의 영향을 줄이기 위해 색상에도 변화를 주어 학습시켰다.
7. ILSVRC 2014 Classification Challenge Setup and Results
ILSVRC 2014대회의 분류 부문에서 top-5 에러율 6.67%로 1등을 차지했다.
2012년 AlexNet(16.4%), 2013년 ZFNet(11.7%)과 비교하면 높은 성능 향상이 이루어진 것을 볼 수 있다.

<성능을 높인 세 가지 전략>
1. 앙상블 효과 사용
동일한 GoogLeNet 구조를 가진 모델 7개를 각각 독립적으로 학습시켰다.
모델의 구조는 같지만, 초기화 값(Initialization)이나 입력 이미지를 샘플링하는 순서를 다르게 하여 각 모델이 조금씩 다른 특성을 배우게 했다.
결과적으로 7개 모델의 예측값을 합쳐서 평균을 내니 에러율이 크게 낮아졌다.
2,3. Multi-scale Evaluation, 144-crops
어떤 사진 한장이 주어지고 이게 뭔지를 맞추는 테스트를 할 때 아래 과정을 거친다.
Step 1. 4개의 스케일 (Scales): 이미지를 4가지 크기(짧은 쪽 기준 256, 288, 320, 352 픽셀)로 리사이징.
Step 2. 3개의 정사각형 조각 (Squares): 각 스케일 이미지에서 왼쪽, 가운데, 오른쪽(또는 위, 중간, 아래)으로 3개의 큰 정사각형 조각을 얻는다. ($4 \times 3 = 12$개)
Step 3. 6개의 224x224 크롭 (Crops): 각 정사각형 안에서 4개의 코너(모서리)와 1개의 중앙, 그리고 전체 이미지를 $224 \times 224$로 리사이징한 것까지 총 6개를 추출. ($12 \times 6 = 72$개)
Step 4. 좌우 반전 (Mirrored): 위에서 얻은 72개 조각을 각각 좌우 반전시킨다. ($72 \times 2 = \mathbf{144}$개)
따라서 하나의 이미지 테스트시 144번의 사진을 모델이 돌리는 셈이 된다.
이 값들의 평균으로 결과를 낸다.
심지어 7개 모델로 앙상블 되어있으므로 한 이미지를 평가하기 위해 1008번 모델이 돌아간다.
매우 비효율적이지만 대회에서는 정확도만 중요하기 때문에 가능하다.

<VGG와의 비교>
GoogLeNet: 6.67% (1위)
VGG (Oxford): 7.32% (2위)
VGG는 구조가 단순하고 깔끔하여 나중에 더 많이 변형되어 쓰였지만, 효율성 면에서는 GoogLeNet이 더 좋았다.
VGG는 파라미터가 1억 개가 넘었지만, GoogLeNet은 500만 개 수준이었기 때문이다.
8. ILSVRC 2014 Detection Challenge Setup and Results
이번엔 분류가 아닌 검출이다.
둘의 차이점은, 분류는 그냥 사진을 보고 뭐가 찍힌건지 맞추는 것이지만, 검출은 그 위치에 박스까지 쳐야한다.
이 시대에는 R-CNN(Regions with CNN features)이 대세였다.
이 R-CNN에 대한 논문도 후에 글을 작성할 예정이다.
GoogLeNet 팀도 이 방식을 기본으로 채택하되, 인셉션 모델을 백본(Backbone)으로 사용했다.
- Region Proposals: 물체가 있을 법한 후보 영역을 찾는 알고리즘으로는 Selective Search와 Multi-box 기법을 혼합해서 사용했다.
- Classifier: 각 후보 영역(Patch)이 어떤 클래스인지 판별할 때, 성능이 검증된 GoogLeNet 앙상블 모델을 사용했다.
<성능 향상 전략>
- Contextual Information (주변 정보 활용): 물체 하나만 보는 게 아니라, 이미지의 전체적인 맥락을 함께 고려했다. 예를 들어 '물 위에 떠 있는 것'은 '배'일 확률이 높다는 식의 힌트를 얻기 위해 더 넓은 영역을 함께 학습했다.
- Bounding Box Regression: 선택된 박스가 물체에 딱 맞지 않을 경우를 대비해, 박스의 위치와 크기를 미세하게 조정하는 회귀(Regression) 모델을 추가했다.
- Multi-scale 추론: Classification과 마찬가지로 여러 크기의 이미지에서 박스를 추출하여 작은 물체까지 놓치지 않도록 했다.
<결과>
GoogLeNet은 Detection 부문에서도 우수한 성적을 거뒀다.
- 성적: mAP(mean Average Precision) 43.9%를 기록하며 2등을 차지했다.
- 의의: 전년도 우승 기록인 22.5%를 두 배 가까이 뛰어넘는 수치였다.


9. Conclusion
1. 단순히 깊게 층을 쌓는 것보다 넓이(병렬)도 중요하다.
2. 더 무거운 모델이 아니어도 설계만 잘하면 성능은 좋다.
3. 파라미터가 적어 모바일 환경등에도 임베딩 될 수 있는 가능성을 열었다.