2016년 9월 13일 화요일

ResNet

딥 네트웍의 층이 깊어지면 추상화 능력이 높아져 표현 능력이 커지고, 비선형성이 높아지므로 더 복잡한 문제를 수용할 수 있다.  그러나 깊은 넷을 학습하는 것은 gradient vanishing/expoding문제로 인해 더 어렵게 된다.



깊은 층을 가지는 네트웍을 학습하기 위해 ReLU, Dropout, Normalized initialization, Intermediate layer normalization, Batch normalization 등의 다양한 기술이 개발되어 왔다. 이러한 기술들을 통해 딥넷의 층의 수를 높이면 일정 수의 깊이까지는 인식률이 증가한다
상기한 그림을 보면 최근 10년의 연구결과는 DNN 깊이의 증가에 따라 오차률이 점차 개선됨을 보여 준다


그러나 CIFAR-10 문제의 학습 오차에서 보듯이 기존 넷(plain net)의 경우 깊이를 단순히 증가만 시키니 학습 오차가 오히려 더 증가하였다. 그림에서 20개의 레이어를 가진 넷보다 56개의 레이어를 가진 넷의 오차가 더 크게 나타난다.  


깊이의 한계가 깨진 것은 ILSVRC'2015에서이다. DNN 깊이 증가의 혁신이 일어나는데 ResNet이 그 주인공이다. 직전의  22개의 층을 가진 GoogLe넷에 비해 획기적으로 증가된 152개의 층을 가지고 있으며 2015년 영상 분류, 물체 감지, 객체 분할 등의 벤치마크 분야에서 가장 높은 성능을 보여주었다.





ResNet 이해의 핵심은 identity 매핑이다. 위 그림에서 좌측은 2014년의 VGG넷이고 우측은 VGG넷을 일부 변경한 더 깊은 넷이다. VGG넷은 2014년에 기존 분류기 중에서 최고의 성능을 낸 것으로 알려져 있다.
두 넷을 비교할 때 파란색의 추가 블럭(extra layers)들을 주목하자. 만일 이 블럭들이 입력에 대해 입력과 동일한 출력을 줄 수 있다면 VGG넷에 아무 영향을 주는일 없이 추가 할 수 있다. 즉, 입출력이 같다면 추가하여도 빼버려도 무관할 것이다. 입출력이 동일하므로 이 블럭들은 identity 매핑을 하는 유닛이고 얼마든지 층들을 쌓아서 깊은 층을 가진 넷을 구성할 수 있다.

또 다른 면에서 생각해 보면, 유닛이 추가되기 전의 VGG넷이 최적이라고 가정하자. 이때 추가된 유닛이 최적으로 학습 되었다면, 전체 VGG넷은 유닛 추가 전의 최적 성능을 내어야 하고, 추가 유닛은 identity 매핑을 하여야 한다.  


그런데 개별 유닛을 살펴보면 아래 그림과 같다. 두 세개의 학습 층과 ReLU 활성부를 가지고 있다. 즉,여러개의 비선형 층들이 쌓여 있으며 이러한 복합층들로는 입출력이 같은 identity 매핑을 만들기가 어렵다.


이 유닛을 identity 매핑으로 만들기 위해 유닛의 구조를 약간 바꾼다.


skip 메카니즘이라고 부르며 층을 건너 뛰어 입력을 바로 출력부로 연결한다. 이렇게 유닛을 구성하게 되면 입력은 그대로 출력으로 나가게 되므로 identity 매핑이 만들어지고 중간에 거치는 층들은 웨이트 값들이 0이나 0근처의 값을 가져도 될 것이다. 즉, 어떤 맵핑을 만들기 보다는 잔차(Residual)나 변동(perturbation)을 검출하기 적절한 내부 유닛으로 바뀌게 된다. 

Residual block

Resnet은 연산량과 파라메터의 수를 줄이기 위해 bottleneck 블럭을 사용하는데 아래 그림과 같다.


좌측의 원형 residual block을 수정한 것이 우측의 bottleneck block이다. bottleneck 블럭은 가운데에만 파라메터가 몰려있어 이름이 이렇게 붙여졌다. 이 블럭은 더 많은 맵 수를 유지하면서도 내부 파라메터의 수는 더 작다. 파라메터 수를 계산해 보면, 좌측은

$3\times3\times64\times64+3\times3\times64\times64=73,728$

개가 되고, 우측은 

$1\times1\times256\times64+3\times3\times64\times64+1\times1\times256\times64=69,632$

개이다. 즉, 특징 맵의 수는 더 많이 유지하면서도 파라메터 수는 비슷하거나 더 작다. 여기서 1x1 convnet연산이 맵의 수를 바꾸기 위해 사용되었다.



ResNet(Residual Net)은 Residual block을 여러개 반복적으로 쌓아 많은 수의 층을 가진 넷으로 구성한다. 층의 수가 많으므로 비선형성이 높아 Alexnet이나 VGG에서 사용하는 FCL(fully connected layer)을 가지지 않는다. 1x1 conv층은 FCL과 같고 이러한 FCL이 block마다 있으므로 따로 FCL이 필요하지 않기도 하다.
FCL 대신에 ResNet에서는 Average pooling을 사용하는데 AP은 맵별로 값의 평균을 구하고 이 평균값들의 벡터를 특징값으로 사용한다. 예를 들면, ResNet의 말단에서 <mini-batch, 512,4,4>의 맵이 AP되면 <mini-batch,512,1,1>이 된다.
보통 기존 넷 내부의 파라메터들은 FCL에 몰려 있는데 이 부분이 없으므로 층의 깊이에 비해 파라메터의 수가 많지 않다. 따라서 런타임에서는 ResNet의 실행 속도는 VGG등과 비슷하거나 오히려 빠르다. 





(Ref.) 
[1] Kaiming He. et. al., Deep residual learning for image recognition, 2015.
[2] Kaiming He. et. al., Identity mapping in deep residual networks, eccv'2016.
[3] Kaiming He. et. al., ResNet presentation



















댓글 2개:

  1. bottleneck 블럭 계산시 256인데, 128로 오타가 난 것 같습니다.

    답글삭제