본문 바로가기
논문 리뷰/Classification

[논문 리뷰] ResNet(2015) 설명

by inhovation97 2022. 1. 19.

논문을 읽고 핵심 내용을 인용하고 제가 이해한대로 부연 설명합니다.

저의 솔로 프로젝트에서 이용했던 resnet입니다.

파이토치 클래스로 구현했지만, 제 프로젝트나 구현이 관심있으신 분들은 링크를 눌러주시면 됩니다.

 

4. Pytroch resnet50 구현하기 (이미지 수집부터 분류 모델까지)

이 포스팅은 아래 흐름대로 진행되는 포스팅입니다. 데이터 수집 - 전처리 - 모델링 - 성능 개선 이번 포스팅은 전처리한 이미지들을 분류하기위한 모델의 아키텍쳐를 구현하여 학습을 진행합

inhovation97.tistory.com

 

4.1 실험 부분이 흥미로웠습니다.

Abstract
1. Introduce
2. Realated work
3. Deep residual Learning
4. Experiments

 

 

 

 

Abstract

 

딥러닝 모델은 모델이 너무 깊어지면서 학습이 어려워지는 문제를 겪고 있습니다. 저자들은 이전까지는 비교하기 힘들 정도로 매우 깊은 152 layer(vggnet의 8배)인 residual net으로 이미지넷 챌린지에서 3.57% error 라는 결과를 얻어냅니다.

이는 기존의 vggnet보다 좋은 성능이며, 심지어는 복잡도도 더 낮다고 합니다. 

이 외에도 CIFAR-10, coco데이터셋의 obj detection, segmentation 등등 여러 좋은 성능을 얻어냈다고합니다. 

 

 

 

 

 

1. Introduce

 

분류모델 말단에 달린 classifier나 feature들의 다양한 수준(low/mid/high)을 끌어올려주는 것은 network의 depth에 달려있을 정도로 network의 depth가 중요했고, 당시 이 부분이 키포인트였죠. 저자들은 이 부분에 집중했습니다.

 

"Is learning better network as easy as stacking more layers?" 

"더 나은 네트웍을 학습시키는 것이 레이어를 쌓는 것 만큼 쉬울까?"

(레이어를 증대하게 쌓은 네트워크의 학습은 쉬울 것인지에 대해서 고민)

이미 vanishing/exploding gradient의 문제가 있었지만, 이는 weight-initialization이나 중간중간의 normalization layer, SGD를 통해 깊은 네트웍의 수렴을 이끌어 왔습니다.

 

하지만 위 fig를 보면, 56-layer 모델이 20-layer 모델보다 train/test error가 모두 높습니다.

56-layer 모델의 test error 뿐만 아니라 training error도 같이 증가했기 때문에 단순히 오버피팅의 문제도 아닙니다. 

논문에서는 이를 deeper network이 수렴해갈 때 발생하는 'degradation problem(of training accuracy)' 이라고 언급합니다.

네트웍이 더 깊어지면, 이 문제는 더 빨리 일어난다고 합니다.

(layer를 더 추가했더니 training error가 더 발생한 것)

 

이건 모든 시스템들이 유사하게 쉬운 수렴을 하는 것은 아니라는 뜻입니다.

따라서 저자들은 'identity mapping'이라는 솔루션을 생각합니다.

얕은 모델과 얕은 모델에서 layer들을 추가한 깊은 모델을 생각했을 때,

깊은 모델에서 얕은 모델의 똑같은 아키텍쳐 부분은 그대로 둔 채 추가된 layer는 단순히 identity mapping을 한다면, 적어도 깊은 모델의 training error는 얕은 모델보다 그 이하여야한다는 목적의 실험을 진행합니다.

하지만 실험 결과가 그닥 좋지 못했고, 다른 솔루션을 생각합니다.

( 이 부분은 아래의 아이디어에 대한 identity mapping에 대한 가정으로 깔고 가는 부분인 것 같습니다. 셋업을 하는 느낌...?)

 

 

identity mapping이 아니라 F(x)+x를 매핑하는 residual mapping을 생각해냅니다. 

만약에 identity mapping이 최적으로 수렴한 상태라면, residual인 F(x)를 0으로 보내는 것이 더 쉬울 것이라는 것

입력값 x를 전달해주는 부분을 shortcut이라고 부르며, 이는 단순히 출력값 F(x)에 더해주는 것이기 때문에 추가적인 파라미터나 계산 복잡도를 높이지 않습니다. -> 이 부분은 아래 3에서 더 자세히 설명됨

