안녕하세요. 이번시간에는 마지막 ILSVRC 대회인 ILSVRC 2015에서 나온 ResNet이란 모델에 대해서 설명드려볼게요. 지난글에는 Google에서 GoogLeNet이란 모델을 발표했죠? 그런데 대부분 전문가들은 GoogLeNet은 너무 구조가 복잡하기 이해하기 어렵다는게 중론이에요. 그래도 성능이 좋으니 GoogLeNet version2인 inception v2 or v3 모델을 종종 사용했는데요. Microsoft는 2015년에 CNN 구조도 간단하면서 inception v3보다도 성능이 좋은 ResNet을 발표하게됐어요. 그럼 지금부터 ResNet에 대해서 알아보도록 할게요.

 

<사진1>

 

 

 

 

 

<0. Abstract>

 

ResNet은 이전에 소개된 VGGNet, GoogLeNet과 같은 모델들 보다 훨씬 깊고 학습시키기도 더 쉬운 모델이라고 소개하고 있어요. 이러한 장점을 갖게한 핵심 기술은 residual function이에요. 입력 layer를 참조한다는건 입력 layer들을 다시 이용한다는 뜻인데 더 자세한건 뒤에서 설명드릴게요 (지금까지 CNN 모델은 한 번 layer를 거쳐가면 사용된 layer는 다시는 활용되지 않은걸 생각하시면 감이 오실거에요).

 

Microsoft에서는 깔끔하게 자신들이 어떤 이론을 세워서 결과를 냈다기 보다는 경험적으로 residual function 쓰니 결과가 좋게 나왔다고 인정하고 있어요 (incetion v2,v3 논문읽다가 계속 억지스러운 느낌을 받았었는데, 여기선 이렇게 깔끔하게 인정하니 논문읽기가 조금 수월한거 같더라구요. 제가 Google의 엄청난 기술을 이해못할 가능성이 더 크겠죠ㅎㅎ).

 

 

ResNet은 무려 152 layer까지 늘리고 3.57% (Top5)이라는 좋은 error rate을 기록하게 되었어요. 

 

 

 

 

 

 

 

 

 

<1. Introduction>

 

CNN 모델은 feature들이 depth가 깊어짐에 따라서 점점 추상화(abstract-level)되요. 그래서 depth가 깊어지면 사용되는 filter들이 표현하는 정도가 굉장히 다양해질거에요. 왜냐하면 100번째 layer에서도 dxd feature map에 대해서 3x3 conv를 사용하고, 101번째에서 같은 feature map size (dxd)에 대해서 3x3 conv를 사용하더라도, 100번째 layer에서의 feature map과 101번째에서 (100번째에서 3x3 conv가 적용되) feature map의 형태는 다르기 때문에 100번째 3x3 conv filter들과 101번째 3x3 conv filter들은 학습(backpropagation)에 따라 서로 다른 값들을 갖을거에요 (물론 애초에 초기값도 서로 다르게 설정되어 있으니 100번째 3x3 conv와 101번째 3x3 conv가 더더욱 같진 않겠죠!)

 

 

Microsoft 연구진들은 이전에 VGGNet 또는 다른 모델들의 추이를 보니 depth가 깊어질수록 좋은 성능을 낼거라는 가설(확신)을 세우게 되요.

 

 

depth의 중요성을 인식하고는 있었지만, layer를 그만큼 더 쌓을수록 쉽게 네트워크를 학습할 수 있는지에 대한 문제에 부딪혔어요. 그중에서 vanishing, exploding gradients는 가장 심각한 방해요소가 되었죠. 그래서 연구자들은 normalized initialization (ex: weight initialization; Xaiver, He)와 intermediate normalization layers (Batch Normalization) 방식들을 제안했어요. 그러자 10개의 layer정도는 학습이 그럭저럭 잘됐습니다.

 

 

보통 deeper CNN 모델의 성능이 최고수준으로 수렴(converging, saturation)되기 시작할때, deeper CNN 모델은 그 시점 이후로 급속하게 성능이 나빠져요. 보통 overfitting 때문이라고 예상하겠지만 Microsoft는 자신들의 실험에서 다른 요인이 있다고 언급했어요. 그 요인은 적절한 layer depth를 갖고 있는 CNN모델에 더 많은 layer를 추가시켜주면 성능이 더 나빠진다는 것이었어요. 아래 그림결과를 봤을때 test error만 보면 overfitting을 의심해볼 수 있지만, training error도 마찬가지로 deeper CNN이 더 나쁘기 때문에 overfitting이라고 볼 수 없는것이죠.

 

