[논문 리뷰] GoogLeNet 간단 리뷰

2022.02.08 22:43 4,336 Views

안녕하세요!

오늘은 GoogLeNet 논문을 읽으면서 내용을 정리해 올립니다.  공부하는 학생인 만큼 틀린 점이 있을 수 있으니 있다면 지적이나 피드백 부탁드립니다.

본 포스팅은 데이콘 서포터즈 "데이크루" 1기 활동의 일환입니다.  


Abstract

2014년 이미지넷 인식 대회 ILSVRC14에서 VGG를 누르고 1위를 차지한 모델입니다. VGG와 마찬가지로 깊은 layer 구성을 통해 성능을 향상시켰습니다. VGG19는 19개의 layer, GoogLeNet은 22개의 layer로 구성되어 있습니다. 논문은 2015년 CVPR에 개제되었고 이름은 ‘Going deeper with convolutions’입니다.

GoogLeNet은 연산을 하는데 소모되는 자원의 효율을 개선했다는 것이 특징입니다. 잘 설계된 구조를 통해 네트워크의 깊이나 폭?을 늘려도 계산 량이 증가하지 않는다고 합니다. 이때 핵심구조를 Inception이라고 부르며 이후에 발전된 모델도 많이 나온 것으로 알고 있습니다. 


GoogLeNet 등장 배경

일반적으로 모델의 성능을 향상시키는 가장 쉬운 방법은 layer를 깊게 쌓거나 node를 늘리면 됩니다. 즉, 파라미터의 개수를 늘리면 되죠. 지금은 ResNet이나 DenseNet과 같이 깊은 모델들도 나왔지만 당시에는 두 가지 문제점이 있었습니다.

첫번째는 네트워크의 크기가 증가함에 따라 더욱 많은 파라미터를 가지게 되는 것입니다. 파라미터가 많아지면 성능이 올라가니 좋은 거 아니냐? 라고 질문을 던질 수 있지만 학습하는 데이터에만 초점이 맞춰진 과대적합 현상이 일어나기 쉽습니다.

두번째는 네트워크가 커지면 커질수록 연산 량이 증가하고 이에 따라 컴퓨터의 리소스를 엄청나게 사용하게 됩니다. 리소스는 돈이고 최대한 적은 돈을 들여서 좋은 성능을 달성하면 좋은 것 일 뿐만 아니라 많은 리소스를 투입했다고 이것이 효율적으로 사용되고 있지 않을 수 있습니다. 또한, 기울기 소실 등과 같은 문제로 좋은 성능을 내지 못하고 있었습니다. 이런 저런 문제를 해결하기 위해 Dropout 과 같은 방법도 이용했지만 더 근본적인 해결이 필요하다고 했습니다.

Inception이라는 이름은 Network in Network(NIN) 논문과 “we need to go deeper”이라는 인터넷 밈에서부터 파생되었다고 합니다. 

 

GoogLeNet 관련 연구

LeNet-5부터 CNN은 일반적으로 표준 구조를 가지고 있다고 합니다. Stack된 Conv layer 다음에 FC layer 가 오는 구조이죠. 대용량 데이터에서는 layer 개수나 사이즈를 늘리고 과대적합을 막기 위해 dropout을 적용하는 것이 일반적이었다고 합니다. 따라서 GoogLeNet도 같은 방식을 채택했다고 합니다.

다음으로 NIN 논문 내용이 나오는데 GoogLeNet에 가장 영향을 끼친 논문이 됩니다. 1*1 conv layer와 ReLU 가 뒤따르는 구조인데 1*1 conv layer는 차원 축소와 네트워크 크기 제한을 목적으로 상용되었다고 합니다.

 

Architectural Details  

주요 아이디어는 NIN에서 가져오는데 NIN은 높은 상관관계에 있는 뉴런을 군집화 시키고 마지막 계층에서 활성화 함수들의 상관관계를 분석함으로써 최적의 네트워크 토폴로지를 구축할 수 있다고 합니다. 뭐 이를 통해 fc layer와 conv layer를 dense한 구조에서 sparse한 구조로 바꿀 수 있다고 합니다. 이 역시 문제가 있는데 불균일한 sparse 데이터에서 계산이 매우 비효율적이라고 합니다. 그렇지만 다 필요없고 dense data 구조를 sparse 하게 바꾸고 이것이 효율적인 데이터 분포가 된다면 되는 것이죠.