( 모든 레이어에서는 온전히 잔차 F(x)에 대한 학습만 하면 됩니다.

<순전파>

conv layer의 특성상 layer가 깊어질수록 이미지를 더욱 global하게 바라보고, high-level feature를 학습합니다. 이제는 residual block을 쓰면, 각 레이어는 identity로 매핑받은 값으로 부터 이전 출력값과의 차이인 F(x)를 학습하는 것이니 본인들의 임무가 더욱 명확해졌기 때문에 학습/수렴이 더욱 쉬워지는 것입니다. 

<역전파>

shortcut 은 단순히 더하기 노드이기때문에 복잡도도 커지지 않으며, 역전파에서도 기울기를 그대로 전파할 수 있어서 gradient vanishing의 문제도 해결됩니다. 

)

 

residual net의 결과

1) 수렴이 매우 쉽다. 

2) layer를 크게 증가시켜도 정확도를 쉽게 얻을 수 있어 이전보다 훨씬 더 나은 결과를 얻을 수 있었다.

( degradation문제 뿐만 아니라 속도나 gradient vanishing 등등 여러가지 복합적인 문제를 해결하여 단순하지만 엄청난 아이디어였던 것 같습니다. )

따라서 아주 좋은 결과를 얻었고, 최종적으로 ensemble방식으로 top-5 error 3.57%를 달성합니다.

기타 cifar10이나 coco(classification뿐만 아니라 다양한 task를 포함)에서도 마찬가지로 굉장한 결과를 얻어냄

 

 

 

 

 

3. Deep Residual Learning

3.1. Residual Learning

H(x)를 underlying mapping으로 간주하여 근사시킬 수 있다면, 더욱 간단하게 그 잔차식인 F(x)+x로 근사시킬 수 있다는 가정도 할 수 있으며, 저자들은 H(x)보다 더욱 간단한 식인 F(x)+x를 underlying mapping 함수로 정의하여 최적화를 시키면 학습의 용이함 정도가 다를 거라고 생각을 했다고 합니다.

( H(x) = F(x)+x 이므로 좀 더 간단한 식인 잔차식으로 네트워크를 최적화 시키면, 효과가 있을 것이라는 생각 )

 

저자들도 이런 reformulation이 앞서 언급한 degradation문제해결에 직관적이지는 않다고 언급합니다. 

저자들이 이런 직관적이지 않은 아이디어를 낼 수 있었던 시발점은 바로 위에서 실험을 했었던, 추가된 레이어 부분에서 identity mapping을 흘려준다면, 적어도 shallow( 레이어를 추가하지 않은 네트워크 )의 training error를 가져야한다는 것이죠. 

하지만 degradatin문제가 identity mapping이 최적화하는 데에 어려움을 겪는다는 것을 밝힌 것이죠. 

( 위에 1. introduce에서 이 실험이 실패했다고 했습니다.

즉 identity mapping으로 계속 같은 값을 흘려주는 layer만 추가했을 때 trainig error가 최소한 같아야하는데, 더 나쁜 결과를 초래하니까 연구진들이 최적화 식에 대한 고민을 한 것이고, 이를 더 간단한 식인 잔차식으로 바꾸어주자는 방향으로 연구가 발전된 것 같습니다.)

따라서 실제 문제에 그럴 확률은 적지만 네트웍이 거의 최적으로 다가섰을때, reformulation한 잔차식은 0만 흘려보내주면 될 정도로 간단한 식이된다.

 

3.2. Identity Mapping by Shortcuts

bias는 식의 간소화를 위해 써주지 않음

저자들은 몇개의 layer마다 반복적으로 residual learning을 결정했고, fig2의 building block을 위 식으로 정의했습니다.

여기서 y, x는 각각 input,output이며 F는 W2*ReLu(w1*x1)를 의미합니다.

그렇게 shortcut connection은 F+x를 수행하게 됩니다. 

위에서 언급한대로 shortcut 실용적이며 추가적인 파라미터도 없습니다. 

 

그리고 반드시 x와 F의 차원이 같아야합니다.

차원이 다를 때에는 위 식 Ws로 linear projection으로 차원을 맞춰줍니다.

여기서 Ws는 오직 차원을 맞추는 데에만 작용합니다.

( 단순히 ConV layer에 깔아줄 때에는 보통 padding으로 차원축소를 억제시키지만, maxpooling을 지나는 경우 차원이 달라지는 bottleneck 구간으로 차원을 맞춰주는 작업이 있다는 것. )

