Convolution Layer의 parameter는 Kernel Height x Width x Input Channel x Output Channel로 구성된다.
parameter가 크면 클 수록 정확도는 높아지겠지만 그만큼 연산 시간이 많이 걸린다. 따라서 BottleNeck은 이러한 문제를 해결하기 위해 제안되었다. 이름에서 알 수 있듯이 네트워크를 통과하는 모습이 마치 병목과 비슷하게 생겼다.
1x1 Conv에서 채널이 축소되고 3x3 Conv에서 공간적 특징을 추출한다. 하지만 채널 축소 없이 특징을 추출하는 것보다 확실히 정보의 손실이 존재한다. 이후에 채널을 다시 증가시키게 되는데 다시 256 채널로 변환하는 것이다.
이렇게 되면 단순히 3x3 Conv를 통해 256 - 64 - 256으로 변환하는 것보다 훨씬 적은 파라미터를 필요로 한다.
계산을 해보면 다음과 같다.
BottleNeck
H x W x in x out
1 x 1 x 256 x 64 = 16384
3 x 3 x 64 x 64 = 36864
1 x 1 x 64 x 256 = 16384
Standard
H x W x in x out
3 x 3 x 256 x 64 = 147456
3 x 3 x 64 x 256 = 147456
파라미터 수가 어마어마하게 차이난다. 확실히 추론하는데 시간을 획기적으로 줄일 수 있지만 그만큼 정보 소실로 인해 정확도가 줄어들 수 있다는 것을 명심하도록 하자.
Referenced: https://coding-yoon.tistory.com/116?category=825914