[Neural Networks] ResNet(Residual Neural Network) 개념 정리



참고문헌[1]인 Deep Residual Learning for Image Recognition 논문을 참고하여 ResNet의 개념에 대해 알아보는 글입니다.

ResNet: Residual Neural Network

ResNet이란 Kaiming He 외 3명이 Residual Block이라는 Shortcut Connection 방법을 이용하여 구현한 신경망입니다.

1. ResNet 소개

이론상으로는 신경망의 깊이가 깊어지면 신경망의 성능이 좋아진다고 나오지만, 실제 구현 시에는 성능이 더 안 좋아지는 현상이 발생했습니다.


위의 내용을 참고하면 어느 정도의 레이어를 쌓을수록 vanishing/exploding gradients의 문제로 convergence 자체를 하지 못하는 문제가 발생하며, 이를 normalized initialization과 intermediate normalization layers로 어느 정도 해결해서 Backpropagation과 함께 SGD(Stochastic Gradient Descent)에 대한 convergence를 할 수 있도록 했습니다.


degradation은 overfitting 때문에 발생하는 원인이 아닌 network의 depth가 깊어질수록 accuracy는 saturated(더 이상의 성능 진전이 없는 상태) 되었다가 accuracy가 저하되는 현상입니다.

overfitting이란 train error는 감소하고 test error는 증가하는 현상이며,
degradation은 train & test error가 모두 증가하는 현상입니다.


위의 그림을 보면 56-layer보다 20-layer일 때 성능이 더 좋은걸 볼 수 있는데, 이는 layer가 많아질수록 성능이 저하 됨을 유추할 수 있습니다.

Kaiming He는 layer가 깊어질수록 성능이 향상돼야 하는데 그렇지 못한 부분을 해결하기 위해 'deep residual learning' 개념을 제안하게 됩니다.

2. Residual learning

Kaiming He 외 3명은 layer가 깊어져도 성능을 향상할 수 있는 방법을 고민했고 이로 인해 Residual learning이라는 방법을 고안했습니다.

Residual learning에 기본 개념은 각 layer에 직접 underlying mapping을 하는 대신 명시적으로 계층에 residual mapping을 fit 하겠다는 의미입니다. residual mapping을 구성하면 극단적으로 identity mapping이 optimal(최적)일 때, 쌓여있는 nonlinear layers가 identity mapping을 fit 하는 것보다 residual을 0으로 만드는 게 더 쉽다는 가설입니다. 위의 글을 풀어보면 아래와 같습니다.


위의 그림은 입력 값(x)을 2개의 weight layer & relu를 거쳐 출력 값(H(x))을 도출합니다. 즉. 일반적인 네트워크는 H(x) 자체를 학습

이와 같은 방법은 네트워크 신경망을 통해 H(x) 자체를 학습하지만 Kaiming He는 출력과 입력의 차이를 구한 'H(x)-x'를 학습하고자 했습니다.


위의 그림은 출력과 입력의 차이인 'H(x)-x'를 학습하고자 제안된 방법이며 위의 방법이 Residual learning의 기본 block이 됩니다.


추가된 점은 shortcut을 이용해 입력 값(x)을 마지막에 '+' 연산하는 차이가 있습니다. 이 shortcut은 추가 파라미터나 계산 복잡성이 추가되지 않습니다. ('+' 연산만 추가)

Fig. 3을 참고하면 2개의 weight layer는 'H(x)-x'를 얻도록 학습(Kaiming He 제안 방법)해야 하는데 그림 상 2개의 weight layer를 F(x)로 정의하고 있으니 F(x)=H(x)-x로 볼 수 있고 이는 H(x)=F(x)+x로 표현할 수 있습니다. 즉, F(x)를 학습한다면 F(x)=H(x)-x이니 Kaiming He가 제안하는 'H(x)-x'를 학습한다는 의미입니다.


기존 H(x)를 학습하는 방법은 degradation 문제가 발생했는데 Kaiming He가 제안한 'H(x)-x'를 학습하는 방법을 이용해 degradation 문제를 해결했습니다.

예로서, 만약 identity mapping이 optimal인 경우(입력과 출력이 같은 경우를 의미 x=H(x))

Fig. 2 방식은 H(x) 자체를 학습하는 방법으로 degradation 때문에 multiple nonlinear layers로 identity mappings를 optimal 하는 과정에 어려움을 겪습니다.
Fig. 3 방식은 H(x) 자체를 학습하는 것이 아닌 출력과 입력의 차이 값인 'H(x)-x'를 학습하는데, 이는 multiple nonlinear layers의 가중치를 0(identity mapping이 optimal인 경우)에 근사하게 학습할 수 있도록 해줍니다.


Fig. 3 방식은 출력과 입력의 차이 값인 'H(x)-x'을 0에 근사하게 학습하고 이때, 입력의 perturbations를 쉽게 검출할 수 있게 됩니다. 이런 방식으로 layer가 깊어져도 성능이 향상되도록 했으며, 출력과 입력의 차이 값을 학습한다고 하여 나머지(residual) 즉, Residual learning이라고 명명되었습니다.


위의 그림을 보면 Fig. 2로 구성된 신경망인 plane network에서는 18-layer보다 34-layer일 때 성능이 더 떨어지는걸 볼 수 있습니다.(왼쪽) 하지만 Fig. 3으로 구성된 ResNet network에서는 18-layer일 때 보다 34-layer일 때 성능이 더 향상됐음을 볼 수 있습니다.


3. Conclusion

ResNet은 기존의 신경망 구조에 'shortcut'을 추가해 H(x) 전체를 학습하는 것이 아닌, 출력과 입력의 차이 값인 'H(x)-x'를 학습하는 방식으로 신경망이 깊어질 때 발생하는 degradation 문제를 해결했습니다.
'H(x)-x'라는 개념은 결국 출력과 입력의 차이 값인 나머지(residual)만 학습하기 때문에 연산이 간단해지고 error 값 크기의 측면에서 학습이 더 쉽다는 것을 알 수 있습니다.

간단하게 ResNet에 대한 개념을 알아보았는데 다음에는 ResNet의 Identity Mapping by Shortcuts와 실험 결과 등을 살펴보겠습니다.

혹여 잘못된 내용이 기재되었다면 댓글 부탁드립니다.


참고문헌

[1] https://arxiv.org/pdf/1512.03385.pdf
[2] https://www.youtube.com/watch?v=ZILIbUvp5lk
[3] https://blog.naver.com/laonple/220761052425
[4] http://openresearch.ai/t/resnet-deep-residual-learning-for-image-recognition/41


댓글

이 블로그의 인기 게시물

[opencv-python] 이미지 크기조절(resize) 하는 법

[python]파이썬: csv reader header skip (첫번째 행 무시하기, 안읽기)

[python] selenium close와 quit 차이점