(그림을 보면 20 layer보다 depth가 더 깊은 56 layer의 training error 가 더 심하다는걸 볼 수 있어요)

 

 

위 그림에서 보여주는 degradation 현상은 all systems (deeper(56) or shallow layer(20))이 유사하게 최적화되지 않는다는걸 보여주고 있어요 (deeper가 shallow layer 만큼 최적화되는게 쉽진 않아보여요). 하지만, deeper model 조차도 construction(제한된 상황)에서 최적화될 수 있는 답이 존재하긴해요.  Construction 상황은 총 두 가지인데, 첫 번째는 추가된 layer가 identity mapping이어야하고, 두 번째는 추가되지 않은 layer들은 이미 shallower model에서 학습된 layer를 사용하는거에요. 이러한 construction 상황에서의 deeper model은 deeper 모델이 shallower model보다 결과가 더 좋아야한다는걸 내포하고 있어요. (Identity mapping은 뒤에서 좀 더 설명드리고, 대략적인 맥락을 설명하면 "construction된 상황에서는 그래도 deeper 모델이 shallower 모델보다 좋은 성능을 보일 수 있는데, construction된 상황말고도 microsoft가 deeper 모델이 최적화될 수 있을지를 추가적으로 실험했을 때 construction 된 상황에서의 deeper 모델보다 더 좋은 성능을 얻진 못했다"라고 요약할 수 있을거 같아요)

 

 

위와 같은 degradation 문제를 해결하기 위해서 이 논문에서는 deep residual learning 이라는 방법을 제시했어요. 전체 layer들 중에서 'each few stacked layers (전체 layer들을 몇몇 단위들로 묶은것)'이 직접 the desired underlying mapping (=H(x))을 학습 하게하는것 보단, residual mapping (= F(x) = H(x) - x)을 학습하게 하도록 하는것이 좋아요. (자세한건 아래 그림에서 다시 설명드릴게요) 

 

 

보통 CNN 모델은 아래 왼쪽 사진처럼 feature (=x)들이 입력되면 여러 layer를 거쳐 H(x)가 나오게되요. 그런데, residual learning 방식은 이전 layer에서 사용되었던(residual) feature(x= 2 layer이전의 feature들, F(x) = 바로 직전의 feature들)를 connection하여 H(x)를 다시 정의하게 됩니다 (H(x) = F(x)+x). 그리고 이러한 connection 방식을 논문에서는 short connection (few layers간의 connection)이라고 하고, 보편적으로는 skip connection (1 or 그 이상의 layer를 뛰어넘는 이미지를 생각) 이라고도 부르게 됩니다.  

 

         

       

 

위의 왼쪽그림이 기존 CNN 모델이라고 한다면, 기존 CNN 모델은 H(x)를 학습한다는 것이 feature를 잘 뽑아내는 목적으로 학습을 하게되는 것이지만, 오른쪽과 같은 residual 방식은 identity mapping 개념을 이용하게되는데요. 위의 왼쪽사진처럼 그냥 input feature (=x)를 이용해서 어떤 최적의 H(x)를 찾는것 보다, 오른쪽 사진처럼 identity mapping 개념과 skip connection 개념을 적용해 학습시키는것이 더 효율적이라고 본거에요.

 

위에서 언급한 이야기를 좀 더 자세히 설명드리면 아래 그림으로 표현할 수 있겠어요.

 

      

 

 

사실 H(x)는 x를 입력으로 했을때 target값 y로 mapping시키는 함수에요. 그래서 보통 H(x)-y를 최소화 시키는 방향으로 학습이 진행된답니다. 하지만 여기에서는 H(x)-x 를 0으로 만들어 주는 방향으로 학습이 되요. 왜냐하면 H(x) 자체가 identity function이라고 가정하고 위와 같은 수식들을 만들어 냈으니까요. 출력값 H(x)와 입력값 x 간의 잔차(residual)를 학습한다고 해서 residual learning이라는 이름이 붙게되는거에요.  

 

 

