본문 바로가기

데이터 다루기/신경망

[신경망] 16. CNN Architecture (2) VGGNet, GoogleNet

728x90
반응형

안녕하세요, 이번 포스팅에서는 저번과 이어서 CNN의 Architecture에 대해서 배워보도록 하겠습니다.

이번에 알아볼 Architecture는 AlexNet과 ZFNet에서 오분률이 또 다시 한번 급격히 감소한 VGGNet과 GoogleNet 입니다.

우선 앞선 두 Architecture와의 차이는 네트워크의 깊이입니다. VGGNet에서는 무려 19개의 층으로 구성됩니다.

다음 그림은 VGGNet과 AlexNet의 차이를 간략하게 보여줍니다.

VGGNet은 AlexNet과 한눈에 봐도 비슷한 구조를 가지고 있습니다. 층 수만 2배정도 늘어났을 뿐인데 성능은 큰 차이를 보입니다.

이 처럼 네트워크의 깊이는 모델의 성능에 매우 큰 영향을 미칩니다.

VGGNet의 특징은 다음과 같습니다.

1. Filter의 크기를 줄이고, 네트워크를 더 깊게 쌓음.

8개의 layer를 가지는 AlexNet에서 16~19개의 layer를 가지는 VGGNet으로 발전했습니다.

이 때 3x3의 크기를 가지는 filter를 사용하며, stride=1, padding=1 인 convolution layer를 가지며, 2x2 max pooling with stride=2인 pooling layer를 가집니다.

여기서 의문점이 있습니다. 왜 3x3 처럼 작은 filter로 쌓았는가 입니다.

이에는 사실 이유가 있습니다.

실제로 3x3 Conv (stride 1) layer를 3겹 쌓았을 때와 7x7 Conv (stride 1) layer 와의 receptive field (convolution이 받아들이는 이미지의 크기)는 같습니다.

하지만 3x3 을 깊게 쌓게 되면, 우선 비선형성을 더 많이 반영할 수 있으며, 실제로 필요한 parameter 수도 적습니다.

3x(3x3xCxC) vs. 7x7xCxC for C channels per layer (3x3xC+3x3xC+3x3xC < 7x7xC)

즉 작은 사이즈를 여러번 쌓는것이 큰 사이즈를 한 번 쌓는것보다 계산 (속도) 측면에서 더 좋습니다.

다음으로 배워볼 Architecture은 Google Net입니다.

GoogleNet은 22개의 layer의 구조를 가지고 있습니다.

그리고 Inception Module을 이용합니다.

Inception Module은 이전 layer에서 나온 output을 input으로 받아들이고, 3개의 convolution layer와 pooling layer를 수평적으로 합성합니다.

이 때, 합성할 때 feature 맵의 사이즈가 다르면 문제가 생기겠죠??

그렇기 때문에, convolution layer와 pooling layer에 zero padding을 추가하여, input 사이즈가 변화하지 않도록 고정합니다.

최종적으로 output은 28x28x(128+192+96+256) = 28x28x672 사이즈를 가지게 됩니다.

그리고 이 Inception Module을 더 발전시키게 되는데 이것이 Bottle Neck 입니다.

Bottle Neck에서는 1x1 Conv를 추가합니다.

구조를 이렇게 변경하는 이유는 computation cost를 줄이기 위해서입니다.

위의 2 구조에 필요한 parameter의 수를 계산해보면 실제로 엄청난 차이가 발생합니다.

Bottle Neck 구조로 변경함에 따라, 필요한 parameter의 수가 절반 넘게 감소된것이 보이시죠??

엄청난 효과입니다...

최종적으로 GoogleNet의 구조는 다음과 같습니다.

중간중간에 FC layer가 들어가는데, 이는 layer가 깊어질수록 학습할 때, backpropergation을 사용하는데, 저희가 배웠다시피 이 방법에는 문제점이 있잖아요??

바로 Gradient Vanishing 문제로 네트워크의 업데이트가 input 층에 가까울수록 일어나지 않습니다.

이 문제를 방지하기 위해서 중간 중간에 classification 층을 만들어서 gradient를 유지 시킬 수 있습니다.

여기서 한가지 궁금점이 있을 수 있습니다.

3개의 output이 나오면, 오차 또한 3번 발생할텐데 오차는 어떻게 계산될까요?

일반적으로 3개의 오차를 다 더하거나 평균값을 사용한다고 합니다.

반응형