2 minute read

이론적으로 NeuralNet의 layer가 증가하면, Parameter의 수가 증가하므로 , training에서의 performance가 증가해야합니다. 하지만, 실제로는 training error가 줄어들다가 어느 순간부터 증가합니다. 이에 대해서, 알아보고자 합니다.

Residual Block

Deep Neural Net에서 위와 같은 문제점이 발생하는 이유는 gradient가 폭발적으로 증가하거나, 0에 가깝게 감소하기 때문입니다.

이를, gradient exploding ,gradient vanishing이라 부릅니다. 이를 해결하기 위한 architecture로 ResNet이 있습니다.

Neural Net의 Layer Block은 아래와 같이 이루어 집니다.

image

NeuralNet 의 layer , activation을 forward propagation을 시킨 것을 a 라 하겠습니다. a[L]은 l번째 layer의 forward propagtion후 activation을 적용한 output이라 정의 하겠습니다. l번째 layer에서 forward propagation을 한 것을 z[L] 이라 하겠습니다. 마찬가지로, weight는 W[L] , bias는 b[L] , activation 은 g[L] 이라 정의하겠습니다.

image

Residual Block이란 a[L+2] 를 계산하기 전에 a[L]을 z[L+2] 을 concatenate한 다음에 , a[L+2]를 계산하는 것입니다.

\[\begin{align} z^{[L+1]} &= W^{[L+1]}a^{[L]} + b^{[L+1]} \\ a^{[L+1]} &= g^{[L+1]}(z^{[L+1]}) \\ z^{[L+2]} &= W^{[L+2]}a^{[L+1]} + b^{[L+2]} \\ a^{[L+2]} &= g^{[L+2]}(z^{[L+2]} +a^{[L]} ) \\ \end{align}\]

수식으로 표현하게 되면 위와 같이 표현할 수 있습니다.

Why Resnet Work?

ResNet 은 어떤 원리로 작동하게 되는 것일까요? 즉 , ResNet이 어떤 원리로 gradient vanishing이나 gradient exploding을 해결할까요? \(a^{[L+2]} = g^{[L+2]}(W^{[L+2]}a^{[L+1]} + b^{[L+2]} + a^{[L]})\) L+2 layer의 activation을 풀어서 전개하게 되면 , 위와 같이 전개할 수 있습니다. 만약에 , W, b 가 0라고 가정을 하면, \(a^{[L+2]} = g^{[L+2]}( a^{[L]}) = a^{[L]}\) 위와 같이 식이 단순화됩니다. Activation Function을 ReLU를 사용하게 된다면, l번째 layer의 activation이 0 이상이기 때문에 , l번째 layer의 activation이 결과값이 됩니다. 따라서, forward propagation시 L+2 번째 layer의 activation은 그저 항등함수가 될 것이고 , 이는 다른 복잡한 function 보다는 비교적으로 배우기가 쉽습니다.

그렇다면, 위의 과정에서 L+2번째 layer의 affine transformation이 무시된다면, hidden layer가 반드시 필요한 것일까라는 의문이 들 수 있습니다.

단순히 hidden-layer없이 , activation만이 전달되는 상황을 가정한다면, 단순히 항등함수만을 배우게 될 것입니다. 하지만, hidden-layer가 존재한다면 좀 더 복잡한 function을 배울 수 있습니다. 따라서, hidden layer를 추가하게 되면, Identity function으로 activation이 그대로 전달되어 최소한의 성능이 보장이 되고 , 뿐만 아니라, 좀더 복잡한 function으로 성능이 더 올라갈 수 있습니다. 왜냐하면 , 복잡한 function을 만들게 되면 , 이에 대한 activation이 L+2 번째 activation에 반영이 되고 , back-propagation으로 배울수 있기 때문입니다. L+2번째 layer의 activation이 0보다 크더라도 , back-propagation시 L번째 layer 에 대한 gradient가 직접적으로 전달되기 때문에 , vanishing gradient나 exploding gradient가 발생하지 않습니다.

따라서, hidden layer를 추가하는게 좋은 선택입니다.

Implementation

VGG architecture의 등장이후 ,Linear,Relu Block을 2번 정도 거치면 channel수를 2배정도로 늘리는 architecture가 보편화 되었습니다. ResNet에서도 이것이 적용되었습니다. \(a^{[L+2]} = g^{[L+2]}(z^{[L+2]} + W_{s}a^{[L]})\) 즉 , L+2번째 layer의 channel수와 L번째 layer의 channel수가 다릅니다. 예를 들어, L+2번째의 channel수가 256이라면, l번째 layer는 128정도가 될 것입니다. 따라서, matrix를 통해서 dimension을 변화시켜주어야 합니다. \(a^{[L+2]} \in R^{n^{[L+2]} \times m} \qquad a^{[L]} \in R^{n^{[L]} \times m } \qquad W_s \in R^{n^{[L+2]} \times n^{[L]} }\) 단순하게 , Linear Layer라 생각하면 dimension을 위와 같이 설정할 수 있을 것입니다.

Leave a comment