EECS 498-007 Lecture 8 | CNN Architectures

shyoon·2025년 1월 31일
0

EECS 498-007

목록 보기
6/13
post-thumbnail

해당 시리즈 포스팅은 미시간 대학의 EECS 498-007 강의 내용을 정리한 글입니다. cs231n 강의와 유사하여 해당 시리즈 포스팅과 겹치는 부분이 많이 있을 수 있습니다.

ImageNet Classification Challenge

이번 시간엔 과거 ImageNet Classification Challenge(ILSVRC) 에서 각 해마다 우승을 차지한 각 CNN 구조를 순차적으로 살펴본다.

2012 - AlexNet

해당 대회가 시작된 2010년과 직후 2011년도 우승 아키텍쳐는 hand-designed feature에 classifier를 연결하는 방식이었지만, 2012 우승 아키텍쳐 AlexNet의 등장 이후로 Vision task에서 오랜 기간 CNN에 대한 연구가 활발히 진행되게 되었다.


227x227 크기의 이미지를 입력받아서 5개의 Conv layers, max pooling, ReLU activation, 이후 3개의 fully-connected layers로 이루어진 네트워크를 통과시키게 된다. AlexNet이 non linearity를 위해 activation으로 ReLU함수를 처음으로 사용한 모델이라고 한다.

당시 저자들이 사용할 수 있었던 가장 큰 메모리의 GPU는 GTX580이었는데, 이는 메모리가 3GB밖에 되지 않았고, 두 대를 연결해서 분산 학습을 위해 위와 같이 둘로 분산된 네트워크 구조를 가지고 있다.


AlexNet의 layer 별 설정과 output size, 사용되는 memory 양은 위 표와 같다.

실제로 CNN 아키텍쳐를 구성할 때 layer 별 FLOPs(부동 소수점 연산 횟수)를 잘 생각해야 하는데, 이 값으로 모델이 컴퓨팅 자원을 얼마나 필요로 하는 지 알 수 있기 때문이다.


Conv1 layer의 FLOPs를 예시로 보면, output element 수와 각 output element에 대한 연산 수(필터 크기) 를 곱하면 위와 같이 계산될 수 있다.


AlexNet의 layer 별 memory, parameters, MFLOP의 추세이다.

  • 대부분의 메모리는 초기의 conv layers에서 많이 잡아먹게 되는데, 이는 비교적 높은 해상도를 input으로 받아서 비교적 많은 수의 필터를 갖기 때문이다.
  • Parameter 수는 뒤쪽의 fully connected layers에서 많아지는데, 이는 fully connected layers 특성 상 conv layers보다 parameter 수가 매우 많기 때문이다. 그리고 매우 큰 값을 곱하기만 하기 때문에 계산량은 많이 필요하진 않다.

2013 - ZFNet

바로 다음 해인 2013년 ILSVRC의 우승 아키텍처는 ZFNet으로, AlexNet을 조금 더 크게 만들었다고 보면 된다.


구조와 layer 수는 AlexNet과 거의 유사하지만, 더 많은 시행착오를 거쳐 conv1에서 11x11 필터 stride 4 → 7x7 필터 stride 2로 수정하였고, conv3,4,5 에서 필터 수를 더 늘렸다.


2014 - VGGNet

2014년의 핵심 모델 중 하나는 VGGNet이다. (사실 우승 모델은 후술할 GoogLeNet이지만, 구글에 비해 훨씬 열악한 컴퓨팅 환경에서 진행된 연구인 만큼 의의가 있다.)

AlexNet과 ZFNet의 경우엔 각 layer의 하이퍼파라미터는 시행착오를 거치면서 완성되었기 때문에 네트워크 전반의 크기를 바꾸기가 어려웠다. 하지만 VGGNet 이후론 ConvNet의 전체 네트워크에 대한 디자인이 어느 정도 정립된다.


