1-4. ResNet 이후 시도 (1) Connection을 촘촘히

Hoon82의 velog·2022년 9월 23일
0

주요 참고 자료

ResNet이 보여준 실험 결과를 살펴보면서 "이 정도 성능이면 충분하지 않을까"라는 생각이 드셨을 수 있지만 아직 개선의 여지가 남아있습니다. Densely Connected Convolutional Networks 의 저자들은 DenseNet은 ResNet의 shortcut connection을 마치 Fully Connected Layer처럼 촘촘히 가지도록 한다면 더욱 성능 개선 효과가 클 것이라고 생각하고 이를 실험으로 입증해 보였습니다.

1) Dense Connectivity

일반적인 컨볼루션 네트워크가 L개의 레이어에 대해 각 레이어 간 하나씩의 연결, 즉 총 L개의 연결을 갖는 것과는 달리, DenseNet의 기본 블록은 L개의 레어가 있을 때 레이어 간 L(L+1)/2개의 직접적인 연결(direct connection)을 만듭니다. 이러한 연결 구조를 "dense connectivity"라고 부르며, 아래처럼 Hl로 표기하고 이를 합성 함수(composite function)라고 부릅니다.

각 레이어는 이전 레이어들에서 나온 특성 맵(feature map) 전부를 입력값으로 받습니다. 위 식에서 (X_0, X_1, X_l-1)은 0번째 레이어를 거친 특성 맵부터 l-1번째 레이어를 거친 특성 맵까지를 의미하며, 이들은 합성함수 H를 거쳐 l번째 레이어의 출력값이 됩니다. DenseNet은 이를 통해서 경사 소실 문제(gradient vanishing)를 개선하고 특성을 계속 재사용할 수 있도록 합니다.

Shortcut connection이 있어 ResNet과 비슷해 보일 수 있지만 ResNet은 shortcut을 원소별로 단순히 더해주었던 반면, DenseNet은 하나하나를 차원으로 쌓아서(concatenate) 하나의 텐서로 만들어 낸다는 사실이 다릅니다. 또 이전 ResNet의 connection에 다른 연산이 없었던 것과 달리, 합성함수 H_l은 이 텐서에 대해 배치 정규화(batch normalizaion, BN), ReLU 활성화 함수, 그리고 3x3 컨볼루션 레이어를 통해서 pre-activation을 수행합니다.

Pre-activation 개념은 Identity Mappings in Deep Residual Networks 논문에서 제시되었는데요, 위 그림의 (b)에서 보듯 ReLU가 컨볼루션 블록 안으로 들어간 것을 의미합니다. 어떤 역할을 하는지에 대해서는 아래 자료를 참고합시다.

Q5. 위의 DenseNet Block은 feed-forward를 포함해서 L(L+1)/2개의 connection을 갖습니다. 그렇다면 DenseNet의 첫번째 Block에는 몇 개의 connection을 가지게 될까요? 첫번째 Dense Block에 몇 개의 Conv Block이 사용되었는지 논문에서 확인하시면 쉽게 계산할 수 있습니다.
21개입니다. 6개의 레이어를 사용했으므로 6(6+1)/2개 즉 21입니다.

2) Growth Rate

특성 맵을 더해주던 ResNet과 달리 DenseNet에서는 특성 맵을 채널 방향으로 쌓아서 사용하니다. 그렇다면 4개의 채널을 가진 CNN 레이어 4개를 DenseNet 블록으로 만들었을 때, 입력값의 채널 개수가 4인 경우 블로 내 각 레이어의 입력값은 몇 개 채널을 가지게 될까요?

첫 번째 레이어 입력값의 채널은 입력 데이터의 채널 그대로 4입니다. 두 번째 레이어의 입력값은 입력 데이터의 채널 값과, 첫 번째 레이어 출력값의 채널인 4를 더해 8이 됩니다. 그리고 세 번째 레이어는 입력 데이터의 채널 4와 첫 번째 레이어 출력값의 채널 4, 그리고 두 번째 레이어 출력값의 채널 4를 받아 12개의 특성 맵을 입력 받고, 네 번째 레이어는 같은 방식으로 16개의 특성 맵을 입력 받고, 네 번째 레이어는 같은 방식으로 16개의 특성 맵을 입력 받습니다.

입력값의 채널이 4로 시작했으나 진행할수록 특성 맵의 크기가 매우 커지는 것을 볼 수 있습니다. 이를 제한하기 위해서 논문에서는 growth rate라는 값을 조정하여 레이어를 거치면서 증가하게 되는 채널의 개수를 조절합니다.

위에서 CNN의 채널 수를 4로 정하였는데 이 값이 growth rate이라고 할 수 있습니다. 블록 내의 채널 개수를 작게 가져가면서 최종 출력값의 특성 맵 크기를 조정할 수 있도록 했다고 합니다. 이외에도 여러 방식이 적용되었으니 DenseNet Tutorial 1 Paper Review & Implementation details에서 bottleneck 레이어, transition 레이어, composite function 등에 대해 살펴보고 넘어가시기 바랍니다.

위 그림에서처럼 이미지넷 챌린지에 참가하기 위한 DenseNet 구현체는 growth rate로 32를 사용했다고 합니다. 12개의 컨볼루션 레이어가 있는 두 번째 Dense block을 구현할 때 각 레이어에서 입력 받는 채널은 몇 개가 될까요? 두 번째 Dense block에 주어지는 입력은 32개의 채널을 가지고 있습니다. 하단 코드 블록에 파이썬을 사용해 배열로 나타내고 실행하여 결과를 출력해 봅시다.

profile
나는 킹고수다!!

0개의 댓글