[CVPR 2016]Deep Residual Learning for Image Recognition

안녕하세요 첫 X-Review로 ResNet 논문을 가져오게 되었습니다. 제가 연구실에 들어오고 처음 꼼꼼하게 읽게 된 논문입니다. 제가 읽은 논문이 많은 것은 아니지만 ResNet에서 쓰이는 skip connection이 이후 많은 연구에서 기본적으로 사용되므로 그 배경에 있는 ResNet을 알아두면 좋을 것 같습니다.

1.서론(introduction)

해당 논문이 나오기 전까지 이미지 분류에 있어서 신경망의 깊이를 늘리는 것이 하나의 해결책으로 자리잡고 있었습니다.
깊은 신경망의 특징은 low/mid/high level feature 들을 통합하고 end-to-end로 분류하는게 가능하게 했고, 층의 깊이에 따라 feature의 level들이 질적으로 좋아지는 경향이 있었습니다.
논문에서는 한가지 질문을 하게됩니다. “Is learning better networks as easy as stacking more layers?
layer를 쌓는것만큼 네트워크를 더 잘 학습시키는 것은 어렵다고 말하는데, 그 이유로서 Degradation problem 을 언급합니다.

Vanishing / Exploding gradients problem

Degradation problem을 설명하기에 앞서 깊은 신경망을 학습하기 어려운 문제로 gradient의 흐름 문제가 먼저 존재했었습니다. 다만 이러한 문제는 2가지 방법으로 어느정도 해결이 되었습니다.

  1. normalized initializatoin ( he 초기화, xavier 초기화 )
  2. intermediate normalization layers ( batch norm)

해당 방법들을 이용하여 gradient 들이 너무 작아지거나 너무 커지는 것을 막아줄 수 있었습니다, 이 문제를 해결하고 나서 어려움에 봉착하게 된 것이 Degradation problem 입니다.

Degradation problem

네트워크의 깊이를 더 깊게 했더니 test error 뿐만 아니라 training error조차 더 커지는 현상입니다.
이는 overfitting이나 gradient flow의 문제가 아닙니다. overfitting의 경우 training error는 더 낮지만 test error 가 더 높은 과적합 상황이어야 합니다. gradient 문제는 앞서 언급했던 방식들로 해결이 되어서 새로운 문제로 Degradation을 언급하게 됩니다.

Degradation 문제는 단순한 identity 함수조차 학습이 잘 되지 않으므로 생기는 문제입니다. 이는 함수의 표현 방식 자체가 비효율적이라고 생각하여 저자는 모델이 학습해야 할 함수를 재설정하는 방식으로 Degradation 문제를 해결하게 됩니다. 함수를 재설정하는 방법은 기존 모델에 identity mapping 을 추가하는 것 뿐입니다.

원래는 H(x) 를 학습했다면 F(x):=H(x) – x 를 학습하게 하는 것인데, 결국 H(x) = F(x)+x 형태로 표현이 됩니다.
저자는 F(X) (잔차) 를 학습하는 것이 직접적으로 H(x)를 학습하는 것 보다 최적화 관점에서 더 쉽다고 가정합니다.
이는 극단적인 예시로 만약 우리가 최종적으로 학습해야할 최적함수가 항등함수라면, 비선형 계층을 여러 개 쌓아서 항등함수를 근사하는 것보다, 잔차를 0으로 만드는 것이 더 쉽다는 생각에서 비롯됩니다.
더 쉽게 말하자면 파라미터들이 학습되는 과정에서 이전 입력을 그대로 출력할 것은 어렵지만, 이전 입력에서 얼마나 변하는지 잔차를 0으로 학습하는 것이 더 쉽다는 가정입니다.

저자는 이러한 shortcut 연결에 항등함수(identity mapping)만 적용하였으며, 따라서 추가적인 파라미터나 연산량을 증가시키지 않고 Degradation 문제를 해결하게 됩니다.

2. Related Work

저자의 이러한 identity mapping기반 shortcut 구성 방식은 여러 기존 기법들로부터 영감을 받았습니다.