이렇게 수식을 만들어 놓으면 backprogation을 통해 학습을 할때 vanishing gradient문제를 피할 수 있게 도와 준답니다. 예를들어 기존 DNN 구조에서는 아래와 같이 곱으로 진행이 되기 때문에 입력 layer에 가까이 있을 수록 vanishing gradient를 유발하게 됩니다. 하지만 cost function과 가까운 layer는 chian rule이 적용되지 않기 때문에 vanishing gradient가 일어날 가능성이 희박하죠.

 

 

Resnet과 같이 가중치 업데이트식을 구성하게 되면 아래와 같이 vanishing gradient를 피할 수 있게 됩니다.

 

 

(음 introduction 설명하다 논문전체를 다 설명해버린거 같네요 ㅎㅎ;;;)

 

 

Microsoft는 그냥 일반적인 CNN 모델을 깊게 설정한 plain 모델과, plain 모델에 residual learning을 적용히킨 resnet 모델을 비교분석했어요. ImageNet, CIFAR-10 데이터셋에서 모두 resnet이 더 우수하게 나왔기 때문에 더욱 깊은 망을 구성하면서도 이전 모델들(VGGNet, GoogLeNet)보다 더 좋은 성능을 내게했어요. 그리고 여러 resnet 모델을 ensemble한 결과 3.57%라는 우수한 error rate을 기록하게 되었어요.

 

 

 

 

 

 

 

 

<3. Deep Residual Learning>

 

"3.1 Residual Learning ~ 3.2 Identity mapping by shortcut" 부분은 앞에서 다룬 내용들의 중복이니 따로 다루지 않겠습니다.

 

<3.3 Residual Learning>

 

이 논문은 두 가지의 모델 (Plain model&ResNet model)을 서로 비교대조하여 실험을 진행했어요.

 

 

먼저, Plain 모델을 요약하면 아래와 같아요

- Plain 모델은 VGG의 철학을 기반으로하여 모든 conv filter는 3x3으로 동일하게 적용한다.

- output feature map size가 같은 layer들에서 사용하는 conv ilter 수는 모두 동일하다.

- output feature map size가 줄어들때는 filter수를 2배로 늘려준다 (time complexity를 동일하게 유지하기 위해).

- output feature map size를 줄일때(downsampling)는 pooling이 아닌 conv filter에 stride를 2로만 두고 사용한다.

- VGG와는 다르게 마지막 GAP(Global Average Pooling)을 통해 softmax를 위한 1000개 뉴런을 갖는 하나의 FC layer만 갖는다 --> VGGNet은 FC layer (4096) 가 2개 더 추가되어 있기 때문에 연산량은 오히려 Plain 모델(32 layer)보다 더 많다)

 

 

 

Residual Network는 Plain 모델에 short connection을 적용시킨 버전이에요. Conv filter 수가 증가할 때 어떻게 short connection을 적용시켜주는지만 유의해서 보시면 되는데요. Short connection을 할때 H(x)=F(x)+x 식에서 F(x)와 x는 dimension이 같아야해요. 그런데, conv filter 수가 증가하게되면 F(x)의 차원이 더 높아지기 때문에 x의 차원을 증가시켜주어야해요. 차원을 증가시킬때는 단순히 zero padding을 해주거나, 1x1 conv filter로 증가시켜주는 방식이 있어요.

 

 

 

 

 

 

 

<3.4 Implementation>

 

여기에서는 ResNet이 training 어떻게 진행했는지 설명해 볼거에요 (data augmentation, hyperparameter, validation).

 

 

- Training input data: 입력 이미지 [256~480] 범위 내에서 랜덤하게 resizing = scale augmentation 

- resized input image에서 random하게 224x224 crop, 경우에 따라 crop한 이미지를 flip한다

- 실제 input image size는 224x224가 된다

- Conv fiter 연산 후, activation function 적용전 Batch Normalization을 적용한다

- Weight initialization: He

- Mini batch size: 256

- Learning rate: 0.1 -> error가 정체될때 10^-1을 곱해준다

- Weight decay (Regularization): 0.0001