VGGNet의 설계 원칙은 아래와 같다.

  • 모든 conv layer의 필터는 3x3, stride 1, padding 1 으로 설정
  • 모든 pooling layer 는 2x2 stride 2의 max pooing
  • 모든 pooling 다음엔 channel을 두 배 키워준다.

Convolutional stages는 보통 초기엔 conv-conv-pool 순서로 진행되고, stage 4,5 에서는 conv-conv-conv-pool (VGG16) 나 conv-conv-conv-conv-pool (VGG19) 순서로 진행된다.


모든 Convolution filter 크기를 3x3으로 쓴 이유는, 5x5 필터를 한 번 쓰는 것 보다 3x3 필터를 한 번 쓰는 것이 같은 receptive field를 가지면서도 적은 파라미터를 쓰기 때문이다. 마찬가지로 7x7 필터는 3개의 연속된 3x3 필터로 대체할 수 있다.


그리고 모든 pooling은 2x2, stride 2의 max pooling을 쓰고, 직후 channel을 두 배 늘린다는 규칙을 적용하면 spatial size는 pooling에 의해 두 배 줄어들고, 채널을 두 배 늘림으로써 메모리는 절반, 파라미터 수는 4배가 되지만 FLOPs는 동일하다.

VGGNet를 기점으로 네트워크의 자유로운 확장/축소가 어느 정도 가능해졌고, 각 layer의 하이퍼파라미터를 일일히 조정할 필요가 없어졌다.


2014 - GoogLeNet

2014년 우승 모델이다. 구글은 실제로 데이터 센터와 모바일 폰에서 해당 분류 작업을 수행할 수 있도록 효율성에 집중하여 디자인하였다.


넓은 spatial feature map에서 합성곱을 하면 매우 값비싸기에, 우선 입력 이미지를 매우 aggressive하게 downsampling한다. (Stem network)

네트워큭 초기에 연산량이 몰려있던 VGG와 비교해보면, 동일한 spatial size로 줄이는 데 들어가는 계산량이 거의 18배 적다.


그리고 Inception Module을 도입하였는데, 이는 전체 네트워크에서 반복되는 local unit이다. 하이퍼파라미터로 필터의 크기를 조정하는 대신, 항상 모든 크기(1x1, 3x3, 5x5, 3x3 max pooling)의 필터로 convolution을 수행한다.


그리고 inception module의 특징을 살펴보면, conv 수행 전이나 max pooling 후에 1x1 convolution을 해준다는 점이다. 앞서 배웠던 1x1 convolution의 특징을 생각해보면, 이는 채널을 조정하기 위해 넣어준 것이다.


최후엔 파라미터 수가 많은 FC layers 대신 global average pooling을 한 번 적용해준다. 슬라이드에 확인 가능하다시피 flop이 훨씬 적다.


그리고 아키텍처를 잘 보면 빨간 박스가 쳐 진 부분이 껴 있는데, 이는 Auxiliary classifiers(보조 분류기)이다. GoogLeNet이 발표된 시기는 아직 batch normalization이 없어서 10개가 넘는 layer를 가진 네트워크의 학습이 매우 어려웠기에 네트워크 중간 중간 이를 배치하여 마찬가지로 class score를 얻고, 따라서 GoogLeNet은 총 세개의 class score를 활용하게 된다. 동일하게 loss를 계산하고 backprop을 진행하여 gradient가 좀 더 효율적으로 전파될 수 있도록 한다.


2015 - ResNet

하지만 금방 Batch Normalization이 발표 되어서 auxiliariy classifier 같은 트릭이 없어도 어느 정도 깊은 network를 학습할 수 있게 되었고, 2015년 우승 아키텍쳐인 ResNet은 residual connection을 도입하여 훨씬 깊은 network를 쌓게 된다.


여태까지는 대체로 더 큰 신경망이 잘 동작하는 경향이 있었다. 따라서 ResNet의 motiavation은 “과연 기존 평범한 CNN 구조에서 layer를 깊게 쌓으면 쌓을수록 무조건적으로 성능 향상이 이루어질까?” 에서 시작한다.


