참고
대표적으로 ResNet에서 Bottleneck를 사용하는데 ResNet의 Bottleneck 구조를 가지고 설명하겠다.
ResNet에서 왼쪽은 BottleNeck 구조를 사용하지 않았고, 오른쪽은 BottleNeck 구조를 사용했다.
BottleNeck을 설명하기 전, Convolution의 Parameters을 계산할 줄 알아야 하는데 다음과 같은 공식으로 계산한다.
Convolution Parameters = Kernel Size(가로) X Kernel Size(세로) X Input Channel수 X Output Channel수
BottleNeck의 핵심은 1x1 Convolution이다. (Pointwise Convolution 이라고도 한느데 이는 Depthwise Separable Convolution에서도 똑같은 원리로 이용되기 때문에 잘 알아두면 좋다.)
1x1 Convolution의 Parameters는 1 x 1 x Input Channel x Output Channel이다.
대게 1x1 Convolution은 연산량이 작기 때문에 Feature Map(Output Channel)을 줄이거나 키울 때 사용된다.
(1) Input Channel = 256인 320x320 size의 Input Image가 있다고 가정하자.
여기서 B는 Batch size이다.
(2) Channel Compression(채널 압축)
Input Channel 256 Output Channel 64
256을 64로 채널을 강제로 축소한 이유는 오로지 연산량을 줄이기 위함이다.
1x1 Convolution에는 Spatial(공간적인) 특징을 가지고 있지 않다. Convolution 연산이 공간적인 특징을 추출하기 위해선 Kernel이 최소 2 이상 되어야 한다.
(3) 특징 추출(Feature Map 추출)
Input Channel 64 Output Channel 64
3x3 Convolution은 특성을 추출하는 역할을 한다.
3x3 Convolution 연산은 = 3 x 3 x Input Channel x Output Channel 이다. ( 3 x 3 x 64 x 64 )
3x3 Convolution은 1x1 Convolution 보다 9배 연산량이 많기 때문에, 1x1 Convolution에서 채널을 줄인 후에 3x3 Convolution에서 특성을 추출한다.
(4) Channel Increase(채널 증가)
Input Channel 64 -> Output Channel 256
CNN은 Feature Map의 특성이 많으면 많을수록 학습이 잘 되기 때문에, 1x1 Convolution으로 강제적으로 채널을 증가시켜준다.
BottleNeck의 구조는 1x1 Convolution으로 장난을 치면서 연산량을 최소화하는 것이다.
하지만 강제로 채널을 줄이고 늘리는 것은 정보 손실을 일으키고 모델의 정확성을 떨어뜨린다.
그림을 보면 연산량과 정보손실은 서로 tradeoff 관계이기 때문에 서로의 합의점을 찾는 것이 중요한 것을 알 수 있다. 즉 연산량과 정보 손실의 관계를 잘 보면서 Error가 최소가 되는 지점을 찾는다.
Bottle의 과정을 한번에 정리하면 다음 그림과 같다.
그리고 형성된 것이 도로의 병목 현상과 비슷하다 하여 BottleNeck 구조라고 불린다.
안녕하세요
https://coding-yoon.tistory.com/116 랑 같은 분이신가요?