반응형

오늘 수업에서는 CNN 아키텍쳐들을 알아볼 예정이다. 지난 시간에는 딥러닝 프레임워크들을 배웠다. PyTorch, Tensorflow, Caffe2등 다양한 프레임워크들이 있었는데 이들을 사용해서 NN, CNN과 같은 규모가 큰 computational graph를 아주 쉽가 구성할 수 있고, gradient를 쉽계 계산 할 수 있도록 도와주며, GPU에서 효율적으로 작동하는 것을 확인할 수 있었다. 프레임워크들은 보통 모듈화된 레이어를 통해 동작했고 모델 아키텍처를 구성하기 위해서는 그 레이어들을 하나의 시쿼스로 정의하고 묶어주면 됐다. 이렇게 아주 복잡한 아키텍처도 쉽게 구성할 수 있도록 해주는 것이다. 

 

오늘은 최신 CNN 아키텍처들에 대해 배워볼 예정이다. 사람들이 가장 많이 사용하는 아키텍쳐들로, 모두 ImageNet 챌린지에서 우승한 모델들이다. 연대순으로 AlexNet, VGGNet, GoogLeNet, ResNet 그리고 잘 사용하진 않지만 역사적인 관점에서 흥미로운 모델들과 최신 모델들도 다뤄볼 예정이다

 

LeNet

오래전 강의에서 LeNet을 다룬 적이 있었는데, LeNet은 산업에 성공적으로 적용된 최초의 ConvNet이다. LeNet은 이미지를 입력으로 받아서 stride = 1 인 5 x 5 필터를 거치고 몇 개의 Conv Layer와 pooling layer를 거치는 형식으로 구성되어있다. 그리고 끝 단에 FC Layer가 붙는다. 엄청 간단한 모델 중에 하나이지만, 숫자 인식에서 뛰어난 성능을 보인 모델이다. 

 

AlexNet

2012년에 AlexNet이 등장했다. 이 모델도 이전 강의에서 언급한적 있었는데, AlexNet는 최초의 Large scale CNN (깊은)으로, ImageNet 이라는 이미지 분석 챌린지에서 분류문제를 아주 효율적으로 해결했다. AlexNet은 2012년에 등장해서는 기존의 모델들을 능가하는 놀라운 성능을 보여주면서 ConvNet 연구의 부흥을 일으킨 장본이라고 할 수 있다.

 

AlexNet은 기본적으로 conv - pool - normalization 구조가 두 번 반복된다. 그리고 그 뒤에 conv layer가 조금 더 붙고(CONV 3,4,5), 그 뒤에 pooling layer (Max POOL3)가 있다. 마지막에는 FC layer가 몇 개 붙는다 (FC6, FC7, FC8). 구조만 봤을 때는 기존의 LeNet과 상당히 유사하고 레이어만 더 많아졌다. AlexNet는 총 5개의 Conv Layer와 2개의 FC-Layer로 구성된다. AlexNet의 ImageNet으로 학습시키는 경우, 입력의 크기는 227 x 227 x 3 이다.

 

첫 레이어를 살펴보면 11 x 11 필터가 stride = 4 로 96개가 존재한다. 첫 레이어의 출력값의 차원은 공식 (전체 이미지 크기 - 필터 크기) / Stride + 1 을 대입해서 55이다. 첫 레이어의 출력 사이즈는 55 x 55 x 96이다 (width, height는 각각 55, 필터가 총 96개 이므로 depth가 96). 이 레이어의 전체 파라미터 갯수는 96 x 11 x11 x 3 (11 x 11 필터가 총 96개, 필터 크기 11 x 11 x 3 입력의 Depth가 3 (rgb)). 그러므로 첫 레이어에 약 35K의 파라미터가 존재한다.

두 번째 레이어는 Pooling Layer로 stride = 2 인 3 x 3 필터가 있다. 두 번째 레이어의 출력 사이즈는 27 x 27 x 96이다. 두 번째 레이어의 파라미터는 몇 개일까? Pooling layer에는 파라미터가 없다. 파라미터는 우리가 학습시키는 가중치인데, Conv Layer에는 학습할 수 있는 가중치가 있지만, pooling의 경우에는 가중치가 없고 그저 특정 지역에서 큰 값을 뽑아내는 역할만 한다. 즉, 학습시킬 파라미터가 없는 것이다.

AlexNet은 이렇게 총 5개의 Conv Layer가 존재하고, 끝에 몇 개의 FC-Layer가 있었는데,  4096개의 노드를 가진 레이어이다. 그리고 마지막 FC layer인 FC8은 softmax를 통과해 1000 ImageNet 클래스에 대한 값을 (확률을?) 반환한다.

 