식 F는 융통적으로 사용할 수 있으며 single layer마다 깔아주는 것은 의미가 없어 위 논문에서는 2~3 layer마다 깔아줍니다. 

 

3.3. Network Architetures

더보기
fig. 3

위 fig에서

VGG-18 : 19.6 billions FLOPs

34-layer plain : 3.6 billions FLOPs

34-layer residual : 3.6 billions FLOPs

residualnet의 점선 부분은 bottle neck 부분임

 

저자들은 같은 조건에서 plain/residual net의 많은 실험을 진행했습니다.

 

Plain Network

저자들은 plain network의 베이스라인을 주로 vggnet에서 영감을 받았다고합니다.

 

  • 거의 3x3 Conv layer로 설계했으며, 같은 사이즈의 output과 같은 사이즈의 filter를 이용했으며, 시간 복잡도를 줄이기 위해 feature map 사이즈가 절반으로 줄어들면 필터의 개수를 두배로 늘렸음.
  • Convlayer마다 stride는 2로 함.
  • 네트워크가 끝나면, GlobalAveragePooling을 하였고, 1000개의 벡터를 뱉는 fclayer를 softmax에 넣었음.

 

Residual Network

plain network를 베이스로 shortcut connection을 집어 넣어줌.

  • 실선 부분은 차원이 같으므로 직접적으로 값을 전달해주는 부분임.
  • 점선 부분은 차원이 증가하므로 2가지 옵션을 생각함. 

      (A) 여전히 추가적인 파라미터 없이 identity mapping을 진행하며, 제로 패딩으로 차원을 맞춰줌.

      (B) vggnet과 GoogLeNet처럼 차원을 맞춰주는 1x1 Conlayer를 진행함 

  • A,B 모두 feature map을 2사이즈를 점프하기 때문에 stride = 2 로 맞춤

 

3.4. Implementation

train

  • 이미지를 [256, 480]사이에서 랜덤으로 resize함. (scale augmentaiton 효과)
  • 픽셀 당 평균으로 뺀 이미지나 수평으로 뒤집은 이미지에서 무작위로 224x224 랜덤 크롭함.
  • standard color augmentation을 적용함.
  • Conv layer 후 activation function전 마다 Batch Normalization을 적용함.
  • scratch로부터 학습할 때 plain/residual 모두 weight initialization을 적용함.
  • learning ragte는 0.1로 설정하여, error rate가 plateaus에 도달할 때마다 10씩 나누어 적용해줌.
  • 모델은 총 60x10^4 iteration으로 학습시킴.
  • weight decay는 0.0001 momentum은 0.9를 적용함.
  • Drop out은 쓰지않음.

test

  • 위 그림대로 10-crop testing을 적용함.

각 모서리대로 4번 crop하고 가운데 1번 crop하여 5개를 얻은 뒤, 가운데에서 얻은 (a)center crop 이미지에 대해 한번씩 더 수행하여 총 10개의 crop image를 얻음 -> 얻은 이미지들을 fully conv에 넣어 multiple scale(10개의 사이즈가 전부 같지 않으므로)에 대한 점수를 얻었고, 이를 전부 평균냄.

 

 

 

 

 

 

4. Experiments

4.1. ImageNet Classification

1000개 클래스 데이터셋인 ImageNet을 분류합니다.

모델들은 1.28milions개수의 이미지를 학습하여 50k개수의 이미지로 검증합니다.

100k test이미지로 최종 결과를 냅니다.

top1 & top5 error rates 모두 평가합니다.

 

table1
&nbsp;fig. 4 얇은 선 : training error 굵은선 : validation error

Plain Networks

18-layer와 34-layer 네트워크에 대해서 진행.

테이블 2를 보면, 34-layer가 validation error와 training error가 더 높은 것을 볼 수 있습니다. 

(degradation문제 발생) 

저자들은 순전파에 0이 아닌 분산을 보장하는 BatchNorm을 쓰고, 역전파에서도 BatchNorm의 살아있는 기울기가 흐르는 것을 입증했기 때문에 gradient vanishing문제는 아닐 것이라고 판단했습니다.

실제로 34-layer 네트워크는 테이블 3에서 괜찮은 수준이기 때문에 괜찮은 정도로 수렴하고 있는 상태입니다.

따라서 저자들은 deep plain net의 수렴율이 기하급수적으로 너무 낮아져서 training error를 줄이는 것에 영향을 미친 것으로 짐작했습니다.

(이는 미래의 연구 과제로 남긴다고 함)

 

Residual Networks

table 2

residual net도 18-layer, 34-layer로 진행.