그렇게 핵심인 Inception module로 넘어갑니다. Inception module은 각 요소를 최적의 sparse 구조로 근사화하고 이를 dense로 바꾸는 방법을 찾는 것입니다. Sparse한 것을 묶어서 상대적으로 Dense한 형태로 만드는 것입니다. 특징을 효과적으로 추출하기 위해 1*1, 3*3, 5*5 conv 연산을 병렬적으로 수행합니다. 사이즈를 위해 padding도 추가한다고 하네요.

Layer가 깊어짐에 따라 더 고수준의 특징을 잡고 3*3, 5*5 conv filter수도 늘어나는데 입력 feature의 크기가 크거나 filter 수가 많아지면 연산량이 더욱 증가하게 됩니다.

그래서 아래 그림처럼 1*1 conv layer를 추가해 차원을 축소해줍니다. 연산량도 낮출 뿐 아니라 비선형적 특징도 추가되니 좋다고 합니다. (Bottleneck layer느낌이죠)

여기서 서로 다른 필터들을 통한 연산 결과들의 합을 출력하는데 이 또한, 명확한 이유가 있다고 합니다. 앞서 CNN의 성능을 올리기 위해 Dropout을 사용했다고 말했는데 과대적합을 막아 에러를 낮추는데 효과는 있지만, 리소스를 효율적으로 사용하지 않는다고 합니다. 컴퓨터 연산장치는 불균등한 연산을 처리하는데 취약해서라고 하며 CPU나 GPU나 dense 한 연산을 처리하는데 최적화가 되어있다고 합니다. 그래서 리소스를 효율적으로 사용하기 위해서는 dense한 네트워크를 구성해야 하고 이것이 과대적합 등의 문제를 가져오니 spare한 구조를 도입해 막자는 것인데 충돌합니다. 따라서 GoogLeNet에서는 전체적으로 연결은 Sparse한데 각각의 실제 연산은 Dense하게 하자는 것입니다. 이 덕분에 다양한 특징을 결합해 더 광범위한 특징을 추출할 수 있습니다.

 

 

GoogLeNet

앞서 설명한 Inception module을 여러 개 쌓아 구성한 네트워크가 됩니다. 초반에는 인셉션 모듈이 학습 효율이 떨어져서 Pre-layer을 추가해 일반적인 CNN 연산을 수행합니다. 그 이후 인셉션 layer로 GoogLeNet에는 총 9개의 인셉션 모듈이 존재해 22개의 layer로 구성됩니다. 당시 기준으로 깊은 네트워크를 구성했음에도 AlexNet 대비 12배 적은 파라미터가 사용되었다고 합니다. 각 Conv layer에 활성화 함수는 ReLU를 사용했다고 하네요.

Global Average Pooling입니다. AlexNet이나 VGG는 FC layer를 마지막에 둬서 연산을 수행하지만 GoogLeNet은 Average Pooling 방식으로 이전층에서 나온 특성을 각각 평균내서 1차원 벡터로 만들어주는 것 입니다. 1차원 벡터로 만들어주는 이유는 softmax에 넣어 분류를 해줘야 하기 때문입니다. 해당 방식이 좋은 이유는 파라미터를 상당히 줄여주는 것인데 예시로 1000장의 5*5 특성이 형성되었으면 FC에서는 5*5*1000*1000으로 25M정도가 추가되지만 pooling 방식은 단지 평균을 내주기 때문에 추가되는 값이 없다. 또한, fine tuning하기도 쉽다고 하네요.

아래의 그림은 논문에 첨부된 전체적인 구조입니다.

 

결론

Inception 구조는 Sparse 구조를 Dense 구조로 연산을 수행해 성능을 개선하였다. 이는 기존에 CNN 성능을 높이기 위한 방법과는 다른 새로운 방법이어서 새로운 가능성을 열어주었습니다. 또한, 계산은 조금 증가한 것에 비해 성능이 대폭 상승했다는 것이 장점입니다. 뭐 구조가 복잡해 이후에 여러 차례 수정을 거치고 VGG보다 잘 안 쓰인 것 같지만요.. 



참고자료

[1] https://arxiv.org/pdf/1409.4842v1.pdf

[2] https://paperswithcode.com/paper/going-deeper-with-convolutions

[3] https://poddeeplearning.readthedocs.io/ko/latest/CNN/GoogLeNet