[CS231n] Lecture 9: CNN Architectures 정리

Lil Park·2023년 2월 28일
0

cs231n

목록 보기
7/7

  • 최신 CNN Architecture들에 대해서 배울 예정

  • 예전에 LeNet을 다룬 적이 있음
    • LeNet은 산업에서 성공적으로 적용된 최초의 ConvNet
    • 이미지를 입력으로 받아 stride=1인 5X5 필터를 거치고, 몇 개의 Conv layer와 pooling layer를 거침
    • 간단한 모델이지만, 숫자 인식에서 엄청난 성공을 거뒀음

  • 이후, 2012년에는 AlexNet이라는 모델이 나왔음
    • 최초의 Large scale CNN
      • ImageNetClassification task를 아주 잘 수행했음
    • 기존의 non-deep learning 모델들을 능가하는 성능을 보임
      • ConvNet 연구에 부흥을 일으킨 장본인
    • AlexNet의 구조는,
      • 기본적으로 Conv-pool-normalization 구조가 두 번 반복
      • 그 뒤에는, Conv layer가 조금 더 붙어있음(Conv 3, 4, 5)
      • 그 뒤에는, pooling layer가 있음 (Max Pool 3)
      • 마지막으로 FC layer
    • LeNet과 유사함 (layer만 많아졌음)
      • AlexNet은 5개의 Conv layer와 2개의 FC layer로 구성

  • AlexNet 모델의 크기는,
    • AlexNet을 ImageNet으로 학습시키는 경우, 입력의 크기가 227 X 227 X 3
    • AlexNet의 첫 layer는, 11 X 11 필터가 stride=4로 96개 존재
      • (전체 이미지 크기 - 필터 크기) / stride + 1
      • 이 layer의 출력 사이즈는 55 X 55 X 96
  • 이 layer의 전체 파라미터 개수는 얼마인가?
    • 11 X 11 필터가 총 96개 존재
      • (11 X 11 X 3) X 96 = 34,838
      • 이 layer의 전체 파라미터 개수는 총 34,838개 (약 35K)

  • 두 번째 layer는 pooling layer
    • stride=2, 3 X 3 필터가 존재
    • 이 layer의 출력 값 크기는 얼마인지?
      • (55 - 3) / 2 + 1 = 27
      • 이 layer의 출력 사이즈는 27 X 27 X 96
    • 이 layer의 파라미터는 몇 개인지?
      • Pooling layer에는 파라미터가 존재하지 않음
      • 따라서, 0개

  • AlexNet의 전체 구조
    • Conv layer들의 파라미터 크기는 앞서 계산한 것과 유사할 것임
    • 모델의 끝 부분에 FC layer가 있음
      • 4096개의 노드를 가진 layer
      • 마지막 FC layer에서는 1000개 (ImageNet의 클래스 개수)

  • AlexNet을 더 자세히 살펴보면,
    • ReLU를 사용함
    • Local response normalization layer를 사용했음
      • 채널 간의 normalization을 위한 것으로, 요즘은 잘 사용하지 않음
      • 큰 효과가 없음
    • Data augmentation을 많이 함
      • flipping, jittering, color norm 등을 적용
    • Dropout을 사용
    • 학습 시 Batch size는 128
    • SGD Momentum을 사용
    • 초기 learning rate는 1e-2
      • 이후, val accuracy가 올라가지 않는 지점에서 학습이 종료되는 시점까지 learning rate를 1e-10까지 줄임
    • Weight decay를 사용
    • 모델 앙상블로 성능을 향상 시킴

  • AlexNet이 다른 Conv Net과 다른 점
    • 모델이 두 개로 나눠져서 서로 교차하는 것
      • 이는 GPU 성능 문제 때문에 고안한 방법
      • 전체 layer를 하나의 GPU에 다 넣을 수 없었기 때문에, network를 GPU에 분산시켜서 넣었음
    • 각 GPU가 모델의 뉴런과 feature map을 반반씩 나눠 가짐
      • 첫 번째 layer의 출력은 55 X 55 X 96
      • 다이어그램에서는, 각 GPU에서 Depth가 48임
      • 즉, feature map을 절반씩 가지고 있는 것

  • AlexNet의 Conv 1, 2, 4, 5에서 어떤 일이 발생하는지 살펴보면,
    • 여기에서는 같은 GPU 내에 있는 feature map만 사용
      • 즉, 해당 layer에서는 전체 96 feature map을 볼 수 없음
      • 48개의 feature map만 사용

  • Conv 3, FC 6, 7, 8을 살펴보면,
    • 이 layer들은 전 계층의 전체 feature map과 연결되어 있음
    • GPU 간의 통신을 하기 때문에, 이전 입력 레이어의 전체 depth를 가져올 수 있음
  • 추가적으로, AlexNet 논문의 architecture와 관련된 이슈가 하나 있음
    • 논문의 그림에서, 첫 layer가 224 X 224로 되어 있음
      • 그러나, 실제 입력은 227 X 227

  • AlexNet은 Image Classification Benchmark의 2012년도 우승 모델
    • AlexNet은 최초의 CNN 기반 우승 모델
      • 수년 전까지 대부분의 CNN architecture의 베이스 모델로 사용했음
    • AlexNet은 다양한 task의 transfer learning에 많이 사용되었음

  • 2013년 ImageNet Challange 우승은 ZFNet
    • ZFNet은 AlexNet의 하이퍼파라미터를 개선한 모델

  • ZFNet은, AlexNet과 같은 layer 수를 갖고, 기본적인 구조도 같음
    • 다만, stride size, 필터 수와 같은 하이퍼파라미터를 조절해서 AlexNet의 error rate를 개선
    • AlexNet의 아이디어와는 기본적으로 같음

  • 2014년에는 많은 변화가 있었음
    • Architecture도 많이 변했고, 성능도 훨씬 향상되었음
    • 가장 큰 차이점은, network가 훨씬 더 깊어졌음
      • 2012/2013년에는 8개의 layer
      • 2014년에는 19, 22 layer로 늘어났음
  • 2014년 우승자는 Google의 GoogLeNet
    • 준우승은 Oxford의 VGGNet
      • VGGNet은 Localization Challange 등 일부 다른 트랙에서는 1위를 차지함

  • VGGNet
    • 이전 모델에 비해서 훨씬 더 깊어졌고, 더 작은 필터를 사용함
      • 이전 AlexNet은 8개의 layer였지만, VGGNet은 16, 19개의 layer를 가짐
      • 또한, AlexNet은 첫 Convolution layer에서 11 X 11 filter를 사용했고, VGG는 3 X 3 filter를 사용
    • VGGNet은 항상 3 X 3의 작은 사이즈의 filter를 사용하고, 주기적으로 pooling을 수행하면서 전체 network를 구성

  • VGGNet이 작은 사이즈의 filter를 사용한 이유는?
    • 우선, filter의 크기가 작으면 파라미터의 수도 더 적음
      • 7 X 7 filter를 한번 사용하는 것과 3 X 3 filter를 3번 사용하는 것이 동일한 receptive filter를 가짐
      • 그러나, 작은 사이즈의 filter를 여러번 사용하게 되면 파라미터 수가 더 적어짐
        • 7 X 7 filter = 49 params
        • 3 X 3 filter 3 = 9 params 3 = 27 params
      • 따라서, 큰 filter에 비해 layer를 조금 더 쌓을 수 있음 (Depth를 키울 수 있음)

  • 그렇다면, stride=1인 3 X 3 filter를 3개를 쌓게 되면, 실질적인 receptive field는 어떻게 될까?
    • receptive field는 filter가 한번에 볼 수 있는 입력의 영역 (수용영역)
      • 첫 번째 layer의 receptive field는 3 X 3
      • 두 번째 layer는 각 뉴런이 첫 번째 layer 출력의 3 X 3 만큼 보게 됨
        • 실질적으로, 3 X 3 중에 각 사이드는 하나의 픽셀을 더 볼 수 있게 됨
        • 따라서, 두 번째 layer의 경우, 실제로 5 X 5의 receptive field를 가지게 됨
      • 마지막 layer도, 각 뉴런이 두 번째 layer 출력의 3 X 3 만큼 봄
      • 이 과정을 피라미드처럼 그려보면, 결국 입력 레이어의 7 X 7을 보게 됨
    • 따라서, 3 X 3 filter를 사용하게 되면, 실질적인 receptive field는 7 X 7
    • 즉, 7 X 7 filter를 사용하는 것과 동일한 receptive field를 보게 됨

  • 결국, 3 X 3 filter를 3개 사용하게 되면, 7 X 7 filter와 실질적으로 동일한 receptive field를 가지면서, 더 깊은 layer를 쌓을 수 있음
    • 더 깊게 쌓기 때문에, non-linearity를 추가할 수 있고, 파라미터 수도 더 적어짐
      • 3 X 3 X C filter = 9 X C params
      • 3 X 3 X C filter 3 = 9 X C params 3 = 27 X C params
      • 7 X 7 X C filter = 49 X C params

  • VGGNet은 ImageNet 2014 Classification Challenge에서 2등
    • 학습 과정은 AlexNet과 유사
      • 다만, local response nermalization은 사용하지 않음
        • 크게 도움이 되지 않기 때문
    • VGG16과 VGG19는 아주 유사함
      • VGG19가 조금 더 깊을 뿐
      • 따라서, VGG19가 성능이 조금 더 좋긴 하지만, 그만큼 메모리도 조금 더 씀
      • 보통 VGG16을 더 많이 사용함
    • AlexNet처럼 모델 성능을 위해서 ensemble 기법을 사용
    • VGG의 마지막 FC layer인 FC7은 ImageNet 1000 class 바로 직전에 위치한 layer
      • 이 FC7은 4096 사이즈의 layer인데, 아주 좋은 feature representation을 가지고 있는 것으로 알려져 있음
      • 다른 데이터에서도 feature 추출이 잘 되며, 다른 task에서도 일반화 능력이 뛰어난 것으로 알려져 있음

  • 다음으로는, ImageNet 2014 Classification Challenge 우승인 GoogLeNet

  • GoogLeNet도 엄청 깊은 network
    • 22개의 layer를 가지고 있음
    • GoogLeNet의 가장 중요한 점은, 효율적인 계산에 관한 특별한 관점이 있다는 것높은 계산량을 아주 효율적으로 수행하도록 network를 디자인했다는 점
      • GoogLeNet은 inception module을 사용함
      • Inception module을 여러개 쌓아서 사용
      • FC-layer가 없음 (파라미터를 줄이기 위함)
      • 전체 파라미터 수가 5M 정도 (AlexNet=60M)

  • 연구자들은 ‘A good local network topology’를 디자인하길 원했음
    • 그리고, ‘network within a network’라는 개념으로 local topology를 구현했고, 이를 쌓아올림

  • 이 local network를 Inception Module이라고 함
    • Inception module 내부에는 동일한 입력을 받는, 서로 다른 다양한 filter들이 병렬로 존재
      • 이미지 내 다양한 feature를 추출하기 위해, 다양한 size의 filter를 병렬적으로 사용
    • 이전 layer로 부터 입력을 받아서 다양한 Conv 연산을 수행
      • 1 X 1 / 3 X 3 / 5 X 5 Conv에 pooling도 있음
      • 여기서 pooling은 3 X 3 pooling
      • Inception module 내부의 각 layer에서 각각의 출력 값들이 나오는데, 이를 모두 Depth 방향으로 합침 (concatenate)
      • 이렇게 합치면, 하나의 tensor로 출력이 결정되고, 이를 다음 layer로 전달하는 것

  • Inception module이 다양한 연산을 수행하고, 이를 하나로 합쳐준다는 단순한 방식(naive way)을 살펴봤는데, 이 방법의 문제는 무엇일까?
    • 예제를 보면, 128개의 1 X 1 filter가 있고, 192개의 3 X 3 filter, 96개의 5 X 5 filter가 존재
    • modelu의 input은 28 X 28 X 256
    • stride를 조절하여 입/출력 간의 spatial dimention을 유지
    • Q1. 이 경우에 1 X 1 X 128 Conv의 출력은 어떻게 될까?
      • 출력은 28 X 28 X 128

  • 같은 방식으로 각 필터의 출력 값을 계산해보면,
    • input size = 28 X 28 X 256
    • 1 X 1 Conv → 28 X 28 X 128
    • 3 X 3 Conv → 28 X 28 X 192
      • 사이즈 유지를 위한 zero padding 진행
    • 5 X 5 Conv → 28 X 28 X 96
      • 사이즈 유지를 위한 zero padding 진행
    • pooling layer → 28 X 28 X 256
      • input의 depth가 변하지 않음
  • 모든 출력 값들을 concat한 사이즈를 계산해보면,
    • 28 X 28은 동일하고, depth가 점점 쌓이게 됨
    • 즉, module의 출력은 28 X 28 X (128 + 192 + 96 + 256)
      • 28 X 28 X 672
  • Inception module의 입력이 28 X 28 X 256 이었으나, 출력은 28 X 28 X 672
    • 즉, spatial dimension은 변하지 않았지만, depth가 엄청나게 늘었음

  • 각 레이어의 연산량을 살펴보면,
    • 1 X 1 Conv
      • 각 픽셀마다 1 X 1 X 256의 내적을 수행
      • 따라서, 각 픽셀 당 256번의 곱셈 연산 수행
      • 입력의 픽셀은 총 28 X 28이고, filter의 개수는 256
      • 따라서, 전체 연산량은 28 X 28 X 128 X 1 X 1 X 256
    • 3 X 3 Conv → 28 X 28 X 192 X 3 X 3 X 256
    • 5 X 5 Conv → 28 X 28 X 96 X 5 X 5 X 256
    • 따라서, inception module 하나의 연산량은 854M
      • 연산량이 매우 많음
  • 또한, pooling layer는 입력의 depth를 그대로 유지하기 때문에, 문제를 악화시킴
    • layer를 거칠때마다 depth가 점점 늘어남

  • GoogLeNet에서 사용한 key insight는 bottleneck layer를 사용하는 것
    • Conv 연산을 수행하기 전에 입력을 더 낮은 차원으로 보내는 것

  • 1 X 1 Conv를 다시 살펴보면,
    • 1 X 1 Conv는 각 spatial location에서만 내적을 수행
    • 따라서, 입력의 depth만 줄일 수 있음
      • 입력의 depth를 더 낮은 차원으로 projection
    • Input feature map들 간의 선형 결합이라고 할 수 있음

  • 주요 아이디어는 입력의 depth를 줄이는 것
    • 3 X 3 Conv / 5 X 5 Conv 이전에 1 X 1 Conv를 추가
    • 3 X 3 Max Pooling 이후에 1 X 1 Conv 추가
    • 각 layer의 연산량은 1 X 1 Conv를 통해 줄어듦
    • 즉, 1 X 1 Conv가 bottleneck layer의 역할로 추가되는 것

  • Bottleneck layer가 추가되었을 때 연산량을 살펴보면,
    • 입력은 이전과 동일한 28 X 28 X 256
    • 1 X 1 Conv 3 (bottleneck) → 28 X 28 X 64 X 1 X 1 X 256 3
      • 이 출력 값이 3 X 3 Conv, 5 X 5 Conv로 전달
    • 1 X 1 Conv → 28 X 28 X 128 X 1 X 1 X 256
    • 3 X 3 Conv → 28 X 28 X 192 X 3 X 3 X 64
      • 입력: 28 X 28 X 64
    • 5 X 5 Conv → 28 X 28 X 96 X 5 X 5 X 64
      • 입력: 28 X 28 X 64
    • 전체 연산량은 358M으로, 기존의 854M 보다 훨씬 줄어든 셈
  • Inception module의 출력 depth도 기존의 672에서 480으로 훨씬 줄었음
  • Inception module에서 1 X 1 Conv를 사용하는 기본적인 이유는, 계산복잡도를 조절하기 위함

  • GoogLeNet은 Inception module들을 쌓아 올려서 구성

  • GoogLeNet을 더 깊게 알아보면,
    • GoogLeNet의 앞단(stem)은 일반적인 network 구조
    • 처음에는 Conv-Pooling을 몇 번 반복
    • 이 후, inception module이 쌓이는데, 모두 조금씩 다름
    • 마지막에는 classifier 결과를 출력

  • GoogLeNet은 FC layer를 대부분 제거했고, 파라미터가 줄어도 모델이 잘 동작함을 확인함

  • GoogLeNet 모델에서 추가적인 줄기가 존재
    • 이들은 보조분류기(auxiliary classifier)
    • 우리가 알고 있는 형태의 작은 mini network
      • Average pooling과 1 X 1 Conv가 있고, FC layer도 있음
      • 그리고 SoftMax로 1000개의 ImageNet class를 구분
      • 또한, 이곳에서도 ImageNet train set loss를 계산함
        • Network의 끝 부분에서만 loss를 구하는 것이 아니라, 이 두 곳에서도 loss를 구하는 이유는 network가 깊기 때문
    • 보조분류기를 중간 layer에 달아주면, 추가적인 gradient를 얻을 수 있음
      • 따라서, 중간 layer의 학습을 도울 수 있음

  • 전체 architecture의 모습을 보면,
    • 가중치를 가진 layer는 총 22개
    • 각 inception module은 1 X 1 / 3 X 3 / 5 X 5 Conv layer를 병렬적으로 가지고 있음

  • GoogLeNet은
    • 효율적인 inception module을 사용하고, FC layer를 제거
    • AlexNet보다 12배 작은 파라미터를 가지고 있음

  • 다음으로는 2015년 우승 모델인 ResNet
    • ResNet은 혁명적으로 network가 깊어진 모델 (152 layer)

  • ResNet architecture는 엄청나게 깊은 network
    • ResNet은 residual connection 이라는 방법을 사용
    • ImageNet data를 분류하기 위해, ResNet은 152개의 layer를 가지고 있음

  • ResNet과 residual connection의 기본 motivation은,
    • 그들이 처음 시작한 질문은, 일반적인 CNN을 깊게 쌓으면 어떤 일이 발생할지 였음
      • 가령, VGG에서 Conv - Pooling layer를 깊게만 쌓는다고 성능이 더 좋아질 것인가?
      • 답은 NO
  • network가 깊어지면, 어떤 일이 발생하는지 살펴보면,
    • 위 그림에서 20 layer와 56 layer network를 비교해보면,
      • 두 모델은 plain CNN
      • 오른쪽의 test error의 경우, 56 layer가 20 layer보다 안좋음
      • 왼쪽의 training error 또한, 56 layer가 20 layer보다 안좋음
        • training에서는, 50 layer network가 더 많은 파라미터를 가지기 때문에, overfitting이 될 것이라고 예상할것임
        • 그리고, overfitting이 발생한다면, test error는 높더라도, training error는 아주 낮아야 정상
        • 즉, 더 깊은 모델임에서 test 성능이 낮은 이유가 overfitting 때문이 아니라는 것을 알 수 있음 (실제 논문에서는 이 문제를 degradation problem이라고 표현)

  • ResNet 저자들이 내린 가설은,
    • 더 깊은 모델 학습 시, optimization에 문제가 생긴다는 것
      • 즉, 모델이 깊어질수록 최적화가 어렵다는 가설
    • 그들은, “모델이 더 깊다면, 적어도 더 얕은 모델만큼은 성능이 나와야 하지 않은지”라고 추론
    • 가령, 다음과 같은 해결책을 고려할 수 있음
      • 더 얕은 모델의 가중치를 깊은 모델의 일부 layer에 복사
      • 그리고 나머지 layer는 identity mapping을 진행 (input을 output으로 그냥 전달)
      • 깊은 모델의 학습이 제대로 안되더라도, 적어도 얕은 모델 만큼의 성능은 보장됨

  • 이 motivation을 모델에 적용시키려면, architecture를 어떻게 디자인 해야할지?
    • 저자들의 아이디어는, layer를 단순하게 쌓지 않는 것
      • Direct mapping 대신에, Residual mapping을 하도록 블럭을 쌓음
    • 오른쪽 그림에서,
      • 입력은 이전 layer에서 흘러 들어온 것
      • 그리고 layer가 직접 H(x)H(x)를 학습하기 보단, H(x)xH(x)-x를 학습할 수 있도록 만들어 줌
      • 이를 위해서, skip connection을 도입 (오른쪽 고리 모양)
      • Skip connection은 가중치가 없고, 입력을 identity mapping으로 그대로 출력으로 전달
      • 실제 layer는 변화량(delta)만 학습하면 됨
      • 즉, 입력 x에 대한 잔차(residual)이라고 할 수 있음
      • 따라서, 최종 출력 값은 x + residual
    • 이 방법을 이용하면, 학습이 더 쉬워짐
      • 가령, input = output 이어야 하는 상황이라면,
      • layer의 출력인 F(x)가 0이어야 하므로 (residual=0), 모든 가중치를 0으로 만들어주면 그만
      • 쉽게 출력을 identity로 만들어 줄 수 있는 것
      • 결국, network는 residual만 학습하면 그만
      • 출력 값도 결국엔 입력 x에 가까운 값
    • F(x) + x 가 의미하는 것은 무엇인지?
      • H(x)=F(x)+xH(x) = F(x) + x
      • 기존의 모델은, H(x)를 직접 학습하는 방식
        • 이는 깊은 network에서 잘 학습시키기 어려움
      • 따라서, ResNet은 F(x)를 학습시키는 방법을 선택
        • 즉, H(x)를 직접 학습하는 대신, x에 얼마를 더하고 빼야할지를 학습
        • Residual을 배우는 것이 쉬울 것이라고 생각함
        • 단순하게, 입력 값을 어떻게 수정해야 하는지를 배운다고 보면 됨
      • 즉, F(x)는 residual(잔차)
        • F(x)=0F(x)=0 이 되도록 학습을 진행

  • ResNet의 전체 architecture를 보면,
    • 하나의 residual block은 2개의 3 X 3 Conv layer로 구성되어 있음
      • 이렇게 구성해야 잘 동작하는 것으로 알려져 있음
    • ResNet은 150 layer까지 쌓아 올릴 수 있음
    • 주기적으로 filter를 2배씩 늘리고, stride=2를 사용하여 downsampling을 수행
    • Network의 초반에는 Conv layer가 추가적으로 붙음
    • Network의 끝에는 FC layer가 없음
      • 대신, Global Average Pooling Layer를 사용
      • GAP은 하나의 Map 전체를 average pooling 함
    • 마지막에는 1000개의 class 분류를 위한 노드가 붙음
  • ResNet은 아주 심플하면서 세련된 모델
    • Residual block을 하나씩 쌓아 올리는 구조

  • ResNet 모델의 depth는 34, 50, 100까지 늘어남
    • 논문에서는 ImageNet 문제를 위해 152까지 늘림

  • 추가적으로, depth가 50 이상일 때, bottleneck layer를 도입
    • 이는 GoogLeNet에서 사용한 방법과 유사
    • Bottleneck layer는 1 X 1 Conv를 도입하여, 초기 filter의 depth를 줄임
      • 가령, 입력이 28 X 28 X 256일 때, 1 X 1 Conv를 적용하면, depth가 줄어들어서 28 X 28 X 64가 됨
      • 이로 인해, 3 X 3 Conv의 연산량이 줄어듦
      • 그 후, 뒤에 다시 1 X 1 Conv를 추가해서 depth를 다시 256으로 늘림

  • 실제 ResNet은 모든 Conv layer 다음 Batch Norm을 사용
  • 초기화는 Xavier initialization을 사용
    • 단, scaling factor를 추가함 (2로 나눔)
      • 이 방법은, SGD Momentum에서 좋은 초기화 성능을 보임
  • learning rate는 learning rate 스케줄링을 통해서, validation error가 줄어들지 않는 시점에서 조금씩 줄여줌
  • Minibatch 사이즈는 256
  • Weight decay도 적용함
  • Dropout은 사용하지 않음

  • 실험 결과를 보면, 성능의 열화 없이 very deep network를 잘 학습시킴
    • ImageNet 학습을 위해서, 152 layer까지 시도
    • Cifar-10으로는 1200 layer까지 늘림
  • Network가 깊어질수록, training error는 더 줄어든 것을 알 수 있음
    • 깊은 network에서 training error가 더 높아지는 경우는 없었음

  • ResNet은 최근에 사람들이 많이 사용하는 network

  • 모델 별 complexity를 살펴보면,
    • 왼쪽 그래프는 모델의 성능 별로 정렬
      • 지금까지 우리가 본 모델이거나, 조금 변형된 모델들
    • 오른쪽 그래프는 계산 복잡성이 추가된 그래프
      • VGGNet이 가장 효율성이 낮음
        • 메모리도 많이 잡아먹고, 연산량도 많음
      • GoogLeNet이 가장 효율적인 network
        • 연산량도 매우 적고, 메모리 사용량도 적음
      • AlexNet은 accuracy가 낮음
        • 연산량은 작지만, 메모리 사용량은 아주 비효율적
      • ResNet은 적당한 효율성을 가지고 있음
        • 메모리 사용량, 연산량은 중간 정도
        • 그러나, accuracy는 최상위

  • 왼쪽 그래프는 forward pass 시간 (단위: ms)
    • VGG가 가장 오래 걸림
  • 오른쪽 그래프는 전력소모량

  • Network in Network (2014)
    • 기본 아이디어는, MLP Conv layer
      • network 안에 작은 network를 삽입
      • 각 Conv layer 안에 MLP(Multi-Layer Perceptron)를 쌓음
        • FC layer를 몇 개 쌓는 것
    • 맨 처음에는 기존의 Conv layer가 있고, FC layer를 통해 abstract feature를 잘 뽑을 수 있도록 함
    • 단순히 Conv filter만 사용하지 말고, 조금 더 복잡한 계층을 만들어서 activation map을 얻어보자는 아이디어
    • NIN에서는 기본적으로 FC layer를 사용
      • 이를 1 X 1 Conv layer라고도 함
    • NIN은 GoogLeNet과 ResNet보다 먼저 bottleneck 개념을 정립했기에 의미있는 아이디어임

  • 다음은 ResNet과 관련된 일련의 연구들
    • ResNet의 성능을 향상시킨 연구들
  • 2016년 ResNet 저자들은, ResNet의 block 디자인을 향상시킨 논문을 발표함
    • 이 논문에서는, ResNet block path를 조절
    • 새로운 구조는 direct path를 늘려서, 정보들이 앞으로 더욱 더 잘 전달되고 backpropagation도 더 잘 될 수 있게 개선함

  • Wide Residual Network라는 논문도 있음
    • 기존의 ResNet 논문은 깊게 쌓는 것에 초점을 맞췄지만, 사실 중요한 것은 depth가 아닌 residual 이라고 주장
      • Residual connection이 있다면, network가 굳이 깊어질 필요가 없다고 주장함
    • 그래서, residual block을 더 넓게 만들었음
      • 즉, Conv layer의 filter를 더 많이 추가함
      • 기존의 ResNet block 당 F개의 filter 대신, F * K 개의 filter를 구성
    • 각 layer를 넓게 구성했더니, 50 layer만 있어도 152 layer의 기존 ResNet 보다 성능이 더 좋다는 것을 입증함
    • 추가적으로, depth 대신 filter의 width를 늘리면 추가적인 이점이 있음
      • 계산 효율이 증가함
        • 병렬화가 더 잘되기 때문에
      • Network의 depth를 늘리는 것은 sequential한 증가
        • 따라서, Conv의 filter를 늘리는 것(width)이 더 효율적

  • ResNeXt
    • ResNet 저자들이 쓴 논문
    • Residual block의 width에 초점
      • filter의 수를 늘림
    • 각 residual block 내에 다중 병렬 경로를 추가
    • pathway의 총 합을 cardinality라고 부름

  • Stochastic Depth
    • Network가 깊어질수록, gradient vanishing 문제가 발생
      • 깊은 network에서 gradient를 뒤로 전달할수록 점점 gradient가 작아지는 문제
    • 기본 아이디어는, train time에 layer의 일부를 제거
      • 얕은 network는 학습이 더 잘 될 수 있기 때문에
      • 일부 network를 골라, identity connection으로 만듦
    • Dropout과 유사

  • FractalNet
    • 저자들은 residual connection이 쓸모없다고 주장
      • FractalNet architecture에는 residual connection이 없음
    • shallow/deep network의 정보 모두를 잘 전달하는 것이 중요
      • 따라서, FractalNet은 그림과 같이 fractal 구조를 가짐
      • shallow/deep 경로를 출력에 모두 연결
      • train time에서는, dropout처럼 일부 경로만 이용해서 학습

  • DenseNet
    • Dense block이 존재
      • 한 layer가 그 layer의 하위 모든 layer와 연결되어 있음
      • network의 입력 이미지가 모든 layer의 입력으로 들어감
      • 모든 layer의 출력이 각 layer의 출력과 concat
      • 이 값이 각 Conv layer의 입력으로 들어감
        • 이 과정에서 dimention을 줄여주는 과정이 포함
    • Dense connection이 gradient vanishing 문제를 완화시킬 수 있다고 주장
      • 또한, Dnese connection이 feature를 더 잘 전달하고, 더 잘 사용할 수 있게 해줌
        • 각 layer의 출력이, 다른 layer에서도 여러번 사용될 수 있기 때문

  • SqueezeNet
    • 효율성에 치중한 network
    • fire module이라는 것을 도입
      • fire module의 구성 중, squeeze layer는 1 X 1 filter들로 구성
      • 출력 값이 1 X 1 / 3 X 3 filter들로 구성되는 expand layer의 입력이 됨
    • ImageNet에서, AlexNet 만큼의 accuracy를 보이지만, 파라미터는 50배 적음
      • SqueezeNet을 더 압축하면, AlexNet보다 500배 더 작아짐
profile
코딩하는 물리학도

0개의 댓글