Residual Network 또는 ResNet이라고 불리는 CNN 아키텍처에 대해 알아보겠습니다. 2015년에 Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun이 "Deep Residual Learning for Image Recognition"라는 논문에서 소개되었습니다.
Residual Network 아이디어
CNN의 대표적인 모델인 AlexNet의 경우 8개의 layer를 사용했으며 GoogleNet은 22개의 layer를 사용했습니다. 그리고 ResNet은 52개의 layer의 사용하여 Layer를 늘렸을 때 성능이 더 좋아 진다는 것을 결과로 증명하였죠.
층을 깊이 쌓을수록 더 좋다는 것은 어느 정도 통용되기 시작했는데요. 그렇다고 Layer를 무작정 늘렸을 때 성능이 오히려 떨어지곤 했습니다. 그런데 Training, Test 모두 성능이 좋지 않기 때문에 Overfitting 때문이 아님을 확인할 수 있었죠.
그 원인은 두가지 였습니다. 첫 번째는 기울기 소실과 폭발(Gradient vanishing & explosion)이 발생하기 때문이었죠. 두 번째는 Degradation Problem인데요. layer가 어느정도 이상으로 깊어지면 오히려 성능이 안좋아지는 현상이 있었습니다.
그래서 새로운 방법으로 Layer 깊어져도 쉽게 Optimization을 할 수 있는 새로운 Architecture를 만들자는 생각에 이르렀습니다. 그 결과가 바로 Residual network였습니다. Residual network의 핵심은 Skip connection인데요.
Drop Connect vs Skip Connect
1. DropConnect
Skip connection을 설명하기 전에 비슷한 Concept의 처리가 DropConnect 입니다. DropConnect는 드롭아웃(Dropout)과 유사한 개념이며 정규화 기법 중에 하나입니다. Drop-Out이 뉴런을 Drop하는 것이라면 DropConnect은 다른 레이어간의 뉴런 사이의 연결을 Drop하는 방식입니다.
두 뉴런 간의 연결을 Drop함으로써 한 모델에서 여러 모델을 훈련시키는 것과 같은 결과를 얻을 수 있는 앙상블 효과는 동일하게 얻을 수 있습니다. DropConnect이 히든 유닛의 객수와 상관없이 항상 DropOut 보다 좋은 성능을 보여졌다고 논문에는 소개하고 있죠.
참고로 2013년 뉴욕대의 Yann LeCun, Rob Fergus, Matthew Zeiler, Li Wan, Sixin Zhang의 논문 "Regularization of Neural Networks using DropConnect“을 통해 공개되었죠.
2. Skip Connect
Residual Network의 아이디어는 하나의 모델을 여러모델을 훈련 시킨 것과 같은 효과를 얻고자 하는데 있었습니다. DropOut, DropConnect와 많이 비슷한 철학이죠. DropOut이 2012년, DropConnect가 2013년, Skip Connection이 2015년에 발표되었으니 얼추 시간이 맞아 떨어지네요.
Skip Connection을 간단하게 설명하면, 네트워크에서 그 것을 구현하기 위해서 일부 레이어를 건너 뛰는 방식을 취하고 일부는 그대로 넘어와서 두 값을 합치는 방식을 사용합니다. 자세한 것은 Residual block을 직접 보면서 설명하겠습니다.
Residual block
Residual network은 Residual 블록을 통해 네트워크 최적화(Optimization)하는 난이도를 낮췄습니다. 그림에서 첫 번째 일반적인 경우는 H(x)를 학습합니다. Residual 구조에서는 학습하고자 하는 H(x)를 곧바로 학습하지 않고 F(x) := H(x) + x 를 학습시키자는 아이디어였죠. 이 방식은 과거 학습은 신경쓰지 않으므로 최적화 난이도가 쉬워집니다.
수학적으로 이야기해 보면, 우선 Skip connection을 만들어서 기존 블록은 F(x)라고 하면 수식은 H(x) = F(x) + x이 됩니다. 여기서 F(x) + x를 근사시키는 방식으로 학습을 합니다. 결론적으로 기존 네트워크 F(x)에 앞서 학습한 정보 x만 더해준 결과가 됩니다. x는 이전 블록에서 학습한 값을 그대로 Skp Connection을 통해 가져온 값입니다.
앞서 학습던 정보를 그대로 가져왔기 때문에 F(x)만 학습 후 더해주면 전체 학습이 됩니다. F(x) + x 전체를 학습하는 것보다 훨씬 쉬운 이유입니다. 또 한가지 이점은 곱셈 연산에서 덧셈 연산으로 변경되었다는 점입니다. 앞서 학습한 정보는 빼고 남아있는 F(x)만 학습하기 때문에 'Residual learning' 이라고 하기도 합니다. 또 다른 측면으로는 x가 F(x)를 통과하고 나서 다시 x를 더해주기 때문에 이를 Skip Connection 또는 Shortcut 이라고 부릅니다.
Residual Unit 학습
$ H(x) = F(x) + x $ 를 근사키키면 된다고 하는데, 수식적으로 어떻게 학습을 할까요? 우선 아래 그림을 수식으로 표현하면 아래와 같습니다.
$ y_{l} = h(x_{l})+ F(x_{l},W_{l}) $
여기서 $ x_{l+1} $는 결과적으로 $ x_{l+1} = f(y_{l}) $라고 할 수 있습니다. 그러면 l+2 레이어로 간다면 아래와 같은 수식이 되겠죠.
$ x_{l+2} = x_{l+1} + F(x_{l+1}, W_{l+1}) $ 이 식을 다시 대치시키면 $ x_{l+2} = x_{l} + F(x_{l}, W_{l}) + F(x_{l+1}, W_{l+1}) $ 됩니다. 계속 반복되는 수식을 표현하면 아래와 같습니다. 그리고 이게 Feed Forwarding을 하게 됩니다.
$ x_{L} = x_{l} + \sum_{i=l}^{L-1} F(x_{i}, W_{i}) $ - Feed Forwarding
이를 Backpropagation을 해주면 아래 수식과 같이 됩니다. 곱하기 연산이 더하기 연산으로 바뀐게 보이시죠.
$ \frac{\partial_{\epsilon }}{\partial_{x_{l}}} = \frac{\partial_{\epsilon }}{\partial_{x_{L}}} \frac{\partial_{x_{L}}}{\partial_{x_{l}}} = \frac{\partial_{\epsilon }}{\partial_{x_{L}}} (1 + \frac{\partial}{\partial_{x_{L}}}\sum_{i=1}^{L-1}F(x_{i}, W_{i})) $ - Backpropagation
Residual Unit을 사용한다면 Feed Forwarding시에 전체 네트워크를 Residual Function인 F의 합들로 표현할 수 있습니다. Plain net의 경우 앞 layer에서의 backpropagation 결과가 0이 가깝다면 그 뒤는 거의 0에 가꿔워집니다. ResNet은 덧셈관계로도 묶여있기 때문에 한쪽이 0이 된다고 해서 전체가 반드시 0으로 수렴하지 않는 구조입니다.
Deeper bottleneck architecture
50층 이상의 깊은 모델에서는 인셉션(Inception) 모델과 마찬가지로, 연산상의 이점을 위해 "bottleneck" layer (1x1 convolution)를 이용했습니다. 기존의 Residual Block은 한 블록에 Convolution Layer(3X3) 2개가 있는 구조인데요.
Bottleneck 구조는 층이 하나 더 생겼지만 Convolution Layer(1X1) 2개를 사용 파라미터 수가 감소하여 연산량을 줄여주었습니다. Activation Function이 증가하여 더 많은 non-linearity가 들어가 표현력이 향상시키게 됩니다. 결론적으로 ResNet은 Skip Connection을 이용한 Shortcut과 Bottleneck 구조를 이용하여 더 깊게 층을 쌓을 수 있었습니다.
일반적인 neural network와 비교했을 때 Layer를 상당히 깊게 쌓았음에도 적게 쌓았을 때보다 에러가 낮으며 degradation problem이 발생하지 않은 것을 알 수 있습니다. 34-layer plain net에 비교하여 34-layer ResNet은 3.5%나 더 낮은 error를 보였죠. (training, test error 감소 또한 성공적임) 이 비교는 deep한 system의 residual을 학습하는 것이 더 효율적이라는 것을 증명했습니다.
Layer의 깊이와 성능과의 관계
ResNet 논문에서는 110 Layer에서 가장 적은 에러가 나왔습니다. 1202-layer network는 110-layer network와 유사한 training error 보였지만, 실제 성능은 더 좋지 못했죠.
이는 Overfitting의 문제로 보이는데요. 이유는 dataset의 크기에 비해 layer가 불필요하게 많다는 것이었습니다. 결론적으로 1000개 이상의 깊은 layer가 쌓였을 때는 성능이 더 좋지 않으므로 더 깊은 Layer가 무조건 좋은 선택은 아니라는 것을 알 수 있습니다.
'딥러닝' 카테고리의 다른 글
자연어 처리(NLP) 역사 및 동향 (1) | 2024.03.12 |
---|---|
Xception 구조 및 특징 (0) | 2024.03.11 |
인셉션(Inception) 특징: 1x1 Conv, Auxiliary classifier (0) | 2024.03.07 |
GoogleNet의 인셉션(Inception) 블럭을 뜯어보자 (1) | 2024.03.06 |
CNN 층은 깊을수록 좋을까? (0) | 2024.03.05 |