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



















2016년 9월 11일 일요일

Batch Normalization

Batch Normalization은 딥러닝 네트웍의 학습에서 gradient vanishing과 exploding을 회피하기 위한 방법 중의 하나이다.

딥러닝 알고리즘은 층이 깊어질수록 표현 능력과 추상화 레벨이 높아지는 것으로 알려져 있다. 그러나 층이 깊어질 때 출력단의 Loss값의 gradient가 내부로 도달하지 않고 소멸해버리는 현상으로 학습에 한계가 있었다. 이러한 문제점을 해결하고 깊은 층을 가지는 넷을 설계하기 위해, ReLU 활성함수, Dropout, 학습 샘플 초기화 전략, Learning rate 조절 등의 여러가지 방법이 개발되어 왔다.

딥러닝 구조의 내재적 불안정성은 Internal Covariance Shift 현상에 의한 것으로 BN 논문의 저자는 주장한다. 이것은 넷 각 층의 입력 값의 분포(variance)가 일관성없이 계속해서 달라지는 현상을 말한다.
레이어 입력값 분포의 변화가 발생하면 입력을 받아들이는 레이어는 새로운 분포에 계속해서 적응해야 한다. 레이어의 입력 값은 이전의 모든 레이어 파라메터에 의해 영향을 받고, 네트웍 파라메터의 작은 변화는 네트웍이 깊어질 때 증폭되고 학습의 복잡성은 증가한다.

이에 대한 해결책으로 각 층의 입력값의 평균을 구해 제거하고 분산으로 값들을 나누어 표준편차를 1로 만드는 것을 생각할 수 있다.
그러나 이 방법은 역행렬의 요구 등으로 계산량이 많은 점과 $f=Wx+b$의 연산에서 오프셋 $b$의 영향이 소거되는 등의 문제로 적용이 어렵다.

또한 층의 입력 값을 정규화를 통해 평균 0, 분산 1로 고정시키는 것은 Activation 함수의 가장 중요한 역할인 비선형성을 없애 버릴 수 있다. 즉, 넷은 비선형성을 가지고 있어야 복잡한 함수를 표현할 수 있는데 이 능력이 사라질 수 있다.  예를 들면, sigmoid 활성함수의 입력 값이 평균 0, 분산 1이라면 입력 값의 범위는 -1~+1이 되고, 이 범위의 sigmoid 함수 값은 0.5를 중심으로 0.2~0.7사이의 거의 직선인 선형 영역이다.
이 점을 보완하기 위해 정규화된 값에 scale 팩터($\gamma$)와 shift 팩터($\beta$)을 도입하고 정규화된 값에 곱하고 더해준다. 두 인자는 오차 역전파 과정에서 학습해 준다. 이를 통해 활성함수로 들어가는 값의 범위를 바꾸어줌에 의해 비선형성을 부여할 수 있다.


$BN(x_i)=\gamma(\frac{x_i-\mu_B}{\sqrt{\sigma^2_B+\epsilon}})+\beta$

BN의 적용 방식은 현재 입력되는 학습 샘플의 mini-batch에 대해 특징 맵 별로 정규화를 수행한다. 이 값에 scale과 shift팩터를 곱하고 더해 적용하게 된다. 따라서, 맵 별 파라메터는 2개이다.
예를 들면, 어떤 중간층에서 BN유닛의 입력이 (mini-batch,128, 32, 32)였다면 (mini-batchx32x32)의 데이터에 대해 mean($\mu_B$)과 vari($\sigma_B$)를 구해 정규화를 수행한 후 scale, shift팩터를 위 식처럼 적용한다. 인자 수는  맵이 128개이므로 256개이다.


(Ref.)
[1] Batch Normalization: Accelerating deep network training by reducing internal covariance shift, ICML2015.
[2] Batch Normalization의 설명 및 구현
[3] Understanding the backward pass through BN Layer