GoogleNet의 핵심 아이디어 inception module, auxiliary classifier, 1*1 convolution 알아보기

0. 개요

 

 

22층으로 구성됨

 

네트워크 안에 네트워크가 있는 구조인 Network In Network 구조

 

Inception block이라는 아이디어를 사용함

 

 

그림을 보면 값을 여러개로 분산시킨 것이 눈에 먼저 보이는 특징인데 물론 그러면서 얻는 효과도 있다.

 

5*5 CONV나 3*3 CONV에 들어가기 전에 1*1 CONV를 넣으면서 parameter 수를 감소시킨 것이 중요한 아이디어다.

 

1*1 conv는 spatial dimension을 그대로 가져오면서 channel수를 줄여

 

적절하게 사용하면 네트워크는 깊게 구축하면서 parameter 수를 줄일 수 있다

 

https://deepdata.tistory.com/202

 

1*1 convolution은 왜 중요한가?

1*1 크기의 kernel을 input에 적용시키면 input의 모든 pixel을 그대로 가져온다 1번 적용하면 output channel은 1이되므로 kernel 수를 적절하게 조절하면 spatial dimension은 그대로 가져오면서 channel만 줄이..

deepdata.tistory.com

 

 

중간에 1*1 conv를 사용하고 3*3 conv를 사용하는 것이 바로 3*3 conv를 쓰는 것보다 parameter 수가 줄어들었다

 

11*11에서 3*3으로 줄인 vgg는 물론 매우 좋았는데

 

중간에 1*1을 넣었더니 parameter를 더욱 줄일 수 있었다.

 

심지어 1층이 더 늘어나니 더욱 deep한 neural network가 된다

 

 

층 수는 늘어나면서 parameter 수를 급격하게 감소시켰다

 

 

--------------------------------------------------------------------------------------------------------------------------------

 

1. Deep layer의 문제점

 

AlexNet이후 VGG의 등장으로 더 깊은 네트워크가 더 좋은 성능을 낸다는 것을 알았다

 

더 큰 receptive field를 가져 하나의 feature가 더 많은 참조를 하면서 더욱 신중한 결론을 내림

 

더 복잡한 함수관계를 학습할 수 있음

 

그래서 네트워크를 깊게하려는 노력을 많이했지만 학습이 잘 안되는 문제점에 도달했다

 

사람들은 layer가 너무 깊으면 model parameter가 너무 많아져 표현력이 과도하게 증가하여 overfitting에 취약할 것이라고 생각했다.

 

그러나 추후 overfitting이 아니라 degradation 문제라는 것이 밝혀졌다

 

degradation 문제라는 것은 backpropagation으로 gradient가 뒤로 축적되면서 너무 커지는 exploding 현상이 일어나거나

 

너무 작아지면서 vanishing 현상이 일어나 학습이 안돼

 

심지어 계산복잡도가 빠르게 증가하면서 GPU 메모리 한계라는 문제점도 생겼다

 

ResNet 논문에서 나온 degradation 문제

 

 

2. inception module

 

하나의 layer에서 다양한 크기의 convolution filter인 1*1, 3*3, 5*5부터 3*3 max pooling을 사용했다

 

이 filter의 output을 channel축으로 concatenation 한 것을 다음 layer로 전달하였다

 

이런 방식으로 여러 측면에서 activation을 구현하겠다는 의지를 보여주었다

 

depth를 늘리려는 것이 아닌 width를 확장하겠다는 것

 

근데 단순히 여러 size를 concatenation하면 계산 복잡도가 증가한다는 문제가 있었다.

 

다른 convolution하기 전에 1*1 convolution을 사용하였고

 

max pooling이후에 1*1 convolution을 사용하여 전체적인 channel 크기를 확 줄였다

 

그러면서 전체적인 parameter를 감소시켜 계산량을 감소시켰다

 

inception block의 형태

 

1*1 convolution을 중간에 넣은 bottleneck layer의 형태

 

하나의 이전 layer에서 나온 output을 여러 1*1,3*3,5*5 convolution, 3*3 max pooling을 시켜서 여러개의 output을

 

channel축으로 <옆으로> concatenation시킴

 

width를 확장시키지만 계산복잡도가 증가할 수 있음

 

그래서 1*1 convolution을 중간에 넣어 channel크기를 줄여 전체적인 parameter를 감소시켰다

 

 

3. 1*1 convolution

 

1*1 filter를 사용한 convolution을 수행하면 input의 spatial dimension은 그대로 가져오고 channel 크기는 1로 감소시킴

 

보통 표시를 안하는데 filter의 channel 크기는 input image의 channel크기와 동일함

 

1*1 크기니까 input sptial dimension pixel 하나씩 내적시킬 수 있음

 

전체 feature map은 filter의 개수만큼 나옴

 

1*1 convolution은 spatial dimension은 그대로 가져오면서 channel 크기를 줄여주는 연산이 된다

 

 

filter 수가 2개니까 2개만큼 feature map이 나온다

 

output의 spatial dimension은 input과 동일하다

 

 

4. GoogleNet의 전체 구조

 

첫 layer는 기본적인 convolutional network

 

다음부터는 inception block을 여러단 쌓았다

 

최종 layer로는 fully connected layer로 classifier를 사용했다

 

여기서 주목할 점은 중간에 auxiliary classifier를 사용했다는 점이다.

 

GoogleNet의 기본 구조

5. auxiliary classifier

 

마지막 output에서 backpropagation하면 layer가 깊을수록 gradient가 input 끝까지 잘 전달이 안돼

 

그래서 중간 중간에 주사기 느낌으로 auxiliary classifier를 꽂아 gradient가 input 끝까지 흐를수있도록 하였다

 

 

마지막에서 계산되는 gradient가 input까지 전달이 안될 가능성이 높아서

 

중간에 auxiliary classifier에서 gradient를 계산하여 흘러보냈다

 

auxiliary classifier의 기본구조

 

googlenet의 마지막 classifier랑은 다르게 FC layer가 2개나 있다

 

auxiliary classifier은 오직 train 과정에서 backpropagation gradient를 계산할 때만 사용한다

 

ground truth를 아니까 auxiliary classifier에서 ground truth가 나오도록 loss를 계산하면 gradient 계산이 가능하다

 

test time에서는 중간 auxiliary classifier는 제거하고 마지막 layer의 결과만 prediction으로 사용한다

 

TAGS.

Comments