AlexNet을 조금 더 자세히 살펴보자면 우선 ReLU 를 사용했다. ReLU는 딥러닝 모델에서 아주 보편화된 방법이다. 중간에 local response normalization layer는 채널간의 normalization을 위한 것인데, 큰 효과가 없는 것으로 알려져서 요즘은 잘 사용하지 않는다. 또 하나의 특징은 data augumentation을 엄청 했다는 점이다. 논문을 보면 더 자세하지만, 대략 flipping, jittering, color norm 등을 적용했다. Data augumentation은 프로젝트를 진행할 때 아주 유용한 기법임으로 알아두면 좋다. AlexNet은 Dropout을 사용하고, 학습 시 Batch size는 128, 그리고 우리도 지난 강의에서 배웠던 SGD momentum을 사용했다. 초기 Learning rate 는 1e-2 로 val accuracy가 올라가지 않는 지점에서는 학습이 종료되는 시점까지 Learning rate를 1e-10까지 줄인다. 그리고 wight decay를 사용했고, 마지막에는 모델 앙상블로 성능을 향상했다(여러개의 모델을 앙상블시켜서 성능을 개선).

 

AlexNet 다이어그램을 보면 대체로 다른 Conv Net의 다이어그램과 유사하긴 하지만 한 가지 차이점이 있는데, 모델이 두개로 나눠져서 서로 교차한다는 점이다. AlexNet을 학습할 당시에는 GTX850 으로 학습을 시켰고 이 GPU는 메모리가 3GB 뿐이었기 때문에, 전체 레이어를 GPU에 다 넣을 수 없었기에 네트워크를 GPU에 분산시켜서 넣었다. 그래서 각 GPU가 모델의 뉴런과 Feature Map을 반반씩 나눠가지는 형태를 띈다. 다이어그램을 유심히 살펴보면 각 GPU에서의 Depth가 48로, Feature Map을 절반씩 가지고 있는 것을 알 수 있다. Conv 1,2,4,5에서는 같은 GPU 내에 있는 Feature Map만 사용해 Conv 1,2,4,5는 전체 96 feature map을 볼 수 없다. 즉, Conv 1,2,4,5는 48개의 Feature Map만 사용하는 셈이다. Conv 3와 FC 6, 7, 8 를 한번 살펴보면 이 레이어들은 이전 계층의 전체 Feature map과 연결되어 있어 이전 입력 레이어의 전체 Depth를 전부 가져올 수 있다 (이 레이어들에서는 GPU간의 통신을 한다). AlexNet은 Image Classification Benchmark를 2012년도에 우승한 모델이고, 최초의 CNN기반 우승 모델로, 수년 전까지 대부분의 CNN 아키텍쳐의 베이스모델로 사용되어 왔다. 하지만 지금은 일반적으로 AlexNet보다 성능이 더 뛰어난 더 최신의 아키텍쳐가 많이 있다.

 

ZFNet 

ZFNet은 2013년 ImageNet Challange에서 우승한 모델이다. 이는 AlexNet의 하이퍼파라미터를 개선한 모델이라고 보면 된다. AlexNet과 같은 레이어 수이고 기존적인 구조도 같지만, stride size, 필터 수 같은 하이퍼파라미터를 조절해서 AlexNet의 Error rate를 좀 더 개선시켰다.

 

VGGNet

2014년에는 많은 변화가 있었는데, 아키텍쳐도 많이 변했고 성능도 훨씬 향상되었다. 가장 큰 차이점을 꼽자면, 네트워크가 훨씬 더 깊어졌다는 점이다. 2012/2013년에는 8개의 레이어었지만, 2014년에는 19레이어와 22 레이어로 훨씬 더 깊어졌다. 2014년도의 ImageNet Challenge 우승자는 Google의 GoogLenet였고, Oxford의 VGGNet이 2등을 차지했다. VGGNet은 Localization Challenge 등 일부 다른 트랙에서는 1위를 차지했음으로 두 모델다 강력한 네트워크를 가지고 있다. 

 

VGGNet의 특징은 네트워크가 훨씬 더 깊어졌고, 더 작은 필터를 사용한다는 것이다. AlexNet에서는 8개의 레이어였지만, VGGNet은 16에서 19개의 레이어를 가지고 있다. 그리고 VGGNet은 아주 작은 필터만 사용한다. 항상 3 x 3 필터만만 사용하는데, 이는 이웃픽셀을 포함할 수 있는 가장 작은 필터다. 이렇게 작은 필터를 유지해 주고, 주기적으로 Pooling을 수행하면서 전체 네트워크를 구성했다. VGGNet은 아주 심플하면서도 고급진 아키텍쳐이고, ImageNet에서 7.3%의 Top 5 Error를 기록했다.

 

