본문 바로가기
Deep Learning/papers

[딥러닝 모델 경량화] Inception

by 룰루셩 2020. 8. 2.

[딥러닝 모델 경량화] Inception

 

안녕하세요! 저번 포스팅에서 딥러닝 모델 경량화 동향을 살펴보았을 때 합성곱 필터의 변경해서 만든 모델 중 하나인  MobileNet을 봤었죠? 이에 대해서 더 자세히 공부하려고 MobileNet 논문을 보는데 Inception, Xception 모델을 먼저 공부하고서 봐야 할 것 같더라고요! 이번 글에서는 Inception이 무엇인지 알아보도록 할게요!

 

이전 포스팅이 궁금하시다면 아래를 클릭해서 보시면 됩니다!

 

2020/08/01 - [Deep Learning/papers] - [딥러닝 모델 경량화] 딥러닝 경량화 기술 동향

 

[딥러닝 모델 경량화] 딥러닝 경량화 기술 동향

[딥러닝 모델 경량화] 딥러닝 경량화 기술 동향 지난 학기에 DCASE라는 대회에 참여하였었는데, 그 주제가 모델 사이즈는 500MB 이하인 상태로 성능을 좋게하는 것이었습니다. 대회는 끝났지만

sotudy.tistory.com

 

Inception model은 GoogLeNet이라고도 많이 알려져 있는 모델입니다. Going deeper with convolutions 라는 논문을 읽으시면 더 자세한 내용을 보실 수 있습니다. 

또한 저는 유튜브에서 PR-034: Inception and Xception 이라는 발표 영상을 보고 공부하였습니다.

 


Inception 모델이 나오게 된 배경과 motivation에 대해서 먼저 살펴보죠!

(우리가 큰 주제로 [딥러닝 모델 경량화]를 배우고 있는 만큼 모델 사이즈와 관련되어있습니다. )

 

deep neural network의 성능을 향상시키는 가장 간단한 방법은 모델 size를 늘리는 것입니다. 그러나 이에는 두 가지 문제가 있습니다.

 

   1. overfitting이 되기 쉽습니다.

   2. 계산 자원이 증가합니다.

 

이를 해결하기 위해서는?

저자들은  Fully connection architecture에서 Sparsely connected architecture로 만들어 주면 어떨까라고 처음에 생각했습니다.

Sparsely connected architecture를 설명하자면, 전에 있는 input  node들 사이의 correlation이 상당히 높다 하면 Fully connected처럼 다 연결된 것이 아니라 지난 output의 서로 연관관계가 높으면 둘은 연결시켜주되 나머지는 연결시키지 않습니다. 이렇게 하면 cluster가 생기고 sparse 한 connection의 architecture가 됩니다.  

그림 1 correlation statistics

그러나 이것도 문제가 있었습니다.

오늘날 컴퓨팅 인프라는 균일하지 않는 sparse  데이터 구조에 대한 수치 계산에 있어서 매우 비효율적이라는 것입니다.

 

 

그래서 이 논문의 저자들은 중간 단계 는 없는지에 대해서 고민했습니다. 그 결과가 바로 Inception module입니다.

 

Optimal local construction을 찾고 이걸 공간적으로 반복하면 어떨까라는 것이 Inception module의 naive 버전입니다.

초기 모듈을 보면 다음 그림과 같습니다.

 

그림2 Inception module, naive version

 

- 이미지에서 local끼리는 correlation이 크니까 1x1 filter을 이용하자

- 멀리 떨어진 correlation 있는 것들의 cluster를 3x3, 5x5 filter으로 나타내자

- 3x3 max pooling은 이 당시에 이게 너무 잘되었어서 이것도 넣어보자

 

이렇게 아이디어를 가지고 이들을 병렬적으로 더해서 만들어보자라고 한 것이 naive version의 Inception module입니다.

 

그런데, 이것도 잘 작동이 안 됐습니다! 풀링층과 conv층 출력을 합치는 것은 출력의 수가 늘어날 수밖에 없었고 최적의 희소성 구조를 커버할 수는 있었지만 매우 비효율적이었습니다.

 

 

다음으로 생각해 낸 것이 연산해야 하는 노드들을 1x1 filter로 줄여주고 계산량이 높은 convolution들을 계산하자는 것입니다.

다음 그림과 같이 말이죠! 여기서 맨 오른쪽의 maxpooling은 maxpooling은 채널 수를 조절할 수 있는 방법이 없어서 나중에 조절해주기 위해 저런 구조를 가지고 있습니다.

 

그림 3 Inception module with dimension reductions

전에 다양한 convolution들을 살펴봤을 때 알 수 있었듯이, 1x1 convolution은 채널 수를 줄여주는 dimension reduction의 역할을 해줍니다.

 

이 방법은 계산 자원의 활용이 개선되어 계산상의 어려움에 빠지지 않고 단계 수를 늘릴 수 있게 되었습니다.

 

 

다음은 Inception module을 사용하여 만들어진 GoogLeNet입니다.

그림 4 GoogLeNet

여기서 오른쪽에 노란색 박스로 나오는 곁가지들은 무엇일가요?

이런 곁가지들은 원래 없었는데 네트워크가 워낙 깊다보니 ReLU를 사용했음에도 Gradient가 효과적으로 backprop되지 못하는 문제가 생겼습니다. 그래서 중간에 이런 곁가지들을 만들어주었다고 합니다. 이걸 자세히 살펴보면 FC→FC→softmax 이렇게 output layer와 같은 구조입니다. 즉, 중간에 예측을 하는 곁가지라고 볼 수 있습니다. 

신기하게도 이 중간 곁가지들이 strong performance를 보였고 이것들도 학습에 이용이 됩니다. loss에 0.3 가중치를 붙여서 전체 네트워크의 총 loss에 추가됩니다. 이 구조가 regularization 효과를 가져왔다고 합니다.

 


 

지금까지 Inception에 대해서 알아보았습니다.

 

추가로 GoogLeNet을 코드로 구현해놓은 깃허브가 있어 공유합니다.  저도 이 깃허브를 보면서 DCASE에 Inception 아이디어를 적용해보려고 합니다.

https://gist.github.com/joelouismarino/a2ede9ab3928f999575423b9887abd14

 

다음에는 Xception 논문을 읽고 정리해보도록 하겠습니다!!

 

 

참고

[1] C. Szegedy,W. Liu, Y. Jia, P. Sermanet, S. Reed, D. Anguelov, D. Erhan, V. Vanhoucke, and A. Rabinovich. Going deeper with convolutions

[2] PR-034: Inception and Xception

[3] https://www.slideshare.net/KyeongUkJang/googlenet 

 

댓글