CNN based Models : Inception 모델에 대한 정리
Inception 개요
-
Inception model은 GoogLeNet이라고도 많이 알려져 있는 모델로서, 2014 ILSVRC14 에서 sota를 기록함
-
VGG의 계산 비효율성을 개선하고자 고안되었으며, 다양한 커널 크기와 병목 구조(bottleneck) 를 적극 활용한 Inception module을 통해 파라미터 수를 절감할 수 있었다. 마지막 FC층도 Global Average Pooling으로 대체하여 모델 크기를 대폭 줄였다.
-
네트워크 사이에서 컴퓨팅리소스의 활용을 증가시킴. Computing budget(컴퓨팅 예산)을 유지하면서도 네트워크의 깊이와 폭을 증가시키는 것을 통해 이를 가능하게 만들었다.
-
Inception v1,Inception v2,Inception v3,Inception v4,Inception-ResNet등 다양한 개선에 따라 다양한 버전이 존재함. -
Paper
- Inception V1 : Going deeper with convolutions
- Inception V2, V3: Rethinking the Inception Architecture for Computer Vision
Motivation
- 딥 뉴럴 네트워크는 깊고 넓은 네트워크가 성능에 더 좋다라는 관점이 있었으나, 그것에 대한 단점으로 Overfitting, Vanishing Gradient Problem을 비롯하여 학습해야하는 파라미터의 수가 늘어나 총 학습시간, 연산속도 증가 등의 문제점이 발생함
- 깊이(레이어 수)를 늘리는 것이 모델을 더 크게 만드는 유일한 방법은 아니다 → 계산을 일정한 수준으로 유지하면서 네트워크의 깊이와 너비를 모두 늘릴 수 있다
- 1 x 1 컨볼루션을 이용해 채널의 수를 줄였다가 다시 늘리는 방법으로 파라미터의 수를 줄일 수 있다
- matrix 연산을 dense하게 하여 연산을 효율적으로 할 수 있다
- CNN 계열에서 가장 많은 연산이 필요한 것은 convolution filter(kernel)을 stride 만큼 옮겨가면서 feature와의 convolution 연산을 하는 것인데 이런 matrix 연산을 할 때, GPU의 성능을 최대화 하려면 matrix 자체가 dense 해야 한다는 것이다 (즉, matrix에 0이 많지 않고 유효한 숫자가 많아야 한다는 뜻)
- overfitting이 덜 되는 general한 구조를 만들기 위해서는 sparse한 convolution을 도입하는 방법을 사용
- matrix 자체는 dense하게 만들되 네트워크 자체는 sparse 하도록 만드는 것을 고민하였다
1 x 1 Convolution
Xception, Squeeze, Mobile 등 다양한 모델에서도 연산량 감소를 위해 1x1 Convolution을 적극적으로 채택하고 있다. 뿐만 아니라 Semantic Segmentation 연구에서도 채널(Channel) 또는 공간적(Spatial) 특성 파악을 위해 1x1 Convolution 방법 사용이 유의미하다는 것을 증명한 바 있다.
- 채널 수 조정 가능
- 필터의 개수를 조정하여 출력 채널의 수를 늘리거나 줄일 수 있음
- 계산량 감소
- (아래 그림에서 파라미터의 숫자로 표현된 것은 결과값을 크기를 의미함)
_image_1.png)
- 위 그림처럼 Channel 수 조절은 계산량 감소에 직접적으로 영향을 주게 되어 네트워크를 구성할 때 좀 더 깊게 구성할 수 있도록 도움을 준다. 여기서 Channel 수를 줄였다가 다시 늘이는 부분을 Bottleneck 구조라고 표현하기도 한다.
- (아래 그림에서 파라미터의 숫자로 표현된 것은 결과값을 크기를 의미함)
- 비선형성 증가
- 1x1 Conv 사용 후, 활성화 함수로 ReLU를 사용하여 모델에 비선형성을 증가시켜준다 (레이어가 깊어지기 때문)
_image_3.png)
- 1x1 Conv 사용 후, 활성화 함수로 ReLU를 사용하여 모델에 비선형성을 증가시켜준다 (레이어가 깊어지기 때문)
Inception V1
Inception Module
_image_4.png)
- 기본 Inception module의 컨셉으로, feature를 효율적으로 추출하기 위해 1x1, 3x3, 5x5의 Convolution 연산을 각각 병렬로 수행한다. 3x3의 Max pooling 또한 수행하는데, 입력과 출력의 H, W가 같아야하므로 Pooling 연산에서 적절히 Padding을 추가해준다.
- 이미지에서 local끼리는 correlation이 크니까 1x1 filter을 이용하자
- 멀리 떨어진 correlation 있는 것들의 cluster를 3x3, 5x5 filter으로 나타내자
- 3x3 max pooling은 이 당시에 이게 너무 잘되었어서 이것도 넣어보자 (convolution filter의 경우 이미지 내의 detail한 특성을 잡아낼 수 있고 MaxPooling 같은 경우 invariant한 특성을 잡아낼 수 있기 때문에)
- 하지만 최종 출력층은 채널이 늘어날 수 밖에 없고, 각 컨볼루션 연산량이 너무 많아 비효율 적이다
_image_5.png)
- naive 버전의 Inception module 에서 1x1 convolution을 적용하여 채널의 수를 줄여 파라미터 수를 더 줄이는 방향으로 설계함
- 연산량이 많은 3x3 및 5x5 convolution 전에 1x1 convolution을 적용하여 차원을 축소함
- 맨 오른쪽의 maxpooling은 채널 수를 조절할 수 있는 방법이 없어서 이후에 1x1 convolution을 적용함
Model 전체 구조
_image_6.png)
모델구조(세로)
-
Inception module을 사용해 전체 모델을 구성하여 완성시킨 것이 Inception v1 (GoogLeNet)
-
당시 유명했던 AlexNet의 1/12배 파라미터를 사용하여 더 적은 연산으로 나은 성능을 보임(VGGNet은 Alexnet의 3배)
-
9개의 Inception module을 포함하고, 22개 레이어의 깊이를 가짐(풀링 레이어를 포함하여 27개)
-
auxiliary(보조의) classifier를 원활한 학습을 위해 추가함
-
네트워크의 얕은 부분, 즉 입력과 가까운 부분에는 Inception 모듈을 사용하지 않았다. 논문에 따르면 이 부분에는 Inception의 효과가 없었다고 한다.
Auxiliary Loss
_image_8.png)
- 네트워크가 너무 깊다보니 ReLU를 사용했음에도 Gradient가 효과적으로 역전파되지않는 문제가 있음(vanishing gradient)
- 이러한 문제를 해결하기 위해 중간에 Loss를 계산할 수 있는 layer를 추가적으로 만들어서 최종 loss에 반영하게함
- 최종 output에 의해 계산된 loss가 더 중요하므로 가중치를 더 줘야 하는 것이 합당하므로,
auxiliary loss에는 0.3의 가중치만큼 계산에 사용함 - 여기서 사용된
auxiliary loss는 training 할 때에만 사용되고 inference할 때에는 사용되지 않으며 당연히 최종 출력은 하나만 나와야 하니 가장 중요한 최종 output을 사용함
Inception V2, V3
Inception v2와Inception v3는 같은 논문에서 발표되었으며, 저자는 정확도를 높이고 계산 복잡성을 줄이는 여러 가지 업그레이드를 제안함- 일반적으로
Inception v1은 좋은 결과를 얻었지만 구조의 복잡성으로 인해 개선하기가 어렵다. 따라서Inception v1을 최적화하기 위해 몇 가지 방법을 제공함
1. Decompose to a smaller convolution
- 더 작은 컨볼루션으로 분해
- VGG 모델의 핵심이었던 3x3 Factoring Convolution을 기존
Inception v1에 적용하여 파라미터 수와 연산량을 줄임 - 아래는 원본 Inception 모델과의 비교
_image_9.png)
2. Decompose into asymmetric convolution
- 비대칭 컨볼루션으로 분해
- 일반적으로 n x n 의 형태로 Conv 를 수행하게 되는데, 이를 1xn과 nx1 과 같이 비대칭 모양의 Convolution으로 분해 할 수 있다 (Factorization)
- 아래 그림 예시와 같이 3x3 convolution 필터를 적용해서 1x1 output feature를 만드는 데에 9개의 파라미터를 사용할 수도 있지만 3x1 convolution 필터와 1x3 convolution 필터를 이용하면 6개의 파라미터를 사용하여 동일한 출력을 만들어 낼 수 있음
_image_10.png)
- Representational bottleneck을 제거하기 위해 모듈의 필터 뱅크를 확장(깊이 보단 넓게)
- 아래 그림처럼 Filter back size를 확장하여 grid size가 가장 작아졌을 때를 사용함
Representational Bottleneck
CNN에서 주로 사용하는 Pooling으로 인해 Feature map의 크기가 줄어들면서 정보량이 줄어드는 현상
_image_11.png)
3. Use auxiliary classifiers
_image_12.png)
- Traing 과정에서 Auxiliary Classifiers 를 도입하여 Gradient Vanishing 문제를 해결하려함
Inception v2에서 기존 2개 중 초반의 Auxiliary Classifiers는 성능에 영향이 없다고 판단하여 제거함
4. Efficient Grid Size Reduction
- Feature Map의 크기를 효율적으로 줄이는 방법
- 일반적으로 CNN에서는 Feature map의 크기를 줄이기 위해 pooling을 사용하지만 pooling은 연산량을 줄이는 대신 신경망의 representation 또한 감소시킨다는 문제가 있음
_image_13.png)
- 이 문제를 해결하기 위해 convolution과 pooling의 순서를 바꾼다면 위 그림의 왼쪽과 같이 연산량은 줄어들지만 Representation이 낮아지고 Representational Bottleneck을 야기하함. 반대로 오른쪽은 연산량이 3배나 많다.
- 따라서 논문에서는 Representational Bottleneck도 피하고 연산량도 줄일 수 있는 구조를 제안함
_image_14.png)
- 위 그림과 같이 stride가 2인 pooling layer와 covolution layer를 병렬로 사용해 concatenate 하는 구조로 representation을 감소시키지 않고 25%만큼 연산량을 줄일 수 있다고함
5. Batch Normalization
- 배치 정규화(BN)는
Inception V2/BN-Inception에서 도입되어 초기 파라미터에 대한 기울기의 의존성을 줄이는 등 local minima에 빠질 수 있는 가능성을 낮춤 - ReLU는 Vanishing gradient / Exploding gradient 해결하기 위한 활성화 함수로 사용되지만 그것은 또한 출력을 더 불규칙하게 만든다 → 네트워크가 깊어지면 작은 변화가 증폭되기 때문에 시간이 지남에 따라 X의 분포가 고정된 상태로 유지되는 것이 유리함
- BN은 학습의 안정성을 위하여 각각의 학습 데이터 batch의 평균과 분산을 구하여 normalization을 하고 학습을 통하여 normalization 한 결과에 곱할 scale과 더할 shift 값을 구함
- BN은 Convolution filter를 적용하고 Activation을 적용하기 이전 그 사이에 사용 (
convolution-BN-ReLU순서) - 입력 에 가중치 를 곱하고 바이어스 를 더한 다음, 활성화 함수 를 거치면 출력 가 된다
- BN을 적용하면,
Inception V2
위와 같은 주요 방법들을 결합하여 Inception V2 를 제안함
_image_15.png)
Inception V3
Inception V2의 대부분 기능들과 함께 아래의 방법들을 추가함- RMSProp 최적화 방법
- 7x7 Factoring Convolution
- auxiliary classifiers 의 BN
- Label Smoothing
RMSProp
- RMSProp는 많이 변화한 변수는 최적값에 근접했을 것이라는 가정을 하며, 업데이트 횟수에 따라 학습률을 조절하는 Adagrad에 지수 가중 이동 평균의 컨셉을 사용하여 최신 기울기들이 더 크게 반영되도록 한 것
7x7 Factoring Convolution
_image_16.png)
Label Smoothing
- Hard label(One-hot encoded vector로 정답 인덱스는 1, 나머지는 0으로 구성)을 Soft label(라벨이 0과 1 사이의 값으로 구성)로 스무딩하는 것을 의미. 즉, 레이블을 부드럽게 깎아서 일반화 성능을 높이고자 하는 것이다.
- 기존 Hard label 인덱스는 가장 큰 로짓과 다른 모든 로짓 간의 차이가 커지도록 조장하여 모델의 적응 능력을 감소시키며 과적합의 원인이될 수 있다.
- 값이 0 인 레이블에 대해서도 아주 작은 값 e를 배분
- K개의 클래스에 대해서, 스무딩 파라미터(Smoothing parameter)를 α라고 할 때, k번째 클래스에 대해서 다음과 같이 스무딩을 한다.
new_labels = (1 — ε) * one_hot_labels + ε / K(ε = 0.1, 하이퍼파라미터)
_image_17.png)
Inception V2, V3 결과
_image_18.png)
- 위에 보이는 표는 Inception-v2에서 한 칸 내려갈 수록 추가되는 기법만 명시하고 이전의 기법들은 기본적으로 사용하고있다. 성능이 제일 좋은(제일 아래에 있는) Inception-v2 BN-auxiliary는 RMSProp + Label Smoothing Factorized 7 x 7 + BN-auxiliary을 다 사용한 것이고 이 모델을 Inception v3라고 부른다.
Inception V4
- 기존의 Inception 모델들은 뛰어난 성능을 인정받았지만 모델의 구조가 너무 복잡하다는 평가를 받았다. 때문에 더 좋은 성적을 보였던 Inception 계열의 모델 보다 VGGNet이 더 흔하게 사용되었다.
_image_19.png)
- 이에 2016년,
Inception V3보다 단순하고 균일화된 구조와 더 많은 Inception Module을 사용한Inception V4가 등장함 - paper : Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning
_image_20.png)
요약
- 논문에서는
Inception-ResNet-v1,Inception-ResNet-v2,Inception-v43가지 아키텍처 네트워크를 제안함 - Residual Connection을 사용한 Hybrid Inception version 2가지와, 이것을 사용하지 않고 비슷한 성능을 낸 Inception-v4를 소개하며 자신들의 연구인 Inception에 대한 pride와 최신 연구인 ResNet과의 결합을 훌륭히 이루어냄
_image_7.png)