VLAD 에서 로컬 discriptor 여러개 뽑고, 전체 이미지를 하나의 vector로 표현할때 residual vectors로 표현됩니다.
이때 vector quantization 과정에서 residual vectors 가 original vecotors 보다 효과적으로 encoding 되는 것을 보입니다.

Multigrid & Hierarchical basis preconditioning 방법들은 최적함수를 좋은 형태로 바꾸거나, 좋은 precondition에서 수렴이 빠르다는 것을 보여줍니다.

이전에도 shortcut 을 사용한 방식들이 존재하기는 했습니다. ex) highway networks, U-net
하지만 layer를 100층이상 늘릴 수 없었고 ResNet은 learnable parameter 없이 매우 깊은 신경망을 만들어내는데 의가 있습니다.

3. Deep Residual Learning

3.1. Residual Learning

저자는 하나의 가설에서부터 skip connection을 구성하게 됩니다.
가설 : multiple nonlinear layers 는 점근적으로 복잡한 함수를 근사시킬 수 있다.
(해당 가설은 Universal Approximation Theorem 으로 추가적으로 알아보면 좋을 것 같습니다.)

해당 가설로부터 x를 input으로 하는 multi nonlinear layer를 H(x)라 할때,
H(x) – x 도 (x와 H(x)의 차원이 같을때) 점근적으로 근사가 가능합니다.
위에 설명했듯이 F(x):=H(x) -x 를 에측해서 근사시키며, 기존의 H(x) = F(x) + x 의 형태가 됩니다.
제가 이해한 표현으로는, 최적의 함수가 identity mapping에 가깝다면, 처음부터 전체 함수를 학습하기보다는, 입력 x에서 얼마나 변화가 있는지를 학습하는 것이 더 쉽다라고 이해했습니다.

3.2. Identity Mapping by Shortcuts

저자가 구성한 building block은 이런 형태입니다. 다만 F와 x의 차원이 다르다면 linear projection인 Ws를 추가할 수 있습니다.

저자는 skip connectoin은 2개나 3개의 block 단위로 하는데 F가 하나의 layer만 가진다면 선형 layer와 비슷한 효과이기 때문에 2개부터 적용합니다.

3.3. Network Architectures

Plain network 와 Residual Network 모두 VGG에서 영감을 받았으며, 전체 parameter의 대부분을 차지하는 fc layer 연산부분을 없애서 더 적은 parameter로 더 좋은 성능을 낼 수 있게 됩니다.

plain network

VGG에서 영감을 받았고 2개의 규칙을 따릅니다.
1. output feature map size 가 같으면 layer들은 filter 개수가 같다.
2. feature map size가 절반이 된다면, filters를 2배로 늘려서 시간복잡도를 유지하고 정보량을 보존시킨다.
downsampling은 stride가 2인 convolution layer로 만드는데, max pool 같은 pooling 기법은 사용하지 않고 마지막 분류기로 갈때만 avg pool로 1000개 class를 softmax로 분류하게 됩니다.

Residual Network

plain network + shortcut connection 구조
identity shortcut은 input과 output 차원수가 같을때만 적용합니다.
input과 output 차원수가 다르다면 적용할 2가지 방법이 존재합니다.
(A) in 64 out 128인 경우, 앞은 64 뒤는 0으로 채우는 방식 (논문 표현으로는 with extra zero entries padded)
(B) in 64 out 128인 경우, conv1*1 적용 (Learnable parameter) : Conv2D(in,out,filter=1,stride=2)
(A)와 (B)방식 모두 stride를 2로 둬서 F(x)와 x의 element wise addition 과정에서의 차원을 맞춰줘야합니다.

3.4. Implementation (ImageNet)

1. Image random sampled in [256,480]
2. random crop by [224,224] or per-pixel mean subtracted를 적용한 horizontal flip
3. standard color augmentation
4. Batch normalization 을 각 convolution이후, ReLU 이전에 적용

  • Optimizer: SGD
  • Batch size: 256
  • 초기 learning rate: 0.1 → plateau 시마다 10배씩 감소
  • Total iterations: 약 60만 (60 × 10⁴)
  • Weight decay: 0.0001
  • Momentum: 0.9
  • Dropout 미사용: BN과 중복되는 regularization 효과 때문에 사용하지 않음