plain net을 베이스라인으로 똑같은 아키텍쳐로 3x3 필터마다 shortcut connection을 깔아줌. (fig. 3)

 

table 2와 fig. 4를 보면서, 주요한 상황 3가지를 관찰했습니다. - 결과

 

1. 34-layer residual net와 18-layer residual net이 plain net과는 달리 상황이 역전되었습니다.

심지어는 34-layer는 training error를 굉장히 많이 줄였고, validation data에 대해서 일반화를 상당히 잘 시킨 것을 알 수 있습니다. 이렇게 세팅한 것이 degradation문제에 대해 잘 짚었기때문에 모델을 깊게하면서도 accuracy gain을 할 수 있었던 것.

(degradation의 문제는 수렴에 대한 어려움의 문제가 맞았다.)

 

2. plain net과 비교해서 34-layer residual net은 trainin error와 더불어 top1 error를 3.5%까지 줄였습니다.

(fig. 4, table 2)

이는 deep모델에서 residual net의 굉장한 효과를 입증해줌.

(residual net은 모델의 깊이에만 관여하는 것이 아니라 같은 깊이에서도 plain net에 비해 성능이 더 좋다.)

 

3. residual net의 수렴 속도가 훨씬 더 빠르다.

fig. 4에서 plain net에 비해 residual net의 초기 수렴 기울기가 훨씬 가파른 것을 볼 수 있습니다.

간단한 fomula를 재정의해준 결과가 속도까지 관여했던 것.

(residual net의 수렴 속도가 더욱 빠르다.)

 

Identity vs. Project Shortcuts.

table 4: single model & table 5: ensemble

resnet 저자들은 reformula 식을 2가지에서 고민했습니다. 

추가 파라미터가 없는 identity mapping or 입력값에 가중치를 한 번 더 주는 projection shortcut 

(위 3.2 부분에서 한 번 언급한 것을 실험) 

이를 모델 A,B,C로 나누어 실험을 진행한 부분입니다. 

 

table 3을 봅니다.

(A) zero - padding shortcut으로, 모든 shortcut의 추가 파라미터는 전혀없음.

(B) projection shortcut으로 bottle neck부분에서만 차원을 늘려주고, 나머지 부분에 대해서는 identity 매핑만 진행.

(C) 모든 shortcut을 projection으로 깔아줌.

 

1. 세가지 옵션의 결과는 전부 plain net보다는 좋았다.

2. B가 A보다 미세하게 더 좋다.

  ( A의 제로패딩된 부분이 잔차를 학습하지는 못했을 것 )

3. C가 B보다 미세하게 더 좋다.

  ( 이는 많은 shortcut들의 추가적인 파라미터 때문일 것. )

 

하지만 A/B/C의 차이는 미세했고 degradation 문제에서 그렇게 중요한 것은 아니기 때문에, 

memory/time complexity를 줄이기위해 C는 해당 논문에서 쓰지 않기로 결정.

 

Deeper Bottleneck Architecture.

training time에대한 우려때문에 위처럼 bottleneck에 대해서 설계했다. 

두 디자인의 time complexity는 비슷함.

2개의 레이어가아닌 1x1, 3x3, 1x1 Conv 3개의 layer를 설계했고, 여기서 1x1은 증가했던 차원을 맞추기위한 용도.

 

추가적인 파라미터가 없는 idenetity shortcut은 bottleneck architecture에서 매우 중요한데, 만약 identity shortcut을 각각 projection으로 대체한다면 모델의 사이즈가 두배로 늘어나고, shortcut은 2 high - dimension로 연결되어 마무리된다. 따라서 위처럼 bottleneck 형식으로 모델을 짜는 것이 효율적일것.

 

50-layer ResNet : fig. 3의 34-layer residual net에서 매 2개의 layer마다 shortcut을 깔아준 것과는 다르게 50 layer에서는 3개의 layer마다 fig. 5의 bottleneck block으로 교체하여 아키텍쳐를 설계했습니다. 

늘어나는 차원에 대해서는 option B를 선택했고, 3.8 bilion FLOPs의 계산량이 필요함.

 

101-layer and 152-layer ResNet : 101, 152 layer 아키텍쳐도 마찬가지로 3-layer blocks를 이용했습니다.(table 1)

모델의 depth가 상당히 깊어졌음에도 152-layer는 여전히 VGG16/19보다 복잡도가 낮았습니다.

50/101/152 - layer ResNet은 34 - layer보다 상당한 차이로 더욱 정확도가 높았으며, degradation 문제가 일어나지 않아서 이렇게 깊게 쌓을 수 있었음. (table 3, 4)

 

 