- Optimizer: Momentum=0.9

- Validationi: AlexNet의 10-crops validation 방식을 택하고, validation시에는 [256~480]에서 random하게 resizing하는것이 아니라 multiple scale(224, 256, 384, 480,640)을 적용하여 평균 score를 내게된다.

- Training image dataset: 1.28 million, Validation image dataset: 50k, Test image dataset: 100K

 

 

 

 

 

 

 

<4. Experiments>

<4.1 ImageNet classification>

 

앞서 언급했던것처럼 이 논문에서는 두 가지 모델 (Plain, ResNet) 에 대해서 실험을 진행했어요. 

 

Plain 모델은 18, 34 layer를 각각 구성해서 실험을 진행했는데 결과적으로 34 layer에서 높은 training error가 나와 degradation problem을 목격하게 

 

<Plain 모델 결과>

 

 

저자들은 이러한 문제가 발생하는 이유가 vanishing gradients에서 오는건 아니라고 주장했어요. 그 이유는 Batch Normalization을 적용시키고 자신들이 직접 관찰했을 때 vanishing gradient가 발생하진 않는다고 했어요. 그래서 잠정적으로 결론 내런것이 deep plain model (34 layer) 같은 경우는 exponentially low convergence rate을 갖고 있을거라고 설명하고 있는데 이 부분은 자신들도 정확하게 모르기 때문에 나중에 연구를 할거라고 언급했네요.

 

 

   

<사진2. Exponentially converging 예시>

 

   

         <사진3. Averaged SGD의 converge rate이 더 exponential함>

 

 

(50 layer에서부터 사용되는 1x1 conv 개념은 뒤에서 'building block' 설명드리면서 다시 언급할게요~)

 

 

두 번째 실험모델은 ResNet이에요. ResNet 또한 28, 34 layer를 비교분석했는데요. 앞서 dimension이 증가할때 short connection을 하는 방법에 두 가지 옵션을 설명드렸는데, 그 중에서 zero padding해주는 방식을 추천했네요.

 

 

ResNet 실험에서 3가지 중요한 사실을 알게됐는데, 그 중 첫 번째가 ResNet에서는 degradation problem을 피할 수 있게 되었다는 점이에요. 그렇기 때문에 더 깊은 34 layer의 성능이 더 좋게 나왔다고 해요.

 

 

 

두 번째로 발견한 사실은 plain 모델과 비교해봄으로써 residual learning을 적용하면 더 깊게 망을 쌓고, 더 좋은 성능을 낼 수 있다는 점이에요. 

 

 

마지막으로 발견한 사실은 plain 모델과 resnet 모델을 비교했을 때, resnet 모델이 좀 더 빨리 최고 성능에 도달(convergence) 하게 된다는 사실이에요.

 

 

 

 

 

 

 

<Identity VS Projection Shortcuts>

 

앞서 언급한 identity shortcuts (short connection = skip connection) 으로 인해 성능이 좋아진것을 볼 수 있었어요. 앞선 identity shortcuts에서 dimension이 증가할 때 zero padding을 이용했는데요. 이번에는 zero padding 이외의 다른 옵션들을 시도해 볼 예정이에요.

 

먼저 A옵션은 이전 방식그대로 zero-padding shortcuts을 적용시켜주는거에요. 단순히 padding만 붙여주기 때문에 따로 weight(parameter) 필요없습니다. 그래서 ResNet이나 Plain 모델이나 parameter 차이는 없게 되는 것이죠.

 

B 옵션은 dimension이 증가할 때 project shortcuts을 적용시켜주는거에요. 이때는 차원을 늘려줘야 하기때문에 늘려주고 싶은 차원 수 만큼 1x1 conv filter 를 사용하게 되요. 그래서 plain 모델과 비교했을때 parameter는 약간 증가하게되요. 

 

C 옵션은 모든 shortcut (connection)이 진행되는 단계에서 projection을 적용시켜주는거에요. 이렇게 되면 파라미터수가 많이 증가하게 되겠죠? 

 

 

결과로만 봤을 때, A<B<C 성능을 보였지만 사실 성능차이가 미비해서 어떤 옵션을 고르는지에 대해서는 성능관점에서 크게 중요하지 않다고 해요. 하지만, parameter 수 차원에서 C옵션은 피했다고 합니다.

 

 

 

 

 