4.Experiments

4.1. ImageNet Classification

Plain과 ResNet을 비교함으로써 Degradation problem을 확인하고 ResNet이 이를 해결하는 점을 보였습니다.
수학적으로 보면 34-layer model은 18-layer model의 파라미터 공간을 포함하고 있으므로 더 유연한 표현력을 가지고 있습니다.
하지만 gradient-based optimizer 입장에서는 이 커진 공간 안에서 identity를 근사해야 하는 것은 훨씬 어려운 문제입니다. 저자는 그 이유로 plain 구조에서는 nonlinear layer가 쌓이면서 “거의 아무것도 안하는 층”을 만드는 것이 매우 어렵기 때문이라고 표현헀습니다.

Top-1 error 성능은 18layers 에서 plain과 ResNet은 별 차이가 없지만, 수렴속도는 차이가 납니다. 위의 Figure 4 그래프를 보면 같은 iteration 에서 초기 error 성능이 더 빠르게 낮아지는 것을 볼 수 있습니다.

Identity vs. Projection Shortcuts.

(A) zero padding used for increasing dimensions, and other shortcuts are identity
(B) projection shortcuts used for increasing dimensions, and other shortcuts are identity
(C) all shortcuts are projections
A<B<C 순서대로 성능이 좋아집니다. (모두 plain 보다는 높은 성능)
다만 projection shortcuts가 degradation problem을 해결하는 주 역할이 않고 학습 속도만 느려지므로 저자는 B를 채택했다고 합니다.

Deeper Bottleneck Architectures.

저자는 50층 이상의 구조에서 building block 형태를 bottleneck 구조로 변경하여 적용하였는데, 이는 training time을 낮추기 위해서입니다. 기존 3X3 conv 연산 2개를, 1X1 , 3X3, 1X1 로 바꾸되 중간 3X3 과정에서의 channel 수를 낮춰 연산량을 비슷하거나 더 낮게 맞췄습니다.

저자는 top-5 error on the test set 에서 ILSVRC 2015 SOTA를 달성하게 됩니다.
저자는 CIFAR-10 에서는 SOTA는 달성하지 못하지만 SOTA에 준하는 성능을 보여줬습니다.

Exploring Over 1000 layers


152layer로 SOTA를 달성하고 1202 layer를 쌓아봤지만 성능은 오히려 더 떨어진 모습을 보여줬습니다. 다만 저자는 이 이유가 Degradation을 해결하지 못해서가 아닌 overfitting 문제라고 주장하며 layer층에 비해 데이터규모가 작다고 주장했습니다.


해당 논문을 읽으면서 들 수 있는 생각으로 BN, ReLU 등을 적용하는 순서에 대한 ablation study가 있는지 궁금할 수 있습니다.
여러 순서로 Ablation study를 진행한 후속 논문이 존재하여 궁금하시면 읽어보시면 좋겠습니다.
Identity Mappings in Deep residual Networks : https://arxiv.org/abs/1603.05027
해당 논문에는 skip connection이 역전파 과정에서 gradient flow를 좋게 만든다는 표현도 존재합니다. 이는 Residual 구조가 이론상 첫 역전파에도 맨처음 x에 영향을 줄 수 있으므로 ReLU의 dying ReLU문제도 어느정도 해결한다고 생각합니다. 중간에 gradient가 흐르지 않을 부분이 존재하더라도 skip connection을 통해 gradient가 흐를 수 있어 초기 최적화에 좋은 영향을 주는 것이라 생각합니다.
첫 x-review 인 만큼 부족하거나 빠진 부분이 있으면 질문이나 조언해주시면 감사하겠습니다.

Author: 신 인택

