[CS231n] Lecture 9: CNN Architectures 정리
- 최신 CNN Architecture들에 대해서 배울 예정
- 예전에 LeNet을 다룬 적이 있음
- LeNet은 산업에서 성공적으로 적용된 최초의 ConvNet
- 이미지를 입력으로 받아 stride=1인 5X5 필터를 거치고, 몇 개의 Conv layer와 pooling layer를 거침
- 간단한 모델이지만, 숫자 인식에서 엄청난 성공을 거뒀음
- 이후, 2012년에는 AlexNet이라는 모델이 나왔음
- 최초의 Large scale CNN
- ImageNetClassification task를 아주 잘 수행했음
- 기존의 non-deep learning 모델들을 능가하는 성능을 보임
- 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로 되어 있음
- 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의 출력은 어떻게 될까?
- 같은 방식으로 각 필터의 출력 값을 계산해보면,
- 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
- 모든 출력 값들을 concat한 사이즈를 계산해보면,
- 28 X 28은 동일하고, depth가 점점 쌓이게 됨
- 즉, module의 출력은 28 X 28 X (128 + 192 + 96 + 256)
- 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
- 5 X 5 Conv → 28 X 28 X 96 X 5 X 5 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)−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)+x
- 기존의 모델은, H(x)를 직접 학습하는 방식
- 이는 깊은 network에서 잘 학습시키기 어려움
- 따라서, ResNet은 F(x)를 학습시키는 방법을 선택
- 즉, H(x)를 직접 학습하는 대신, x에 얼마를 더하고 빼야할지를 학습
- Residual을 배우는 것이 쉬울 것이라고 생각함
- 단순하게, 입력 값을 어떻게 수정해야 하는지를 배운다고 보면 됨
- 즉, F(x)는 residual(잔차)
- F(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)
- 오른쪽 그래프는 전력소모량
- Network in Network (2014)
- 기본 아이디어는, MLP Conv layer
- network 안에 작은 network를 삽입
- 각 Conv layer 안에 MLP(Multi-Layer Perceptron)를 쌓음
- 맨 처음에는 기존의 Conv layer가 있고, FC layer를 통해 abstract feature를 잘 뽑을 수 있도록 함
- 단순히 Conv filter만 사용하지 말고, 조금 더 복잡한 계층을 만들어서 activation map을 얻어보자는 아이디어
- NIN에서는 기본적으로 FC layer를 사용
- NIN은 GoogLeNet과 ResNet보다 먼저 bottleneck 개념을 정립했기에 의미있는 아이디어임
- 다음은 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에 초점
- 각 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배 더 작아짐