4.2. CIFAR-10 and Analysis

 

연구팀은 CIFAR-10 데이터셋에 대해도 연구를 진행했으며, deep 네트워크에 초점을 맞췄지만, sota결과를 내기위해 매우 효율적으로 모델을 구성해보았다고 합니다.

( CIFAR-10 이미지 크기가 작기 때문에 이 부분에 대한 생각을 볼 수 있음. )

 

fig. 3의 plain/residual 구성을 따르지만, 이미지의 크기가 작기때문에 first layer는 3x3conv layer로 시작.

그 뒤로 3x3 Conv를 2n layer씩 총 6n layer를 feature map 사이즈가 바뀔 때마다 깔아주는데, 필터의 개수는 사이즈가 절반으로 줄어들 때마다 2배씩 늘려주어 output 차원을 고려하였음.

Conv layer가 끝나면, AVGPooling을 거친 뒤 10-way FC layer, softmax를 거쳐 output을 도출함.

 

최종적으로 6n+2(맨처음 3x3convlayer & fc layer 2개)개의 layer로 아키텍쳐를 설계

( 위 테이블을 보면 이해 쉬움. )

※ 논문에서 2stride로 subsampling을 진행했다고했는데, 이는 Pooling을 의미함

 

하이퍼 파라미터 세팅에 관한 부분은 패스합니다.

 

n={3,5,7,9}씩 조정하여 20,32,44,56 layer의 아키텍쳐를 생성(첫 conv & fc layer 2개를 포함한 것)

 

fig. 6

fig. 6을 보면, fig. 4에서 처럼 왼쪽 plain net은 역시나 네트워크가 깊어지면, degradation 문제가 발생.

가운데 ResNet을 보면 가장 깊은 네트워크의 error가 가장 작은 것을 볼 수 있습니다.

ImageNet 데이터와 마찬가지로 문제를 잘 해결했습니다.

 

연구진들은 추가로 n=18로 두어 110-layer를 쌓아 실험을 진행했습니다.

초기 모델이 깊은만큼 lr을 0.1로 두어, training error가 80% 이하일 때까지는 0.01씩 warm up 하다가

다시 0.1로 학습을 진행.

fig. 6을 보면 110 - layer도 잘 학습을 마쳤으며, 이는 FitNet이나 Highway보다 파라미터가 적고 깊음.

 

Analysis of Layer Response.

 

fig. 7

3x3 layer 레이어 -> BN을 거쳐 나온 값들의 표준편차를 확인해봅니다.

해당 분석은 residual function의 효과를 직접적으로 확인해 볼 수 있습니다.

fig. 7을 보면, 일반적으로 painnet에 비해 resnet의 response가 훨씬 작습니다.

이는 residual function이 일반적으로 plain net에 비해 0으로 보내기 더 쉽다는 가정에 잘 들어맞는 결과입니다. 또한 fig를 보면 resnet의 깊이가 더 깊을수록 반응 값들의 크기가 더 작다는 것을 방증해줍니다.

모델이 깊을수록 resnet의 각각 레이어에서는 signal들을 덜 수정하는 경향이 있기때문에 값들이 많이 튀지 않는 것이라고 볼 수 있습니다.

 

Exploding Over 1000 layers.

table 6 - CIFAR-10에 대한 결과

저자들은 1000 layer까지 쌓아 굉장히 깊은 아키텍쳐에 관해서도 연구를 진행했습니다.

n=200으로 두어 1202-layer network을 설계했고, 이는 꽤나 준수한 수준의 결과를 내었습니다. (table 6)

하지만 110 - layer에 비해 성능이 떨어집니다.

이를 저자들은 degradation이 아니라 overfitting이라고 분석했습니다.

데이터에 비해 모델이 쓸모없이 너무 깊은 것이었던 것입니다.

optimization 문제에 포커스를 맞추었기 때문에 dropout이나 maxout같은 강력한 regularization을 쓰지 않았던 영향도 있을 수 있습니다.

아마 쓴다면, 더 좋은 성능을 기대해 볼 수도 있을 것이라고 주장하네요.

 

Obj detection부분은 성능적인 부분만 간략히 나와있기 때문에 생략합니다.

 

 

 

 

 

 

무언가 많이 시도하고, 이것저것 열심히 뭔가를 달았던 GooLeNet이 초라해질 정도로 간단한 아이디어였지만, 엄청난 효과를 불러온 resnet의 논문이었습니다.

댓글