6 thoughts on “[CVPR 2016]Deep Residual Learning for Image Recognition

  1. 안녕하세요 신인택 연구원님 좋은 리뷰 감사합니다.
    리뷰를 읽으며 헷갈리는 부분이 몇가지 있어 질문 남깁니다. identity mapping(항등함수)이 결국 입력을 그대로 출력하는 ‘거의 아무것도 안하는 층’이 되는데, 아무것도 안하는 층이 어떻게 학습에 도움이 되는 것인지 궁금합니다.
    bottleneck구조를 적용한 것이 training time을 줄이기 위해서라고 언급해주셨는데, 연산량이 비슷하다면 학습 시간도 bottleneck 구조를 적용하기 전과 비슷한게 아닌지 궁금합니다. Table3.를 확인하니 사용하기 전보다 성능이 좋아졌는데 같은 연산량이면서도 성능이 좋아서 적용한 것은 아닐까라는 생각이 드네요. 또, bottleneck 구조가 성능이 좋아진 이유에 대해서도 논문에서의 언급이 있었는지 궁금합니다.
    감사합니다.

    1. 안녕하세요 성준님 좋은 답글 감사합니다.
      항등함수를 학습한다기보단 입력에서 얼마나 달라지는지를 학습하게끔 학습해야할 함수의 형태를 바꾼것이 ResNet입니다.
      저자가 Degradation 문제를 파악하면서 얘기한 것이, 더 깊은 layer는 낮은 layer의 파라미터적 space를 포함하고 있는 관계인데도 성능이 더 낮다는 점에서, 낮은 네트워크가 하던 일의 항등함수조차도 학습하지 못한다고 주장했습니다. 이는 깊은 네트워크의 최적화가 상대적으로 더 어렵다는 뜻이기도 합니다. 이러한 문제를 해결하기 위해 항등함수에서 얼마나 변화가 생길지를 학습하는 형태로 H(x)를 바꿔주게 됩니다. 결국 아무것도 안하는 층이 어떻게 학습에 도움이 되는지 라기보다 아무것도 안하는 층에서 얼마나 변화가 생기는지를 학습하는 형태로 바꾼 것이 모델로 하여금 최적화하기 더 쉬운 형태가 되었다고 이해하면 좋을 것 같습니다.

      두번째 질문은 아래 우진님이 질문한 것과 비슷한 내용이어서 다시 대답을 해드리자면, 파라미터 개수가 비슷하고 연산량이 비슷한 모델이어도 building block을 사용한 구조보다 bottleneck 구조를 사용하는 것이 연산 속도가 더 빠릅니다. 이는 모델에서 사용하는 1*1 conv 블록이 fc layer처럼 작동하며, feature map size의 각 픽셀마다 병렬적으로 처리하는 것이 GPU 입장에서 용이하기 때문입니다.
      GPU의 메모리에 값들이 일렬로 저장이 되는데 conv stride 에 따라서도 영향이 있고, kernel size 에 따라서도 공간적 정보가 생기기 때문에 GPU 의 스레드값을 참조하는데에 시간이 걸릴 수 밖에 없습니다. 1*1 conv 블록은 공간적 정보가 없고, stride도 1이기 때문에 GPU memory locality 가 용이하여 같은 연산량이어도 더 연산속도가 빠를 수 있습니다.

      bottleneck 구조가 성능이 좋아진 이유에 대한 언급은 딱히 존재하지 않습니다. 다만 bottleneck 구조를 만든 이유 자체는 파라미터적 관점에서 유리하고, 깊은층을 만들기에도 용이해서라고 저술되어 있습니다. 성능이 좋아진 이유를 나름 분석해본 제 생각을 위 문단에 적어놨습니다. 혹여나 틀린점이나 다른 생각이 있으시다면 답글 달아주시면 감사하겠습니다.

  2. 안녕하세요 신인택 연구원님! 좋은 리뷰 감사합니다

    궁금한점이 생겨 질문 남깁니다!
    resnet 구조에서 bottleneck 구조에서 궁금증이 생기는 것이 보통 파라미터 수를 줄일때 5X5를 사용하는 대신 3X3 두번을 사용하는 것 처럼 1×1->3×3->1×1로 하는것이 feature map은 유지하면서 연산 효율을 높이는 것과 비슷한건가요?? 즉, 정리해서 말씀드리면 3×3두번을 사용하는 것과 1×1->3×3->1×1 을 사용하는 것이 그냥 단순 파라미터만 줄이는 역활만 하는지 구조적인 정보도 고려되었는지 궁금합니다!

    1. 안녕하세요 우진님 질문에 도움이 될 답변 해드리자면
      34 layer의 building block 형태는 (3*3) 구조를 16개 사용하여 구성되고
      50 layer의 bottleneck 형태는 (1*1,3*3,1*1) 구조를 16개 사용하여 구성됩니다.
      즉 같은 개수의 구조를 사용하지만 층의 깊이는 더 깊어지고, bottleneck 구조에서의 중간 채널수를 줄여 파라미터의 개수가 대폭 감소합니다.
      그리고 연산 효율을 높이는 원인이 파라미터적 관점이 아닌, GPU의 메모리 접근방식에서도 차이가 생깁니다.
      GPU 가 각 스레드를 참조할떄, 1*1 conv layer의 경우 fc layer와 동일한 과정으로 계산을 하게됩니다.
      이때 메모리를 연속적으로 참조하기 때문에 GPU가 병렬적으로 계산하는데에 도움을 줍니다.

      3*3 conv layer의 경우 공간적으로 계산을 해야하는데, GPU의 메모리 접근시 멀리 떨어져 있는 주소를 공간적으로, 병렬적으로 접근하는 것이 1*1 conv layer보다 느리기 때문에 만약 동일한 파라미터를 가지고 있었다고 하더라도 1*1 conv layer를 사용하는 것이 GPU 의 memory locality 관점에서 병목현상이 적습니다.
      질문에 답변이 됐기를 바랍니다.

  3. 안녕하세요 인택님, resnet에 대해서 정말 자세하게 다뤄주셔서 감사합니다.
    덕분에 resnet에 대해서 생각해보지 못했던 부분에 대해서도 다뤄주셔서 좋았습니다.
    마지막에 인택님께서 “중간에 gradient가 흐르지 않을 부분이 존재하더라도 skip connection을 통해 gradient가 흐를 수 있어 초기 최적화에 좋은 영향을 주는 것이라 생각합니다” 라고 말씀해주셨는데, 직관적으로 와닿지 않아서 그런데 이에 대해서 자세하게 설명해 주실 수 있으실까요?
    저는 Residual 구조에서는 loss가 역전파될 때 gradient가 input까지 전파되는 과정에서 중간 layer에서 gradient가 사라지더라도 skip connection으로 연결되어있기 때문에 dying ReLU나 vanishing gradient 문제를 완화시킨다고 이해했는데 맞을까요? 이것이 초기 최적화랑 어떠한 연관이 있는지도 궁금합니다!
    감사합니다.

    1. 안녕하세요 우현님 답변 감사합니다.
      질문에 대한 답변으로는 이해하신 것이 맞습니다. Residual connection이 존재하지 않는다면 초기 conv layer들은 맨 뒷단의 gradient flow를 모든 layer들을 거치며 기다려야하지만, skip connection들이 중간중간 존재하기 때문에 이론상 맨 뒷단의 역전파값이 맨 처음 conv layer에도 영향을 미칠 수 있어 초기 최적화에도 영향을 미치게 됩니다. 제가 알기로는 ReLU 를 사용하게되면 전체 파라미터의 30% 정도가 죽어서 gradient가 흐르지 않는 것으로 아는데, 이런 Residual connection은 그런 상태에서도 어느정도 loss가 반영되기 때문에 gradient flow가 좋아진다고 후속 논문에서도 이를 언급하고 있습니다.
      RNN 같은 경우도 recurrent한 방식이 덧셈이 존재하지 않고 곱셈계산이 hidden layer에 누적돼서 gradient vanishing이 생기는 것과 같은 맥락이라고 생각하시면 됩니다.

안 우현에 답글 남기기 응답 취소

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다