[paper review] inception의 발달 과정

    본 글의 논문 Rethinking the Inception Architecture for computer vision 링크 : https://arxiv.org/abs/1512.00567

     

    Rethinking the Inception Architecture for Computer Vision

    Convolutional networks are at the core of most state-of-the-art computer vision solutions for a wide variety of tasks. Since 2014 very deep convolutional networks started to become mainstream, yielding substantial gains in various benchmarks. Although incr

    arxiv.org

    복습 겸, 이전에 다뤘던 Inception ver 1인 GoogleNet의 특징을 정리해봅시다.

     

    GoogleNet 은

     

    Inception module을 사용하였습니다.

    1X1 convolution 을 사용하여 모델을 깊게 만들 수 있었습니다.

    Inception 모듈은 낮은 layer에서 제외하였습니다.

    auxiliary classifier로 vanishing gradient를 해결하였습니다.

     

    이번에 리뷰해볼 Rethinking the Inception Architecture for computer vision 는 Inception ver 2와 ver 3 에 대한 이야기입니다. 

     

    1. Inception v2


    Inception v2는 Factorizing Convolution 을 해줍니다.

     

    Factorizing Convolution는 합성곱을 분해해준다는 방식입니다. 

    Inception v1(왼쪽) 과 Inception v2(오른쪽)

    이전에 봤던 GoogleNet (Inception v1)은 각각 1X1 convolution을 모두 진행해준 1x1convolution, 3x3convolution, 5x5convolution, pooling을 해준 결과물들을 채널단위로 합치는 방식이었습니다.

     

    하지만 Googlenet이 이겼지만 이기지 못한 모델 VGG가 기억나시나요?

    VGG는 오로지 3x3 Conv 필터만 사용한다는특징이 있었습니다. 이 방법을 Inception에 새롭게 적용한 것입니다.

    따라서, 5X5 convolution은 연산량이 크기때문에 이를 3X3 convolution 2개로 바꾸었습니다. 즉, Factorizing Convolution을 해주었습니다. 

    5X5 Convolution 을 3X3 Convolution 2개로 바꾸는 방법

    이렇게 3X3 convoution만 사용하면 어떤 점이 좋을까요?

     

    바로, 연산량이 줄어든다는 점입니다. 

     

    만약 크기가 같은 2개의 layer 를 하나의 5x5 로 변환하는 것과 3x3 짜리 2개로 변환하는 것 사이의 비용을 계산해보면,

    5x5xN : (3x3xN) + (3x3xN) = 25 : 9+9 = 25 : 18 가 나오게 되어, 약 28% 의 reduction 효과를 얻을 수 있었습니다. 

     

     


    Inception v2는 Asymmetric convolution을 사용한 factiorization을 해줍니다.

     

    이 방법 또한 마찬가지로 연산량을 줄이면서 convolution을 할 수 있는 꼼수 중 하나입니다. 일반적으로 NXN 형태로 convolution을 수행하는데 이를 1XN과 NX1로 분해하는 기법입니다. 

    Asymmetric convolution를 사용한 factiorization

     


    Inception v2는Auxiliary classifiers 맨 하단 분류기를 삭제했습니다.

     

    googlenet 에서는 총 3개의 softmax를 위치해주어 vanishing gradient (기울기 소실)라는 문제를 막아주었다고 말씀드렸는데요,

    비교 실험을 통해 Inception에서 맨 처음에 위치한 softmax가 성능에 영향을 주지 못한다는 사실을 알게되어 이를 삭제해주었습니다. 

    Inception ver1 구조
    Inception ver2 구조

     


    마지막으로는, Inception v2는 효율적인 그리드 크기를 줄였습니다. 

    효율적인 그리드 크기 줄이기

    CNN은 Feature Map의 Grid 크기 줄이는 과정을 Max Pooling 을 이용해서 진행합니다.

    이때 항상 pooling과 convolution을 연속해서 사용하는데, 이 순서에 따라 장단점이 존재합니다. 

     

    우선, 왼쪽의 그림에서 있는 모델(representational bottleneck)처럼 pooling을 진행하고 convolution을 진행할 경우 병목현상이 발생합니다.

    사진에 있는 병을 봤을때 병의 몸통보다 병의 목부분의 내부 지름이 좁아서 물이 상대적으로 천천히 쏟아지는 상황을 생각해보시면 병목현상을 이해하실 수 있으실 텐데요, 병목현상으로 인해 정보손실이 일어난다고 생각하시면 되겠습니다.

     

    하지만 오른쪽 모델(expansive conputation)처럼 convolution을 먼저, Pooling을 나중에 진행할 경우 연산량이 왼쪽 모델에 비해 4배정도 커지게됩니다.

     

    즉, 병목현상을 없앨것이냐 연산량을 줄일것이냐의 문제였습니다.

     

    Inception ver 2에서는 이 문제를 두 모델을 섞어버리면서 해결하였습니다.

    Pool과 convolution을 병렬적으로 진행하는 모델을 집어넣고 다른 convolution의 경우 stride 를 2로 설정하여 concat해주는 넓이가 같도록 설정해주어 연산량 감소와 병목현상 없음이라는 두 이점 모두를 챙길 수 있었습니다. 

    두 모델을 섞은 모습

    내용이 좀 많다보니 다시 정리를 하고 넘어가자면,

    inception v2는 Factorizing Convolutions와 Asymmetric Conv 를 사용한 Factorization를 진행하여 연상량이 감소되었습니다.

    그리고 Auxiliary Classifiers 맨 하단 분류기가 쓸모없다는 것을 알게되어 삭제해주었습니다. 

    stride 2 와 pool과 convolution을 합친 모델을 적용하여 연산량을 줄이고 병목현상로 인한 정보량의 손실을 막을 수 있었습니다. 

     

    2. Inception v3

    inception v3는 Inception-V2와 구조는 동일한데 Hyperparameter만 변경해준 것입니다. 

     

    어떤 Hyperparameter를 변경해주었는지 알아봅시다. 

    1. Optimizer: SGD에서 RMSProp으로 바꿨습니다. 

    이 optimizer가 더 성능이 좋았기 때문입니다. 

     

    2. Label smoothing 을 사용해주었습니다.

    Label smoothing은 Target 값을 one-hot encoding을 사용하는 것이 아니라, 값이 0 인 레이블에 대해서도 아주 작은 값인 e를 배분하고, 정답인 레이블은 1-(n-1)e로 설정해주는 방식입니다.

    이 방법은 딥러닝 모델이 정답 타겟에 과잉 확신하는 현상을 해소해주는 효과를 가져옵니다. 

     

    3. 마지막 Fully Conntected 레이어에 Batch Normalization(BN)을 적용하였습니다. 

    배치정규화를 사용할 경우, 학습 속도 개선초깃값 선택에 의존하지 않아도 된다는 장점이 있습니다. 

     

    이러한 하이퍼파라미터 조절로 Inception v3과 완성되었습니다. 

     

    이로 Inception 리뷰를 마치면서, TMI를 적어보자면 inception이라는 글자를 처음 봤을때, 영화 inception이 생각났는데요

    여러가지 자료를 찾아보니까 Inception이라는 코드네임이 Network in Network 라는 논문에서 가져온 것인데, 이 논문에서는 inception이 인셉션 영화의 대사인 We neet to go deeper에서 착안해 온것이라고 합니다. (저희 팀원중 한분은 너무 억지같다고 말씀하셨지만..ㅎㅎ) 이제 곧 주말인데 Inception 영화나 다시 보고 싶은 마음이네요. 

     

    댓글