CS231n Lecture9 Review
23 Aug 2022 | CS231n
해당 게시물은 Standford 2017 CS231n 강의와 2022년 슬라이드를 바탕으로 작성되었습니다.
Last Time: Components of Convolutional Networks
- 앞 강의에서 CNN을 구성하기 위한 여러가지 components들을 살펴보았습니다.
- 그렇다면 components들을 어떻게 조합을 해야 성능이 좋을지, 역사적으로 어떻게 구성해왔는지에 대해 알아보겠습니다.
Today: CNN Architectures
- 여러 네트워크 중 ImageNet Classification Task 에서 좋은 성능을 보였던 대표적인 CNN Architectures들 (AlexNet, VGG, GoogLeNet, ResNet) 에 대해 살펴보겠습니다.
- 역사적인 관점에서 아주 흥미로운 모델들, 그리고 아주 최신의 모델들도 다룹니다.
LeNet-5(1998)
- 앞 강의에서 LeNet을 다룬 적이 있었지만, 조금 더 자세히 살펴보겠습니다.
- LeNet 은 Convolution layer가 성공적으로 적용된 최초의 ConvNet 입니다.
- 슬라이드에서 볼 수 있듯, 이미지를 입력으로 받아서 stride = 1 인 5 x 5 필터를 거치고, 몇 개의 Conv Layer와 pooling layer를 거쳐, 끝 단에 FC Layer가 붙습니다.
- Conv - ReLU - Pool(downsampling) 전체 N번 반복 합니다.
- Cout x H x W를 한 줄로 펴줍니다.
- FC - ReLU 전체 N번 반복 합니다., 마지막 output은 c차원 입니다.
- LeNet은 digit recognition task에서 우수한 성능을 보였습니다.
- LeNet-5의 구조를 살펴보는데, 구조는 동일하나 각 component의 구성이 바뀐버전을 살펴보겠습니다.
- 원본 구조는 논문에 있습니다.
- 우선 Input 이미지는 grayscale 이므로 채널은 1입니다.
- Filter 사이즈는 1 x 5 x 5, filter 20개.
- P를 조정해서 output size가 같도록 만들어줍니다.
- ReLU로 nonlinear를 취해줍니다.
- K=2, s=2로 주고 크기를 반으로 다운샘플링 시킵니다.
- [Conv, ReLU, Pool] 1회
- Filter 사이즈는 20 x 5 x 5, filter 50개.
- P를 조정해서 output size가 같도록 만들어줍니다.
- ReLU로 nonlinear를 취해줍니다.
- K=2, s=2로 주고 크기를 반으로 다운샘플링 시킵니다.
- [Conv, ReLU, Pool] 2회
- 50 x 7 x 7 = 2,450를 flatten 시킵니다.
- FC-Layer를 적용해서, Input은 2450, Output은 500이 되도록 만들어주고, ReLU를 취해줍니다.
- FC를 적용하여, Input은 500, Output은 10이 되도록 만들어줍니다.
- $y ∈ {0, 1, …, 9}$ 라면, $f(x;W): ℝ^{1 x 28 x 28} → ℝ^{10}$ 입니다.
- 정리하면 네트워크를 통과할때 다음과 같이 진행됩니다.
- pooling or stride를 사용하여 Spatial size가 감소합니다.
- channel의 수가 증가됩니다.
- 현대의 architectures들은 점차 이러한 구조를 breaking 하고 있습니다. 이후의 architectures들을 살펴봄으로써 발전양상을 살펴보겠습니다.
AlexNet(2012)
- ILSVRC 를 remind해보면, ImageNet 데이터셋은 클래스 1000개, training set이 130만개, test set이 10만개로 구성되어있는 DataSet입니다.
- 2011년도 까지는 rule-based 방법으로, edge들을 직접 추출한 후, linear classifier를 얹어서 모델을 만들었습니다.
- 하지만 2012년, AlexNet 은 Conv layer를 깊게 쌓은 최초의 대규모 CNN 구조로, 2012년 ImageNet Classification task 에서 엄청난 격차를 보여주면서 Convolution Network는 컴퓨터 비전의 전면에 서게 되었습니다.
- AlexNet은 현재까지 약 50,000번 인용되었는데, CNN아키텍쳐 구성 방법에 영향을 많이 미쳤음을 알 수 있습니다.
- 위 슬라이드는 AlexNet의 전체 architectures구조 와, 각 Layer components, Details 입니다.
- AlexNet은 CNN을 깊게 쌓은 심층신경망 형태입니다.
- 모델 구조는 다음과 같습니다.
- 227x227 크기의 입력 이미지
- 논문의 그림에서는 input size가 224×224×3 으로 표시되어 있는데 오류입니다. 사실 input size 는 227×227×3 입니다.
- 5개의 Convolutional layer + Max pooling layer
- 3개의 Fully connected layer
- 마지막 층은 softmax를 거쳐 최종적으로 1000개의 class로 분류합니다.
- ReLU Activation function
- AlexNet의 몇가지 큰 특징 은 다음과 같습니다.
- AlexNet이 ReLU nonlinear activation function을 사용한 첫번째 Neural Network입니다.
- 채널간 Local response normalization이라는 정규화 방법을 사용하였습니다.
- 현재는 Batch Normalization을 주로 사용합니다.
- 당시에는 GPU의 메모리가 부족(3GB)해서 모델을 2개의 GPU에 병렬적으로 분리해서 학습을 수행하였습니다.
- filpping, jittering, cropping, color normalization 등의 다양한 data augmentaion 을 적용했습니다.
- 강의에서의 질문에 대한 답을 찾겠습니다.
- $227 × 227 × 3$ size의 input 이미지가 네트워크에 들어갔을때 첫 conv layer (CONV1: 96 11x11 filters applied at stride 4) 를 통과한 output size 는 어떻게 될까?
- 하나의 필터에서 나오는 output size는 $(227 − 11) / 44 + 1 = 55$ 임을 알 수 있습니다. 또한 필터의 갯수가 96 개이므로 총 output size는 $55 × 55 × 96$ 입니다.
- 이때, 첫번째 conv layer의 총 parameter 갯수는 어떻게 될까?
- conv layer의 파라미터수는 filter size x filter depth x filter 개수로, $(11 × 11 × 3 + 1) × 96$ 개의 파라미터를 가집니다.
- 첫번째 conv layer를 거쳐 나온 $55 × 55 × 96$ size의 feature map을 Pooling layer (POOL1: 3x3 filters applied at stride 2) 에 넣어서 만들어진 output size 는 어떻게 될까?
- 하나의 filter 에서 $(55 − 3) / 2 + 1 = 27$ size의 output이 생성되고 pooling layer는 input의 channel(depth)은 그대로 유지함으로써 총 output size는 $27 × 27 × 96$ 입니다.
- 이때, Pooling layer의 총 parameter 갯수는 어떻게 될까?
- pooling layer는 단순히 pooling하는 과정(ex. max pooling) 이므로 학습시킬 파라미터가 없습니다.
params & memory & flop
앞에서 layer 및 parameter 계산법에 대해 알아보았는데, 조금 더 자세하게 memory와 flop의 관점까지 바라보는 과정을 진행해보겠습니다. 본 과정은 AlexNet의 구조를 따라가되, 일부 Layer의 수가 수정된 구조입니다.
- 이제 AlexNet의 layer들이 어떻게 쌓여있는지 살펴보겠습니다.(일부 변형됨.)
- Conv1 Layer의 Input size는 $227 × 227$ 이며, 3개의 Channel을 가집니다.
- $C_{out} = 64, K = 11, S = 4, P = 2$ 입니다.
- Output channels은 filters의 수와 같습니다.
- $C_{out} = 64$ 이므로, output size의 $C$도 64입니다.
- 위 수식대로 입력하면 $H$와 $W$ 는 56입니다.
- $(Input\ width - Kernel\ size + 2 × Padding) / Stride + 1 = (227 - 11 + 2 × 2) / 4 + 1 = 56$
- 즉 Kernel size, stride, pad에 의해 output의 $H$와 $W$가 결정 됩니다.
- Conv1의 출력을 저장하기 위한, Output이 차지하는 Memory 공간 은 다음과 같이 계산할 수 있습니다.
- output의 원소 개수 는 $Channel × Height × Width$ 이므로, $64 × 56 × 56 = 200,704$ 개 입니다.
- 한 원소당 32-bit floating point 크기 를 가진다고 할때, 4 byte의 크기를 가집니다.
- 따라서, Output이 차지하는 Memory 공간을 계산하기 위해서는 다음과 같이 계산합니다.
- $(number\ of\ elements) × (bytes\ per\ element) / 1024 = 200,704 × 4 / 1024 = 784KB$
- 즉 output을 저장하기 위해서는 784KB가 필요합니다.
- Conv1가 가지는 Parameter의 수 를 계산하기 위해서는 layer를 다시 살펴보아야 하는데, 다음과 같이 계산할 수 있습니다.(Filter가 학습되는 파라미터)
- (number of filter x input channel x kernel size x kernel size) + bias 로 계산할 수 있습니다.
- Weight 는 $Output\ Channel\ 수 × Input\ Channel\ 수 × Kernel\ size × Kernel\ size$ 이므로, $64 × 3 × 11 × 11$ 입니다.
- Bias 는 Output Channel의 수와 같으므로, 64입니다.
- 따라서, 총 파라미터 수는 $(64 × 3 × 11 × 11) + 64 = 23,296$ 개 입니다.
- Conv1의 계산에 필요한 floating point(부동소수점) 연산의 수 는 다음과 같이 계산할 수 있습니다.
- Neural Network에서는 (multiply 한번 + add 한번) 을 한번의 floating point 연산 이라고 계산합니다.
- 예를 들어, 크기가 3인 두 벡터의 내적은 element-wise 곱셈 3번 수행 후 3번의 덧셈을 수행해서 출력하게 되는데, 이때의 floating point 연산은 3번이라고 계산하는 것입니다.
- 이는 Output의 총 원소 수 x 각 원소를 계산하기 위한 연산의 수 이므로, $(Output\ Channel × Output\ Height × Output\ Width) × (Input\ Channel × Kernel\ size × Kernel\ size)$ 로 구할 수 있습니다.
- 따라서, $(64 × 56 × 56) × (3 × 11 × 11) = 72,855,552flops$ 입니다.
- Conv1 계산 후에 ReLU nonlinear activation function를 적용합니다.
- 이후 Pool1 layer를 적용합니다.
- Channel은 그대로 유지하며, 가로 세로는 down sampling 됩니다.
- Pooling 레이어에서는 $C_{out} = C_{in}$ 이므로, 64입니다.
- Output Width(=Height)는 kernel, stride, input size에 의해 결정 됩니다.
- $(Input\ width - Kernel\ size) / Stride + 1 = 53 / 2 + 1 = 27.5$
- 위 결과에서, 소숫점 이하의 값을 내림 해주면 27이 됩니다.
- Pool1의 출력을 저장하기 위한, Output이 차지하는 Memory 공간 은 다음과 같이 계산할 수 있습니다.
- output의 원소 개수는 $Channel × Height × Width$ 이므로, $64 × 27 × 27 = 46,656$ 개 입니다.
- 한 원소당 32-bit floating point 크기를 가진다고 할때, 4 byte의 크기를 가집니다.
- 따라서, Output이 차지하는 Memory 공간을 계산하기 위해서는 다음과 같이 계산합니다.
- $(number\ of\ elements) × (bytes\ per\ element) / 1024 = 46,656 × 4 / 1024 = 182.25KB$
- 즉 output을 저장하기 위해서는 182.25KB가 필요합니다.
- Pool1는 learnable parameter가 없습니다.
- Pool1의 계산에 필요한 floating point(부동소수점) 연산의 수 는 다음과 같이 계산할 수 있습니다.
- Pooling Layer에서는 출력 후 채널별로 더해주는 연산이 없기 때문 에, 식은 $(Output\ Channel × Output\ Height × Output\ Width) × (Kernel\ size × Kernel\ size)$ 가 됩니다.
- 따라서, $(Output\ Channel × Output\ Height × Output\ Width) × (Kernel\ size × Kernel\ size) = (64 × 27 × 27) × (3 × 3) = 419,904 flops$ 입니다.
- Convolutional layer에 비해 현저히 적습니다.
- Conv Layer와 pooling Layer들을 여러번 통과 후에, Fully-Connected Layer와의 연결을 위해 Flatten시킵니다.
- 즉, 입력을 모두 1차원 벡터로 펼쳐주는 연산을 수행하게 됩니다.
- 이러한 연산을 수행하는 layer를 Flatten layer이라고 하며, 단순히 펼치는 작업 뿐이므로 학습되는 파라미터와 flop은 없습니다.
- 따라서, 출력은 $Input\ Channel × Height × Width = 256 × 6 × 6 = 9216$ 이 됩니다.
- Flatten layer를 통과한 1차원 벡터는 Fully Connected layer에 입력으로 들어가게 됩니다.
- FC6에 대한 파라미터 개수는 weight matrix의 크기와 같습니다.
- 따라서 $input의\ 채널\ 수 × output의\ 채널\ 수 + bias term$ 입니다.
- FC6에 대한 부동소수점 연산의 수는, 내적을 각 행마다 연산을 하는데(9216번), $W$ 의 행 개수가 4096이므로, $9216 × 4096 = 37,748,736$ 이 됩니다.
- 그리고 마지막 Fully connected layer는 1000개의 category에 대한 score를 출력하게 됩니다.
- 마지막 FC 레이어의 output은 ImageNet 데이터셋의 class가 1000개이기 때문에 1000개로 맞춰줍니다.
- AlexNet의 모델 구성(위 슬라이드의 빨간색 박스)은 단지 Trial and error를 통해 가장 성능이 좋았을 때의 모델 구성일 뿐입니다.
- 초록색 박스 부분을 보면, 네트워크를 통과하며 메모리, 파라미터, flop이 감소하게 되는 것을 볼 수 있는데, 이는 AlexNet뿐만 아니라, 여러 CNN에서도 따르고 있는 trend입니다.
- AlexNet에서의 메모리, 파라미터, flops에 대한 설명을 정리하면 다음과 같습니다.
- Memory는 Conv layer가 더 많은 부분을 차지합니다.
- 초기 Input은 픽셀 수가 높기(이미지 해상도가 높기) 때문입니다.
- Parameter의 수는 FC layer가 더 많습니다.
- 학습할 양이 많기 때문입니다.
- Flops(부동소수점 연산량)은 대부분 Conv layer가 더 많은 연산을 수행합니다.
- 즉 Conv레이어를 쌓을 때 연산 부담이 커집니다.
- 추가적으로 AlexNet은 대체로 다른 Conv Net의 다이어그램과 유사하긴 하지만, 분산처리(모델이 두개로 나눠진 구조) 를 했다는 차이점이 있습니다.
- AlexNet을 학습할 당시에 GTX580으로 학습시켰는데, 메모리가 3GB 밖에 없어서 전체 레이어를 GPU에 다 넣을 수 없었기 때문에 네트워크를 GPU에 분산시켜서 학습하였습니다.
- 따라서 모델을 2개로 나누어 두 개의 GPU가 각각 절반의 뉴런, feature map를 가지는 구조로 학습이 되었습니다.
- 따라서 위의 그림을 보면 첫번째 conv layer 를 나온 output size가 $55 × 55 × 96$ 이 아닌 $55 × 55 × 48$ 이 되어있는 모습을 확인할 수 있습니다.
- 따라서 위 그림과 같이 CONV1, CONV2, CONV4, CONV5에서는 오직 절반의 feature map으로만 연산을 합니다.
- CONV3, FC6, FC7, FC8에서는 나뉜 feature map들이 합쳐져 연산이 되어 최종적으로 전체 네트워크가 전체 feature map을 사용할 수 있게 됩니다.
- 정리하면, AlexNet은 ImageNet Classification Benchmark의 2012년도에 최초의 CNN기반 우승 모델입니다.
- 또한 AlexNet은 다양한 Task의 transfer learning에 많이 사용되었습니다.
ZFNet(2013)
- ZFNet 은 AlexNet 이후, ILSVRC 2013년에 우승한 아키텍쳐 입니다.
- AlexNet에서 많은 하이퍼파라미터에대해 시행착오를 거쳐, layer configuration을 수정하여 우승하였습니다.
- ZFNet은 AlexNet과 아이디어는 동일하지만, 더 큰 버전의 AlexNet입니다.
- AlexNet과의 차이점은 1번째 Conv layer에서 Filter size와 Stride를 줄여서 더 세밀하게 탐색하도록 하였고, 이후의 Conv layer에서도 출력 필터의 수를 더 늘렸습니다.
- Conv1에서 커널사이즈와 stride사이즈를 축소하여, 다음 layer가 더 고해상도로 인식 하게 됩니다.
- Conv3, 4, 5에서 필터 개수를 증가 시킴으로써 연산 횟수, learnable parameter의 개수가 증가했습니다.
- 따라서, 단지 네트워크를 더 크게 하고 연산량을 늘려서 성능을 높인 More trial and less error라고 볼 수 있습니다.
VGGNet(2014)
- 2014년도에 넘어오면서 CNN 구조는 VGG, GoogleNet과 같이 더 복잡하고 깊게 만들어졌습니다.
- 2012/2013년에는 8개의 레이어인 반면, 2014년에는 19레이어와 22 레이어로 늘어났습니다.
- ILSVRC 2014의 우승자는 Google의 GoogLenet이며, Oxford의 VGGNet이 2등을 차지했습니다.
- VGGNet 은 아주 심플하면서도 nice한 아키텍쳐이며, ImageNet에서 7.3%의 Top 5 Error를 기록했습니다.
- VGG는 AlexNet보다 더 작은 필터 를 이용하고, 더 많은 레이어 를 가지는 구조로 이루어져있습니다.
- 또한 AlexNet에서는 8개의 레이어였지만 VGGNet은 16에서 19개의 레이어를 가집니다.
- 그리고 VGG는 이웃픽셀을 포함할 수 있는 가장 작은 필터인 3×3 size의 filter를 사용 하며, stride 1, padding 1 만을 사용한 CONV layer 들을 구성하였습니다.
- 즉 VGG는 네트워크에 설계에 대한 어떠한 원칙을 갖도록 해준 모델 입니다.
- AlexNet과 ZFNet은 단순히 trial and error였으며, VGGNet을 통해 네트워크의 확장과 축소를 더욱 쉽게 생각할 수 있게 되었습니다.
- 강조하면 VGGNet이 중요한 이유는 CNN아키텍쳐의 디자인 가이드를 제시했기 때문 입니다.
- VGG는 아주 심플하고 깔끔한 디자인 규칙 을 따릅니다.
- NN은 기본적으로 5개의 stage로 이루어져 있으며, Stage 1, 2, 3에서는 conv두번에 pooling, 그리고 Stage 4,5에서는 conv를 4-5번하고 pooling 레이어를 쌓았습니다.
- 모든 Conv layer는 3x3 크기이고, stride와 padding은 1입니다.
- 모든 Max pool은 2x2 크기이고, stride는 2이며, Max pool 이후에는 channel을 2배로 늘립니다.
Design Rules of VGG
- 지금부터 이러한 구성으로 신경망을 구성한 motivation 을 알아보겠습니다.
- 모든 Conv Layer가 3x3 size 및 pad가 1인 디자인 규칙 에 대해서 살펴보겠습니다.
- 위 슬라이드의 Option 1과 Option 2는 큰 Kernel size를 가진 Conv layer와 작은 kernel size를 가진 Conv layer를 여러겹 쌓은 경우를 비교한 것인데, 그 결과는 다음과 같습니다.
- 두 경우 모두에서 네트워크가 바라보는 입력의 양(receptive field)이 동일 합니다.
- 5x5 Conv layer에서 영향을 받는 receptive field는 3x3 크기의 Conv layer 2개를 쌓았을 때와 동일합니다.
- 마찬가지로, 7x7 크기의 Conv layer는 3x3 크기의 Conv layer 3개를 쌓았을 때와 영향을 받는 receptive field가 동일합니다.
- 그러므로 작은 kernel size의 Conv layer를 여러겹 쌓은 경우에서 파라미터와 연산량이 더 적으며, 학습 속도를 개선할 수 있습니다.
- Option 1
- param = $Input\ Channel\ 수 × Output\ Channel\ 수 × Kernel\ size × Kernel\ size \ = C_{in} × C_{out} × 5 × 5 = 25C^2$
- FLOPs = $(Output\ Channel × Output\ Height × Output\ Width) × (Input\ Channel × Kernel\ size × Kernel\ size) \ = (C_{out} × H × W) × (C_{in} × 5 × 5) = 25C^2HW$
- Option 2
- param = $9C^2 + 9C^2 = 18C^2$
- FLOPs = $9C^2HW + 9C^2HW = 18C^2HW$
- 즉 Params와 FLOPs 계산결과를 보면 3x3 Conv layer를 2개 쌓은 것이 5x5 Conv layer보다 더욱 적습니다.
- 만약 $3×3$ size 필터를 가진 conv layer 세 개와, $7×7$ size 의 필터를 사용한 conv layer 한 개를 비교하면 다음과 같이 됩니다.
- $3 × (3^2C^2) = 27C^2$ vs $7^2C^2 = 49C^2$
- 또한 작은 kernel size의 Conv layer를 여러겹 쌓은 경우가 더 높은 표현력을 갖게 됩니다.
- Conv layer를 여러번 쌓게되면, 더 많은 ReLU를 통과하며 비선형성(non-linearity)이 추가되므로 더 높은 표현력 을 가지게 됩니다.
- 따라서, 본 디자인 규칙은 작은걸 여러개 쌓는게 더 좋으니까 하이퍼파라미터로서 kernel size는 고려하지 않아도되고, 네트워크의 깊이만 고려하면 된다는 의미 를 담고 있습니다.
- 다음 디자인 규칙은, 모든 Max pool은 2x2 크기이고, stride는 2이며, Max pool 이후에는 channel을 2배로 늘리는 것 에 대해 살펴보겠습니다.
- 위 슬라이드의 Option 1과 Option 2는 Max pool 이후 channel을 2배 늘린 경우의 전과 후를 비교한 것인데, 그 결과는 다음과 같습니다.
- Memory : 절반으로 줄어들었습니다.
- Parameters : 4배 증가했습니다.
- FLOPs : 그대로 유지됩니다.
- 여기서, 중요한 것은 연산량(FLOPs)가 유지된다는 점입니다.
- 결국 channel을 2배 늘린 이유는 픽셀이 반으로 줄어도, 각각의 conv stage에서는 동일한 부동소수점 연산 수를 갖게 주기 위함 입니다.
- 따라서, 디자인 규칙 2는 각 stage에서의 Conv layer의 kernel size(each spatial resolution)가 변해도 Max pool 이후 channel을 2배로 해줌으로써 연산량을 동일하게 유지할 수 있다는 의미를 담고 있습니다.
- 다음은 VGGNet의 전체 네트워크를 한번 살펴보겠습니다.
- AlexNet의 총 파라미터 수는 60M인 반면, VGG는 총 파라미터 수는 약 138M 정도 임을 알 수 있습니다.
- VGG는 메모리 사용량이 많은 모델 입니다.
- 초기 레이어에서 많은 메모리를 사용하는 것을 알 수 있습니다.
- Sparial dimention이 큰 곳들이 메모리를 더 많이 사용합니다.
- 마지막 레이어는 많은 파라미터를 사용합니다.
- FC-Layer는 dense connection이기 때문에 엄청난 양의 파라미터를 사용합니다.
- 최근의 네트워크들은 너무 많은 파라미터를 줄이기 위해 FC Layer를 없애버리기도 합니다.
- 다음은 VGGNet의 Details 입니다.
- VGGNet은 ImageNet 2014 Classification Challenge에서 2등, Localization에서는 우승을 했습니다.
- AlexNet에서 사용한 Local response normalization은 사용하지 않습니다.
- VGG16과 VGG19은 아주 유사하며, VGG19가 아주 조금 더 좋습니다. 보통 16을 더 많이 사용합니다.
- 그리고 모델 성능을 위해서 앙상블 기법을 사용했습니다.
- VGG의 마지막 FC-Layer인 FC7은 4096 사이즈의 레이어인데 아주 좋은, feature represetation을 가지고 있는 것으로 알려져있습니다.
- 아주 좋은 feature representation으로, 다른 데이터에서도 특징(feature) 추출이 잘되며, 다른 Task에서도 일반화 능력이 뛰어난 것으로 알려져있습니다.
- 마지막으로 위 슬라이드는 VGGNet과 동일하게 5개의 Conv layer와 3개의 FC layer를 가지는 AlexNet을 비교한 것입니다.
- 이를 통해 VGGNet이 AlexNet에 비해 엄청나게 큰 모델 이라는 것을 알 수 있습니다.
GoogLeNet
- GoogLeNet은 ILSVRC 2014 Classification Challenge에서 우승한 모델입니다.
- VGGNet과 마찬가지로 depth가 깊어졌으며, 더 좋은 accuracy를 달성했습니다.
- GoogLeNet 은 계산 효율성을 고려하여 구성한 아키텍쳐 입니다.
- 즉 GoogLeNet은 성능을 높임과 동시에 네트워크 계산 효율성을 고려하는 것에 집중한 모델 입니다.
- AlexNet에서 VGG까지의 모델들은 모두 네트워크의 크기가 커질수록 좋은 성능을 보이는 것에 집중한 모델이었지만, GoogLeNet은 효율적인 CNN을 설계하는 방법에 집중하였습니다.
- 즉 GoogLeNet은 Parameter 개수, memory 사용, 연산 수를 줄이는 것에 중점 을 두었습니다.
- Mobile에서는 training단계를 거치지는 않지만, Testing time에서 forward pass를 거쳐야 하므로 효율성이 중요합니다.
- GoogLeNet도 엄청 깊은 네트워크입니다.
- 반복하지만 GoogLeNet에서 가장 중요한 것은 효율적인 계산에 관한 특별한 관점이 있다는 것과 높은 계산량을 아주 효율적으로 수행하도록 네트워크를 디자인했다는 점입니다.
- GoogLeNet은 Inception module 을 사용합니다.
- GoogLeNet에는 파라미터를 줄이기 위해서 FC-Layer가 없습니다.
- 또한 전체 파라미터 수가 5M 정도입니다.
- 60M인 AlexNet보다 적지만, 그럼에도 불구하고 훨씬 더 깊습니다.
- ILSVRC 2014에서 6.7%의 top-5 error로 우승했습니다.
GoogLeNet: Aggressive Stem
- 지금부터 GoogLeNet의 구조를 톺아보겠습니다.
- GoogLeNet의 첫번째 아이디어는 맨 처음에 Stem Network 를 사용한 것입니다.
- 앞선 아키텍쳐들은 앞쪽 단계에서 고해상도의 이미지에 Conv layer 적용시 부동소수점 연산이 집중되어 있었습니다.
- GoogLeNet은 해당 연산 수를 줄이기 위해서, 앞쪽 단계에서 빠르게 downsampling을 진행하는 선택을 했습니다.
- 즉 Stem Network 는 입력 이미지를 아주 aggressively하게 다운샘플링 하는 역할을 수행하는 네트워크를 의미 하는데, 이를 사용한 이유는 초기의 expensive한 Conv 연산을 피하기 위함입니다.
- 슬라이드의 표에서, 3번의 Conv layer만으로 224x224 크기의 입력(resolution)이 28x28로 빠르게 줄어든 것을 볼 수 있습니다.
- 앞쪽 단계에서 빠르게 downsampling을 진행함으로써, VGGNet에 비해 memory, parameter 수, 연산 수 모두 줄어들었음을 알 수 있습니다.
GoogLeNet: Inception module
- GoogLeNet의 두번째 아이디어는 연산 효율성을 올릴 수 있었던 핵심적인 부분인 Inception module 입니다.
- inception module은 좋은 local network typology를 디자인 하기위해 설계되었으며, 네트워크 안의 네트워크 (network within a network)의 개념으로 만들어졌습니다.
- GooleNet은 Inception module들을 쌓아올려 구성합니다.
- 즉 네트워크 안의 Local Network를 Inception module 이라고 합니다.
- 슬라이드의 Inception module은 Naive Inception module 입니다.
- Inception Module 내부에는 동일한 입력을 받는 서로 다른 다양한 필터들이 “병렬로” 존재합니다.
- 1×1 CONV, 3×3 CONV, 5×5 CONV, 3×3 MAX POOL 연산이 병렬적으로 이루어집니다.
- 각 filter를 통해 연산되어 나온 output 들을 모두 depth 방향으로 합칩니다.(concatenate)
- 합쳐진 하나의 출력을 다음 레이어로 전달합니다.
- 하지만 Naive Inception module은 계산 비용의 문제점이 존재 합니다.
- 예제를 살펴보겠습니다.
- 1×1 CONV 128개, 3×3 CONV 192개, 5×5 CONV 96개, 3×3 MAX POOL이 있으며, 각 연산은 병렬적으로 이루어지며, stride를 조절하여 입/출력 간의 spatial dimention을 유지시켜줍니다.
- Module input이 28×28×256일때 다음과 같습니다.
- 1 x 1 x 128 conv의 출력: 28 x 28 x 128
- 3 x 3 x 192 conv의 출력: 28 x 28 x 192
- 5 x 5 x 96 conv의 출력: 28 x 28 x 96
- 3 x 3 Pool의 출력: 28 x 28 x 256
- 모든 출력 값들을 depth-wise로 합친(concat) 사이즈를 계산해볼때 28 x 28 은 동일하고 depth가 점점 쌓이게 됩니다.
- Inception module의 입력: 28 x 28 x 256
- Inception module의 출력: 28 x 28 x (128 + 192 + 96 + 256) = 28 x 28 x 672 = 529K
- spatial dimention은 변하지 않았지만 depth가 엄청나게 증가했습니다.
- 그리고 각 레이어들의 계산량을 한번 살펴보면 다음과 같습니다.
- 1 x 1 x 128 conv의 연산량: 28 x 28 x 128 x 1 x 1 x 256
- 1 x 1 conv는 각 픽셀마다 1 x 1 x 256 개의 내적연산을 수행되므로, 픽셀 당 256번의 곱셈 연산이 수행됩니다.
- 그리고 각 픽셀이 총 28 x 28이며, 128개의 filter를 만들기 때문에 다음과 같이 연산됩니다.
- 3 x 3 x 192 conv의 출력: 28 x 28 x 192 x 3 x 3 x 256
- 5 x 5 x 96 conv의 출력: 28 x 28 x 96 x 5 x 5 x 256
- 따라서 하나의 Inception Module에서의 전체 연산량은 854M가 되며, 이는 연산량이 아주 많습니다.
- Pooling layer 또한 입력의 Depth를 그대로 유지하기 때문에 문제를 악화시킵니다.
- 즉 레이어를 거칠때마다 Depth가 점점 늘어만 갑니다.
Reminder: 1x1 convolutions
- Naive Inception module은 계산 비용의 문제점을 해결하기 전에 1x1 conv 를 다시 한번 살펴보겠습니다.
- 1x1 conv는 각 spatial location에서만 내적을 수행합니다.
- 즉 spatial dimensions을 보존하면서, depth만 줄일 수 있기에, 입력의 depth를 더 낮은 차원으로 projection할 수 있습니다.
- Input feature map들 간의 선형결합(linear combination) 또는 각 input pixel에 동일한 FC layer를 적용하는 것으로 해석 할 수 있습니다.
Solution: “bottleneck layers”
- Naive Inception module은 계산 비용의 문제점을 해결하기위한 key insight는 “bottleneck layer” 를 이용하는 것입니다.
- “bottleneck layer”는 feature의 depth를 감소시키기 위해 1x1 convolutions을 사용하는 것을 의미 합니다.
- “bottleneck layer” 아이디어는 입력의 depth를 줄이는 것 입니다.
- ouput의 채널수가 계속해서 많아져 연산량이 증가하는 문제를 해결하기 위해 Inception module 내부의 각 연산 과정에도 이러한 1x1 convolutions을 추가해 input의 차원(depth)을 축소합니다.
- 3×3 conv, 5×5 conv 연산 이전에 1×1 conv 연산으로 함으로써 3×3 conv, 5×5 conv 연산에 들어갈 input 의 channel 수를 줄입니다.
- pooling layer 에서는 3×3 pooling 연산 이후에 1×1 conv 연산을 적용하여 output 의 channel 수를 줄입니다.
- 즉 1x1 convolutions이 bottleneck layers의 역할로 추가되는 것입니다.
- 픽셀별로 nonlinearity를 줄 수 있는 방법 으로서, 픽셀별로 fc layer에 한번 돌린 것보다 효과가 좋습니다.
- 즉 GoogLeNet은 Inception module with dimension reduction을 사용 하였습니다.
- Inception 모듈은 VGG와 같이 kernel size에 대해 하이퍼파라미터를 고려하지 않도록 설계 되었습니다.
- Inception 모듈은 4개의 parallel한 branch가 있는데 각각 1x1 Conv, 3x3 Conv, 5x5 Conv, Max pool입니다.
- 즉, Inception 모듈 안에서 다양한 크기의 kernel size를 고려하게 되므로, 하이퍼파라미터로 고려할 필요가 없게 되는 것입니다.
- 또한 Inception 모듈에서 또 한가지 주목할 것은 1x1 Conv 연산입니다.
- 연산 비용이 비싼 spatial한 Conv 연산을 수행하기 전에 1x1 Conv 연산을 통해 input channel의 차원을 조절하여(줄여서) 연산량을 줄이는 방법을 사용 하였습니다.
- 결과적으로 1x1 convolutions를 추가함으로써 연산량을 많이 줄일 수 있습니다.
- 그리고 이를 통해 배울 수 있는 점은 1x1 convolutions를 이용하면 계산량을 조절할 수 있다는 사실입니다.
- 이때, 1x1 convolutions을 사용함으로써 input의 정보 손실이 일어나지 않을까라고 생각할 수도 있는데, 1x1 convolutions을 추가함으로써 네트워크가 더 깊어지는 효과도 있고 각 conv 연산 이후 ReLu와 같은 non-linear activation function을 사용함으로써 모델에 비선형성(non-linearity)를 부여할 수 있어 도움이 됩니다.
GoogLeNet: Global Average Pooling
- GoogLeNet의 세번째 아이디어는 네트워크의 맨 마지막에서 수행한 Global Average Pooling 입니다.
- AlexNet에서 VGGNet까지의 네트워크에서 보았듯이, 모델 파라미터의 대부분은 마지막의 FC layer에서 나오게 됩니다.
- GoogLeNet에서는 마지막 Conv layer의 출력을 1차원 벡터로 만드는 Flatten 연산 대신, 파라미터를 줄이기 위해 Global Average Pooling을 사용하여 이러한 파라미터의 수를 줄이며 efficiency를 높였습니다.
- Global Average Pooling은 마지막 Conv layer의 출력에서, 각 채널별로 1개씩의 평균을 구해 출력하는 방법입니다.
- 슬라이드의 윗쪽 표를 보면, 7x7 크기의 1024개의 채널이 Global Average Pooling에 입력으로 들어가서, 1024 크기의 1차원 벡터가 출력되는 것을 확인할 수 있습니다.
- 슬라이드 아래의 표(VGGNet)와 비교해보면, Global Average Pooling이 VGGNet에 비해 엄청난 양의 파라미터 수를 줄여주었다는 것을 알 수 있습니다.
GoogLeNet: Auxiliary Classifiers
- GoogLeNet의 마지막 아이디어는 Auxiliary Classifier 입니다.
- Batch Normalization이 나오기 이전에는 deep Network 트레이닝이 어려워서, 10개 이상의 layer를 가지는 네트워크를 학습시키기 위한 여러가지 방법들(hack)을 사용하였는데, 그중 GoogLeNet에서 사용한 방법이 Auxiliary Classifier입니다.
- Auxiliary classifier는 AvgPool - 1×1 Conv - FC - FC - Softmax로 이루어져 있습니다.
- 슬라이드에서 2개의 빨간색 박스가 Auxiliary Classifier인데, 이는 네트워크의 최종 출력과 같이 class score를 출력합니다.
- 따라서, GoogLeNet은 총 3개의 다른 class score를 출력하였습니다.
- 하나는 네트워크의 마지막, 나머지 두개는 네트워크의 중간
- 그리고 이 중간의 두 classifier의 score에 대해서도 trainset loss를 계산하여 gradient가 전파되도록 하였습니다.
- 이는 네트워크에서 gradient가 더 잘 전파되도록 하는 효과 가 있었습니다.
- 네트워크의 끝에만 gradient를 주입하는 것보다 네트워크의 중간에 gradient를 두번 더 주입하는 것이라고 생각하면 됩니다.
- 즉 이러한 Auxiliary classifier를 사용해서 네트워크 중간 중간에서 class를 분류하고, loss값을 이용함으로써 네트워크가 깊어져도 네트워크의 중간 중간에서 gradient를 잘 이용하여 학습할 수 있게 합니다.
- inference하는 과정에서는 중간에 2개의 auxiliary classifier를 모두 제거 후, 제일 마지막 layer의 softmax만을 사용 합니다.
GoogLeNet Architecture
- 전체 아키텍쳐의 모습입니다.
- 정리하면 GoogLeNet에는 가중치를 가진 레이어가 총 22개이며, 각 Inception Module은 1x1/3x3/5x5 conv layer를 병렬적으로 가지고 있습니다.
- AlexNet보다 12배 작은 파라미터를 가지고있고, ILSVRC 2014 clssification의 우승 모델입니다.
- GoogLeNet은 아주 신중하게 디자인된 모델이며, Google의 거대한 클러스터를 이용한 cross validation을 수행한 결과 나온 최적의 디자인 입니다.
ResNet(2015)
- ResNet 은 ILSVRC 2015 Classification Challenge에서 우승한 모델 입니다.
- ResNet은 layer개수를 크게 증가시키면서, accuracy는 반으로 줄이는 혁신을 선보였습니다.
- ResNet 아키텍쳐는 152 레이어로 엄청나게 더 깊어졌습니다.
- ResNet 아키텍쳐는 이전의 다른 모델들에 비해 엄청나게 깊은 네트워크입니다.
- ImageNet데이터를 분류하기 위해 ResNet은 152개의 레이어를 가지고 있습니다.
motivation of ResNet
- Batch normalization이 등장하고 사람들은 10개 이상의 layers를 쌓는 deeper network가 가능해짐을 깨달았습니다.
- 기존 트렌드는 더 깊은 네트워크일수록 더 좋은 성능을 내 왔기 때문에 deeper network에서 더 좋은 성능을 낼 것으로 기대했지만, 문제는 너무 깊어지니 BN을 적용했음에도 불구하고 성능이 더 나빠졌습니다.
- 위 그림에서, 56개 layer 모델이 20개 layer 모델보다 성능이 좋지 않은 것을 확인할 수 있습니다.
- 처음에는 이러한 현상이 딥러닝 모델이 Overfitting되었기 때문일 것이라고 추측 하였습니다.
- 따라서 더 깊은 모델은 학습 시 Overfitting이 된 것이라고 가정을 하고 실험을 진행했습니다.
- 하지만 실험을 통해 알게된 사실은 매우 깊은 네트워크가 Overfitting이 아니라 오히려 Underfitting 되었다는 것입니다.
- 위 슬라이드의 왼쪽과 오른쪽 그래프는 각각 Training data, Test data에 대한 결과인데, deeper model에서 둘 모두 안좋은 성능을 보이기 때문에 overfitting 문제가 아닙니다.
- 그리고 overfit이 발생한다면 test error는 높더라도 training error는 아주 낮아야 정상일 것 입니다.
- 그런데 56-layer의 traing error을 보면 20-layer보다 안좋습니다.
- 그러므로 더 깊은 모델임에도 test 성능이 낮은 이유가 over-fitting 때문이 아니라는 것을 알 수 있습니다.
- Training error을 살펴본 결과 deep model은 사실상 underfitting 되어있었습니다.
- Training자체가 잘 되지않았습니다.
- 이러한 현상이 발생하는 이유는 네트워크가 깊어짐에 따라 모델을 최적화(optimize)하여 학습시키기 어렵다는 점 때문입니다.
- 네트워크가 깊어지면 vanishing gradient/exploding gradient 문제 등이 발생하여 모델을 학습이 시키기 어려워져 오히려 안좋은 성능을 보이는 것입니다.
- deeper models은 shallower models보다 더 많은 representation power(more parameters)를 가집니다.
- 그렇다면 deeper models은 shallower models을 재현할 수 있어야 한다는 것 입니다. 적어도 비슷한 성능을 내기를 원한 것 입니다.
- shallower models의 layer를 deeper models의 layer에 복사한 후, 나머지 layer를 identity function으로 생각한다면 얕은 모델을 emulate 한다고 생각할 수 있습니다.
- ex. 첫 20개의 레이어는 20개의 레이어를 가진 모델을 통째로 복사하고 나머지 레이어는 identity function 역할만 하면되기에 이론적으로 56개의 레이어의 모델은 최소한 20개 레이어의 모델만큼의 성능은 보장됩니다.
- 따라서 deeper models은 최소한 shallower models만큼 효과적이어야 합니다.
- 하지만, 여러 실험에서 깊은 모델이 underfitting 되었다는 것이 의미하는 것 은, 깊은 모델이 얕은 모델을 재현(emulate)하는 identity function를 optimization하는데 문제가 있다는 것을 의미합니다.
- 결론적으로, 다음과 같은 가설 을 세웁니다.
- 해당 문제는 training 문제가 아니라, optimization problem 입니다.
- deeper models은 optimization하기 더 어려우며, 때문에 특히 shallower models을 모방하기 위한 identity functions을 학습하지 않습니다.
- deeper models이 적어도 shallower models만큼 우수하려면, 네트워크를 수정해서 identity function을 잘 학습하도록 하는 것이 해결방안 입니다.
- 더 얕은 모델의 가중치를 깊은 모델의 일부 레이어에 복사합니다.
- 그리고 나머지 레이어는 input을 output으로 그냥 내보내서 identity mapping을 합니다.
- 이렇게 구성하면 Deeper Model의 학습이 제대로 안되더라도 적어도 Shallow Model 만큼의 성능은 보장됩니다.
- 이러한 문제를 해결하기 위해 ResNet에서는 identity function을 더 잘 학습하기위해서, skip connection을 이용한 Residual block 을 사용합니다.
- 즉, 수정된 네트워크 구조는 Residual Block 입니다.
- Residual block은 일반적인 여러개의 conv layer들로 이루어져있고, 여기에 skip connection을 추가한 구조로 이루어져있습니다.
- Skip connection 이란, 이전 레이어의 input(residual block의 처음 input)을 그대로 residual block의 output에 mapping하여 최종 output을 만들어내는 것 입니다.
- 여기서 이전 레이어에 가져와 그대로 합쳐주는 x를 identity 라고 하고, 이것을 이후 output에 합치는 것을 identity mapping 이라고 표현합니다.
- 이것을 수식으로 표현하면 H(x) = F(x) + x 라고 할 수 있습니다.
- H(x)는 전체 conv layer들을 통과한 함수를 뜻합니다.
- 원래는 전체 conv layer, 위 그림에서 H(x)를 학습해야했는데, 이렇게 skip connection을 이용함으로써 F(x)만 학습할 수 있게 됩니다. F(x) = H(x) − x 로 표현할 수 있으니, 이것은 즉 해당 block 에서 입력 x에 대한 잔차(residual) or 변화량(delta)만 학습 한다고 할 수 있습니다.
- 따라서 residual block 이라고 부르는 것입니다.
- 네트워크는 Residual만 학습하면 그만이며, 레이어가 Full mapping을 학습하기 보다 이런 조금의 변화(X에 대한 변화량(delda))만 학습하는 것 입니다.
- 만약 H(x)를 직접 학습시키는 대신에 F(x)인 Residual을 학습하는게 더 쉽다라는 가설이 참이라면, 어쩌면 대부분의 레이어가 잘 동작하려면 레이어의 출력이 Identity에 가까워야 할지 모른다는 것을 암시합니다.
- 그러므로 Identity(Input)을 단순히 더해주고, 변화량(delta)만 학습시키면 됩니다.
- 정리하면 ResNet의 아이디어는 H(x) = F(x) + X 이니, F(x)를 학습시켜보면 어떨까? 하는 것이며, H(x)를 직접 배우는 대신에 X에 얼마의 값을 더하고 빼야할까?(Residual)를 배우는 것이 쉬울 것이라고 생각한 것이므로, 입력값을 어떻게 수정해야 하는지를 배운다고 보면 됩니다.
- 이 방식은 깊은 네트워크가 얕은 네트워크를 더 쉽게 emulate할 수 있게 해줍니다.
- identity function에 대해 쉽게 학습이 되기를 기대하는 의미입니다.
- 만약 슬라이드의 Residual Block안에 있는 2개 Conv layer의 weight를 0으로 설정한다면, 두 layer의 출력은 0이 되고 Residual Block의 최종 출력 결과는 identity를 계산하게 됩니다.
- 또는 Input = output 이어야 하는 상황이라면 레이어의 출력인 F(x)가 0 이어야 하므로(residual = 0) 모든 가중치를 0으로 만들어주면 그만입니다.
- 또한, 깊은 네트워크에서 gradient의 흐름을 개선하는데에도 도움이 됩니다.
- Back Propagation에서, Add gate는 입력 모두에 gradient를 전달해주는 gradient distributor 역할을 수행합니다.
- 이러한 gradient의 전달이 Residual Block에서는 short cut으로 이루어지게 되므로, 깊은 네트워크에서 gradient의 흐름이 더 원활하게 이루어지게 됩니다.
Full ResNet architecture
- 전체 ResNet 구조에 대해 살펴보겠습니다.
- Residual Networks(ResNet)는 Residual Block을 쌓은 네트워크 구조입니다.
- 위 슬라이드를 보면, VGG에서 유사한 방식으로 residual block을 쌓은 형태라는 것을 알 수 있습니다.
- Residual Block은 2개의 3 x 3 Conv 레이어로 구성되어있습니다.
- 여러개의 stage로 나눠져있으며, stage가 시작할때 convolution시 stride=2를 적용하여 downsampling하고 그에따라 filter의 갯수를 2배로 늘립니다.
- 또한 GoogLeNet과의 유사한 점은 다음의 2가지가 있습니다.
- 처음의 몇개 layer에서 aggressive down sampling을 수행하여, 네트워크 초반에 연산량을 줄입니다.(Stem Network)
- 마지막 Conv layer의 출력인 네트워크의 끝에는 FC-Layer가 없고, Global Average Pooling을 수행하여 파라미터를 줄입니다.
- 이후 FC-Layer, softmax를 이용해 class수 만큼의 output을 출력합니다.
- ResNet 모델의 Depth는 34, 50, 100까지 늘어나며, 논문에서는 ImageNet문제를 위해 152까지 늘렸습니다.
- ResNet-18의 구조는 다음과 같습니다.
- Stem을 수행한 후, 총 4번의 stage를 반복하고 Linear layer(FC layer)로 결과를 출력합니다.
- 각 stage에는 2번의 residual block과 4개의 Conv layer가 있습니다.
- 18의 의미는 layer의 수를 의미합니다. (Stem에서 1개, 모든 stage에서 16개, 최종 출력에서 1개)
- ResNet-34의 구조는 다음과 같습니다.
- Stem, 총 4번의 stage, FC layer의 형태는 동일합니다.
- 각 stage에서 residual block(Conv layer)의 수가 더 증가했습니다.
- 위 슬라이드 하단의 VGG-16과 비교해보면, ResNet이 더 적은 연산(FLOPS)을 수행하는 것을 알 수 있는데(4배 차이), 이는 Stem과 Global Average Pooling을 수행했기 때문입니다.
Residual Networks: Bottleneck Block
- ResNet은 모델의 Depth가 50 이상일때 연산 효율을 높이기 위해 Bottleneck Layers 를 도입합니다.
- GoogLeNet에서 사용한 bottleneck layer와 유사한 개념입니다.
- Residual block의 conv layer에 들어가기 전에 1×1 conv layer를 이용해 차원(채널수)을 줄여서 3×3 conv layer의 연산량을 줄여주고, 이후에 1×1 conv layer를 이용해 다시 차원(채널수)을 늘리는 구조로 이루어져 있습니다.
- 즉 Residual Network를 더 깊게 쌓기 위해 Bottleneck Block이라는 구조가 새롭게 만들어졌습니다.
- 슬라이드는 “Basic Residual block”과 “Bottleneck Residual block”을 비교한 것입니다.
- Basic block
- Basic Residual block은 2개의 3 x 3 Conv레이어를 쌓음으로써, 각각 $9HWC^2$ 이므로 총 $18HWC^2$의 부동소수점 연산이 필요합니다.
- 즉 3x3 Conv를 두번 수행합니다.
- Bottleneck block
- 먼저, 1x1 Conv layer를 사용해 입력의 채널을 1/4로 줄입니다. 그러므로 FLOPs는 $4HWC^2$ 입니다.
- 3x3 Conv를 수행합니다. 그러므로 FLOPs는 $9HWC^2$ 입니다.
- 마지막으로, 다시 1x1 Conv layer를 통해 입력의 채널을 4배로 키웁니다. 그러므로 FLOPs는 $4HWC^2$ 입니다.
- 총 FLOPs는 $17HWC^2$ 입니다.
- 위의 각 과정에서의 FLOPs를 모두 계산해보면, Bottleneck block이 더 깊어졌지만 연산량은 오히려 더 줄어들었다는 것 을 알 수 있습니다.
- 따라서, Basic에서 Bottleneck으로의 전환은 아래와 같은 효과를 얻게됩니다.
- 더 적은 연산량
- 더 높은 표현력 (더 많은 layer을 통과하면서 더 많은 비선형성이 추가됨)
- ResNet-34에서 Basic block을 Bottleneck block으로 전환한 네트워크 형태가 ResNet-50입니다.
- Network는 더 깊어졌고, 레이어수가 3배가 되며, error는 더 줄어들었지만, 연산량에는 큰 변화가 없습니다.
- ResNet-50보다 더 많은 Bottleneck block을 쌓은 구조들이 ResNet-101, ResNet-152이며 깊어질수록 네트워크가 더 잘 동작하므로 error는 조금씩 감소하였습니다.
- 정확도가 더 높지만 연산 부담이 큰 모델입니다.
- ResNet을 훈련할때 여러가지 구체적인 방법들을 사용했습니다.
- 모든 conv layer 이후에 batch normalization 을 사용했습니다.
- He initialization 방법으로 가중치 초기화를 했습니다.
- optimizer로 SGD+Momentum을 사용하고 초기 learning rate 는 0.1 로 설정하여 validation error 가 줄어들지 않는 시점에 learning를 10배씩 감소시키는 learning rate decay를 사용했습니다.
- mini-batch size는 256입니다.
- weight-decay는 1e-5를 사용하고 dropout은 사용하지 않았습니다.
- ResNet은 네트워크가 깊어질수록 error가 점점 줄어드는 경향을 보이며 엄청난 격차를 보이는 좋은 성능으로 대회에서 우승합니다.
- degradation문제 없이 Very deep network를 아주 잘 학습시킬 수 있었습니다.
- ResNet은 ILSVRC와 COCO의 모든 대회종목을 2등과의 엄청난 격차로 휩쓸었습니다.
- Total top-5 Error는 3.6%로, ImageNet paper에서 제시한 “인간의 성능” 보다 뛰어났습니다.
Comparing complexity
- 왼쪽 그래프는 성능을 비교하는 그래프 이고, 오른쪽 그래프는 연산 수를 비교하는 그래프 입니다.
- 오른쪽 그래프에서 x축은 모델의 연산량을 의미하고 y축은 모델의 성능(accuracy)을 의미합니다.
- 오른쪽 그래프에서 오른쪽으로 갈 수록 헤비한 네트워크, 위로 갈수록 성능이 좋은 네트워크, 원 크기는 파라미터 개수(클수록 메모리가 부담)
- 모델 별로 성능과 복잡도(complexity)를 비교해서 살펴보겠습니다.
- Inception-v4는 ResNet+inception모델이 합쳐진 개념으로 가장 좋은 성능을 보입니다.
- AlexNet은 Accuracy가 낮으며 연산수는 적지만, 파라미터 개수가 많아 네트워크 입니다.
- VGG를 보면 연산량과 메모리 사용량이 엄청 커서 효율성이 작습니다.
- GoogLeNet은 연산량과 메모리사용량이 굉장히 작은 효율적인 모델입니다.
- ResNet은 심플한 디자인, 양호한 효율성의 네트워크로 정확도가 아주 높아 성능이 좋습니다.
- 다음으로, 각 모델에서 forward pass 하는데에 필요한 시간과 전력사용량을 비교한 그래프 입니다.
- 왼쪽 그래프가 forward pass 하는데 걸리는 시간, 오른쪽 그래프가 전력사용량 입니다.
- VGG가 시간이 오래 걸리는 것을 확인할 수 있고, ResNet은 적당한 정도로 분포하는 것을 알 수 있습니다.
Model Ensembles(2016)
- 2016년에는 이전처럼 혁신적인 시도보다는 이전까지의 모델을 이용한 앙상블 방식 의 모델이 많이 쓰였습니다.
- Inception, Inception-Resnet, Resnet, Wide Resnet models의 Multi-scale ensemble을 사용하여 0.6%를 개선시켜 우승하였습니다.
SENet(2017)
- 2017년 ResNext의 아이디어를 바탕으로한 여러 연구들을 통해서 Squeeze-and-Excitation(SE) 라는 방법을 사용한 SENet 이라는 모델이 나왔습니다.
- 그리고 이 모델이 2017년 좋은 성능을 보인 것을 마지막으로 ImageNet challenge는 끝납니다.
Other Networks
- 위에 모델들에 이어서 추가적으로 몇가지 중요한 모델 구조, ResNet에서 변형된 모델 구조들에 대해 살펴보겠습니다.
Network in Network(NiN)
- 2014년에 나온 논문으로 Network in Network 입니다.
- Network in Network의 기본 아이디어는 MLP Conv layer로, 각 Conv layer안에 FC-layer (multi-layer perceptron)를 넣는 것 입니다.
- convolution시 filter 대신에 MLP를 사용해서 feature를 추출하는 방법을 고안했습니다.
- 즉, Conv layer에서 filter를 거쳐나온 output을 여러개의 FC-layer에 통과시킴으로써 추상적인(abstract) feature 들을 추출해 더 복잡한(complex) activation map을 출력할 수 있도록 합니다.
- 이때, NiN 에서 말하는 FC-layer는 1×1 Conv layer라고 할 수도 있습니다.
- GoogLeNet과 ResNet에서 사용하는 bottleneck의 개념이 바로 이 NiN 에서 가져온 아이디어이기 때문에 NiN 은 큰 의미를 가집니다.
Identity Mappings in Deep Residual Networks
- 2014년에 나온 논문으로 Identity Mappings in Deep Residual Networks 입니다.
- 여기서는 ResNet block의 skip connection부분이 아닌 direct path 부분을 조절 하여 모델의 성능을 올렸습니다.
- “Pre-Activation”은 operation 순서를 바꿔 본 시도로, ReLU를 conv레이어보다 먼저 넣었습니다.
- Original ResNet block 에서는 윗단 레이어은 ReLU를 거친 positive값만 받기때문에, Identity function을 제대로 학습하지 못할 것 같다는 생각에서 출발한 시도입니다.
- 여러 실험들을 통해 논문에서 얻어낸 결론을 요약해보면 다음과 같습니다.
- shortcut path (skip connection 부분)의 정보는 최대한 손상시키지 않는 것이 backpropagation, 정보 전달 측면에서 유리 합니다.
- residual path에서는 shortcut과 합쳐주기 전에 activation function을 적용하는 것이 유리 하다는 것을 알아냈습니다.
- Accuracy는 1퍼센트정도 늘어나며, 크게 차이가 없으므로, 잘 사용되지는 않습니다.
Wide Residual Networks
- 또 다른 ResNet 에서 개선된 모델로 Wide ResNet 이 있습니다.
- 본 논문의 저자는 ResNet에서 네트워크의 깊이(depth)가 중요한게 아니라 residual 구조가 성능 향상에 큰 도움을 줬다고 주장 합니다.
- 따라서 네트워크가 extreamly 하게 깊어질 필요가 없다고 생각하여 residual block을 더 넓게 만들었습니다.
- 본 논문에서 wide 하다는 의미는 channel의 개수가 많다는 것을 의미합니다.
- 즉, WRN은 residual block을 구성하는 convolution layer의 filter 수를 증가시켜서 신경망의 넓이를 증가시켰습니다.
- Widening factor k에 따라 channel 개수가 늘어나는 구조입니다.
- 기존의 ResNet에는 Block 당 F개의 filter만 있었다면, F * K 개의 필터로 구성했습니다.
- 이렇게 각 레이어를 넓게(filter 의 갯수를 늘려) 구성하여 단 50개의 레이어만으로도 기존 152개의 레이어를 가지는 ResNet 보다 성능이 좋게 나오는 것을 증명 했습니다.
- 저자들은 기존 구조의 순서인 Conv-BN-ReLU가 아닌 BN-ReLU-Conv로 순서를 변경했습니다. 후자가 더 빨리 훈련하고 좋은 결과를 냈습니다. residual block의 power를 향상시킬수 있는 간단한 3가지 필수적인 방법은 다음과 같습니다.
- 합성곱층을 block마다 더 추가한다.
- feature planes를 더 추가하면서 합성곱층의 너비를 넓힌다.
- 합성곱층의 필터 size를 증가시킨다.
- 논문 저자들의 residual network의 일반적인 구조입니다.
- 논문에서 깊이 factor는 l, 너비 factor는 k로 나타냈습니다. figure1(a),(c)는 basic 모델과 basic-wide모델의 예를 보여줍니다.
- 위 표는 ImageNet과 COCO dataset의 성능을 비교합니다.
- Width가 증가할수록 성능이 올라가는 모습을 볼 수 있습니다.
- 정리하면 다음과 같습니다.
- widening은 여러 깊이의 residual network에서 성능을 일관되게 향상시킵니다.
- 깊이와 너비 둘다 증가시키는것은 파라미터의 수가 너무 많아지거나 강한 regularization이 필요해지기 전까지는 도움이 됩니다.
- 얇은 신경망과 동일한 수의 매개변수를 가진 넓은 신경망이 동일하거나 더 나은 성능을 낼 수 있기 때문에 residual network의 매우 깊은 깊이는 정규화 효과가 없는 것으로 보입니다. 더군다나, wide network는 얇은 네트워크보다 2배 이상의 많은 수의 매개변수를 사용하여 성공적으로 학습할 수 있습니다.
ResNeXt
- ResNet 논문의 저자들이 제안한 ResNet 을 발전시킨 형태인 *ResNext** 모델이 있습니다.
- 여기에서도 residual block 의 width를 늘리는 전략, 즉 conv layer의 filter의 갯수를 늘리는 방법 을 제안합니다.
- 독특한 점이 residual block 에서 여러 개의 병렬 pathway를 사용하는 구조 입니다.
- ResNext는 ResNet의 “Bottleneck” block을 병렬로 연결한 구조이며, 위 슬라이드의 오른쪽 구조와 같이 G개의 parallel pathway(block)으로 구성됩니다.
- 각 pathway에서 3x3 Conv layer의 연산을 위해 줄였다가 다시 증가시키는 채널의 수를 소문자 c라고 하면, 이러한 G개의 병렬 구조가 Bottleneck block과 같은 연산량을 갖게 하는 c의 값을 quadratic equation을 세우고 풀 수 있습니다.
- 위 슬라이드의 아랫부분의 식이 quadratic equation이며, 아래의 Example은 다음과 같은 의미를 갖습니다.
- Ex1) C=64, G=4라고 했을 때, c=24가 되어야 Bottleneck block과 같은 FLOPs를 갖습니다.
- Ex2) C=64, G=32라고 했을 때, c=4가 되어야 Bottleneck block과 같은 FLOPs를 갖습니다.
- 각 pathway에서 3x3 Conv layer의 연산을 위해 줄였다가 다시 증가시키는 채널의 수를 소문자 c라고 하고,
- 각각의 pathway에서 FLOPs를 계산한 후, 모두 더하면 전체 FLOPs를 구할 수 있습니다.
- 이러한 방법은 네트워크 디자인을 수정하는 새로운 메커니즘을 제공합니다.
- 연산량을 유지하는 채널의 수를 설정하는 것 대신에, 방정식을 풀어 pathway의 수 G를 설정할 수도 있습니다.
- ResNext에서는 단순히 병렬적으로 사용하는 것이 아니라 1 x 1 Conv에서 채널의 1/4로 축소하는 것이 아니라 ‘c’ 만큼 축소했는데 $9Gc^2 + 8GCc - 17C^2 = 0$ 이라는 Flops 수를 구하는 방정식으로 통해서 임의로 정한 C와 G를 이용했을 때, 기존의 bottleneck residual block과 동일한 연산이 수행되는 c를 구해 그 값으로 c를 정한다고 합니다.
- Grouped Convolution은 Group의 수만큼 GPU를 병렬적으로 사용하는데, 이때 채널을 GPU의 수만큼 분리해서 각 GPU별로 학습을 진행합니다.
- 위 사항들을 고려했을때 다음과 같이 표기할 수 있습니다.
- ResNext의 parallel pathway 구조를 이용하면, 연산량은 유지하면서 성능은 향상시킬 수 있습니다.
- 위 슬라이드는 (연산량은 유지하면서) Group의 수를 늘릴수록 성능이 좋아진다는 것을 보여줍니다.
Deep Networks with Stochastic Depth
- ResNet의 성능을 개선하고자 하는 방법은 계속되는데, Stochastic Depth 이라는 논문이 있습니다.
- 네트워크가 깊어지면 backpropagation 과정에서 gradient가 전달될 수록 점점 gradient가 작아지는 gradient vanishing 문제가 발생하곤했습니다.
- 이러한 문제를 해결하기 위해 train time 에 레이어의 일부를 dropout 하는 방법입니다.
- 임의로 dropout 된 짧은 구조의 네트워크로 수월하게 학습을 하고 test time 에는 전체 네트워크를 이용해서 output을 내는 방법입니다.
FractalNet: Ultra-Deep Neural Networks without Residuals
- FractalNet 에서는 residual connection을 사용하지 않고 초기의 레이어(shallow)의 정보과 깊은 레이어(deep)의 정보를 모두 잘 전달하는 것이 중요하다는 관점에서 fractal 한 구조를 사용했습니다.
- 따라서 shallow layer의 정보와 deep layer의 정보를 모두 출력에 전달합니다.
- 또한 dropout 처럼 train time 에는 임의의 일부 경로의 정보를 사용해서 학습하고 test time 에 전체 경로를 이용하는 방법을 사용합니다.
DenseNet
- DenseNet 은 ResNet에서의 shortcut connection(skip connection)을 다른 방법으로 수행한 네트워크입니다.
- ResNet에서는 Additive shortcut을 수행하였는데, DenseNet에서는 Concatenation shortcut을 사용 합니다.
- 즉, 이전 layer의 feature를 Add하는 것 대신에 Concatenate하는 것입니다.
- 즉, 초기 input 이 모든 layer 에 동일하게 들어가고, 모든 레이어에서의 ouput 이 합쳐져(concat) 그 다음 conv layer의 input으로 들어가는 구조로 되어 있습니다.
- 논문의 저자들을 이러한 Dense block 이 gradient vanishing 문제를 완화할 수 있고 feature 들을 더 잘 전달하고 사용할 수 있게끔 한다고 주장합니다.
SqueezeNet
- SqueezeNet 은 효율성(efficient)를 중점적으로 하여 설계된 모델입니다.
- SqueezeNet에서 연산 효율을 올리기 위해 fire module 이라는 것을 사용했습니다.
- Fire module은 1×1 conv layer로 구성되어 있는 squeeze layer와 1×1 conv layer, 3×3 conv layer로 구성되어 있는 expand layer로 구성되어 있습니다.
- 이러한 fire module을 사용한 squeezeNet은 AlexNet 보다 50배 적은 파라미터를 가짐과 동시에 비슷한 성능을 보였습니다.
- squeezeNet을 더 압축하면 AlexNet 보다 500배 더 작아지게 된다고 합니다.
Main takeaways $ Summary
- 위 슬라이드는 이번 강의에서 배운 내용들을 요약한 것입니다.
해당 게시물은 Standford 2017 CS231n 강의와 2022년 슬라이드를 바탕으로 작성되었습니다.
Last Time: Components of Convolutional Networks
- 앞 강의에서 CNN을 구성하기 위한 여러가지 components들을 살펴보았습니다.
- 그렇다면 components들을 어떻게 조합을 해야 성능이 좋을지, 역사적으로 어떻게 구성해왔는지에 대해 알아보겠습니다.
Today: CNN Architectures
- 여러 네트워크 중 ImageNet Classification Task 에서 좋은 성능을 보였던 대표적인 CNN Architectures들 (AlexNet, VGG, GoogLeNet, ResNet) 에 대해 살펴보겠습니다.
- 역사적인 관점에서 아주 흥미로운 모델들, 그리고 아주 최신의 모델들도 다룹니다.
LeNet-5(1998)
- 앞 강의에서 LeNet을 다룬 적이 있었지만, 조금 더 자세히 살펴보겠습니다.
- LeNet 은 Convolution layer가 성공적으로 적용된 최초의 ConvNet 입니다.
- 슬라이드에서 볼 수 있듯, 이미지를 입력으로 받아서 stride = 1 인 5 x 5 필터를 거치고, 몇 개의 Conv Layer와 pooling layer를 거쳐, 끝 단에 FC Layer가 붙습니다.
- Conv - ReLU - Pool(downsampling) 전체 N번 반복 합니다.
- Cout x H x W를 한 줄로 펴줍니다.
- FC - ReLU 전체 N번 반복 합니다., 마지막 output은 c차원 입니다.
- LeNet은 digit recognition task에서 우수한 성능을 보였습니다.
- LeNet-5의 구조를 살펴보는데, 구조는 동일하나 각 component의 구성이 바뀐버전을 살펴보겠습니다.
- 원본 구조는 논문에 있습니다.
- 우선 Input 이미지는 grayscale 이므로 채널은 1입니다.
- Filter 사이즈는 1 x 5 x 5, filter 20개.
- P를 조정해서 output size가 같도록 만들어줍니다.
- ReLU로 nonlinear를 취해줍니다.
- K=2, s=2로 주고 크기를 반으로 다운샘플링 시킵니다.
- [Conv, ReLU, Pool] 1회
- Filter 사이즈는 20 x 5 x 5, filter 50개.
- P를 조정해서 output size가 같도록 만들어줍니다.
- ReLU로 nonlinear를 취해줍니다.
- K=2, s=2로 주고 크기를 반으로 다운샘플링 시킵니다.
- [Conv, ReLU, Pool] 2회
- 50 x 7 x 7 = 2,450를 flatten 시킵니다.
- FC-Layer를 적용해서, Input은 2450, Output은 500이 되도록 만들어주고, ReLU를 취해줍니다.
- FC를 적용하여, Input은 500, Output은 10이 되도록 만들어줍니다.
- $y ∈ {0, 1, …, 9}$ 라면, $f(x;W): ℝ^{1 x 28 x 28} → ℝ^{10}$ 입니다.
- 정리하면 네트워크를 통과할때 다음과 같이 진행됩니다.
- pooling or stride를 사용하여 Spatial size가 감소합니다.
- channel의 수가 증가됩니다.
- 현대의 architectures들은 점차 이러한 구조를 breaking 하고 있습니다. 이후의 architectures들을 살펴봄으로써 발전양상을 살펴보겠습니다.
AlexNet(2012)
- ILSVRC 를 remind해보면, ImageNet 데이터셋은 클래스 1000개, training set이 130만개, test set이 10만개로 구성되어있는 DataSet입니다.
- 2011년도 까지는 rule-based 방법으로, edge들을 직접 추출한 후, linear classifier를 얹어서 모델을 만들었습니다.
- 하지만 2012년, AlexNet 은 Conv layer를 깊게 쌓은 최초의 대규모 CNN 구조로, 2012년 ImageNet Classification task 에서 엄청난 격차를 보여주면서 Convolution Network는 컴퓨터 비전의 전면에 서게 되었습니다.
- AlexNet은 현재까지 약 50,000번 인용되었는데, CNN아키텍쳐 구성 방법에 영향을 많이 미쳤음을 알 수 있습니다.
- 위 슬라이드는 AlexNet의 전체 architectures구조 와, 각 Layer components, Details 입니다.
- AlexNet은 CNN을 깊게 쌓은 심층신경망 형태입니다.
- 모델 구조는 다음과 같습니다.
- 227x227 크기의 입력 이미지
- 논문의 그림에서는 input size가 224×224×3 으로 표시되어 있는데 오류입니다. 사실 input size 는 227×227×3 입니다.
- 5개의 Convolutional layer + Max pooling layer
- 3개의 Fully connected layer
- 마지막 층은 softmax를 거쳐 최종적으로 1000개의 class로 분류합니다.
- ReLU Activation function
- 227x227 크기의 입력 이미지
- AlexNet의 몇가지 큰 특징 은 다음과 같습니다.
- AlexNet이 ReLU nonlinear activation function을 사용한 첫번째 Neural Network입니다.
- 채널간 Local response normalization이라는 정규화 방법을 사용하였습니다.
- 현재는 Batch Normalization을 주로 사용합니다.
- 당시에는 GPU의 메모리가 부족(3GB)해서 모델을 2개의 GPU에 병렬적으로 분리해서 학습을 수행하였습니다.
- filpping, jittering, cropping, color normalization 등의 다양한 data augmentaion 을 적용했습니다.
- 강의에서의 질문에 대한 답을 찾겠습니다.
- $227 × 227 × 3$ size의 input 이미지가 네트워크에 들어갔을때 첫 conv layer (CONV1: 96 11x11 filters applied at stride 4) 를 통과한 output size 는 어떻게 될까?
- 하나의 필터에서 나오는 output size는 $(227 − 11) / 44 + 1 = 55$ 임을 알 수 있습니다. 또한 필터의 갯수가 96 개이므로 총 output size는 $55 × 55 × 96$ 입니다.
- 이때, 첫번째 conv layer의 총 parameter 갯수는 어떻게 될까?
- conv layer의 파라미터수는 filter size x filter depth x filter 개수로, $(11 × 11 × 3 + 1) × 96$ 개의 파라미터를 가집니다.
- 첫번째 conv layer를 거쳐 나온 $55 × 55 × 96$ size의 feature map을 Pooling layer (POOL1: 3x3 filters applied at stride 2) 에 넣어서 만들어진 output size 는 어떻게 될까?
- 하나의 filter 에서 $(55 − 3) / 2 + 1 = 27$ size의 output이 생성되고 pooling layer는 input의 channel(depth)은 그대로 유지함으로써 총 output size는 $27 × 27 × 96$ 입니다.
- 이때, Pooling layer의 총 parameter 갯수는 어떻게 될까?
- pooling layer는 단순히 pooling하는 과정(ex. max pooling) 이므로 학습시킬 파라미터가 없습니다.
params & memory & flop
앞에서 layer 및 parameter 계산법에 대해 알아보았는데, 조금 더 자세하게 memory와 flop의 관점까지 바라보는 과정을 진행해보겠습니다. 본 과정은 AlexNet의 구조를 따라가되, 일부 Layer의 수가 수정된 구조입니다.
- 이제 AlexNet의 layer들이 어떻게 쌓여있는지 살펴보겠습니다.(일부 변형됨.)
- Conv1 Layer의 Input size는 $227 × 227$ 이며, 3개의 Channel을 가집니다.
- $C_{out} = 64, K = 11, S = 4, P = 2$ 입니다.
- Output channels은 filters의 수와 같습니다.
- $C_{out} = 64$ 이므로, output size의 $C$도 64입니다.
- 위 수식대로 입력하면 $H$와 $W$ 는 56입니다.
- $(Input\ width - Kernel\ size + 2 × Padding) / Stride + 1 = (227 - 11 + 2 × 2) / 4 + 1 = 56$
- 즉 Kernel size, stride, pad에 의해 output의 $H$와 $W$가 결정 됩니다.
- Conv1의 출력을 저장하기 위한, Output이 차지하는 Memory 공간 은 다음과 같이 계산할 수 있습니다.
- output의 원소 개수 는 $Channel × Height × Width$ 이므로, $64 × 56 × 56 = 200,704$ 개 입니다.
- 한 원소당 32-bit floating point 크기 를 가진다고 할때, 4 byte의 크기를 가집니다.
- 따라서, Output이 차지하는 Memory 공간을 계산하기 위해서는 다음과 같이 계산합니다.
- $(number\ of\ elements) × (bytes\ per\ element) / 1024 = 200,704 × 4 / 1024 = 784KB$
- 즉 output을 저장하기 위해서는 784KB가 필요합니다.
- Conv1가 가지는 Parameter의 수 를 계산하기 위해서는 layer를 다시 살펴보아야 하는데, 다음과 같이 계산할 수 있습니다.(Filter가 학습되는 파라미터)
- (number of filter x input channel x kernel size x kernel size) + bias 로 계산할 수 있습니다.
- Weight 는 $Output\ Channel\ 수 × Input\ Channel\ 수 × Kernel\ size × Kernel\ size$ 이므로, $64 × 3 × 11 × 11$ 입니다.
- Bias 는 Output Channel의 수와 같으므로, 64입니다.
- 따라서, 총 파라미터 수는 $(64 × 3 × 11 × 11) + 64 = 23,296$ 개 입니다.
- Conv1의 계산에 필요한 floating point(부동소수점) 연산의 수 는 다음과 같이 계산할 수 있습니다.
- Neural Network에서는 (multiply 한번 + add 한번) 을 한번의 floating point 연산 이라고 계산합니다.
- 예를 들어, 크기가 3인 두 벡터의 내적은 element-wise 곱셈 3번 수행 후 3번의 덧셈을 수행해서 출력하게 되는데, 이때의 floating point 연산은 3번이라고 계산하는 것입니다.
- 이는 Output의 총 원소 수 x 각 원소를 계산하기 위한 연산의 수 이므로, $(Output\ Channel × Output\ Height × Output\ Width) × (Input\ Channel × Kernel\ size × Kernel\ size)$ 로 구할 수 있습니다.
- 따라서, $(64 × 56 × 56) × (3 × 11 × 11) = 72,855,552flops$ 입니다.
- Neural Network에서는 (multiply 한번 + add 한번) 을 한번의 floating point 연산 이라고 계산합니다.
- Conv1 계산 후에 ReLU nonlinear activation function를 적용합니다.
- 이후 Pool1 layer를 적용합니다.
- Channel은 그대로 유지하며, 가로 세로는 down sampling 됩니다.
- Pooling 레이어에서는 $C_{out} = C_{in}$ 이므로, 64입니다.
- Output Width(=Height)는 kernel, stride, input size에 의해 결정 됩니다.
- $(Input\ width - Kernel\ size) / Stride + 1 = 53 / 2 + 1 = 27.5$
- 위 결과에서, 소숫점 이하의 값을 내림 해주면 27이 됩니다.
- Pool1의 출력을 저장하기 위한, Output이 차지하는 Memory 공간 은 다음과 같이 계산할 수 있습니다.
- output의 원소 개수는 $Channel × Height × Width$ 이므로, $64 × 27 × 27 = 46,656$ 개 입니다.
- 한 원소당 32-bit floating point 크기를 가진다고 할때, 4 byte의 크기를 가집니다.
- 따라서, Output이 차지하는 Memory 공간을 계산하기 위해서는 다음과 같이 계산합니다.
- $(number\ of\ elements) × (bytes\ per\ element) / 1024 = 46,656 × 4 / 1024 = 182.25KB$
- 즉 output을 저장하기 위해서는 182.25KB가 필요합니다.
- Pool1는 learnable parameter가 없습니다.
- Pool1의 계산에 필요한 floating point(부동소수점) 연산의 수 는 다음과 같이 계산할 수 있습니다.
- Pooling Layer에서는 출력 후 채널별로 더해주는 연산이 없기 때문 에, 식은 $(Output\ Channel × Output\ Height × Output\ Width) × (Kernel\ size × Kernel\ size)$ 가 됩니다.
- 따라서, $(Output\ Channel × Output\ Height × Output\ Width) × (Kernel\ size × Kernel\ size) = (64 × 27 × 27) × (3 × 3) = 419,904 flops$ 입니다.
- Convolutional layer에 비해 현저히 적습니다.
- Conv Layer와 pooling Layer들을 여러번 통과 후에, Fully-Connected Layer와의 연결을 위해 Flatten시킵니다.
- 즉, 입력을 모두 1차원 벡터로 펼쳐주는 연산을 수행하게 됩니다.
- 이러한 연산을 수행하는 layer를 Flatten layer이라고 하며, 단순히 펼치는 작업 뿐이므로 학습되는 파라미터와 flop은 없습니다.
- 따라서, 출력은 $Input\ Channel × Height × Width = 256 × 6 × 6 = 9216$ 이 됩니다.
- Flatten layer를 통과한 1차원 벡터는 Fully Connected layer에 입력으로 들어가게 됩니다.
- FC6에 대한 파라미터 개수는 weight matrix의 크기와 같습니다.
- 따라서 $input의\ 채널\ 수 × output의\ 채널\ 수 + bias term$ 입니다.
- FC6에 대한 부동소수점 연산의 수는, 내적을 각 행마다 연산을 하는데(9216번), $W$ 의 행 개수가 4096이므로, $9216 × 4096 = 37,748,736$ 이 됩니다.
- 그리고 마지막 Fully connected layer는 1000개의 category에 대한 score를 출력하게 됩니다.
- 마지막 FC 레이어의 output은 ImageNet 데이터셋의 class가 1000개이기 때문에 1000개로 맞춰줍니다.
- AlexNet의 모델 구성(위 슬라이드의 빨간색 박스)은 단지 Trial and error를 통해 가장 성능이 좋았을 때의 모델 구성일 뿐입니다.
- 초록색 박스 부분을 보면, 네트워크를 통과하며 메모리, 파라미터, flop이 감소하게 되는 것을 볼 수 있는데, 이는 AlexNet뿐만 아니라, 여러 CNN에서도 따르고 있는 trend입니다.
- AlexNet에서의 메모리, 파라미터, flops에 대한 설명을 정리하면 다음과 같습니다.
- Memory는 Conv layer가 더 많은 부분을 차지합니다.
- 초기 Input은 픽셀 수가 높기(이미지 해상도가 높기) 때문입니다.
- Parameter의 수는 FC layer가 더 많습니다.
- 학습할 양이 많기 때문입니다.
- Flops(부동소수점 연산량)은 대부분 Conv layer가 더 많은 연산을 수행합니다.
- 즉 Conv레이어를 쌓을 때 연산 부담이 커집니다.
- Memory는 Conv layer가 더 많은 부분을 차지합니다.
- 추가적으로 AlexNet은 대체로 다른 Conv Net의 다이어그램과 유사하긴 하지만, 분산처리(모델이 두개로 나눠진 구조) 를 했다는 차이점이 있습니다.
- AlexNet을 학습할 당시에 GTX580으로 학습시켰는데, 메모리가 3GB 밖에 없어서 전체 레이어를 GPU에 다 넣을 수 없었기 때문에 네트워크를 GPU에 분산시켜서 학습하였습니다.
- 따라서 모델을 2개로 나누어 두 개의 GPU가 각각 절반의 뉴런, feature map를 가지는 구조로 학습이 되었습니다.
- 따라서 위의 그림을 보면 첫번째 conv layer 를 나온 output size가 $55 × 55 × 96$ 이 아닌 $55 × 55 × 48$ 이 되어있는 모습을 확인할 수 있습니다.
- 따라서 위 그림과 같이 CONV1, CONV2, CONV4, CONV5에서는 오직 절반의 feature map으로만 연산을 합니다.
- CONV3, FC6, FC7, FC8에서는 나뉜 feature map들이 합쳐져 연산이 되어 최종적으로 전체 네트워크가 전체 feature map을 사용할 수 있게 됩니다.
- 정리하면, AlexNet은 ImageNet Classification Benchmark의 2012년도에 최초의 CNN기반 우승 모델입니다.
- 또한 AlexNet은 다양한 Task의 transfer learning에 많이 사용되었습니다.
ZFNet(2013)
- ZFNet 은 AlexNet 이후, ILSVRC 2013년에 우승한 아키텍쳐 입니다.
- AlexNet에서 많은 하이퍼파라미터에대해 시행착오를 거쳐, layer configuration을 수정하여 우승하였습니다.
- ZFNet은 AlexNet과 아이디어는 동일하지만, 더 큰 버전의 AlexNet입니다.
- AlexNet과의 차이점은 1번째 Conv layer에서 Filter size와 Stride를 줄여서 더 세밀하게 탐색하도록 하였고, 이후의 Conv layer에서도 출력 필터의 수를 더 늘렸습니다.
- Conv1에서 커널사이즈와 stride사이즈를 축소하여, 다음 layer가 더 고해상도로 인식 하게 됩니다.
- Conv3, 4, 5에서 필터 개수를 증가 시킴으로써 연산 횟수, learnable parameter의 개수가 증가했습니다.
- 따라서, 단지 네트워크를 더 크게 하고 연산량을 늘려서 성능을 높인 More trial and less error라고 볼 수 있습니다.
VGGNet(2014)
- 2014년도에 넘어오면서 CNN 구조는 VGG, GoogleNet과 같이 더 복잡하고 깊게 만들어졌습니다.
- 2012/2013년에는 8개의 레이어인 반면, 2014년에는 19레이어와 22 레이어로 늘어났습니다.
- ILSVRC 2014의 우승자는 Google의 GoogLenet이며, Oxford의 VGGNet이 2등을 차지했습니다.
- VGGNet 은 아주 심플하면서도 nice한 아키텍쳐이며, ImageNet에서 7.3%의 Top 5 Error를 기록했습니다.
- VGG는 AlexNet보다 더 작은 필터 를 이용하고, 더 많은 레이어 를 가지는 구조로 이루어져있습니다.
- 또한 AlexNet에서는 8개의 레이어였지만 VGGNet은 16에서 19개의 레이어를 가집니다.
- 그리고 VGG는 이웃픽셀을 포함할 수 있는 가장 작은 필터인 3×3 size의 filter를 사용 하며, stride 1, padding 1 만을 사용한 CONV layer 들을 구성하였습니다.
- 즉 VGG는 네트워크에 설계에 대한 어떠한 원칙을 갖도록 해준 모델 입니다.
- AlexNet과 ZFNet은 단순히 trial and error였으며, VGGNet을 통해 네트워크의 확장과 축소를 더욱 쉽게 생각할 수 있게 되었습니다.
- 강조하면 VGGNet이 중요한 이유는 CNN아키텍쳐의 디자인 가이드를 제시했기 때문 입니다.
- VGG는 아주 심플하고 깔끔한 디자인 규칙 을 따릅니다.
- NN은 기본적으로 5개의 stage로 이루어져 있으며, Stage 1, 2, 3에서는 conv두번에 pooling, 그리고 Stage 4,5에서는 conv를 4-5번하고 pooling 레이어를 쌓았습니다.
- 모든 Conv layer는 3x3 크기이고, stride와 padding은 1입니다.
- 모든 Max pool은 2x2 크기이고, stride는 2이며, Max pool 이후에는 channel을 2배로 늘립니다.
Design Rules of VGG
- 지금부터 이러한 구성으로 신경망을 구성한 motivation 을 알아보겠습니다.
- 모든 Conv Layer가 3x3 size 및 pad가 1인 디자인 규칙 에 대해서 살펴보겠습니다.
- 위 슬라이드의 Option 1과 Option 2는 큰 Kernel size를 가진 Conv layer와 작은 kernel size를 가진 Conv layer를 여러겹 쌓은 경우를 비교한 것인데, 그 결과는 다음과 같습니다.
- 두 경우 모두에서 네트워크가 바라보는 입력의 양(receptive field)이 동일 합니다.
- 5x5 Conv layer에서 영향을 받는 receptive field는 3x3 크기의 Conv layer 2개를 쌓았을 때와 동일합니다.
- 마찬가지로, 7x7 크기의 Conv layer는 3x3 크기의 Conv layer 3개를 쌓았을 때와 영향을 받는 receptive field가 동일합니다.
- 그러므로 작은 kernel size의 Conv layer를 여러겹 쌓은 경우에서 파라미터와 연산량이 더 적으며, 학습 속도를 개선할 수 있습니다.
- Option 1
- param = $Input\ Channel\ 수 × Output\ Channel\ 수 × Kernel\ size × Kernel\ size \ = C_{in} × C_{out} × 5 × 5 = 25C^2$
- FLOPs = $(Output\ Channel × Output\ Height × Output\ Width) × (Input\ Channel × Kernel\ size × Kernel\ size) \ = (C_{out} × H × W) × (C_{in} × 5 × 5) = 25C^2HW$
- Option 2
- param = $9C^2 + 9C^2 = 18C^2$
- FLOPs = $9C^2HW + 9C^2HW = 18C^2HW$
- 즉 Params와 FLOPs 계산결과를 보면 3x3 Conv layer를 2개 쌓은 것이 5x5 Conv layer보다 더욱 적습니다.
- 만약 $3×3$ size 필터를 가진 conv layer 세 개와, $7×7$ size 의 필터를 사용한 conv layer 한 개를 비교하면 다음과 같이 됩니다.
- $3 × (3^2C^2) = 27C^2$ vs $7^2C^2 = 49C^2$
- Option 1
- 또한 작은 kernel size의 Conv layer를 여러겹 쌓은 경우가 더 높은 표현력을 갖게 됩니다.
- Conv layer를 여러번 쌓게되면, 더 많은 ReLU를 통과하며 비선형성(non-linearity)이 추가되므로 더 높은 표현력 을 가지게 됩니다.
- 두 경우 모두에서 네트워크가 바라보는 입력의 양(receptive field)이 동일 합니다.
- 따라서, 본 디자인 규칙은 작은걸 여러개 쌓는게 더 좋으니까 하이퍼파라미터로서 kernel size는 고려하지 않아도되고, 네트워크의 깊이만 고려하면 된다는 의미 를 담고 있습니다.
- 다음 디자인 규칙은, 모든 Max pool은 2x2 크기이고, stride는 2이며, Max pool 이후에는 channel을 2배로 늘리는 것 에 대해 살펴보겠습니다.
- 위 슬라이드의 Option 1과 Option 2는 Max pool 이후 channel을 2배 늘린 경우의 전과 후를 비교한 것인데, 그 결과는 다음과 같습니다.
- Memory : 절반으로 줄어들었습니다.
- Parameters : 4배 증가했습니다.
- FLOPs : 그대로 유지됩니다.
- 여기서, 중요한 것은 연산량(FLOPs)가 유지된다는 점입니다.
- 결국 channel을 2배 늘린 이유는 픽셀이 반으로 줄어도, 각각의 conv stage에서는 동일한 부동소수점 연산 수를 갖게 주기 위함 입니다.
- 따라서, 디자인 규칙 2는 각 stage에서의 Conv layer의 kernel size(each spatial resolution)가 변해도 Max pool 이후 channel을 2배로 해줌으로써 연산량을 동일하게 유지할 수 있다는 의미를 담고 있습니다.
- 다음은 VGGNet의 전체 네트워크를 한번 살펴보겠습니다.
- AlexNet의 총 파라미터 수는 60M인 반면, VGG는 총 파라미터 수는 약 138M 정도 임을 알 수 있습니다.
- VGG는 메모리 사용량이 많은 모델 입니다.
- 초기 레이어에서 많은 메모리를 사용하는 것을 알 수 있습니다.
- Sparial dimention이 큰 곳들이 메모리를 더 많이 사용합니다.
- 마지막 레이어는 많은 파라미터를 사용합니다.
- FC-Layer는 dense connection이기 때문에 엄청난 양의 파라미터를 사용합니다.
- 최근의 네트워크들은 너무 많은 파라미터를 줄이기 위해 FC Layer를 없애버리기도 합니다.
- 다음은 VGGNet의 Details 입니다.
- VGGNet은 ImageNet 2014 Classification Challenge에서 2등, Localization에서는 우승을 했습니다.
- AlexNet에서 사용한 Local response normalization은 사용하지 않습니다.
- VGG16과 VGG19은 아주 유사하며, VGG19가 아주 조금 더 좋습니다. 보통 16을 더 많이 사용합니다.
- 그리고 모델 성능을 위해서 앙상블 기법을 사용했습니다.
- VGG의 마지막 FC-Layer인 FC7은 4096 사이즈의 레이어인데 아주 좋은, feature represetation을 가지고 있는 것으로 알려져있습니다.
- 아주 좋은 feature representation으로, 다른 데이터에서도 특징(feature) 추출이 잘되며, 다른 Task에서도 일반화 능력이 뛰어난 것으로 알려져있습니다.
- 마지막으로 위 슬라이드는 VGGNet과 동일하게 5개의 Conv layer와 3개의 FC layer를 가지는 AlexNet을 비교한 것입니다.
- 이를 통해 VGGNet이 AlexNet에 비해 엄청나게 큰 모델 이라는 것을 알 수 있습니다.
GoogLeNet
- GoogLeNet은 ILSVRC 2014 Classification Challenge에서 우승한 모델입니다.
- VGGNet과 마찬가지로 depth가 깊어졌으며, 더 좋은 accuracy를 달성했습니다.
- GoogLeNet 은 계산 효율성을 고려하여 구성한 아키텍쳐 입니다.
- 즉 GoogLeNet은 성능을 높임과 동시에 네트워크 계산 효율성을 고려하는 것에 집중한 모델 입니다.
- AlexNet에서 VGG까지의 모델들은 모두 네트워크의 크기가 커질수록 좋은 성능을 보이는 것에 집중한 모델이었지만, GoogLeNet은 효율적인 CNN을 설계하는 방법에 집중하였습니다.
- 즉 GoogLeNet은 Parameter 개수, memory 사용, 연산 수를 줄이는 것에 중점 을 두었습니다.
- Mobile에서는 training단계를 거치지는 않지만, Testing time에서 forward pass를 거쳐야 하므로 효율성이 중요합니다.
- GoogLeNet도 엄청 깊은 네트워크입니다.
- 반복하지만 GoogLeNet에서 가장 중요한 것은 효율적인 계산에 관한 특별한 관점이 있다는 것과 높은 계산량을 아주 효율적으로 수행하도록 네트워크를 디자인했다는 점입니다.
- GoogLeNet은 Inception module 을 사용합니다.
- GoogLeNet에는 파라미터를 줄이기 위해서 FC-Layer가 없습니다.
- 또한 전체 파라미터 수가 5M 정도입니다.
- 60M인 AlexNet보다 적지만, 그럼에도 불구하고 훨씬 더 깊습니다.
- ILSVRC 2014에서 6.7%의 top-5 error로 우승했습니다.
GoogLeNet: Aggressive Stem
- 지금부터 GoogLeNet의 구조를 톺아보겠습니다.
- GoogLeNet의 첫번째 아이디어는 맨 처음에 Stem Network 를 사용한 것입니다.
- 앞선 아키텍쳐들은 앞쪽 단계에서 고해상도의 이미지에 Conv layer 적용시 부동소수점 연산이 집중되어 있었습니다.
- GoogLeNet은 해당 연산 수를 줄이기 위해서, 앞쪽 단계에서 빠르게 downsampling을 진행하는 선택을 했습니다.
- 즉 Stem Network 는 입력 이미지를 아주 aggressively하게 다운샘플링 하는 역할을 수행하는 네트워크를 의미 하는데, 이를 사용한 이유는 초기의 expensive한 Conv 연산을 피하기 위함입니다.
- 슬라이드의 표에서, 3번의 Conv layer만으로 224x224 크기의 입력(resolution)이 28x28로 빠르게 줄어든 것을 볼 수 있습니다.
- 앞쪽 단계에서 빠르게 downsampling을 진행함으로써, VGGNet에 비해 memory, parameter 수, 연산 수 모두 줄어들었음을 알 수 있습니다.
GoogLeNet: Inception module
- GoogLeNet의 두번째 아이디어는 연산 효율성을 올릴 수 있었던 핵심적인 부분인 Inception module 입니다.
- inception module은 좋은 local network typology를 디자인 하기위해 설계되었으며, 네트워크 안의 네트워크 (network within a network)의 개념으로 만들어졌습니다.
- GooleNet은 Inception module들을 쌓아올려 구성합니다.
- 즉 네트워크 안의 Local Network를 Inception module 이라고 합니다.
- 슬라이드의 Inception module은 Naive Inception module 입니다.
- Inception Module 내부에는 동일한 입력을 받는 서로 다른 다양한 필터들이 “병렬로” 존재합니다.
- 1×1 CONV, 3×3 CONV, 5×5 CONV, 3×3 MAX POOL 연산이 병렬적으로 이루어집니다.
- 각 filter를 통해 연산되어 나온 output 들을 모두 depth 방향으로 합칩니다.(concatenate)
- 합쳐진 하나의 출력을 다음 레이어로 전달합니다.
- 하지만 Naive Inception module은 계산 비용의 문제점이 존재 합니다.
- 예제를 살펴보겠습니다.
- 1×1 CONV 128개, 3×3 CONV 192개, 5×5 CONV 96개, 3×3 MAX POOL이 있으며, 각 연산은 병렬적으로 이루어지며, stride를 조절하여 입/출력 간의 spatial dimention을 유지시켜줍니다.
- Module input이 28×28×256일때 다음과 같습니다.
- 1 x 1 x 128 conv의 출력: 28 x 28 x 128
- 3 x 3 x 192 conv의 출력: 28 x 28 x 192
- 5 x 5 x 96 conv의 출력: 28 x 28 x 96
- 3 x 3 Pool의 출력: 28 x 28 x 256
- 모든 출력 값들을 depth-wise로 합친(concat) 사이즈를 계산해볼때 28 x 28 은 동일하고 depth가 점점 쌓이게 됩니다.
- Inception module의 입력: 28 x 28 x 256
- Inception module의 출력: 28 x 28 x (128 + 192 + 96 + 256) = 28 x 28 x 672 = 529K
- spatial dimention은 변하지 않았지만 depth가 엄청나게 증가했습니다.
- 그리고 각 레이어들의 계산량을 한번 살펴보면 다음과 같습니다.
- 1 x 1 x 128 conv의 연산량: 28 x 28 x 128 x 1 x 1 x 256
- 1 x 1 conv는 각 픽셀마다 1 x 1 x 256 개의 내적연산을 수행되므로, 픽셀 당 256번의 곱셈 연산이 수행됩니다.
- 그리고 각 픽셀이 총 28 x 28이며, 128개의 filter를 만들기 때문에 다음과 같이 연산됩니다.
- 3 x 3 x 192 conv의 출력: 28 x 28 x 192 x 3 x 3 x 256
- 5 x 5 x 96 conv의 출력: 28 x 28 x 96 x 5 x 5 x 256
- 따라서 하나의 Inception Module에서의 전체 연산량은 854M가 되며, 이는 연산량이 아주 많습니다.
- 1 x 1 x 128 conv의 연산량: 28 x 28 x 128 x 1 x 1 x 256
- Pooling layer 또한 입력의 Depth를 그대로 유지하기 때문에 문제를 악화시킵니다.
- 즉 레이어를 거칠때마다 Depth가 점점 늘어만 갑니다.
Reminder: 1x1 convolutions
- Naive Inception module은 계산 비용의 문제점을 해결하기 전에 1x1 conv 를 다시 한번 살펴보겠습니다.
- 1x1 conv는 각 spatial location에서만 내적을 수행합니다.
- 즉 spatial dimensions을 보존하면서, depth만 줄일 수 있기에, 입력의 depth를 더 낮은 차원으로 projection할 수 있습니다.
- Input feature map들 간의 선형결합(linear combination) 또는 각 input pixel에 동일한 FC layer를 적용하는 것으로 해석 할 수 있습니다.
Solution: “bottleneck layers”
- Naive Inception module은 계산 비용의 문제점을 해결하기위한 key insight는 “bottleneck layer” 를 이용하는 것입니다.
- “bottleneck layer”는 feature의 depth를 감소시키기 위해 1x1 convolutions을 사용하는 것을 의미 합니다.
- “bottleneck layer” 아이디어는 입력의 depth를 줄이는 것 입니다.
- ouput의 채널수가 계속해서 많아져 연산량이 증가하는 문제를 해결하기 위해 Inception module 내부의 각 연산 과정에도 이러한 1x1 convolutions을 추가해 input의 차원(depth)을 축소합니다.
- 3×3 conv, 5×5 conv 연산 이전에 1×1 conv 연산으로 함으로써 3×3 conv, 5×5 conv 연산에 들어갈 input 의 channel 수를 줄입니다.
- pooling layer 에서는 3×3 pooling 연산 이후에 1×1 conv 연산을 적용하여 output 의 channel 수를 줄입니다.
- 즉 1x1 convolutions이 bottleneck layers의 역할로 추가되는 것입니다.
- 픽셀별로 nonlinearity를 줄 수 있는 방법 으로서, 픽셀별로 fc layer에 한번 돌린 것보다 효과가 좋습니다.
- 즉 GoogLeNet은 Inception module with dimension reduction을 사용 하였습니다.
- Inception 모듈은 VGG와 같이 kernel size에 대해 하이퍼파라미터를 고려하지 않도록 설계 되었습니다.
- Inception 모듈은 4개의 parallel한 branch가 있는데 각각 1x1 Conv, 3x3 Conv, 5x5 Conv, Max pool입니다.
- 즉, Inception 모듈 안에서 다양한 크기의 kernel size를 고려하게 되므로, 하이퍼파라미터로 고려할 필요가 없게 되는 것입니다.
- 또한 Inception 모듈에서 또 한가지 주목할 것은 1x1 Conv 연산입니다.
- 연산 비용이 비싼 spatial한 Conv 연산을 수행하기 전에 1x1 Conv 연산을 통해 input channel의 차원을 조절하여(줄여서) 연산량을 줄이는 방법을 사용 하였습니다.
- 결과적으로 1x1 convolutions를 추가함으로써 연산량을 많이 줄일 수 있습니다.
- 그리고 이를 통해 배울 수 있는 점은 1x1 convolutions를 이용하면 계산량을 조절할 수 있다는 사실입니다.
- 이때, 1x1 convolutions을 사용함으로써 input의 정보 손실이 일어나지 않을까라고 생각할 수도 있는데, 1x1 convolutions을 추가함으로써 네트워크가 더 깊어지는 효과도 있고 각 conv 연산 이후 ReLu와 같은 non-linear activation function을 사용함으로써 모델에 비선형성(non-linearity)를 부여할 수 있어 도움이 됩니다.
GoogLeNet: Global Average Pooling
- GoogLeNet의 세번째 아이디어는 네트워크의 맨 마지막에서 수행한 Global Average Pooling 입니다.
- AlexNet에서 VGGNet까지의 네트워크에서 보았듯이, 모델 파라미터의 대부분은 마지막의 FC layer에서 나오게 됩니다.
- GoogLeNet에서는 마지막 Conv layer의 출력을 1차원 벡터로 만드는 Flatten 연산 대신, 파라미터를 줄이기 위해 Global Average Pooling을 사용하여 이러한 파라미터의 수를 줄이며 efficiency를 높였습니다.
- Global Average Pooling은 마지막 Conv layer의 출력에서, 각 채널별로 1개씩의 평균을 구해 출력하는 방법입니다.
- 슬라이드의 윗쪽 표를 보면, 7x7 크기의 1024개의 채널이 Global Average Pooling에 입력으로 들어가서, 1024 크기의 1차원 벡터가 출력되는 것을 확인할 수 있습니다.
- 슬라이드 아래의 표(VGGNet)와 비교해보면, Global Average Pooling이 VGGNet에 비해 엄청난 양의 파라미터 수를 줄여주었다는 것을 알 수 있습니다.
GoogLeNet: Auxiliary Classifiers
- GoogLeNet의 마지막 아이디어는 Auxiliary Classifier 입니다.
- Batch Normalization이 나오기 이전에는 deep Network 트레이닝이 어려워서, 10개 이상의 layer를 가지는 네트워크를 학습시키기 위한 여러가지 방법들(hack)을 사용하였는데, 그중 GoogLeNet에서 사용한 방법이 Auxiliary Classifier입니다.
- Auxiliary classifier는 AvgPool - 1×1 Conv - FC - FC - Softmax로 이루어져 있습니다.
- 슬라이드에서 2개의 빨간색 박스가 Auxiliary Classifier인데, 이는 네트워크의 최종 출력과 같이 class score를 출력합니다.
- 따라서, GoogLeNet은 총 3개의 다른 class score를 출력하였습니다.
- 하나는 네트워크의 마지막, 나머지 두개는 네트워크의 중간
- 따라서, GoogLeNet은 총 3개의 다른 class score를 출력하였습니다.
- 그리고 이 중간의 두 classifier의 score에 대해서도 trainset loss를 계산하여 gradient가 전파되도록 하였습니다.
- 이는 네트워크에서 gradient가 더 잘 전파되도록 하는 효과 가 있었습니다.
- 네트워크의 끝에만 gradient를 주입하는 것보다 네트워크의 중간에 gradient를 두번 더 주입하는 것이라고 생각하면 됩니다.
- 즉 이러한 Auxiliary classifier를 사용해서 네트워크 중간 중간에서 class를 분류하고, loss값을 이용함으로써 네트워크가 깊어져도 네트워크의 중간 중간에서 gradient를 잘 이용하여 학습할 수 있게 합니다.
- inference하는 과정에서는 중간에 2개의 auxiliary classifier를 모두 제거 후, 제일 마지막 layer의 softmax만을 사용 합니다.
GoogLeNet Architecture
- 전체 아키텍쳐의 모습입니다.
- 정리하면 GoogLeNet에는 가중치를 가진 레이어가 총 22개이며, 각 Inception Module은 1x1/3x3/5x5 conv layer를 병렬적으로 가지고 있습니다.
- AlexNet보다 12배 작은 파라미터를 가지고있고, ILSVRC 2014 clssification의 우승 모델입니다.
- GoogLeNet은 아주 신중하게 디자인된 모델이며, Google의 거대한 클러스터를 이용한 cross validation을 수행한 결과 나온 최적의 디자인 입니다.
ResNet(2015)
- ResNet 은 ILSVRC 2015 Classification Challenge에서 우승한 모델 입니다.
- ResNet은 layer개수를 크게 증가시키면서, accuracy는 반으로 줄이는 혁신을 선보였습니다.
- ResNet 아키텍쳐는 152 레이어로 엄청나게 더 깊어졌습니다.
- ResNet 아키텍쳐는 이전의 다른 모델들에 비해 엄청나게 깊은 네트워크입니다.
- ImageNet데이터를 분류하기 위해 ResNet은 152개의 레이어를 가지고 있습니다.
motivation of ResNet
- Batch normalization이 등장하고 사람들은 10개 이상의 layers를 쌓는 deeper network가 가능해짐을 깨달았습니다.
- 기존 트렌드는 더 깊은 네트워크일수록 더 좋은 성능을 내 왔기 때문에 deeper network에서 더 좋은 성능을 낼 것으로 기대했지만, 문제는 너무 깊어지니 BN을 적용했음에도 불구하고 성능이 더 나빠졌습니다.
- 위 그림에서, 56개 layer 모델이 20개 layer 모델보다 성능이 좋지 않은 것을 확인할 수 있습니다.
- 처음에는 이러한 현상이 딥러닝 모델이 Overfitting되었기 때문일 것이라고 추측 하였습니다.
- 따라서 더 깊은 모델은 학습 시 Overfitting이 된 것이라고 가정을 하고 실험을 진행했습니다.
- 하지만 실험을 통해 알게된 사실은 매우 깊은 네트워크가 Overfitting이 아니라 오히려 Underfitting 되었다는 것입니다.
- 위 슬라이드의 왼쪽과 오른쪽 그래프는 각각 Training data, Test data에 대한 결과인데, deeper model에서 둘 모두 안좋은 성능을 보이기 때문에 overfitting 문제가 아닙니다.
- 그리고 overfit이 발생한다면 test error는 높더라도 training error는 아주 낮아야 정상일 것 입니다.
- 그런데 56-layer의 traing error을 보면 20-layer보다 안좋습니다.
- 그러므로 더 깊은 모델임에도 test 성능이 낮은 이유가 over-fitting 때문이 아니라는 것을 알 수 있습니다.
- Training error을 살펴본 결과 deep model은 사실상 underfitting 되어있었습니다.
- Training자체가 잘 되지않았습니다.
- 위 슬라이드의 왼쪽과 오른쪽 그래프는 각각 Training data, Test data에 대한 결과인데, deeper model에서 둘 모두 안좋은 성능을 보이기 때문에 overfitting 문제가 아닙니다.
- 이러한 현상이 발생하는 이유는 네트워크가 깊어짐에 따라 모델을 최적화(optimize)하여 학습시키기 어렵다는 점 때문입니다.
- 네트워크가 깊어지면 vanishing gradient/exploding gradient 문제 등이 발생하여 모델을 학습이 시키기 어려워져 오히려 안좋은 성능을 보이는 것입니다.
- deeper models은 shallower models보다 더 많은 representation power(more parameters)를 가집니다.
- 그렇다면 deeper models은 shallower models을 재현할 수 있어야 한다는 것 입니다. 적어도 비슷한 성능을 내기를 원한 것 입니다.
- shallower models의 layer를 deeper models의 layer에 복사한 후, 나머지 layer를 identity function으로 생각한다면 얕은 모델을 emulate 한다고 생각할 수 있습니다.
- ex. 첫 20개의 레이어는 20개의 레이어를 가진 모델을 통째로 복사하고 나머지 레이어는 identity function 역할만 하면되기에 이론적으로 56개의 레이어의 모델은 최소한 20개 레이어의 모델만큼의 성능은 보장됩니다.
- 따라서 deeper models은 최소한 shallower models만큼 효과적이어야 합니다.
- shallower models의 layer를 deeper models의 layer에 복사한 후, 나머지 layer를 identity function으로 생각한다면 얕은 모델을 emulate 한다고 생각할 수 있습니다.
- 하지만, 여러 실험에서 깊은 모델이 underfitting 되었다는 것이 의미하는 것 은, 깊은 모델이 얕은 모델을 재현(emulate)하는 identity function를 optimization하는데 문제가 있다는 것을 의미합니다.
- 결론적으로, 다음과 같은 가설 을 세웁니다.
- 해당 문제는 training 문제가 아니라, optimization problem 입니다.
- deeper models은 optimization하기 더 어려우며, 때문에 특히 shallower models을 모방하기 위한 identity functions을 학습하지 않습니다.
- deeper models이 적어도 shallower models만큼 우수하려면, 네트워크를 수정해서 identity function을 잘 학습하도록 하는 것이 해결방안 입니다.
- 더 얕은 모델의 가중치를 깊은 모델의 일부 레이어에 복사합니다.
- 그리고 나머지 레이어는 input을 output으로 그냥 내보내서 identity mapping을 합니다.
- 이렇게 구성하면 Deeper Model의 학습이 제대로 안되더라도 적어도 Shallow Model 만큼의 성능은 보장됩니다.
- 이러한 문제를 해결하기 위해 ResNet에서는 identity function을 더 잘 학습하기위해서, skip connection을 이용한 Residual block 을 사용합니다.
- 즉, 수정된 네트워크 구조는 Residual Block 입니다.
- Residual block은 일반적인 여러개의 conv layer들로 이루어져있고, 여기에 skip connection을 추가한 구조로 이루어져있습니다.
- Skip connection 이란, 이전 레이어의 input(residual block의 처음 input)을 그대로 residual block의 output에 mapping하여 최종 output을 만들어내는 것 입니다.
- 여기서 이전 레이어에 가져와 그대로 합쳐주는 x를 identity 라고 하고, 이것을 이후 output에 합치는 것을 identity mapping 이라고 표현합니다.
- 이것을 수식으로 표현하면 H(x) = F(x) + x 라고 할 수 있습니다.
- H(x)는 전체 conv layer들을 통과한 함수를 뜻합니다.
- 원래는 전체 conv layer, 위 그림에서 H(x)를 학습해야했는데, 이렇게 skip connection을 이용함으로써 F(x)만 학습할 수 있게 됩니다. F(x) = H(x) − x 로 표현할 수 있으니, 이것은 즉 해당 block 에서 입력 x에 대한 잔차(residual) or 변화량(delta)만 학습 한다고 할 수 있습니다.
- 따라서 residual block 이라고 부르는 것입니다.
- 네트워크는 Residual만 학습하면 그만이며, 레이어가 Full mapping을 학습하기 보다 이런 조금의 변화(X에 대한 변화량(delda))만 학습하는 것 입니다.
- 만약 H(x)를 직접 학습시키는 대신에 F(x)인 Residual을 학습하는게 더 쉽다라는 가설이 참이라면, 어쩌면 대부분의 레이어가 잘 동작하려면 레이어의 출력이 Identity에 가까워야 할지 모른다는 것을 암시합니다.
- 그러므로 Identity(Input)을 단순히 더해주고, 변화량(delta)만 학습시키면 됩니다.
- 정리하면 ResNet의 아이디어는 H(x) = F(x) + X 이니, F(x)를 학습시켜보면 어떨까? 하는 것이며, H(x)를 직접 배우는 대신에 X에 얼마의 값을 더하고 빼야할까?(Residual)를 배우는 것이 쉬울 것이라고 생각한 것이므로, 입력값을 어떻게 수정해야 하는지를 배운다고 보면 됩니다.
- 이 방식은 깊은 네트워크가 얕은 네트워크를 더 쉽게 emulate할 수 있게 해줍니다.
- identity function에 대해 쉽게 학습이 되기를 기대하는 의미입니다.
- 만약 슬라이드의 Residual Block안에 있는 2개 Conv layer의 weight를 0으로 설정한다면, 두 layer의 출력은 0이 되고 Residual Block의 최종 출력 결과는 identity를 계산하게 됩니다.
- 또는 Input = output 이어야 하는 상황이라면 레이어의 출력인 F(x)가 0 이어야 하므로(residual = 0) 모든 가중치를 0으로 만들어주면 그만입니다.
- 또한, 깊은 네트워크에서 gradient의 흐름을 개선하는데에도 도움이 됩니다.
- Back Propagation에서, Add gate는 입력 모두에 gradient를 전달해주는 gradient distributor 역할을 수행합니다.
- 이러한 gradient의 전달이 Residual Block에서는 short cut으로 이루어지게 되므로, 깊은 네트워크에서 gradient의 흐름이 더 원활하게 이루어지게 됩니다.
Full ResNet architecture
- 전체 ResNet 구조에 대해 살펴보겠습니다.
- Residual Networks(ResNet)는 Residual Block을 쌓은 네트워크 구조입니다.
- 위 슬라이드를 보면, VGG에서 유사한 방식으로 residual block을 쌓은 형태라는 것을 알 수 있습니다.
- Residual Block은 2개의 3 x 3 Conv 레이어로 구성되어있습니다.
- 여러개의 stage로 나눠져있으며, stage가 시작할때 convolution시 stride=2를 적용하여 downsampling하고 그에따라 filter의 갯수를 2배로 늘립니다.
- 또한 GoogLeNet과의 유사한 점은 다음의 2가지가 있습니다.
- 처음의 몇개 layer에서 aggressive down sampling을 수행하여, 네트워크 초반에 연산량을 줄입니다.(Stem Network)
- 마지막 Conv layer의 출력인 네트워크의 끝에는 FC-Layer가 없고, Global Average Pooling을 수행하여 파라미터를 줄입니다.
- 이후 FC-Layer, softmax를 이용해 class수 만큼의 output을 출력합니다.
- 이후 FC-Layer, softmax를 이용해 class수 만큼의 output을 출력합니다.
- ResNet 모델의 Depth는 34, 50, 100까지 늘어나며, 논문에서는 ImageNet문제를 위해 152까지 늘렸습니다.
- ResNet-18의 구조는 다음과 같습니다.
- Stem을 수행한 후, 총 4번의 stage를 반복하고 Linear layer(FC layer)로 결과를 출력합니다.
- 각 stage에는 2번의 residual block과 4개의 Conv layer가 있습니다.
- 18의 의미는 layer의 수를 의미합니다. (Stem에서 1개, 모든 stage에서 16개, 최종 출력에서 1개)
- ResNet-34의 구조는 다음과 같습니다.
- Stem, 총 4번의 stage, FC layer의 형태는 동일합니다.
- 각 stage에서 residual block(Conv layer)의 수가 더 증가했습니다.
- 위 슬라이드 하단의 VGG-16과 비교해보면, ResNet이 더 적은 연산(FLOPS)을 수행하는 것을 알 수 있는데(4배 차이), 이는 Stem과 Global Average Pooling을 수행했기 때문입니다.
Residual Networks: Bottleneck Block
- ResNet은 모델의 Depth가 50 이상일때 연산 효율을 높이기 위해 Bottleneck Layers 를 도입합니다.
- GoogLeNet에서 사용한 bottleneck layer와 유사한 개념입니다.
- Residual block의 conv layer에 들어가기 전에 1×1 conv layer를 이용해 차원(채널수)을 줄여서 3×3 conv layer의 연산량을 줄여주고, 이후에 1×1 conv layer를 이용해 다시 차원(채널수)을 늘리는 구조로 이루어져 있습니다.
- 즉 Residual Network를 더 깊게 쌓기 위해 Bottleneck Block이라는 구조가 새롭게 만들어졌습니다.
- 슬라이드는 “Basic Residual block”과 “Bottleneck Residual block”을 비교한 것입니다.
- Basic block
- Basic Residual block은 2개의 3 x 3 Conv레이어를 쌓음으로써, 각각 $9HWC^2$ 이므로 총 $18HWC^2$의 부동소수점 연산이 필요합니다.
- 즉 3x3 Conv를 두번 수행합니다.
- Bottleneck block
- 먼저, 1x1 Conv layer를 사용해 입력의 채널을 1/4로 줄입니다. 그러므로 FLOPs는 $4HWC^2$ 입니다.
- 3x3 Conv를 수행합니다. 그러므로 FLOPs는 $9HWC^2$ 입니다.
- 마지막으로, 다시 1x1 Conv layer를 통해 입력의 채널을 4배로 키웁니다. 그러므로 FLOPs는 $4HWC^2$ 입니다.
- 총 FLOPs는 $17HWC^2$ 입니다.
- Basic block
- 위의 각 과정에서의 FLOPs를 모두 계산해보면, Bottleneck block이 더 깊어졌지만 연산량은 오히려 더 줄어들었다는 것 을 알 수 있습니다.
- 따라서, Basic에서 Bottleneck으로의 전환은 아래와 같은 효과를 얻게됩니다.
- 더 적은 연산량
- 더 높은 표현력 (더 많은 layer을 통과하면서 더 많은 비선형성이 추가됨)
- ResNet-34에서 Basic block을 Bottleneck block으로 전환한 네트워크 형태가 ResNet-50입니다.
- Network는 더 깊어졌고, 레이어수가 3배가 되며, error는 더 줄어들었지만, 연산량에는 큰 변화가 없습니다.
- ResNet-50보다 더 많은 Bottleneck block을 쌓은 구조들이 ResNet-101, ResNet-152이며 깊어질수록 네트워크가 더 잘 동작하므로 error는 조금씩 감소하였습니다.
- 정확도가 더 높지만 연산 부담이 큰 모델입니다.
- ResNet을 훈련할때 여러가지 구체적인 방법들을 사용했습니다.
- 모든 conv layer 이후에 batch normalization 을 사용했습니다.
- He initialization 방법으로 가중치 초기화를 했습니다.
- optimizer로 SGD+Momentum을 사용하고 초기 learning rate 는 0.1 로 설정하여 validation error 가 줄어들지 않는 시점에 learning를 10배씩 감소시키는 learning rate decay를 사용했습니다.
- mini-batch size는 256입니다.
- weight-decay는 1e-5를 사용하고 dropout은 사용하지 않았습니다.
- ResNet은 네트워크가 깊어질수록 error가 점점 줄어드는 경향을 보이며 엄청난 격차를 보이는 좋은 성능으로 대회에서 우승합니다.
- degradation문제 없이 Very deep network를 아주 잘 학습시킬 수 있었습니다.
- ResNet은 ILSVRC와 COCO의 모든 대회종목을 2등과의 엄청난 격차로 휩쓸었습니다.
- Total top-5 Error는 3.6%로, ImageNet paper에서 제시한 “인간의 성능” 보다 뛰어났습니다.
Comparing complexity
- 왼쪽 그래프는 성능을 비교하는 그래프 이고, 오른쪽 그래프는 연산 수를 비교하는 그래프 입니다.
- 오른쪽 그래프에서 x축은 모델의 연산량을 의미하고 y축은 모델의 성능(accuracy)을 의미합니다.
- 오른쪽 그래프에서 오른쪽으로 갈 수록 헤비한 네트워크, 위로 갈수록 성능이 좋은 네트워크, 원 크기는 파라미터 개수(클수록 메모리가 부담)
- 모델 별로 성능과 복잡도(complexity)를 비교해서 살펴보겠습니다.
- Inception-v4는 ResNet+inception모델이 합쳐진 개념으로 가장 좋은 성능을 보입니다.
- AlexNet은 Accuracy가 낮으며 연산수는 적지만, 파라미터 개수가 많아 네트워크 입니다.
- VGG를 보면 연산량과 메모리 사용량이 엄청 커서 효율성이 작습니다.
- GoogLeNet은 연산량과 메모리사용량이 굉장히 작은 효율적인 모델입니다.
- ResNet은 심플한 디자인, 양호한 효율성의 네트워크로 정확도가 아주 높아 성능이 좋습니다.
- 다음으로, 각 모델에서 forward pass 하는데에 필요한 시간과 전력사용량을 비교한 그래프 입니다.
- 왼쪽 그래프가 forward pass 하는데 걸리는 시간, 오른쪽 그래프가 전력사용량 입니다.
- VGG가 시간이 오래 걸리는 것을 확인할 수 있고, ResNet은 적당한 정도로 분포하는 것을 알 수 있습니다.
Model Ensembles(2016)
- 2016년에는 이전처럼 혁신적인 시도보다는 이전까지의 모델을 이용한 앙상블 방식 의 모델이 많이 쓰였습니다.
- Inception, Inception-Resnet, Resnet, Wide Resnet models의 Multi-scale ensemble을 사용하여 0.6%를 개선시켜 우승하였습니다.
SENet(2017)
- 2017년 ResNext의 아이디어를 바탕으로한 여러 연구들을 통해서 Squeeze-and-Excitation(SE) 라는 방법을 사용한 SENet 이라는 모델이 나왔습니다.
- 그리고 이 모델이 2017년 좋은 성능을 보인 것을 마지막으로 ImageNet challenge는 끝납니다.
Other Networks
- 위에 모델들에 이어서 추가적으로 몇가지 중요한 모델 구조, ResNet에서 변형된 모델 구조들에 대해 살펴보겠습니다.
Network in Network(NiN)
- 2014년에 나온 논문으로 Network in Network 입니다.
- Network in Network의 기본 아이디어는 MLP Conv layer로, 각 Conv layer안에 FC-layer (multi-layer perceptron)를 넣는 것 입니다.
- convolution시 filter 대신에 MLP를 사용해서 feature를 추출하는 방법을 고안했습니다.
- 즉, Conv layer에서 filter를 거쳐나온 output을 여러개의 FC-layer에 통과시킴으로써 추상적인(abstract) feature 들을 추출해 더 복잡한(complex) activation map을 출력할 수 있도록 합니다.
- 이때, NiN 에서 말하는 FC-layer는 1×1 Conv layer라고 할 수도 있습니다.
- GoogLeNet과 ResNet에서 사용하는 bottleneck의 개념이 바로 이 NiN 에서 가져온 아이디어이기 때문에 NiN 은 큰 의미를 가집니다.
Identity Mappings in Deep Residual Networks
- 2014년에 나온 논문으로 Identity Mappings in Deep Residual Networks 입니다.
- 여기서는 ResNet block의 skip connection부분이 아닌 direct path 부분을 조절 하여 모델의 성능을 올렸습니다.
- “Pre-Activation”은 operation 순서를 바꿔 본 시도로, ReLU를 conv레이어보다 먼저 넣었습니다.
- Original ResNet block 에서는 윗단 레이어은 ReLU를 거친 positive값만 받기때문에, Identity function을 제대로 학습하지 못할 것 같다는 생각에서 출발한 시도입니다.
- 여러 실험들을 통해 논문에서 얻어낸 결론을 요약해보면 다음과 같습니다.
- shortcut path (skip connection 부분)의 정보는 최대한 손상시키지 않는 것이 backpropagation, 정보 전달 측면에서 유리 합니다.
- residual path에서는 shortcut과 합쳐주기 전에 activation function을 적용하는 것이 유리 하다는 것을 알아냈습니다.
- Accuracy는 1퍼센트정도 늘어나며, 크게 차이가 없으므로, 잘 사용되지는 않습니다.
Wide Residual Networks
- 또 다른 ResNet 에서 개선된 모델로 Wide ResNet 이 있습니다.
- 본 논문의 저자는 ResNet에서 네트워크의 깊이(depth)가 중요한게 아니라 residual 구조가 성능 향상에 큰 도움을 줬다고 주장 합니다.
- 따라서 네트워크가 extreamly 하게 깊어질 필요가 없다고 생각하여 residual block을 더 넓게 만들었습니다.
- 본 논문에서 wide 하다는 의미는 channel의 개수가 많다는 것을 의미합니다.
- 즉, WRN은 residual block을 구성하는 convolution layer의 filter 수를 증가시켜서 신경망의 넓이를 증가시켰습니다.
- Widening factor k에 따라 channel 개수가 늘어나는 구조입니다.
- 기존의 ResNet에는 Block 당 F개의 filter만 있었다면, F * K 개의 필터로 구성했습니다.
- 이렇게 각 레이어를 넓게(filter 의 갯수를 늘려) 구성하여 단 50개의 레이어만으로도 기존 152개의 레이어를 가지는 ResNet 보다 성능이 좋게 나오는 것을 증명 했습니다.
- 저자들은 기존 구조의 순서인 Conv-BN-ReLU가 아닌 BN-ReLU-Conv로 순서를 변경했습니다. 후자가 더 빨리 훈련하고 좋은 결과를 냈습니다. residual block의 power를 향상시킬수 있는 간단한 3가지 필수적인 방법은 다음과 같습니다.
- 합성곱층을 block마다 더 추가한다.
- feature planes를 더 추가하면서 합성곱층의 너비를 넓힌다.
- 합성곱층의 필터 size를 증가시킨다.
- 논문 저자들의 residual network의 일반적인 구조입니다.
- 논문에서 깊이 factor는 l, 너비 factor는 k로 나타냈습니다. figure1(a),(c)는 basic 모델과 basic-wide모델의 예를 보여줍니다.
- 위 표는 ImageNet과 COCO dataset의 성능을 비교합니다.
- Width가 증가할수록 성능이 올라가는 모습을 볼 수 있습니다.
- 정리하면 다음과 같습니다.
- widening은 여러 깊이의 residual network에서 성능을 일관되게 향상시킵니다.
- 깊이와 너비 둘다 증가시키는것은 파라미터의 수가 너무 많아지거나 강한 regularization이 필요해지기 전까지는 도움이 됩니다.
- 얇은 신경망과 동일한 수의 매개변수를 가진 넓은 신경망이 동일하거나 더 나은 성능을 낼 수 있기 때문에 residual network의 매우 깊은 깊이는 정규화 효과가 없는 것으로 보입니다. 더군다나, wide network는 얇은 네트워크보다 2배 이상의 많은 수의 매개변수를 사용하여 성공적으로 학습할 수 있습니다.
ResNeXt
- ResNet 논문의 저자들이 제안한 ResNet 을 발전시킨 형태인 *ResNext** 모델이 있습니다.
- 여기에서도 residual block 의 width를 늘리는 전략, 즉 conv layer의 filter의 갯수를 늘리는 방법 을 제안합니다.
- 독특한 점이 residual block 에서 여러 개의 병렬 pathway를 사용하는 구조 입니다.
- ResNext는 ResNet의 “Bottleneck” block을 병렬로 연결한 구조이며, 위 슬라이드의 오른쪽 구조와 같이 G개의 parallel pathway(block)으로 구성됩니다.
- 각 pathway에서 3x3 Conv layer의 연산을 위해 줄였다가 다시 증가시키는 채널의 수를 소문자 c라고 하면, 이러한 G개의 병렬 구조가 Bottleneck block과 같은 연산량을 갖게 하는 c의 값을 quadratic equation을 세우고 풀 수 있습니다.
- 위 슬라이드의 아랫부분의 식이 quadratic equation이며, 아래의 Example은 다음과 같은 의미를 갖습니다.
- Ex1) C=64, G=4라고 했을 때, c=24가 되어야 Bottleneck block과 같은 FLOPs를 갖습니다.
- Ex2) C=64, G=32라고 했을 때, c=4가 되어야 Bottleneck block과 같은 FLOPs를 갖습니다.
- 각 pathway에서 3x3 Conv layer의 연산을 위해 줄였다가 다시 증가시키는 채널의 수를 소문자 c라고 하고,
- 각각의 pathway에서 FLOPs를 계산한 후, 모두 더하면 전체 FLOPs를 구할 수 있습니다.
- 위 슬라이드의 아랫부분의 식이 quadratic equation이며, 아래의 Example은 다음과 같은 의미를 갖습니다.
- 이러한 방법은 네트워크 디자인을 수정하는 새로운 메커니즘을 제공합니다.
- 연산량을 유지하는 채널의 수를 설정하는 것 대신에, 방정식을 풀어 pathway의 수 G를 설정할 수도 있습니다.
- ResNext에서는 단순히 병렬적으로 사용하는 것이 아니라 1 x 1 Conv에서 채널의 1/4로 축소하는 것이 아니라 ‘c’ 만큼 축소했는데 $9Gc^2 + 8GCc - 17C^2 = 0$ 이라는 Flops 수를 구하는 방정식으로 통해서 임의로 정한 C와 G를 이용했을 때, 기존의 bottleneck residual block과 동일한 연산이 수행되는 c를 구해 그 값으로 c를 정한다고 합니다.
- Grouped Convolution은 Group의 수만큼 GPU를 병렬적으로 사용하는데, 이때 채널을 GPU의 수만큼 분리해서 각 GPU별로 학습을 진행합니다.
- 위 사항들을 고려했을때 다음과 같이 표기할 수 있습니다.
- ResNext의 parallel pathway 구조를 이용하면, 연산량은 유지하면서 성능은 향상시킬 수 있습니다.
- 위 슬라이드는 (연산량은 유지하면서) Group의 수를 늘릴수록 성능이 좋아진다는 것을 보여줍니다.
Deep Networks with Stochastic Depth
- ResNet의 성능을 개선하고자 하는 방법은 계속되는데, Stochastic Depth 이라는 논문이 있습니다.
- 네트워크가 깊어지면 backpropagation 과정에서 gradient가 전달될 수록 점점 gradient가 작아지는 gradient vanishing 문제가 발생하곤했습니다.
- 이러한 문제를 해결하기 위해 train time 에 레이어의 일부를 dropout 하는 방법입니다.
- 임의로 dropout 된 짧은 구조의 네트워크로 수월하게 학습을 하고 test time 에는 전체 네트워크를 이용해서 output을 내는 방법입니다.
FractalNet: Ultra-Deep Neural Networks without Residuals
- FractalNet 에서는 residual connection을 사용하지 않고 초기의 레이어(shallow)의 정보과 깊은 레이어(deep)의 정보를 모두 잘 전달하는 것이 중요하다는 관점에서 fractal 한 구조를 사용했습니다.
- 따라서 shallow layer의 정보와 deep layer의 정보를 모두 출력에 전달합니다.
- 또한 dropout 처럼 train time 에는 임의의 일부 경로의 정보를 사용해서 학습하고 test time 에 전체 경로를 이용하는 방법을 사용합니다.
DenseNet
- DenseNet 은 ResNet에서의 shortcut connection(skip connection)을 다른 방법으로 수행한 네트워크입니다.
- ResNet에서는 Additive shortcut을 수행하였는데, DenseNet에서는 Concatenation shortcut을 사용 합니다.
- 즉, 이전 layer의 feature를 Add하는 것 대신에 Concatenate하는 것입니다.
- 즉, 초기 input 이 모든 layer 에 동일하게 들어가고, 모든 레이어에서의 ouput 이 합쳐져(concat) 그 다음 conv layer의 input으로 들어가는 구조로 되어 있습니다.
- 논문의 저자들을 이러한 Dense block 이 gradient vanishing 문제를 완화할 수 있고 feature 들을 더 잘 전달하고 사용할 수 있게끔 한다고 주장합니다.
SqueezeNet
- SqueezeNet 은 효율성(efficient)를 중점적으로 하여 설계된 모델입니다.
- SqueezeNet에서 연산 효율을 올리기 위해 fire module 이라는 것을 사용했습니다.
- Fire module은 1×1 conv layer로 구성되어 있는 squeeze layer와 1×1 conv layer, 3×3 conv layer로 구성되어 있는 expand layer로 구성되어 있습니다.
- 이러한 fire module을 사용한 squeezeNet은 AlexNet 보다 50배 적은 파라미터를 가짐과 동시에 비슷한 성능을 보였습니다.
- squeezeNet을 더 압축하면 AlexNet 보다 500배 더 작아지게 된다고 합니다.
Main takeaways $ Summary
- 위 슬라이드는 이번 강의에서 배운 내용들을 요약한 것입니다.