유승훈

lec11 - Convolutional Neural Network(CNN) 본문

강의정리/모두를 위한 딥러닝 시즌 2

lec11 - Convolutional Neural Network(CNN)

seunghuni96 2021. 2. 26. 21:30

우리가 지금까지 했던 Neural Network들은 모든 뉴런들이 연결된, Fully Connected(FC) Network 였습니다. 하지만, X를 여러개로 나눈 뒤에, 하나로 합쳐서 앞으로 보내는 구조도 생각해볼 수 있습니다. 이것이 이번 강의에서 배우는 Convolutional Neural Network(CNN)의 기본개념입니다.

 

CNN은 고양이에게 한 실험에서 시작되었습니다. 고양이에게 여러 형태의 그림을 보여주었는데, 그림마다 활성화되는 뉴런들이 다른것을 발견했습니다. 여기서 착안하여 데이터를 통째로 쓰는 것이 아니라, 여러 조각으로 잘라서 Network에 학습시키는 것을 생각해냈습니다. 

 

이미지를 여러개로 누너어서, Input으로 넘겨준 뒤에, Activation Function을 거칩니다. 이 과정을 반복하는데, 한번이 아니라 여러번 할 수도 있고, 중간에 Pooling을 거칠수도 있습니다. 이후 마지막에 우리에게 익숙한 Fully Connected Network를 구성해서 최종적인 Labeling을 하는 Classifier를 붙입니다.

 

Convolution Layer는 Width, Height, Channel 순서로 표기합니다. 여기서 Channel은 데이터의 차원이라고 생각하면 편합니다. 컬러 이미지일때는 RGB로 3, 흑백인 경우 1의 값을 같습니다. 하지만 항상 이런 값을 갖는것은 아니고, Network를 거치면서 중간의 Layer는 이전의 Output을 Input으로 받기 때문에, 이 보다 훨씬 큰 것이 일반적입니다.

 

이미지를 하나가 아니라 여러개로 나누어서 처리를 하는데, 이 조각들을 Filter라고 합니다. 나누는 크기는 정할 수 있고, Channel은 항상 같이 따라갑니다. Input의 Channel과 Filter의 Channel이 항상 같다는 것입니다. 여기서 Filter는 75개의 숫자를 갖게 됩니다. 나눈 Filter를 하나의 숫자로 합치는데, 이때 우리가 많이 활용한 $Wx+b$를 사용합니다. 이러한 과정을 반복하는데, 위의 그림처럼 숫자가 딱 떨어지지 않을수도 있습니다.

 

여기서 Stride라는 개념이 등장합니다. Stride라는 간격으로 Filter가 이동하면서, Input 이미지의 조각들을 만들어냅니다. 위의 그림과 같이 7x7의 Input에서, 3x3인 Filter를 Stride=1로 나눈다고 하면, Filter가 한칸씩 이동하면서 만들어지기 때문에 5x5 output을 얻을 수 있습니다.

위의 예시는 5x5인 Input에서 3x3인 Filter를 Stride=1로 나눈 것입니다. 최종적으로 3x3의 output임을 볼 수 있습니다. 빨간색으로 작게 써있는것이 W(eight)입니다. 

 

이미지의 크기를 N, Filter의 크기를 F라고 할 때,

위와 같은 형태로 Output의 크기가 정해집니다. 당연히 소수로 나오는 경우도 있는데, 이때는 Input과 Filter의 크기에 따라 조절하면 됩니다. 예시에서는 편의상 Channel을 1로 했는데, 실제로는 1이 아닌 경우가 대부분입니다. 여러개 겹쳐진다고 생각하면 될 것 같습니다.

 

이런 과정이 반복될수록 데이터의 크기는 점점 작이집니다. 위에서도 7x7이었던 이미지가 5x5, 3x3으로, 5x5였던 이미지가 3x3으로 작아지는 것을 볼 수 있습니다. 데이터가 작아질수록 점점 정보를 잃고 있는 것입니다.

 

그래서 우리 데이터를 0들로 한번 두르는 Padding이라는 것을 활용합니다. 이에는 크게 두 가지 이유가 있는데요.

  • 데이터의 크기가 급격하게 작아지는 것을 방지함

  • 우리의 Network에 모서리의 형태를 인지시킴

이러한 이유 때문에 Padding을 많이 활용합니다. 또 하나 생각해야 할 것은, Padding을 하면 데이터의 크기가 커진다는 것입니다. 상하좌우로 데이터가 하나씩 더 붙기 때문에 그림에서는 5x5였던 원 데이터가 7x7로 커진것을 볼 수 있습니다. 당연히 Output의 크기도 이에 따라 변합니다.

 

Convolution 연산을 한 뒤에는 Activation Function에 통과시키는게, 가장 많이 사용되는 것이 Relu입니다. 모든 음수는 0으로 변경하고, 나머지는 그대로 값을 유지합니다.

 

여기까지가 기본적으로 하나의 CNN Layer를 만드는 과정입니다.

 

