About me
home
Portfolio
home
🗼

GoogleNet 정리

등장배경: CNN 모델은 깊고 넓은 네트워크가 성능이 더 좋다는 관점이 있었는데, 연산량과 파라미터 수가 너무 많아져 학습시키는데 오래 걸린다는 단점이 존재. (초기 CNN 모델의 한계)
2014년에는 ILSVRC(ImageNet 이미지 인식 대회)에서 GoogleNet이 1등을 차지하였고, 간소한 차이로 VGGNet이 2등을 하였다.
AlexNet은 망의 layer 수(depth)가 8개뿐이였지만, ImageNet과 같은 대용량 데이터를 학습해야하는 경우 더 망이 깊어져야 하는 것은 필수적이다.
따라서 AlexNet보다 더 개선된 CNN 모델로 GoogleNetVGGNet이 등장하였고, 이중 GoogleNet은 단순히 더 깊게(deeper) 네트워크를 만들지 않고 새로운 기법(Inception 모듈)을 제시해 독창적인 아키텍쳐를 구성하였다.
이후 2015년 ResNet부터는 155 layers로 망의 깊이가 훨씬 더 깊어지게 되면서 에러율도 3.47%까지 떨어지게 되었다.
단순히 망을 깊게 구성했을 때 나타나는 문제점 - 파라미터의 개수가 증가하게 되어 학습시키는데 오래 걸린다. - train data의 양이 제한적인 경우 overfitting될 가능성이 높아진다. - gradient vanishing 이 생긴다.
GoogleNet에서 제시한 해결책 - Inception 이라는 새로운 모듈을 제시 (밑에서 자세히 소개) 이 Inception module 을 중첩시켜 깊은 신경망을 구성하게 된다.

Inception module

GoogleNet V1의 아키텍처에서는 이 Inception module이 9개 중첩된다.
input으로 들어올때랑 output으로 나갈때 : W,H는 똑같지만 Depth만 달라진다.
다양한 feature를 뽑기 위해 여러 종류(1x1, 3x3, 5x5)의 합성곱 연산을 병렬로 구성하였다. 이는 다양한 representation을 받아들일 수 있는 필터들이 필요하기 때문이다. 또한 max pooling을 써서 이미지의 invariant한 특징을 잡아낼 수 있다.
여기에 1x1 convolution을 적용하여 채널 수를 줄이고 파라미터 수를 더 줄이는 방향으로 설계하였다. 1x1 convolution 덕분에 연산량이 조절되었고 AlexNet보다 더 깊은 신경망을 구성할 수 있게 된 것이다~
AlexNet은 8 layers 이고 GoogleNet이 22 layers로 더 깊은 망을 사용하는데 free parameter 수는 1/12 정도이고 전체 연산량도 AlexNet보다 적다.
전체 아키텍쳐를 보면 처음에 줄기(stem) 부분을 지나 9개의 Inception module을 연속적으로 지나고 중간중간 보조 분류기(Auxiliary) 가 튀어나와있고 마지막에 평균 풀링(Average Pooling)을 하여 Classification을 하는 구조이다. 이로 인해 학습할 parameter 양을 줄였다.

Auxiliary Loss

존재 이유: 신경망이 22층으로 매우 깊기 때문에 gradient를 역전파(back propagation)하는 도중에 소실되는 문제점이 있다.
따라서 신경망 중간중간에 예측 결과 Loss를 삽입해줌으로써 기울기 소실 문제를 해결할 수 있게 된다.
최종 Loss는 중간에 튀어나온 2개의 손실함수(Auxiliary Loss)와 마지막에 최종으로 output classifier에 전파되는 손실함수의 값의 평균이다.
근데 소스코드에는 구현이 안 되어있는거 같다…

Tensor Factorization 기법

이 기법을 사용하여 inception 모듈을 개선한 것이 v2, v3 버전이다.
5x5영역에 5x5 conv 필터를 한번 거치면 output은 크기가 1x1인 feature가 됨. → 25개의 파라미터 필요 근데 위 사진처럼 5x5 영역에 3x3 conv 필터를 쓰면 3x3 영역이 되고, 한번 더 3x3 conv 필터를 쓰면 1x1 feature가 된다. → 9개 + 9개 = 18개 파라미터 필요 따라서 Tensor factorization 기법을 사용하여 파라미터를 줄인다.
각각 inception 모듈마다 이 기법이 쓰이니, inception 모듈이 여러 개 중첩된 최종 모델에는 아주 많은 파라미터를 줄일 수 있게 된다.
이후 Inception V3에서는 더 다양한 Tensor factorizaiton 기법(A,B,C)을 사용하여 다음과 같은 아키텍쳐가 되었다. Auxiliary Loss는 1개로 줄어들었다.
Batch Normalization은 2015년에 처음 제안되었고 우리 교재의 코드에는 BatchNormalization까지 추가된 Inception 모듈을 제공한다. (tensor factorization 기법을 사용한걸 보니 V2 버전이다.) Conv → BN → ReLU 순서로 적용된다.