이에 대한 답은, No 였다. 위 슬라이드의 loss 그래프는 20-layer, 56-layer 구조 모두 평범한 CNN인데, layer가 더 많다(깊다)고 해서, 무조건 적으로 test loss가 작은 건 아니었다.

test 그래프만 보면 56-layer가 20-layer보다 파라미터 수가 많으니 overfitting이 발생했다고 생각할 수도 있지만, training 에서도 56-layer가 더 loss가 컸기 때문에, overfitting에 의한 결과는 아니었다. 사실 underfitting이다.


그래서 처음 저자들이 세운 가설은 “모델이 깊을 수록 최적화가 어렵다” 였다.

그래서 저자들은 우선 더 얕은 모델의 가중치를 깊은 모델의 일부 layer에 복사하고, 나머지 layer는 identity mapping으로 input을 output으로 그냥 내보내는 방식을 활용하고자 하였다. 이렇게 한다면 깊은 모델의 학습이 제대로 안 되더라도, 얕은 모델 만큼의 성능은 보장이 될 것이라는 가설을 세웠다.


왼쪽은 VGGNet에서 보았던 일반적인 convolution block인 conv-conv(ReLU와 BatchNorm을 곁들인..) “Plain block”이라면 오른쪽은 저자들이 도입한 “Residual Block”으로, 블럭의 input을 output에 단순히 더해주는 shortcut(skip connection)이 추가된다.


이 shortcut의 아이디어는 “블럭이 어떻게 하면 identity function을 잘 학습할 수 있을까?” 에서 출발한다.

전체 블럭 네트워크는 H(x)=F(x)+xH(x) = F(x) + x 라면, FF가 0으로 초기화되면 H(x)=xH(x) = x 가 되어 identity function을 쉽게 학습할 수 있고, 따라서 깊은 네트워크가 얕은 네트워크를 emulate 하기 쉬워진다고 한다.

그리고 이 add gate는 backprop도 가능하다.


각 residual block의 디자인은 VGG와 같이 두 개의 3x3 conv layer로 이루어져 있다.

각 블록에서 첫 번째 layer에서는 spatial size를 절반으로 줄이고, 두 번째 layer에서는 channel 수를 두 배로 늘린다.


또한, GoogLeNet처럼 network 초반 stem network로 aggressive하게 downsampling하며 마지막엔 fully-connected layer 대신 global average pooing을 사용한다.


각 stage 별 block의 구조를 달리한 ResNet18과 ResNet34의 성능 및 GFLOP을 VGG와 비교하면 위와 같다.


그리고 layer를 18, 34개 보다도 더 깊게 쌓는 경우에는 “basic” residual block 이 아닌, 더 적은 계산량을 갖는 “bottleneck” residual block 구조를 사용할 것을 제안하였다.

첫 번째 1x1 conv는 채널 수를 줄이고(4C→C) 두번째 3x3 conv를 수행한 후, 마지막 1x1 conv에서는 다시 채널 수를 증가시킨다(C→4C).


그렇게 bottleneck block을 활용했을 때 50, 101, 152개 layer까지 쌓은 아키텍쳐의 전체적인 구조와 ImageNet performance를 요약하면 위 표와 같다.


이 ResNet은 ILSVRC classification task 뿐 아니라, detection, localization, segmentation 등 다양한 task에서도 뛰어난 성능을 보여 당시 많은 집중을 받았다고 하고, 컴퓨터비전 task에서의 가이드라인같은 아키텍쳐가 되었다.


이에 따라 포스팅을 작성하는 시점 인용수가 25만회를 넘었다..


이후 activation의 위치를 변경해서 성능을 높인 연구 결과도 있었다.


Comparing Complexity

여태까지 살펴 본 아키텍쳐들의 복잡도 및 정확도를 시각화하여 비교한 그림이다.