같은 이미지에 다른 Weight를 갖는 다른 Filter들을 만든다고 생각해봅시다. 이미지에서 여러개의 Filter들로 다양한 특징을 뽑아내는 것입니다. 고양이 이미지를 예로 들면, 어떤 Filter는 고양이의 귀를, 또 어떤 Filter는 고양이의 코를 특징으로 뽑아냅니다. 

 

처음 예로 들었던 32x32 이미지에서, 5x5인 필터를 6개 만드는 것입니다. Weight가 다르기 때문에, 모양이 살짝씩 다릅니다. 이렇게 Filter를 거쳐 만들어진 데이터를 Feature map, Activation map이라고 합니다. 이 Feature map들의 

 

Weight들은 우리가 이전에 했던것과 동일하게 처음에는 Random 혹은 Weight initialization 방법들로 설정할 수 있고, 이후에는 우리가 가진 데이터를 기반으로 학습을 진행합니다.

 

다음은 Pooling이라는 개념에 대해서 알아보겠습니다. 간단하게는 Sampling이라고도 볼 수 있습니다.

 

하나의 Convolutional Layer를 뽑아서, Size를 작게 만드는 과정을 반복하고, 다시 쌓는 것입니다.  위와 같이 4x4인 데이터에서 2x2로 Pooling을 한다고 합시다. 몇가지 방법이 있는데요, 가장 큰 값을 뽑은 Max Pooling, 평균을 구하는 Average Pooling, 최소값을 구하는 Min Pooling이 있습니다.

 

이런 과정을 거쳐서 Convolutional Network가 만들어지고, 마지막에 가서 Fully Connected Layer에 넣어서 Label을 분류하도록 하는 것입니다.

 

이제 CNN이 어떻게 활용됐었는지를 보겠습니다. Alexnet은 Imagenet이라는 이미지 분류 경진대회에서 우승을 차지한 알고리즘입니다. 논문의 저자인 Alex의 이름을 따서 Alexnet이라고 부릅니다. 

 

기본적으로 227x227x3의 이미지를 받아서, 가장 처음으로 Convolutional Layer를 만들고, 그 다음 Layer로는 Pooling을 해준 과정을 볼 수 있습니다.

 

Alexnet을 간단하게 정리하면 다음과 같습니다. Convolution Layer, Pooling Layer, Normalization Layer들이 있는 것을 볼 수 있습니다. Normalization Layer는 말 그대로 Normalization을 해 주는 Layer인데요, 최근에는 굳이 안해도 된다는 의견이 일반적이라고 합니다. 

 

CNN을 거친 뒤, 4096개의 뉴런과 1000개의 이미지 Label로 분류하는 Fully Connected Layer로 연결되는 것을 볼 수 있습니다. 이런 네트워크를 한개가 아니라 7개를 만들어서 Ensemble했습니다. 그 결과 대략 15.4%의 오류를 보였습니다.

 

그 다음으로는 GoogLeNet이 2014년에 등장했습니다. 각각 다른 형태의 Convolution을 만들고, 이를 합치는 형태입니다. 두번한 경우도 있고, 한번만 한 경우도 있습니다. 이를 레고처럼 합쳐서 여러번 쌓은 형태입니다. 이는 Imagenet 대회에서 6.7%의 오류를 보였습니다.

 

2015년에는 Resnet이 Imagenet 대회의 우승을 차지했습니다. Imagenet의 데이터를 인간이 직접 분류한 5% 오류보다 좋은 3.6%의 오류를 보여주었습니다. 이 알고리즘은 Imagenet뿐 아니라 여러 다른 대회에서도 우승할 만큼 좋은 성능을 보여주었습니다.

 

알고리즘이 발전할수록 레이어도 깊어졌습니다. 처음 소개한 Alexnet은 8개의 Layer를, GoogLeNet은 19개의 Layer를, ResNet은 152개의 Layer를 사용했습니다. 그런데 초기값을 엄청나게 잘 잡고, Activation Function을 잘 사용한다고 하더라도, 저렇게 깊은 구조는 학습이 어려울 것 같아보입니다. 

 

하지만 Resnet은 깊지만 깊지 않은(?)구조를 가집니다. x가 Weight Layer를 거치면서 Output이 되고, 그 Output이 다음 Weight Layer의 Input이 됩니다. ResNet은 Input을 바로 Output에 연결시켰습니다. 그러면 $H(x)=F(x)+x$가 되는데, Input인 x는 바뀌지 않기 때문에, F(x)를 최소화하는 것이 $H(x)-x$인 잔차를 최소화하는 과정이 됩니다. F(x)가 0이 되면, $H(x)=x$가 됩니다.

 

2014년에는 우리나라의 Yoon Kim 박사님이 CNN을 이미지 데이터 뿐 아니라 텍스트 데이터에서도 활용하는 것을 제안했고, 그에 따라 많은 곳에서 활용되고 있습니다. 우리가 흔히 알고 있는 알파고도 CNN을 활용해서 만들어졌습니다. 

Comments