[CV Study] Densely Connected Convolutional Networks

2020. 6. 14. 02:32Research

ResNet에서는 깊은 네트워크에서 발생하는 gradient vanishing 문제를 해결하기 위해 block 마다 한 개의 shortcut connection을 두었다. 이번에 살펴볼 DenseNet은 shortcut connection을 극단적으로 늘린 케이스라고 생각하면 된다. 얼마나 극단적이냐면 어떤 레이어와 그 이전에 있던 모든 레이어 간에 direct connection이 존재한다. 즉, $l$번째 레이어에는 $0$~$l-1$번째 레이어의 모든 출력이 입력으로 들어오고, $l$번째 레이어의 출력은 그 이후에 등장하는 $L-l$개의 레이어로 전달된다. VGG에서는 총 $L$개의 레이어가 존재하는 경우에, 전체 connection의 개수는 $L$개였다. 반면 DenseNet에서는 $L$개의 레이어가 존재할 때 무려 $1+2+  ... + L = \frac{L(L+1)}{2}$개의 connection이 생긴다. 이렇게 layer간의 상호작용을 극대화함으로써 다음과 같은 이점을 얻을 수 있다.

 

  1. Gradient vanishing 문제를 해결
  2. 모든 레이어가 연결되어 있어서 feature propagation이 잘 이루어짐 (빠른 학습이 가능)
  3. Dense connection을 통해 이전 레이어들에서 구한 feature가 재사용될 수 있다.
  4. Parameter 수 감소
  5. Dense connection 자체가 정규화 효과가 있어서 오버피팅 방지

Dense connection은 얼핏보면 비효율적이지 않을까라는 생각이 들지만 생각보다 매우 효율적이다. ResNet에서는 네트워크의 깊이를 깊게 만들어서 성능을 높였고, GoogLeNet에서는 같은 level에 여러 레이어(1x1 Conv, 3x3 Conv, 5x5 Conv)를 두고 이를 concat하여 다양한 feature를 학습하였다. 반면 DenseNet에서는 $l$번째 레이어가 $0$~$l-1$번째 레이어에서 추출한 모든 feature map을 concat하여 입력으로 받기 때문에 추가적인 연산 없이 input variation을 높일 수 있다. 이전 레이어들의 output을 입력으로 받는 데엔 별다른 연산이 필요하지 않기 때문에 연산량이나 파라미터 수에 있어서 매우 효율적이며, input variation이 높아지는 것을 통해 정규화 효과를 누릴 수도 있다.

 

DenseNet

 

1. Dense Connectivity

DenseNet의 핵심은 dense connectivity라고 할 수 있다. 일단 다음과 같이 notation을 정하도록 하자.

 

$x_0$ 네트워크로 들어오는 최초 입력 데이터
$L$ 전체 레이어 수
$H_l(x)$ $x$가 입력으로 들어온 $l$ 번째 non-linear transformation 레이어 (일반적으로 Conv + BN + ReLU 조합으로 구성됨)
$x_l$ $l$ 번째 레이어의 출력 feature map

 

ResNet의 경우, Conv + BN + ReLU 조합에 identity shortcut connection이 합쳐져 있으므로 block 하나의 동작을 다음 식으로 표현할 수 있다.

 

ResNet에서 shortcut connection은 gradient vanishing을 해결하기 위해서 존재하는데, summation 연산을 통해서 정보가 전달되기 때문에 concat 연산과 비교했을 때 정보 전달력이 떨어진다.

 

DenseNet에서 각 레이어의 동작은 다음과 같이 표현 가능하다. $l$번째 레이어는 네트워크 입력값인 $x_0$부터 $l-1$번째 레이어의 출력값인 $x_{l-1}$까지의 모든 값을 입력으로 받는다.

 

이 때 $[x_0, x_1, ..., x_{l-1}]$은 $x_0$부터 $x_{l-1}$까지의 값들을 모두 concat한다는 의미이다. Concatenation 연산은 summation 연산과 비교했을 때 연산량도 적고, information flow에도 유리하다는 장점이 있다.

 

 

2. Composite Function

DenseNet에서는 대부분의 최신 CNN 모델들에서 그러하듯 3x3 Conv + BN + ReLU를 하나의 composite function으로 사용했다.

 

 

3. Pooling Layers

앞에서 살펴본 concat 연산($[x_0, x_1, ..., x_{l-1}]$)의 경우에 feature map의 사이즈가 일치하지 않으면 사용할 수 없다. 하지만 실제 CNN 네트워크에서 downsampling은 필수적이므로 레이어마다 feature map 크기가 달라질 수밖에 없다. 이 문제를 해결하기 위해서 DenseNet에선 아래의 그림과 같이 전체 네트워크를 3개의 dense block으로 분리하고 각 block 사이에 2x2 average pooling과 1x1 convolution을 두어서 feature map 크기를 조절하게 하였다.

 

 

4. Growth Rate

DenseNet에서는 이전에 존재한 모든 레이어의 출력값들을 concat하여 입력으로 사용하기 때문에 각 레이어의 feature map의 수(= channel 수)를 작게 잡을 필요가 있다. DenseNet에는 growth rate $k$라는 하이퍼파라미터를 두고 있는데, $k$는 각 레이어($H_l$)의 output feature map 수(= ouput channel 수 = filter 개수)로 사용된다. $k$에 따라서 각 레이어에서 얼마나 많은 양의 feature가 이후에 등장하는 레이어들에게 전달될 지가 결정된다. 다시 말하면, $k$가 각 레이어의 global state contribution을 정하는 scale factor가 된다.

DenseNet에선 $k=12$ 정도의 작은 growth rate를 사용했는데, 이 정도로도 SOTA 성능을 내기에 충분하였다고 한다. 그 이유에 대해서 생각해보면, 각 레이어는 모든 이전 레이어의 feature map에 대한 직접적인 접근을 하기 때문에 일종의 "collective knowledge"를 학습할 수 있기 때문이다.

 

5. Bottleneck Layers

ResNet과 DenseNet의 bottleneck block [1]

 

DenseNet에서도 ResNet과 비슷하게 1x1 Conv를 사용하는 bottleneck block이 존재한다. ResNet에서는 3x3 Conv이전에 1x1 Conv를 두어서 연산량이 큰 3x3 Conv로 들어가는 input featrue map의 채널 수를 줄이도록 하였다. DenseNet에서는 1x1 Conv에서 $4k$개의 필터를 사용해서 $4k$개 채널을 갖는 feature map이 3x3 Conv로 입력되도록 하였다.

 

6.  Compression

DenseNet에서는 모델을 더욱 가볍게 만들기 위하여 transition layer들에서 feature map 수를 줄이도록 하였다. Compression factor인 $\theta$에 따라서 dense block에서 나온 feature map의 $m$개의 채널은 transition layer를 거치면서 $\lfloor \theta m \rfloor$개로 줄어든다. ($0 < \theta \leq 1)$

 

 

Torchvision DenseNet-161 Graph

DenseNet-161

DenseNet-161 그래프의 일부분을 캡쳐한 것인데 총 13041개의 edge가 존재한다.

 

 


Reference

[1] https://hoya012.github.io/blog/DenseNet-Tutorial-1/

 

DenseNet Tutorial [1] Paper Review & Implementation details

대표적인 CNN architecture인 DenseNet에 대한 리뷰와 구현을 위한 detail들을 분석하고 정리하였습니다.

hoya012.github.io