<Deeper Bottleneck Architecture>

 

Training 하는데 걸리는 시간을 고려해서 기존의 building block을 bottleneck design으로 변경했어요.

 

 

좀 더 자세히 말하자면 아래와 같은 그림으로 표현할 수 있을것 같습니다.

 

 

 

한 가지 궁금한 부분은 어떻게 7x7 conv filter 64개와 3x3 stride =2을 통해 얻은 56x56x64 output feature map이 bottleneck 구조에서 갑자기 56x56x256이 되었는지 모르겠네요. 

 

제 생각엔 위의 질문은 아래 문단을보고 조금 예측할 수 있지 않나싶어요. Identity shortcut with zero padding 옵션과 같이 56x56x64 output feature map에서 64를 256으로 만들어 줄때 zero padding을 이용한게 아닌가 싶습니다. 그럼 연산량도 증가하진 않을테니까요. 만약 projection을 하게된다면 상당히 많은 연산들이 필요해지겠네요 ㅎ

 

 

아래 최종 결과 테이블 보시면 ResNet 152가 제일 좋은걸 알 수 있고, ensemble 기법을 적용하면 3.57이라는 놀라운 top-5 err 를 기록하게 됩니다.

 

 

 

 

 

 

 

 

 

 

<5. 그외 여러 실험들>

 

Microsoft는 "Deep Residual Learning for Image Recognition"라는 논문을 통해 처음 ResNet을 발표하고, "Identity Mappings in Deep Residual Network"라는 논문을 통해 처음 발표한 ResNet의 성능을 뒷받침하는 이론들을 강화하면서, 추가적으로 다양한 실험들을 진행했어요.

 

첫 번째로는 short connection을 굉장히 다양하게 구성하면서 실험을 진행했어요. 작성중...........

 

 

 

 

두 번째로는 Activation function을 어느 위치에다 두는지에 따라서 여러 모델을 구성해보고 실험을 진행했어요.

 

 

작성중...........

 

B: addition 결과를 BN으로 설정하고 ReLU를 적용하면 ReLU가 적용되는 부분이 제한되기 때문에 representation 능력이 떨어질 수 있음 (ex: sigmoid activation 을 쓰면 linearity 모델이 나올가능성 농후, DNN chapter Batch Noramlization 참고)

C: ReLU를 addition 직전에 두기 때문에 항상 non-negative 값이 나오며 이로인해 모델의 representation 능력이 떨어짐

D:

 

 

 

(↓↓↓Pytorch로 구현한 Code 설명 글↓↓↓)

https://89douner.tistory.com/288

 

3. CNN 구현

안녕하세요. 이번 글에서는 pytorch를 이용해서 대표적인 CNN 모델인 ResNet을 implementation 하는데 필요한 코드를 line by line으로 설명해보려고 합니다. ResNet을 구현할 줄 아시면 전통적인 CNN 모델들

89douner.tistory.com

 

 

 

 

 

[논문 래퍼런스]

"Deep Residual Learning for Image Recognition"/ Kamming. H. et al/ 2015/ https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/He_Deep_Residual_Learning_CVPR_2016_paper.pdf

"Identity Mappings in Deep Residual Network"/ Kamming. H. et al/ 2016/ https://arxiv.org/pdf/1603.05027.pdf

 

[글 래퍼런스]

https://sike6054.github.io/blog/paper/first-post/

 

[사진 래퍼런스]

사진1

https://medium.com/analytics-vidhya/cnns-architectures-lenet-alexnet-vgg-googlenet-resnet-and-more-666091488df5

사진2

https://slideplayer.com/slide/15080479/

사진3

http://proceedings.mlr.press/v89/nitanda19a/nitanda19a.pdf

 

'Deep Learning for Computer Vision > Convolution Neural Network (CNN)' 카테고리의 다른 글

11. Transferlearning (Feat. fine-tuning)  (0) 2020.01.17
10. DensNet  (0) 2020.01.17
8.GoogLeNet (inception v1)  (2) 2020.01.17
7. VGGNet  (5) 2020.01.17
6. AlexNet  (4) 2020.01.17

+ Recent posts