본문 바로가기

머신러닝/[논문으로 짚어보는 딥러닝의 맥]

Convolutional Neural Network(CNN)의 기초

핵심 키워드

  • Convolutional Neural Network(CNN)
  • Convolutions
  • Subsampling
  • Convolution layer
  • Fully connected layer

학습하기

 이번에는 컨볼루션 뉴럴 네트워크(Convolutional Neural Network, CNN)에 대해서 알아보도록 하겠습니다. CNN이라는 것은 Convolutional Neural Network를 말하는데요, 이름으로 모든 것을 알 수 있습니다. 컨볼루션을 사용한 뉴럴 네트워크. 끝입니다. 그렇다면 컨볼루션이 뭔지를 알면 되겠지요. CNN의 구조는 다음과 같습니다. 인풋(Input)이라는 것은 어떤 입력 이미지입니다. 어떤 이미지가 있고, 거기에 컨볼루션이라는 과정을 거치면, (컨볼루셔널) 피쳐 맵(Feature Map)이 나오게 됩니다. 그 다음에는 서브샘플링(Subsampling)입니다. 서브샘플링이란 큰 이미지에서 더 작은 이미지를 얻어내는 것, 그러니까 스페셜한 정보가 줄어드는 것으로 볼 수 있습니다. 그렇게 얻어진 컨볼루셔널 피쳐 맵에 다시 컨볼루션을 적용하고, 다시 서브샘플링을 적용하고... 이게 끝입니다.

 결국 CNN = 컨볼루션 + 서브샘플링 + 풀리 커넥션(Fully Connection) 입니다. 풀리 커넥션은 이름은 여러가지가 있지만, 덴스(Dense Layer)라고 불리기도 합니다. 앞에서 봤지만 컨볼루션 뉴럴 네트워크는 결국 컨볼루션-서브샘플링-...-풀리 커넥티드 레이어의 구조입니다. 직관적으로 말하면, 컨볼루션과 서브샘플링이 피쳐 추출(Feature Extration)을 해주는 역활입니다. 여기서 피쳐 추출이 중요한데요. 예를들어, 물건을 분류할 때 어떻게 분류할까요? 이게 강아지다. 이게 소다. 이런 2가지를 구분하기위해 우리가 어떠한 일들을 하냐면, 강아지에게서는 강아지 모양의 귀, 눈, 꼬리를 보고 소는 소의 색깔, 얼굴모양, 꼬리모양, 다리모양 따위를 우리가 알고 있습니다. 즉 이미지 자체를 보는 것이 아니라 이미지의 특정 부분, 피쳐를 추출해서 그 특성들의 조합을 통해 대상을 구분하게 되는 것입니다. 그렇게 어떤 데이터에서 특정 부분을 뽑아내는 것을 피쳐 추출이라고하며, CNN에서는 컨볼루션과 서브샘플링 레이어가 해당 역활을 수행하게됩니다. 결국 피쳐 추출 레이어(컨볼루션 서브샘플링)를 거쳐서 나온 것은 어떤 특징이 되는 것이죠. 그런데 결과적으로 얻고 싶은건 특징들 정보가 아니라 그 특징을 가진 물체가 어떤 물체인지는 구분하는것입니다. 그렇게 구분하는 구별자(Classifier)가 있어야 하고, 이 역활을 풀리 커넥트 레이어가 처리하게 됩니다. 그래서 이미지가 들어가면 컨볼루션, 풀링(풀링은 서브샘플링의 일종), 컨볼루션, 풀링,풀리커넥티드... 이렇게 최종적으로 동물을 구분하는 모델이 만들어지는 겁니다.

 왜 잘될까? 보통 이런 생각을 합니다. CNN이 잘되는 이유는 첫째로 로컬 인배리언스입니다. 이는 국소적으로 비슷하다, 차이가 없다라는 말으로써, 쉽게 말하자면 컨볼루션 필터가 전체 이미지를 모두 돌아다닙니다. 동일한 컨볼루션 필터가 전체 이미지를 모두 돌아다니기 때문에, 우리가 찾고 싶은 물체가 이미지의 어디에 위치해 있는가는 별로 중요하지 않은 것입니다. 100 X 100 이미지에서 물체가 하나, 가운데에 있다고 가정합시다. 이런 이미지와 물체가 옆으로 한칸 옆으로 가있는 이미지는 다른 이미지입니다. 그러나 CNN의 입장에서는 두 이미지가 별로 차이가 없습니다. 두번째로는 Compositionality 인데요.  CNN은 컨볼루션,서브샘플링,컨볼루션,서브샘플링... 이렇게 반복적으로 계층적구조 층을 쌓게됩니다. 이를 컴포지셔날리티라고 합니다. 물론 CNN을 아직은, 정확히 하지 않아서 헷갈릴 수 있지만, 조금만 더 공부하시면 됩니다.

 이제 나왔네요. 5 X 5이미지가 있고 3 X 3의 컨볼루션을 진행하는 과정입니다. ...이후는 영상을 통해 훨씬 더 직관적으로 이해할 수 있습니다... 결국은 컨볼루션이라는 것은 내가 가진 이미지와 컨볼루션 필터가 얼마나 비슷한지를 표시하게되는 것입니다. 비슷하면, 높은 값, 다르면 낮은 값, 물론 어떤 컨볼루션 필터를 사용해야 높은 정확도가 나오는가는 모델이 학습할 내용입니다. 보시면 컨볼루션 필터가 동일한 모양이 전체 이미지를 돌아다니는 것을 알 수 있고 이것이 중요합니다.

 그래서 CNN을 이해하시기 위해서는 이 표에 익숙해지셔야합니다. 해당 표는 구글넷의 인셉션 아키텍쳐입니다. 컨볼루션, 컨볼루션, 맥스풀, 패치 사이즈, 스트라이드, 제로패딩, 채널.. 결국 이러한 단어들을 제대로 이해하셔야 합니다.

 제로 패딩이라는 것은 어떤 이미지가 있을 때, 컨볼루션을 가장자리에서도 하고 싶을 때 처리하는 것입니다. 예를 들어 5 X 5 이미지가 있을 때, 3 X 3 컨볼루션 필터를 사용한다면, 가장자리에서 문제가 생깁니다. 그래서 단순히 이미지의 가장자리에 0을 덧대어 컨볼루션이 가능하게끔 하는 것입니다. 이러한 상황에서 인풋 사이즈는 5, 출력 사이즈는 5, 필터 사이즈는 3,  제로패딩 사이즈는 1이라고 칭하며, 출력 사이즈 = (인풋 사이즈 + 2*패딩 사이즈 - 필터사이즈) + 1이라는 관계식이 성립합니다. 

 스트라이드라는 것은 영어로는 널리 뛰다라는 뜻으로, 같은 컨볼루션 필터를 이용해 이미지를  순회할 때, 얼마나 뛰어넘어가며 필터링할 것인지를 선택하는 것입니다. 직관적으로, 주어진 이미지가 5 X 5일 때, 스트라이드가 1인 컨볼루션을 적용한다면 출력 이미지인 피쳐맵은 5 X 5입니다. 만약 스트라이드가 2라면 피쳐맵은 3 X 3입니다. 입력 이미지가 28 X 28일 때 스트라이드가 2라면 14 14 한번더 적용하면 7 7 피쳐맵이 출력됩니다. 당연하게도, 컨볼루션 필터의 사이즈와 스트라이드 사이즈가 같으면, 컨볼루션 필터는 오버래핑 없이 컨볼루션이 진행됩니다.

 그래서 이제, 이게 콘벌루션 레이어입니다. input = [batch, in_height, in_width, in_channel],  filter = [filter_height, filter_width, in_channels, out_channels]. 이제는 이것만 이해한다면, 컨볼루션이 무엇인지를 다 이해한 것입니다. 이제 그림을 한 번 봐보죠. in_height와 in_width는 이미지의 가로세로 길이로 생각할 수 있고, in_channel은 이미지가 RGB로 구성되어있다는 의미입니다. 마지막으로 batch는, 일반적으로 학습할 때, 이미지를 한 장씩 넣고 학습하지 않습니다. 보통 배치 사이즈만큼 넣어 미니 배치 학습을 합니다. 일단 저희는 배치가 한 장이라고 가정합시다. 그러면 저희의 input = [1, 4, 4, 3]이 됩니다. 그리고 filter = [3, 3, 3, 7]입니다. 여기서 재밌는 것은, in_channels가 3이라는 점입니다. 앞에서는 단순 2차원 컨볼루션 필터를 사용했었지만, 실제 이 값은 항상 input의 in_channel과 같은 값을 사용해야합니다. 그리고 스트라이드는 1이라 가정합시다. 그러면 출력은 어떻게 될까요. 4 X 4인풋에 스트라이드 1인 컨볼루션을 적용했으니 출력 이미지의 가로 세로는 4 X 4입니다. 그러면 out_channels는 무엇일까요? 컨볼루션 필터의 개수와 관련되있습니다. 컨볼루션 필터를 7개를 사용한다면 4 X 4라는 출력물이 7겹으로 쌓이게 되는 것입니다. 또 여기서, 컨볼루션 레이어의 파라미터 수는 어떻게 결정될까요. 여기서는 3*3*3*7으로 총 189개의 파라미터있습니다. 저는 이런 파라미터의 수에 대한 이야기를 많이 할 것입니다. 이는 딥러닝에 큰 역활을 담당하며, 항상 작을 수록 좋습니다. 우리의 목표는 파라미터의 수를 줄이면서, 많은 레이어를 쌓기를 원합니다. 때문에 파라미터 수에 대한 이해가 필요합니다.

 자 그러면 넘어가도록 합시다. 이는 28 X 28 이미지, 그러니까 MNIST 데이터셋에 CNN을 적용한 모델입니다. ...이후는 그림을 참고하시면 됩니다... 

 정리해보자면, 이미지가 들어오면 컨볼루션, 바이어스합, 액티베이션, 풀링 처리 후 플래팅하고, 풀리커넥티드 레이어를 활용해 10단계로 분류..입니다. 자 중요하다 말했던 파라미터의 수를 생각해봅시다. 컨볼루션 레이어에서는 3*3*64 + 64(바이어스)=576+64이며 풀리 커넥티드 레이어에서는 14*14*64*10=125440. 풀리 커넥티드 레이어의 파라미터 수가 압도적으로 많은 것을 알 수 있고, 앞서 말한 것 처럼 파라미터의 수는 작을수록 좋습니다. 때문에, 최근에는 풀리 커넥티드 레이어를 삭제 또는 최대한 간소화시키는 방법이 최근의 트렌드입니다. 이렇게 파라미터의 수를 생각하는 것은 정말, 정말 중요합니다. 파라미터가 과도한 부분을 해소함으로써 모델의 성능 향상이 가능합니다.