VGGNet은 왜 더 작은 필터를 사용했을까? 우선 필터의 크기가 작으면 레이어의 파라미터의 수가 더 적어짐으로 큰 필터에 비해 레이어를 조금 더 많이 쌓을 수 있다. 즉, 작은 필터를 사용하면 Depth를 더 키울 수 있다. 3 x 3 필터를 여러 개 쌓은 것은 결국 7 x 7 필터를 사용하는 것과 실질적으로 동일한 Receptive Field(리셉티브 필드)를 가진다. Receptive Field은 filter가 한번에 볼 수 있는 입력의 Spatial area이다 (출력 레이어의 뉴런 하나에 영향을 미치는 입력 뉴런들의 공간 크기). Stride가 1인 3 x 3필터를 세 개를 쌓게 되면 실질적인 Receptive Field가 어떻게 될까? 우선 첫 번째 레이어의 Receptive Field는 3 x 3이다. 두 번째 레이어의 경우는 각 뉴런이 첫 번째 레이어 출력의 3 x 3만큼을 보고, 3 x 3 중에 각 사이드는 한 픽셀씩 더 볼 수 있다. 그래서 실제로는 두번째 레이어의 경우 5 x 5의 receptive field를 가지게 된다. 세 번째 레이어의 경우 두 번째 레이어의 3 x 3 을 본다. 그리고 두번째 레이어와 똑같이 적용해보면, 결국 (첫) 입력 레이어의 7 x 7을 보게 되고, 실질적인 Receptive Field는 7 x 7 로, 즉 3 x 3필터 세 개를 쌓는 것이 하나의 7 x 7 필터를 사용하는 것과 동일하다고 볼 수 있다. 7 x 7 필터와 실직적으로 동일한 receptive filed를 가지면서도 더 깊은 레이어를 쌓을 수 있고, 7 x 7보다 파라미터 수도 더 적다 (각 레이터 당 3 x 3 x C (depth) x C (feature map의 갯수) VS 7 x 7 x C x C).

 

VGGNet의 네트워크를 한번 살펴보면, AlexNet과 비슷한 패턴이 반복된다. Conv Layer와 Pooling Layer가 반복적으로 진행되는 패턴이다. VGG16에서 모든 Layer의 수를 세어보면 16개이다. VGG19의 경우 유사한 아키텍쳐이지만 Conv Layer가 조금 더 추가돼있다. VGG16의 전체 파라미터의 갯수는 138M개 이다 (AlexNet의 경우에는 60M개).

 

* 네트워크가 더 깊다는 말의 의미는 레이어의 갯수가 더 많은 것을 의미한다.

* 하나의 Conv Layer 내에 여러개의 필터가 존재하는 이유? 3 x 3 Conv 필터가 있다고 하면 이 필터는 한번에 3 x 3 x Depth를 보고 하나의 Feature Map을 만들어 낸다. 우리는 여러개의 필터를 사용할 수 있고, 각 필터는 하나의 Feature Map을 만든다. 각 필터가 존재하는 이유는 서로 다른 패턴을 인식하기 위해서이다 (각각의 Feature Map).  

 

VGG16과 VGG19는 아주 유사하고, VGG19가 조금 더 깊다. VGG19가 아주 조금 더 좋고 메모리도 조금 더 쓰지만 보통 16을 더 많이 사용한다. 네트워크를 살펴보면, AlexNet에서 처럼 모델 성능을 위해서 앙상블 기법을 사용했다. VGG의 마지막 FC-Layer인 FC7은 이미지넷 1000 class 의 바로 직전에 위치한 레이어인데, 4096 사이즈로 아주 좋은 feature represetation을 가지고 있는 것으로 알려져있다. 즉. 다른 데이터에서도 특징(feature) 추출이 잘되며 다른 Task에서도 일반화 능력이 뛰어난 것으로 알려져있다.

 

* VGG는 localization task에서 우승함 -> localization은 하나의 task인데, 이미지에 고양이가 있는가? 를 분류하는 것 뿐만 아니라, 정확히 고양이가 어디에 있는지 네모박스를 그리는 것이다. Detection과는 조금 다른데, Detection은 이미지 내에 다수의 객체가 존재할 수 있지만, localization은 이미지에 객체가 하나만 있다고 가정하고, 이미지를 분류하고, 추가적으로 네모박스도 쳐야한다.

 

