[DL] CS231n Lecture 9: CNN Architectures
카테고리: DL
태그: DL
1. Case Studies
1.1 LeNet-5 (1998)
LeNet은 산업에 아주 성공적으로 적용된 최초의 ConvNet이다. 특히 숫자 인식에서 좋은 성과를 보였다.
LeNet은 이미지를 입력으로 받아서 Stride=1인 5x5 필터를 거치고 몇 개의 Conv Layer와 Pooling Layer를 거친 뒤 그 끝 단에 FC Layer가 붙는다.
1.2 AlexNet (2012)
AlexNet은 2012년에 나온 최초에 Large scale CNN이다. 특히 Classfication Task를 잘 수행했다.
AlexNet은 기본적으로 conv - pool - normalization 구조가 두 번 반복되고 후에 Conv와 FC가 붙는다. 그래서 총 5개의 Conv Layer와 3개의 FC가 사용됐다.
Input: 227x227x3 images
First layer (CONV1): 11x11 filters 96개 (stride=4)
Q1. 첫 레이어의 output size? Hint: (227-11)/4+1 = 55
A1: Output volume [55x55x96]
Conv Layer는 filter와 input image 연산을 통해 feature map을 만든다. 이때 filter의 개수가 96개 이므로 55x55x96 이다.
Q2: What is the total number of parameters in this layer?
A2: Parameters: (11113)*96 = 35K
필터 하나가 11x11x3을 통과한다. (입력의 Depth = 3) 그리고 필터가 96개가 있다.
After CONV1: 55x55x96
Second layer (POOL1): 3x3 filters (stride=2)
Q3. 두번째 레이어의 output size? Hint: (55-3)/2+1 = 27
A3. Output volume: [27x27x96]
위 공식을 통해 width, height를 구할 수 있다. depth는 입력과 변하지 않기 때문에 96이다.
Q4. What is the total number of parameters in this layer?
A4. 0개
Conv Layer에는 학습할 수 있는 가중치가 있다. 하지만 pooling의 경우에는 가중치가 없고 그저 특정 지역에서 큰 값을 뽑아내는 역할을 한다.
AlexNet의 전체 구조를 보면 위와 같다.
Layer가 2개로 나뉘어져있는데, AlexNet 학습 당시 GTX850을 사용했는데 메모리가 3GB뿐이라서 전체 레이어를 다 넣을 수 없었다. 그래서 각 GPU가 Feature map과 모델의 뉴런을 절반씩 가지고 있다.
같은 GPU 내에 있는 feature map만 사용하기 때문에 CONV1,2,4,5는 전체 96 feature map을 볼 수 없다.
즉, feature map 48개만 사용한다.
CONV3과 FC6,7,8은 이전 계층의 전체 feature map과 연결되어 있다. 이 Layer에서는 GPU간의 통신을 통해 이전 입력 레이어의 전체 depth를 전부 가져올 수 있다.
AlexNet이 기존의 모델들에 비해 월등한 성적을 낼 수 있었던 이유는 최초로 딥러닝과 Conv Net을 사용했기 때문이다.
1.2 ZFNet (2013)
ILSVRC에서 AlexNet 다음으로 우승을 차지한 것이 바로 ZFNet이다.
ZFNet은 AlexNet의 하이퍼파라미터를 개선한 모델이다. 레이어 수와 기본적인 구조도 같지만 stride size와 필터 수 같은 하이퍼파라미터를 조절해 AlexNet의 Error rate를 좀 더 개선했다.
1.3 VGGNet (2014)
VGGNet의 특징은 네트워크가 훨씬 더 깊어졌고 더 작은 필터를 사용한다는 것이다.
AlexNet 8 Layers → 16-19 Layers (VGG16Net) , 3x3 필터를 사용한다.
Q1. 그렇다면 왜 더 작은 필터를 사용했을까?
A1. 필터의 크기가 작으면 파라미터의 수가 더 적어진다. 따라서 큰 필터에 비해 레이어를 조금 더 많이 쌓을 수 있다. 즉, 작은 필터의 사용으로 Depth를 더 키울 수 있었다.
Q2. 3x3 conv (stride 1) Layer의 3개의 receptive field를 사용하는 것의 효과?
A2. Receptive Field는 필터가 한번에 볼 수 있는 입력의 Sparical area이다. 3개의 3x3 conv (stride=1)는 7x7 conv layer를 사용하는 것과 같은 효과이다.
위의 예시처럼 3x3 필터를 3개 쓰면 7x7 1개를 사용하는 것과 같은 효과를 낸다. 이렇게 되면 동일한 receptive field를 가지면서도 더 깊은 레이어를 쌓을 수 있게 된다. 더 깊게 쌓음으로써 Non-Linearity를 더 추가할 수 있고 파라미터 수도 더 적어지게 된다.
또한 \(3*(3^2C^2)\) vs \(7 * (7^2C^2)\) 으로 파라미터 수를 훨씬 적게 사용한다. (C = Depth)
FC7은 4096 사이즈의 Layer인데 아주 좋은 feature representation을 가지고 있다고 알려져 있다. 다른 데이터에서도 feature 추출이 잘되고 다른 Task에서도 일반화 능력이 뛰어난 것으로 알려져 있다.
1.4 GoogLeNet (2014)
GoogLeNet도 22 Layer를 사용한 깊은 네트워크이다. 하지만 여기서 가장 중요한 것은 효율적인 계산에 대한 그들의 특별한 관점이 있다는 것과 높은 계산량을 아주 효율적으로 수행하도록 네트워크를 디자인했다는 점이다.
네트워크는 더 깊어졌지만 Inception module를 추가하고 FC layer를 없애 연산을 효율적으로 줄였다. 그 결과 전체 파라미터 수가 5M 정도이다.
(AlexNet : 60M)
Inception Module 내부에는 동일한 입력을 받는 서로 다른 다양한 필터들이 병렬로 존재한다. 이전 Layer의 입력을 받아서 다양한 Conv 연산을 수행한다.
이때 나온 출력들을 모두 Depth 방향으로 합친다(concatenate). 그렇게 합치면 하나의 tensor로 출력이 결정되고 하나의 출력을 다음 Layer로 전달한다. 이렇게 다양한 연산을 수행하고 하나로 합쳐준다는 naive 한 방식이 있다.
하지만 이 방식은 Computational complexity한 문제가 있다. Inception module의 입력은 28 x 28 x 256이었으나 출력은 28 x 28 x 672가 된 것이다. 즉 spatial dimention은 같지만 depth가 엄청 커졌다
navie inception module의 연산량을 계산해보면 854M번 연산을 해야한다. 또한 pooling layer은 입력의 Depth를 그대로 유지하기 때문에 Layer를 거칠때마다 Depth가 점점 늘어간다.
이 문제를 해결하기 위해서 bottleneck layer를 사용한다. bottleneck layer는 Conv 연산을 수행하기 전의 입력을 1x1 Conv를 통해 더 낮은 차원으로 보내는 것이다.
bottleneck Layers를 추가하면 다음과 같이 나타낼 수 있고 앞서 계산한 것 처럼 연산량을 구할 수 있다.
Naive한 inception module의 연산량 854M 에서 358M으로 줄은것을 볼 수 있다. 즉, 1x1 conv를 이용하면 계산량을 조절할 수 있다.
GoogLeNet의 앞단에는 일반적인 네트워크 구조이다. 초기 6개의 Layer는 지금까지 봤던 일반적인 Layer이다.
Auxiliary classification에서도 ImageNet trainset loss를 계산한다. 이곳에서도 Loss를 계산하는 이유는 네트워크가 깊기 때문에 중간 Layer에 추가해주면 추가적인 gradient를 얻을 수 있고 중간 Layer의 학습을 도울 수도 있다.
추가적인 gradient는 네트워크가 엄청 깊은 경우 gradient가 점점 작아지다가 결국 0에 가깝게 될 수 있기 때문에 추가적인 gradient를 보내준다.
1.6 ResNet (2015)
ResNet은 2015년에 ILSVRC을 우승했다. ResNet의 다른 네트워크에 비해 훨씬 깊은 네트워크이다. 이때 residual connections라는 방법을 사용한다.
residual connection의 시작은 일반 CNN을 깊게 쌓으면 어떤일이 벌어질까에 대한 질문으로 시작했다. 그리고 실험을 통해 56 layer가 20-layer보다 성능이 안좋을 수 있다는 것을 확인했다.
하지만 Training error에서 만약 파라미터가 아주 많아 overfit한 거 였다면 test error는 높더라도 training error는 아주 낮아야 정상이다. 따라서 더 깊은 모델임에도 test 성능이 낮은 이유가 over-fitting이 아니라는 것이다.
ResNet 저자들이 내린 가설은 더 깊은 모델 학습시 Optimization에 문제가 발생한다는 것이었다.
만약 모델이 더 깊다면 적어도 더 얕은 모델만큼은 성능이 나와야 하지 않나 생각했다.
더 얕은 모델의 가중치를 깊은 모델의 일부 layer에 복사를 한다음 나머지 layer는 identity mapping을 한다. (input을 그냥 output으로 보냄) 이렇게 만들어진 모델은 적어도 앝은 모델의 성능은 나와야 한다고 생각했다.
Direct mapping 대신에 Residual mapping을 하도록 블럭을 쌓고, 레이어가 직접 H(x)를 학습하기 보다 H(x)-x를 학습할 수 있도록 만들어 준다. 이를 위해서 Skip Connection을 도입하게 된다. 오른쪽 화살표는 가중치가 없고 입력을 identity mapping으로 그대로 출력단으로 보낸다. 그러면 실제 layer는 변화량만 학습하면 된다.
그래서 최종 출력 값은 input X + 변화량(Residual)이다.
Full ResNet architecture에 대해서 정리해보면 기본적으로 risidual blocks를 쌓아서 만드는 구조이다. 모든 residual block은 두 개의 3x3 conv layers로 이루어져 있다.
주기적으로 필터를 두배 씩 늘리고 stride 2를 이용해 Downsampling을 수행한다.
네트워크 초반에는 Conv Layer가 추가적으로 붙고 네트워크의 끝에는 FC Layer가 없다. 대신 Global Average Pooling Layer를 사용한다. GAP는 하나의 MAP 전체를 Average Pooling 한다. 그리고 마지막에는 1000개의 클래스 분류를 위한 노드가 붙는다.
그리고 ResNet의 경우 Depth가 50이상일 때 Bottleneck Layers를 도입한다.
1x1 conv, 64를 활용해 3x3 conv의 연산량을 줄이고 다시 1x1 conv, 256을 통해 Depth를 늘린다.
이러한 방식을 통해 ILSVRC15에서 ResNet은 152 layers를 사용해 우승했다.
댓글남기기