요약하자면,

  • Inception-v4는 Inception과 ResNet을 결합한 모델로 가장 좋은 성능을 보였다.
  • VGG는 높은 메모리와 계산량을 가진다.
  • GoogLeNet은 효율적이다.
  • AlexNet은 계산량은 적지만, 파라미터 수가 많다. (정확도도 타 모델에 비해는 많이 낮음)
  • ResNet은 간단한 구조로 효율적이며 정확도가 높다.

이후 2016년도의 우승 모델은 단순한 모델 앙상블이라 크게 새로울 것은 없었다.


Improving ResNets

ResNeXt

각 Residual block 블럭 내에 multiple parallel pathways를 추가하여 residual block의 width를 늘린 방식이다. Pathways의 총 합을 cardinality라고 한다. 구조 자체는 ResNet과 유사하면서도, 한 residual block 내부에서 여러 layer들을 병렬로 묶어준다는 점에서 Inception Module이 떠오르기도 한다.

이제 채널을 조정하는 것 말고도, parallel pathway 수를 조정하는 것 또한 하나의 아키텍쳐 디자인 요소가 될 수 있다는 것을 보여주었다.


이렇게 parallel pathway를 늘림으로써 네트워크의 계산 복잡도를 유지하면서도 ResNet에서 성능 개선이 가능하였다.


2017년도 ILSVRC는 ResNeXt 구조에서 squeeze-and-excite branch를 추가하여 각 residual block에 global context를 추가한 SENet이 우승을 차지하였고 ImageNet Challenge는 막을 내리게 되었다.


Beyond ResNets

ILSVRC가 끝난 후에도 연구는 계속되었다...

DenseNet

한 layer가 그 layer의 하위 모든 layer들과 연결된 Dense block을 사용한다. Input 이미지가 네트워크의 모든 layer의 입력으로 들어가게 된다, 이 출력들은 모두 concat된다. 해당 방식이 gradient vanishing 문제를 해결할 수 있다고 한다.


MobileNets

단순히 정확도 개선만을 목표로 한 것이 아닌, 모바일 기기나 임베디드 앱에서도 실행할 수 있을 만큼 계산을 최소로 하면서도 성능이 좋은 아키텍처이다. 각 convolution을 하나는 depthwise로, 하나는 pointwise로 바꾸었다.

후속 연구로는 ShuffleNet, MobileNetV2, ShuffleNetV2 등이 있다.


Neural Network Architecture를 설계가 어렵기 때문에, 이 자체를 자동화하려는 시도이다.

  1. Controller라고 하는 네트워크가 다양한 network architecture들을 출력하고, 이 것들로 child network를 샘플링한 후 그것을 학습시킨다.
  2. Child network들을 학습시킨 후, controller network의 가중치 업데이트가 이루어지고, 이러한 과정이 반복되면서 controller는 점점 좋은 architecture를 뱉게 된다.

하지만 초기 controller를 학습하는 데 gradient step에서 매우 많은 계산 비용이 발생하였다. (800개의 GPU로 28시간…) 따라서 후속 연구들은 효율성에 집중하였다.


그래도 실제로 Neural Architecture Search를 통해 얻은 architecture들(빨간색)은 위에서 보았던 아키텍처들보다 대체로 좋은 성능을 보였다.


Summary

  • 초기 연구에서는 네트워크가 클 수록 성능이 좋다는 결과를 보였다.
  • GoogLeNet은 효율에 집중을 둔 초기 모델 중 하나이다.
  • ResNet은 제한된 GPU로 매우 깊은 네트워크를 학습하는 방법을 보여주었다.
  • ResNet 이후로는 효율적인 네트워크에 대한 연구와,
  • 모바일 기기에 적합한 tiny networks에 대한 연구가 활발했다.
  • Neural Architecture Search는 아키텍처 디자인을 자동화한다.

좋은 아키텍처를 선택하려면?

→ 굳이 새로운 걸 디자인하진 말고, 정확도에 초점을 둔다면 ResNet50이나 ResNet101을, 효율성에 집중을 둔다면 MobileNet이나 ShuffleNet을 사용해보자.


Reference

profile
큰 사람이 되겠어요

0개의 댓글

관련 채용 정보