이번에 리뷰하는 논문은 2016년 microsoft research의 Kaiming He와 몇몇 연구자들에 의해 CVPR에 발행된 논문이다. ILSVRC의 2015년 대회에서 우승한 ResNet 모델을 소개하는 논문이다. 당시 전례 없이 깊은 모델을 만들었다는 점, 깊어진 깊이에 반해 이전에 나왔던 더 얕은 모델보다 더욱 단순하다는 점, Residual Learning이라는 기법을 도입한 점 등 꼭 읽어야하는 논문 중 하나라고 생각한다.
문제 정의
ResNet이 나오기 전까지만 해도 VGG-Net, GoogLeNet 등 ResNet의 152 layers에 비하면 적은 layer를 가지는 모델들이 존재했다. 깊이가 깊어지면 모델의 성능이 좋아질 것을 예상은 할 수 있었지만 모델이 깊어짐에 따른 문제점이 존재하였다. 본 논문에서는 그 문제를 Residual Learning이라는 방식을 통해 해결하고 원리와 결과에 대해서 설명한다.
Problems
1. Vanishing/Exploding Gradient
2. Degradation problem
모든 논문이 그렇듯, 논문의 앞 부분에서는 모델의 깊이가 깊어짐에 다른 문제점을 정의하고 있다. 먼저 예전부터 알고 있었던 문제인 Vanishing/Exploding Gradient가 있었다. 오래된 문제인만큼 Sigmoid 이외의 activation function 사용 혹은 normalized initialization, intermediate normalization layers 등의 방법을 통해 해결할 수 있음을 알고 있었다.
그렇다면 Degradation problem은 무엇일까?
우선적으로 깊이가 깊은 모델과 얕은 모델 모두 앞서서 언급한 방법을 사용하여 최적화는 올바르게 진행될 수 있었다. 즉 수렴하는 방향성은 맞출 수 있었던 것이다. 여기서 깊은 모델과 얕은 모델은 학습시키는 weight의 수가 다르고 즉 feature의 수가 다른 것이다. 따라서 당시 연구자들에게도 깊은 모델이 더욱 잘 학습될 수 있을 것이라는 상식적인 가설이 생겼을 것이다. 하지만 실제 실험 결과 plain한 모델, 즉 단지 층만 늘려서 만든 깊은 모델은 training error와 validation error 모두 얕은 모델보다 더 높은 에러율을 보인다는 것을 발견하였다. 깊이가 깊어진 모델에서는 일반적인 방법으로는 optimization이 어렵다는 것을 의미하며, 이것을 Degradation problem이라고 부른다.

해결 방법 및 원리
이 문제를 해결하고자 논문에서 도입한 방법이 바로 Residual Learning이다. 원리를 살펴보면 단순히 층을 쌓는다는 개념에 추가로 identity shortcut을 추가한다. 논문을 읽기 전에는 이 shortcut을 어떻게 바로 생각해냈을까, 그리고 이게 효과가 있을 것이라는걸 어떻게 처음부터 예상하고 실험을 했을까? 하는 궁금증이 들었다. 논문을 읽고나니 생각에 순서가 잘못되었다는 것을 깨달았다. 아래는 논문에 있는 구절을 가져왔다.

즉 연구자들은 모델이 모든 출력에 대해 학습하는 것 자체를 힘들다고 판단한 것이다. 그것이 Degradation problem이 발생하는 이유이다. 이를 해결하고자 모든 출력값을 학습하는 것이 아니라, 아래 그림과 같이 어떠한 block을 정의하고 여기의 input과 결과 출력 사이의 차이(residual)만을 학습하도록 하는 방식이다. 구절에서도 나와 있듯이 이 residual을 zero로 최적화하는 것이 더욱 쉽다는 것이 연구자들의 생각이었다. 이것을 수식으로 나타내면 아래와 같다.

