LeNet은 산업에 성공적으로 적용된 최초의 ConvNet입니다.
LeNet은 이미지를 입력으로 받아서 stride = 1인 5x5 필터를 거치고 몇 개의 Conv Layer와 pooling layer를 거칩니다.
[CONV-POOL-CONV-POOL-FC-FC]
AlexNet은 2012년에 나온 모델이고, 최초의 Large scale CNN입니다. ImageNet Classification Task를 잘 수행했습니다.
AlexNet은 기본적으로 conv-pool-normalization 구조가 두 번 반복됩니다. 그리고 뒤에 conv layer가 조금 더 붙고 그 뒤에 pooling layer가 있습니다. 마지막엔 FC-layer가 몇 개 붙습니다.
LeNet과 상당히 유사하며 layer가 더 많아졌습니다. AlexNet은 5개의 Conv Layer와 2개의 FC-layer로 구성됩니다.
AlexNet의 ImageNet으로 학습시키는 경우
입력의 크기가 227 x 227 x 3 입니다.
첫 레이어는 11 x 11 필터가 stride = 4로 96개가 존재합니다.
Q1. 첫 레이어의 출력 사이즈는 몇 일까요?
Q2. 이 레이어의 전체 파라미터 갯수는 몇 개일까요?
두 번째 레이어를 보겠습니다. 두 번째 레이어는 Pooling Layer입니다.
여기엔 stride = 2인 3 x 3 필터가 있습니다.
Q3. 두 번째 레이어의 출력값의 크기는 몇일까요?
Q4. 두 번째 레이어의 파라미터는 몇 개일까요?
파라미터는 우리가 학습 시키는 가중치입니다. Conv Layer에는 학습할 수 있는 가중치가 있습니다. 반면 pooling의 경우 가중치가 없고 특정 지역에서만 큰 값을 뽑아내는 역할을 합니다. 따라서 학습 시킬 파라미터가 없습니다.
파라미터 계산을 직접 해보며 익히는 것을 강사는 추천하고 있습니다.
AlexNet은 Image Classification Benchmark의 2012년도에 우승한 모델입니다. 수년 전까지 대부분의 CNN 아키텍쳐의 베이스모델로 사용되어 왔습니다. 지금은 더 최신의 아키텍쳐가 많습니다. 일반적으로 AlexNet보다 성능이 더 뛰어납니다. 최신의 모델을 살펴 보겠습니다.
ZFNet은 AlexNet의 하이퍼파라미터를 개선한 모델입니다. AlexNet과 같은 레이어 수고 기본적인 구조도 같습니다. 다만, stride size, filter 수 같은 하이퍼파라미터를 조절하여 Error rate를 더 개선하였습니다.
VGGNet의 특징은 훨씬 더 네트워크가 깊어졌고, 더 작은 필터를 사용한다는 점입니다. 항상 3 x 3 필터만 사용하고, 이는 이웃하는 픽셀을 포함시킬 수 있는 최소 필터입니다. 이런 작은 필터를 유지해주며 주기적으로 Pooling을 수행하며 전체 네트워크를 구성하게 됩니다.
우선 필터의 크기가 작으면 파라미터의 수가 적습니다. 따라서 큰 필터에 비해 레이어를 조금 더 많이 쌓을 수 있습니다. Depth를 더 키울 수 있다는 점입니다.
3 x 3 필터를 여러 개 쌓은 것은 결국 7 x 7 필터를 사용하는 것과 실질적으로 동일한 Receptive Filter를 가집니다.
Q1. stride = 1 인 3 x 3필터를 세 개의
Receptive Filed는 어떻게 될까요?
Receptive Field은 filter가 한번에 볼 수 있는 입력의 "Sparical area" 입니다. 필터들이 서로 겹치기 떄문에 결국 입력 레이어의 7 x 7 필터와 실질적으로 동일한 receptive filed를 가지면서 더 깊은 레이어를 쌓을 수 있게 됩니다.
더 깊게 쌓으면 Non-Linearity를 더 추가할 수 있고 파라미터 수도 더 적어지게 됩니다.
Q2. '네트워크가 더 깊다'라는 의미는 무엇을 의미하는지?
네트워크의 깊이 = 학습 가능한 가중치를 가진 레이어의 갯수
Q3. 네트워크가 깊어질수록 레이어의 필터 갯수를 늘려야 하는지?
Q4. 앞서 계산한 메모리 중에 굳이 가지고 있지 않고 버려도 되는 부분이 있는지?
Q5. localization이 무엇인지
2014년 Classification Challenge에서 우승한 모델입니다. GoogLeNet도 엄청 깊은 네트워크입니다. 22개의 레이어를 갖고 있습니다.
GoogLeNet은 높은 계산량을 효율적으로 수행할 수 있도록 네트워크를 디자인하였습니다.
GoogLeNet은 Inception module을 사용합니다. 이 모듈을 여러 개 쌓아서 만들고, GoogLeNet에는 FC-Layer가 없습니다. 파라미터를 줄이기 위해 없앴고, 전체 파라미터 수가 5백만개입니다. AlexNet에 비해 적은 숫자임을 알 수 있습니다.
구글은 좋은 네트워크 타이폴로지를 만들고 싶었고 네트워크 안에 네트워크라는 개념으로 로컬 타이폴로지를 구현했습니다.
여기서 이 Local Network를 inception modul이라 합니다. 내부에는 동일한 입력을 받는 다양한 필터가 '병렬'로 존재하고, 이 레이어의 압력을 받아서 다양한 Conv 연산을 수행합니다.
여기는 1x1, 3x3, 5x5 conv에 Pooling도 있습니다. 여기서는 3x3 pooling입니다. 각 레이어에서 각각의 출력 값이 나오는데 이 출력을 모두 Depth 방향으로 합칩니다.
지금까지는 다양한 연산을 수행하고 이를 하나로 합쳐준다는 아주 단순한 방식(naive way)를 보았는데,
naive way의 문제점은 무엇일까요? 바로 계산 비용입니다.
예제를 본다면,
128개의 1x1 필터, 192개의 3x3 필터, 96개 5x5 필터가 있씁니다.
stride를 조절하여 입출력 간의 spatial demention을 유지합니다.
28 x 28 x 128이 됩니다. 1x1 conv의 경우 입력에 맞춰 depth는 256입니다. 그리고 128개의 필터 하나 당 28 x 28 Feature map을
생성하게 될 것입니다. 그렇다면 출력은 28 x 28 x 128 이 됩니다.
이런 방식으로 각 필터의 출력 값을 계산해보겠습니다. x 3 conv의 경우에 출력이 28 x 28 x 192이 될 것이고, 5 x 5 conv의 경우에 96개의 필터이므로 출력이 28 x 28 x 96 이 될 것입니다.
Pooling Layer는 input에서 depth가 변하지 않습니다. 그리고 Stride를 잘 조절해 Spatial dimention를 유지하면 입력과 출력의 크기는 같습니다.
이제 모든 출력 값들을 합친 사이즈를 계산해 봅니다.
28x28은 동일하고 depth가 점점 쌓이게 됩니다. 모든 depth를 더하면 최종적으로 28x28x672가 됩니다.
Inception module의 입력은 28x28x256이었지만 출력은 28x28x672가 되었습니다.
spatial dimention은 변하지 않았지만
depth가 엄청나게 불어났습니다.
위는 spatial dimention을 유지하기 위해서
zero padding을 한 경우고, depth-wise로 합쳤기 때문입니다.
현재 입력은 네트워크의 입력이 아니라 네트워크 중간에 있는 어떤 한 레이어의 입력입니다. 256의 값은 바로 직전의 inception module의 출력 depth라고 볼 수 있습니다.
이 필터는 1x1 conv 필터였고 이 필터가 입력 28x28x256을 돌아다니며 conv 연산을 수행합니다. 1x1 conv는 입력의 depth인 256만 가지고 내적을 합니다. 그러면 필터 하나당 28x28x1의 feature map을 갖게 됩니다.
각 필셀마다 하나의 값씩 계산이 되기 때문에 28x28x1이 됩니다. 그리고 필터가 128개이기 떄문에 28x28x128이 됩니다.
첫 번째 예시로 1 x 1 conv를 살펴봅시다. 1 x 1 conv는 각 픽셀마다 1 x 1 x 256 개의 내적연산을 수행합니다. 따라서 픽셀 당 256번의 곱셈 연산이 수행되는 것이죠. 그리고 픽셀이 총 28 x 28 이므로 처음 "28 x 28" 이 여기에 해당합니다. 그리고 이런 연산을 수행하는 필터가 총 256개 있으므로 1 x 1 conv에서의 전체 연산량은 28 x 28 x 128 x 256 입니다.
이런식으로 3x3, 5x5의 연산량도 계산할 수 있습니다. 따라서 하나의 Inception Module에서의 전체 연산량은 854M이 됩니다.
다시 문제점으로 돌아가서 연산량이 무지 많다는 점인데 여기서 Pooling layer 또한 문제를 악화시킵니다. Depth를 그대로 유지하기 때문인데요. layer를 거칠 때마다 Depth가 점점 늘어갑니다.
이 문제를 해결하기 위해 GoogLeNet에서 사용한 key insight는 "bottleneck layer"사용이었습니다.
Conv 연산을 시작하기 전 입력을 더 낮은 차원으로 보내는 방법입니다.
1x1 conv를 다시 한번 살펴봅시다. 1x1 conv는 각 spatial location에서만 내적을 수행합니다. 그러면서 depth만 줄일 수 있습니다. 입력의 depth를 더 낮은 차원으로 projection 하는 것입니다.
이는 Input feature map들 간의 선형결합(linear combination) 이라고 할 수 있습니다.
여기서 main idea가 입력의 depth를 줄이는 것입니다.
각 레이어의 계산량은 1x1 conv을 통해 줄어듭니다.
GoogLeNet의 앞단(stem) 에는 일반적인 네트워크구조 입니다. 초기 6개의 레이어는 지금까지 봤던 일반적인 레이어들이죠.
처음에는 conv pool을 몇 번 반복합니다. 이 후에는 Inception module에 쌓이는데 모두 조금씩 다릅니다. 그리고 마지막에는 classifier 결과를 출력합니다.
GoogLeNet에서는 계산량이 많은 FC-layer를 대부분 걷어냈고, 파라미터를가 줄어들어도 모델이 잘 동작함을 확인했습니다.
그리고 위의 그림에 아래 부분에는 추가적인 줄기가 뻗어있는데 이들은 보조분류기(auxiliary classifier) 입니다. 그리고 이것들은 작은 미니 네트워크들입니다.
Average pooling과 1x1 conv가 있고 FC-layey도 몇개 붙습니다. 그리고 SoftMax로 1000개의 ImageNet class를 구분합니다.
그리고 실제로 이 곳에서도 ImageNet trainset loss를 계산합니다. 네트워크의 끝에서 뿐만 아니라 이 두 곳에서도 Loss를 계산하는 이유는 네트워크가 깊기 때문입니다. 보조분류기를 중간 레이어에 달아주면 추가적엔 그레디언트를 얻을 수 있고 따라서 중간 레이어의 학습을 도울 수 있습니다.
다시 이것이 전체 아키텍처의 모습이라 볼 수 있고, 가중치를 가진 레이어는 총 22개입니다.
그리고 Inception Module은 1x1, 3x3, 5x5 Conv layer를 병렬적으로 갖고 있습니다.
GoogLeNet 학습 시, 각 보조분류기의 Loss를 모두 합친 평균을 계산합니다. 가능성이 있습니다.
여기에서 1x1 conv를 쓴 이유는 차원 축소의 효과도 있고 다른 레이어들처럼 conv layer이기 때문입니다. 차원 축소 과정에서 이전의 feature map와 연관이 있는지 학습하려면
전체 네트워크를 Backprop으로 학습시킬 수 있어야 합니다.
모든 레이어는 가중치를 공유하지 않습니다.
네트워크의 맨 마지막에서부터 Chain rule을 이용해서 그레디언트가 전달된다고 생각하면, 네트워크가 엄청 깊은 경우에는 그레디언트 신호가점점 작아지게 되고 결국에는 0에 가깝게 될 수 있습니다. 그렇기 때문에 보조 분류기를 이용해서 추가적인 그레디언트 신호를 흘려줍니다.
아닙니다. backprob은 한번만 합니다. computational graph 상에 서로 다른 출력이 있는 것인데 각 출력에서 gradient를 모두 계산한 다음 한 번에 Backprop합니다. computational graph 상에 다 함께 있는 것 처럼
생각하고 계산한다고 보면 됩니다.
GoogLeNet에는 기본적으로 22개의 레이어가 있습니다. 아주 효율적인 Inception module이 있고 FC Layer를 들어냈습니다. AlexNet보다 12배 작은 파라미터를 갖고 있습니다.
ResNet 아키텍쳐는 엄청나게 깊은 네트워크입니다. 기존의 어떤 네트워크보다도 훨씬 더 깊습니다!
ResNet은 residual coonections라는 방법을 사용합니다.
처음 시작한 고민은 바로 일반 CNN을 깊고 더 깊게 쌓게되면 어떤 일이 발생할지였습니다. VGG에 conv pool 레이어를 깊게만 쌓는다고 성능이 더 좋아지는 것일까요? 그렇지 않습니다.
네트워크가 깊어지면 어떤 일이 발생하나요?
위의 그림은 20 레이어와 56 레이어이고 비교해보겠습니다. 두 모델 다 plain CNN이고, 오른쪽 test error의 경우 56 레이어가 20 레이어보다 안 좋습니다.
training error를 보아도 이상합니다. 56 레이어 네트워크가 있으면 엄청 나게 많은 파라미터가 있겠구나 추측할 수 있고, Overfit하겠구나 예상할 수 있습니다.
그리고 Overfit이 발생한다면 test error는 높더라도 training error는 아주 낮아야 정상인데, 이 경우는 56 레이어가 둘 다 높습니다.
따라서 더 깊은 모델인데도 test 성능이 안 좋은 이유를 단순한 overfitting 문제가 아니라는 걸 알 수 있습니다.
여기서 ResNet 저자들은 더 깊은 모델 학습시 optimization에 문제가 생긴다고 가설을 세웠습니다!
가설: 모델이 깊어질 수록 최적화가 어렵다
또 여기서 더 깊은 모델이라면 더 얕은 모델 만큼 성능이 나와야 하지 않은지? 라고 생각했다고 합니다.
여기서 해결책으로 우선 더 얕은 모델의 가중치를 깊은 모델의 일부 레이어에 복사했습니다. 그리고 나머지 레이어는 identity mapping을 했습니다. identity mapping은 input을 output으로 내보내는 것을 말합니다.
그러면 shallower layer 만큼의 성능이 나와야 합니다. Deeper model의 학습이 제대로 안 되더라도 적어도 shallower model 만큼의 성능은 보장됩니다. 그렇다면 이 motivation을 우리가 만든 모델에 녹이려면 어떻게 모델 아키텍처를 디자인 해야 할까요?
ResNet의 아이디어는 단순히 레이어를 쌓는 방법(Direct mapping)이 아니라 Residual mapping의 방법이었습니다.
레이어가 직접 "H(x)"를 학습하기 보다
이런 식으로 "H(x) - x" 를 학습할 수 있도록 만들어줍니다.
이를 위해서 Skip Connection을 도입하게 됩니다. 그림의 오른쪽에 고리 모양이 그렇습니다.
Skip Connection은 가중치가 없으며 입력을 identity mapping으로 그대로 출력단에 내보냅니다.
실제 레이어는 변화량(delta) 만 학습하면 됩니다. 입력 X에 대한 잔차(residual)라고 할 수 있습니다.
최종 출력 값은 "input X + 변화량 (Residual)" 입니다.
이 방법을 사용하면 학습이 더 쉬워집니다. 가령 Input = output 이어야 하는 상황이라면, 레이어의 출력인 F(x)가 0 이어야 하므로(residual = 0) 모든 가중치를 0으로 만들어주면 그만입니다. 손쉽게 출력을 Identity로 만들어 줄 수 있는 것입니다.
네트워크는 Residual만 학습하면 그만입니다. 출력 값도 결국엔 입력 입력 X에 가까운 값입니다. 다만 X를 조금 수정한 값이죠. 레이어가 Full mapping을 학습하기 보다 이런 조금의 변화만 학습하는 것입니다.
네. 두 경로의 출력값 모두 같은 차원입니다. 일반적으로 같은 차원이지만 그렇지 않다면 Depth-wise padding으로 차원을 맞춰 줍니다.
전체 출력 값인 "F(x) + X" 를 다시한번 살펴봅시다. F(x)는 레이어의 출력 값입니다. X는 입력 값입니다.
위 그림의 왼쪽 plain layers를 가진 네트워크는 H(x)를 학습하고 있고, H(x)를 학습 시키는 것은 어렵습니다. 아주 깊은 네트워크에서는 H(x)를 잘 학습시키기가 아주 어렵습니다.
ResNet의 아이디어는 H(x) = F(x) + X 이니
F(x)를 학습시켜보면 어떨까? 하는 것입니다!
H(x)를 직접 배우는 대신에 X에 얼마의 값을 더하고 빼야 할까?(Residual)를 배우는 것을 생각했고, 입력값을 어떻게 수정해야 할지 고민했습니다.
맞습니다!
그냥 더하는 방법입니다. F(x)는 단순히 X에 값을 얼마나 더하거나 빼야 하는지를 나타냅니다. 그러므로 단순 계산입니다.
그건 단순한 가설이었습니다. Residual을 학습
시키는 것은 X에 대한 변화량(delda)을 학습시키는 것의 의미입니다. 이 가설이 참이라면 내 모델의 일부는 학습된 shallow layers이고 나머지 레이어들은 identity라면 잘 동작해야 합니다. 이는 대부분의 레이어가 잘 동작하려면 레이어의 출력이 Identity에 가까워야 할 지 모른다는 것을 암시합니다. 그래서 Identity(Input) + 변화량(delta) 만 학습시키면 됩니다.
만약, Output = Input (identity)이어야만 하는 상황이면 F(x) = 0 이 되면 됩니다. 상대적으로 학습시키기 쉽다고 생각할 수 있습니다. 이런 방식으로 Identity Mapping에 가까운 값을 얻을 수 있습니다.
네. 네트워크의 구성과 연결구조는 아주 활발하게 연구되고있는 분야입니다.
다시 ResNet 내용으로 돌아가서, 기본적으로 ResNet은 residual block들을 쌓아 올리는 구조입니다.
위 그림을 통해 전체 ResNet 아키텍처를 볼 수 있습니다. 하나의 Residual blocks는 두 개의 3x3 conv layers로 이루어져 있습니다. 이렇게 구성해야 잘 동작하는 것으로 알려져있습니다. 이 Residual blocks를 아주 깊게 쌓아 올립니다. ResNet은 150 Layers까지 쌓아 올릴 수 있습니다.
그리고 주기적으로 필터를 두배 씩 늘리고 stride 2를 이용하여 Downsampling을 수행합니다. 그리고 네트워크의 초반에는 Conv Layer가 추가적으로 붙고 네트워크의 끝에는 FC-Layer가 없습니다.
대신 Global Average Pooling Layer 를 사용합니다. GAP는 하나의 Map 전체를 Average Pooling 합니다. 그리고 마지막에는 1000 개의 클래스분류를 위한 노드가 붙습니다. 여기까지가 전체 ResNet 아키텍쳐입니다.
ResNet은 ResNet Block을 하나씩 쌓아 올리는 구조입니다. 이 모델의 Depth는 34, 50, 100까지 늘어나고, 논문에서는 ImageNet 문제를 위해 152까지 늘렸습니다.
ResNet의 경우 모델 Depth가 50 이상일 때 Bottleneck Layers를 도입합니다. 이건 GoogLeNet에서 사용한 방법과 유사합니다.
Bottleneck Layer는 1x1 conv를 도입하여 초기 필터의 depth를 줄여줍니다. 가령 입력이 28x28x256 일때 1x1 conv를 적용하면 depth가 줄어들어서 28x28x64 가 됩니다.
이로인해 3 x 3 conv의 계산량이 줄어듭니다. 그리고 뒤에 다시 1x1 conv를 추가해서 Depth를 다시
256으로 늘립니다. Deeper ResNet은 이런 구조를 취합니다.
실제로 ResNet은 모든 Conv Layer 다음 Batch Norm을 사용합니다. 그리고 초기화는 Xavier를 사용하는데 추가적인 scaling factor를 추가합니다(2로 나눔). 이 방법은 SGD + Momentum에서 좋은 초기화 성능을 보입니다.
learning rate는 learning rate 스케줄링을 통해서 validation error가 줄어들지 않는 시점에서 조금씩 줄여줍니다. Minibatch 사이즈는 256이고 weight dacay도 적용합니다. Dropout은 사용하지 않았습니다.
실험결과를 보시면 그들은 성능의 열화 없이 Very deep network를 아주 잘 학습시킬 수 있었습니다. Backprob시 네트워크의 gradient flow를 아주 잘 가져갈 수 있었습니다.
ImageNet 학습을 위해서 152 레이어 까지 시도해 보았으며 Cifar-10 으로는 1200 Layer 까지 늘렸습니다. 그리고 네트워크가 깊어질수록 Training Error는 더 줄어듦을 알 수 있었습니다. 깊은 네트워크의 Train Error가 더 높아지는 경우는 없었습니다.
처음에 AlexNet부터 살펴보고, VGGNet과 GooglLeNet은 지금도 여전히 아주 유명하고, 최근에 아주 많이 사용하는 네트워크 ResNet까지 보았습니다.
왼쪽 그래프를 보면 지금까지 배운 모델이거나 조금 변형된 모델들입니다.
GoogLeNet-Inception을 보시면 모델은 버전 별로 V2, V3 등이 있는데 가장 좋은 모델은 V4입니다.
ResNet + Inception 모델을 합쳐둔 것입니다. 모델이 조금씩 바뀌었고 가장 좋은 모델을 차지했습니다.
오른쪽 그래프를 보면 계산 복잡성이 추가되었습니다. Y축은 top-1 Accuracy이고 높을 수록 좋습니다. X축은 연산량을 나타냅니다. 오른쪽으로 갈수록 연산량이 많습니다. 원의 크기는 메모리 사용량입니다. 원이 클 수록 큰 모델입니다.
오른쪽 아래 회색 원을 보면 원이 커질수록 메모리 사용량도 커집니다.
초록색 원은 VGGNet입니다. 가장 효율성이 작습니다. 메모리도 크면서 계산량도 많지만 성능은 나쁘지 않은 모델입니다.
GoogLeNet이 가장 효율적인 네트워크입니다. X축에서 거의 왼쪽에 있을 뿐만 아니라 메모리 사용량도 적습니다.
초기 모델 AlexNet은 accuracy가 낮습니다. 계산량도 작고, 메모리 사용량이 비효율적입니다.
ResNet의 경우 적당한 효율성을 갖고 있습니다. 메모리 사용량과 계산량을 중간정도이지만
Accuracy는 최상위입니다.
왼쪽 그래프는 forward pass 시간입니다. 단위는 ms 인데 VGG가 제일 오래걸립니다. 200ms으로 초당 5정도 처리합니다.
오른쪽은 전력소모량인데 더 자세한 내용은 아래 논문을 참고하시기 바랍니다. 더 다양한 분석 결과를 보실 수 있습니다.
기본 아이디어는 MLP conv layer입니다. 네트워크 안에 작은 네트워크를 삽입하는 것입니다. 각 Conv layer 안에 MLP(Multi-Layer Perceptron)를 쌓습니다. FC-Layer 몇 개를 쌓는 것입니다.
맨 처음에는 기존의 Conv Layer가 있고 FC-Layer를 통해 abstract features를 잘 뽑을수 있도록 합니다.
단순히 conv filter만 사용하지 말고, 조금 더 복잡한 계층을 만들어서 activation map을 얻어보자는 아이디어입니다.
NIN에서는 기본적으로는 FC-Layer를 사용합니다. 이를 1x1 conv layer 라고도 합니다. 아래의 다이어그램이 바로 Network in Network 구조입니다.
Network in Network는 GoogLeNet과 ResNet보다 먼저 Bottleneck 개념을 정립했기 때문에 아주 의미있는 아이디어입니다.
새로운 구조는 direct path를 늘려서 정보들이 앞으로 더욱 더 잘 전달되고 Backprob도 더 잘 될 수 있게 개선하였다고 합니다.
새로은 Block 구조로 더 좋은 성능을 얻을 수 있었습니다.
기존의 ResNet 논문은 깊게 쌓는 것에 열중했지만 사실 중요한 것은 depth가 아닌 residual 이라고 주장한 연구입니다.
Residual Connection이 있다면 네트워크가 굳이 더 깊어질 필요가 없다며, residual block을 더 넓게 만들어 conv layer 필터를 더 많이 추가하였습니다.
가령 기존의 ResNet에는 Block 당 F개의 filter만 있었다면 대신에 F * K 개의 필터로 구성했습니다. 각 레이어를 넓게 구성했더니 50 레이어만 있어도 152 레이어의 기존 ResNet보다 성능이 좋다는 것을 입증했습니다.
그리고 네트워크의 Depth 대신에 filter의 Width를 늘리면 추가적인 이점이 있는데, 계산 효율이 증가합니다. 왜냐하면 병렬화가 더 잘되기 때문입니다.
네트워크의 Depth를 늘리는 것은 sequential한 증가이기 때문에 conv의 필터를 늘리는(width) 편이 더 효율적입니다.
이 논문에서도 계속 residual block의 width를 파고들어 filter의 수를 늘립니다. 각 Residual block 내에 "다중 병렬 경로" 추가합니다. 이들은 pathways의 총 합을 cardinality라고 불렀습니다.
하나의 bottleneck ResNet block은 비교적 작지만 이런 thinner blocks을 병렬로 여러개 묶었습니다. 여기에서 ResNeXt과 Wide ResNet 과의 연관성을 볼 수 있습니다. 또한, 여러 Layers를 병렬로 묶어준다는 점에서 Inception Module과도 연관있습니다.
네트워크가 깊어지면 깊어질수록 Vanishing gradient 문제가 발생합니다. 깊은 네트워크에서는 그레디언트를 뒤로 전달할수록 점점 그레디언트가 작아지는 문제가 있습니다.
기본 아이디어는 Train time에 레이어의 일부를 제거합니다. short network면 트레이닝이 더 잘 될 수 있기 때문입니다. 일부 네트워크를 골라서 identity connection으로 만들어버립니다.
이렇게 shorter network를 만들어서 Train하면 그레디언트가 더 잘 전달될 수 있습니다. 아주 효율적인 방법이 될 수 있습니다. Dropout과 유사합니다.
그리고 test time에서는 full deep network를 사용합니다.
지금까지 소개한 논문들은 ResNet 아키텍처를 개선하고자 노력한 연구 결과입니다.
residual connection이 쓸모없다고 주장합니다. 지금까지 ResNet의 Motivation이 어느 정도 납득할만 하다고 했지만, FractalNet은 그렇다고 생각하지 않았습니다.
여기서는 residual connection이 전혀 없습니다. 여기서 shallow/deep network의 정보 모두를 잘 전달하는 것이 중요하다고 생각했습니다. 그래서 오른쪽 그림처럼 fractal한 모습입니다.
FractalNet에서는 shllow/deep 경로를 출력에 모두 연결합니다. 다양한 경로가 존재하지만 Train time에는 Dropout처럼 일부 경로만을 이용해서 Train 합니다. 그리고 Test time에는 full network를 사용합니다. 그들은 FractalNet의 좋은 성능을 입증했습니다.
DenseNet에는 Dense Block 이란 것이 있습니다. 한 레이어가 그 레이어 하위의 모든 레이어와 연결이 되어 있습니다. 네트워크의 입력 이미지가 모든 Layer의 입력으로 들어가는 것입니다. 그리고 모든 레이어의 출력이 각 레이어의 출력과 concat 됩니다.
이 concat된 값이 각 Conv layer의 입력으로 들어가고, 이 과정에서 dimention을 줄여주는 과정이 포함됩니다. Dense Connection이 Vanishing gradient 문제를 완화시킬 수 있다고 주장합니다. Dense connection은 Feature를 더 잘 전달하고 더 잘 사용할 수 있게 해줍니다. 각 레이어의 출력이 다른 레이어에서 여러 번 사용되기 때문입니다.
여기선 fire modules 이라는 걸 도입했습니다. "squeeze layer"는 1x1 필터들로 구성되고, 이 출력 값이 1x1, 3x3 필터들로 구성되는 "expand layer"의 입력이 됩니다. SqueezeNet는 ImageNet에서 AlexNet 만큼의 Accuracy를 보이지만 파라미터는 50배 더 적습니다. 용량이 매우 작아지는 것입니다.
이번 강의에서는 4가지의 주요 아키텍처를 배웠습니다.
그 외 다른 네트워크들도 살펴보았습니다.
네트워크가 점점 깊어지는 트렌드지만 어떤 레이어를 디자인할 지가 가장 큰 관심사였습니다. skip connections과 Backprob이 잘 되도록 디자인 하는 것도 중요했습니다.
그리고 Depth vs Width, residual connection 등 다양한 이슈의 관점에서 네트워크 아키텍처를 다뤘습니다.