GoogLeNet
layer의 유닛 증가 / network의 크기를 키우자
but 크기를 키울수록 학습해야 할 파라미터가 많아지고, 데이터가 충분하지 않을 때 과적합의 위험성이 있다. 또는 학습하는데 걸리는 시간이 급격하게 증가 -.이를 개선하기 위해 GoogLeNet
GoogLeNet:
- 신경망은 깊게 유지하며 성능을 올리고 파라미터 수를 줄여 효율성을 높일 수 있는 architecture
- AlexNet보다 파라미터가 12배나 적음에도 불구하고 훻씬 정확( deep한 구조와 클래식한 컴퓨터 비전의 시너지 덕분)
- 고정된 구조를 가지기 보단 유연한 구조를 가지게끔
- 추론 시간에 1.5 billion 이하의 연산만을 수행하도록 설계
- GoogLeNet의 코드 네임인 Inception은 Network in Network(NIN)에서 유래 -> 1*1 convolution layer + ReLu activation적용( 병목 현상을 제거하기 위한 차원 축소, 네트워크 크기 제한)
- 위 두 문제를 해결하는 방법
- dense 한 Fully-Connected 구조에서 SparselyConnected 구조로 바꾼다.

sparse 하면서도 더 큰 심층 신경망으로 표현 가능하다면 입력 layer에서 출력 layer로 향하는 layer 간의 관계 통계적으로 분석 후 연관 관계가 높은 것들만 연결하여 최적의 sparse한 네트워크를 만들 수 있다.
하지만 오늘날의 컴퓨팅 환경은 균일하지 않은 Sparse data 구조를 다룰 때 매우 비효율적이다.
Google팀의 Inception 구조는 위에서 말한 Sparse구조를 시험하기 위해 시작되었다.
러닝 레이트와 하이퍼 파라미터를 조정하고 훈련 방법등을 개선한 결과 Localization 및 Object detection분야에서 특히 좋은 성능을 보였다고 한다.
Inception
:Sparse 매트릭스를 서로 묶어 (클러스터링 하여) 상대적으로 Dense 한 Submatrix를 만든다
- NIN에서 사용한 1*1 filter 활용 -> 여러 feature map로부터 특징을 추출하여 차원을 줄이는 효과를 가지기 때문에 연산량을 줄이는 데에도 효과적
- 3*3, 5*5 filter를 병렬적으로 추가하여 입력으로부터 더 다양한 feature 추출
- 3*3 pooling도 병렬도 수행하여 각 나온 결과를 concat하여 사용

문제 발생!
- 5*5 filter가 많아질수록 연산량이 많아짐
- pooling layer의 특성상 이전 단계를 채널 사이즈를 유지하기에, 다음 단계로 보낼 때 각 filter의 결과와 pooling의 결과를 concat하기 때문에 단계를 거칠수록 사이즈가 계속 커지는 것은 불가피

- 3*3과 5*5앞에 1*1을 두어 차원을 줄인다.-> 이를 통해 여러 scale을 확보하면서 연산량을 낮출 수 있다.
- 추가적으로 convolution 연산 이후에 추가되는 ReLU를 통해 비선형적 특징을 더 추가
*Google의 의견
효율적인 메모리 사용을 위해 낮은 layer에서는 기본적인 CNN모델을 적용하고 높은 layer에서 Inception module 사용 추천
1. 과도한 연산량 문제없이 각 단계에서 유닛 수를 상당히 증가시킬 수 있다.
2. Visual 정보가 다양한 Scale로 처리되고 다음 레이어는 동시에 서로 다른 layer에서 특징 추출
GoogLeNet의 구조

GoogLeNet의 전체적인 구조, Inception module 핵심적으로 사용, 총 22개의 layer로 구성됨

낮은 레이어가 위치해 있는 부분
효율적인 메모리 사용을 위해 낮은 레이어에서는 기본적인 CNN모델 적용
convolution layer를 통과하고 pooling후 LRN수행 S: STRIDE

Inception module

모델의 깊이가 매우 깊을 경우 기울기가 0으로 수렴하는 gradient vanishing 문제가 발생할 수 있다.
중간 layer에 auxilary classifier를 추가하여 중간중간에 결과를 출력해 추가적인 역전파를 일으켜 gradient가 전달될 수 있게끔 하면서 정규화 효과가 나타나도록 하였다.
지나치게 영향을 주는 것을 막기 위해 0.3을 곱하였고
실제 test시에 auxiliary classifier를 제거 후 제일 끝단의 softmax 사용

예측 결과가 나오는 모델의 끝부분
최종 classifier이전에 average pooling layer를 사용
GAP(Global Average Pooling)이 적용
: 이전 layer에서 추출된 feature map을 각각 평균을 낸 것을 이어 1차원 벡터로 만들어 준다.
-> 최종적으로 이미지 분류를 위한 softmax layer와 연결할 수 있기 때문이다.

이렇게 1차원 벡터로 만들면 가중치의 개수를 상당히 많이 줄여줌
FC는 가중치의 개수가 매우 많지만, GAP를 사용하면 1개의 가중치도 필요하지 않다.
또한 GAP을 적용한다면 fine tuning을 하기 쉽게 만든다.
=========
Training Methodology
모델 훈련을 어떻게 하였는지 설명
0.9 momentum의 Stochastic gradient descent를 이용하였고 learning rate는 8 epochs마다 4프로씩 감소시켰다.
또한, 이미지의 가로, 세로 비율을 3 : 4와 4 : 3 사이로 유지하며 본래 사이즈의 8% ~ 100%가 포함되도록 다양한 크기의 patch를 사용하였다. 그리고 photometric distortions를 통해 학습 데이터를 늘렸다고 한다.
결론
Inception 구조는 Sparse 구조를 Dense 구조로 근사화하여 성능을 개선하였다. 이는 기존에 CNN 성능을 높이기 위한 방법과는 다른 새로운 방법이었으며, 성능은 대폭 상승하지만 연산량은 약간만 증가한다는 장점이 있다.