다시 돌아가서 아까 말했던 shortcut 구조는 이런 생각을 구현하고자 만들어진 하나의 기법인 것이다. 연구자들의 생각을 따라가니 궁금증이 어느정도 해소되었다.
* 중요 *
추가적인 해석을 해보자면, identity를 더해주는 shortcut이 의미하는 바는 network가 학습할 수 있는 기준을 제공한다는 점이다. 잔차를 학습한다는 것은 input과 output이 유사하다는 전제 하에 조금씩 network가 차이를 배워나가는 것으로 이해할 수 있다. 기존에는 이러한 shortcut이 존재하지 않아서 모델이 어떤 부분을 얼마나 학습해야하는지가 어렵게 느껴졌다면 이제는 일종의 설명서를 제공하는 셈이다. 아마 ResNet의 모델 크기와 잔차 학습 방법으로 모델에게 가이드라인을 제공한 것이 잘 맞아떨어졌을 것이라고 생각한다.
이로써 각 layer가 각자 미세한 부분을 빠르게 집중하여 학습하다 보니 깊이가 길어짐에도 성능이 좋아지고 optimization이 원활하고 오히려 더 빠르게 이루어졌을 것이라고 생각했다.

또 한 가지 논문을 읽으면서 ResNet의 shortcut이 특별한 이유에 대해서 알게 되었다. 사실 shortcut 구조는 이전에도 존재하던 방법이었다. 하지만 더 깊은 모델을 만들지 못한 이유는 당시 shortcut을 사용하는 기법에는 새로운 parameter가 추가된다는 단점이 존재했다. 단순화하는 효과가 없는 것이다. 또한 gated shortcut이 closed되면 non-residual 값이 된다는 문제점도 존재했다.
ResNet의 shortcut에서는 identity mapping shortcut을 사용했다. 이렇게 하면 추가적인 parameter가 생기지 않을 뿐 아니라 closed 되는 경우 절대 생기지 않게되어 기존에 존재했던 단점들이 사라지게 된다.
결과 정리
최종적인 실험의 결론을 살펴보면 다음과 같다.

ImageNet 데이터를 각각 plain(왼쪽)모델과 ResNet(오른쪽)으로 학습(얇은 그래프) 및 검증(두꺼운 그래프) 한 결과이다. 추가적으로 빨간색은 깊은 모델, 민트색은 얕은 모델을 나타낸다. 결과 분석에서 포인트는,
1. ResNet을 사용한 경우에는 더 깊은 layer의 validation error가 얕은 보델보다 작아졌으며, 무엇보다 training error도 더 작아졌다는 점이다. 여기서 training error의 감소가 의미하는 바는 validation error의 generality를 검증해줄 수 있다는 점이다.
2. Plain 모델과 비교시 모델의 깊이가 깊어진 경우 성능이 더욱 좋아졌다는 점이다.
3. 마지막으로 ResNet을 사용한 경우 더욱 빠른 optimization(convergence)가 가능하다는 점이다. 이것은 더 얕은 모델인 18 layers로 더욱 명확히 볼 수 있다. Plain 모델과 ResNet을 사용한 18 layers 모델은 최종적인 성능이 거의 동일하다. 하지만 중간 학습 과정을 보면 ResNet의 optimization 과정이 더욱 빠르게 일어남을 확인할 수 있다.
더 깊은 ResNet
사실 우리가 깊다고 얘기한 ResNet은 152 layer로 ImageNet 대회에서 1등을 차지한 모델이었다. 하지만 앞서 살펴본 모델은 34 layers였다. 연구자들은 앞서 살펴본 원리를 바탕으로 더 큰 모델을 만들어서 점점 키워가면서 학습을 진행하였다. 이 때 한 가지 차이가 생기는데 단순히 2 layer를 묶은 building block이 아니라 3 layer를 하나로 묶은 Bottleneck Architectures를 사용했다는 점이다.

여기서 1x1 conv로는 dimension을 줄이고 늘리는 역할을, 3x3 conv로는 smaller input/output dimension을 다루는 데 사용되도록 block을 구성하였다. 마찬가지로 identity shortcut mapping을 사용한다.
추가적으로 1000 layer 이상의 ResNet 학습하면 최적화는 여전히 잘 진행되지만 error가 110 layer의 ResNet보다 더 커진다는 점을 발견하였고, 이때부터 overfitting이 발생한다고 설명한다.
아래는 논문을 읽으며 수기로 정리한 필기이다. 언급하지 못한 내용들도 있어서 함께 올려둔다.
수기 노트
P1

P2

P3

P4

P5