GoogLeNet

GoogLeNet은 2014년 Classification Challenge에서 우승한 모델이다. GoogLeNet도 엄청 깊은 네트워크로, 22개의 레이어를 가지고 있다.  GoogLeNet에서 가장 중요한 것은 효율적인 계산에 관한 그들의 특별한 관점이 있다는 것과 높은 계산량을 아주 효율적으로 수행하도록 네트워크를 디자인했다는 점이다. GoogLeNet은 Inception module을 여러개 쌓아서 만들었다. 그리고 FC-Layer가 없는데, 이는 파라미터를 줄이기 위해서이다. 전체 파라미터 수가 5M 정도로, 60M인 AlexNet보다 적지만 그럼에도 불구하고 훨씬 더 깊다. Inception module은 무엇일까?

 

Inception은 Network in Network로 부터 이름이 유래했다. Inception Module 내부에는 동일한 입력을 받는 서로 다른
다양한 필터들이 병렬로 존재한다. 이전 레이어의 입력을 받아서 다양한 Conv 연산을 수행한다. 밑에 그림을 보면, 1x1 / 3x3 / 5x5 conv /Pooling (3x3)가 각각의 레이어로 동일한 입력을 받는다. 각 레이어에서 연산 후에 각각의 출력 값들이 나오는데, 그 출력들을 모두 Depth 방향으로 합친다 (concatenate). 이렇게 합치면 하나의 tensor로 출력이 결정되고, 이 하나의 출력을 다음 레이어로 전달하는 형태이다. 지금까지는 살펴본 Inception 모듈의 형태는 다양한 연산을 수행하고 이를 하나로 합쳐준다는 아주 단순한 방식(naive way)이다. 이 방법의 문제는 무엇일까? 바로 계산 비용이다. 이런식으로 계산을 해서 모든 출력 값들을 합친 사이즈를 계산해보면 spatial dimention은 변하지 않지만 depth가 엄청 불어난다 (예를 들어, Inception module의 입력은 28 x 28 x 256 이었으나 출력은 28 x 28 x 672). 연산량이 아주 많아지고, 특히, Pooling layer는 입력의 Depth를 그대로 유지하기 때문에 문제를 악화시킨다. 레이어를 거칠때마다 Depth가 점점 늘어나는데, Pooling의 출력은 이미 입력의 Depth와 동일하고, 여기에 다른 레이어의 출력이 계속해서 더해지기 때문에 레이어를 거칠수록 출력의 depth가 점점 더 늘어나게 되는 것이다. 이 문제를 어떻게 해결할 수 있을까?

 

* Inception 설명 참고- leedakyeong.tistory.com/entry/%EB%85%BC%EB%AC%B8-GoogleNet-Inception-%EB%A6%AC%EB%B7%B0-Going-deeper-with-convolutions-1

 

문제를 해결하기 위해서 GoogLeNet에서 사용한 key insight는 "bottleneck layer" 를 이용하는 것이었다. Conv 연산을 수행하기에 앞서 입력을 더 낮은 차원으로 보내는 방법이다. Input feature map들 간의 선형결합(linear combination) 이라고 할 수 있다. 주요 아이디어는 바로 입력의 depth를 줄이는 것인데, 각 레이어의 계산량은 1x1 conv를 통해 줄이는 방법이다.  1x1 conv는 각 spatial location에서만 내적을 수행하면서 depth만 줄일 수 있다 (입력의 depth를 더 낮은 차원으로 projection). 즉, 1 x 1 conv가 depth 의 차원을 줄여준다. 1x1 conv를 이용하면 계산량을 조절할 수 있고 연산량이 줄어든다.

 

* 1 x 1 Conv를 수행하면 일부 정보손실이 발생하지는 않을까? 정보 손실이 발생할 수는 있지만, 일반적으로 1x1 conv를 추가하면 여러모로 도움이 되고 더 잘 동작한다. Inception Module에서 1 x 1 convs를 사용하는 기본적인 이유는 계산복잡도를 조절하기 위해서다.

 

 

 

 

반응형

'AI > CS231n' 카테고리의 다른 글

[11강] Detection and Segmentation  (0) 2020.12.19
[8강] Deep Learning Software  (0) 2020.11.28
[6강] Training Neural Networks I  (0) 2020.11.14
[5강] Convolutional Neural Networks  (0) 2020.11.07
[4강] Introduction to Neural Networks  (0) 2020.10.31