안녕하세요~


이번글에서는 Convolution Neural Network(CNN)의 기본구조에 대해서 알아보도록 할거에요. CNN은 기본적으로 Convolution layer-Pooling layer-FC layer 순서로 진행이 되기 때문에 이에 대해서 차근차근 알아볼거에요.


<사진1>










<1. Convolution layer>


먼저 CNN에서 핵심이 되는 부분은 convolution layer에요. 보통 convolution layer에서 이미지를 classification(분류)하는데 필요한 특징(feature)정보들을 뽑아내요.


<사진2>


Convolution layer에는 수 많은 filter들이 있어요. 이러한 filter들을 통해 feature들을 뽑게 되는데 지금부터 어떻게 뽑아내는건지 보여드릴게요.


이미지의 feature가 될 수 있는 요소는 굉장히 많지만 그 중에서 대표적인 것이 형태가 될거에요. 물체의 윤곽부분만 보더라도 우리는 물체가 무엇인지 구분하는데 큰 정보를 얻게되요. 아래 사진에서도 오른쪽의 윤곽선만 보더라도 우리는 물체를 쉽게 가늠해볼 수 있어요.


<사진3>


먼저 convolution filter가 어떻게 연산을 하는지 살펴보고 좀 더 이해하기 쉽도록 이야기를 풀어나가볼게요.


<사진4>


convolution filter는 위와 같이 전체이미지를 차례대로 움직이면서 (이렇게 움직이는 방식을 window sliding이라고해요) 특징값을 추출해내는거에요. 전체 이미지에서 특정 filter의 모양과 일치하게 되면 그 부분에서 큰 값을 갖게 되겠죠? 이러한 filter가 전체 이미지를 순회하고 나면 전체 이미지에서 해당 filter와 유사한 모양을 가진 부분에 대한 feature들만 얻을 수 있게되요. 우리는 이러한 과정을 통해 "특정 filter에 부합하는 feature 정보를 얻었다"라고 말하게 되는거죠.



1) First convolution layer


CNN에서 물체의 윤곽을 알아내기 위해서 제일 처음 하는 작업은 edge filter를 사용하는거에요. Convolution filter는 모든 layer에서 같은 크기로 고정되어 있어요 (보통은 3x3 size로 구성되는데 이에 대한 이유는 뒤에서 설명드릴게요). 그렇기 때문에 처음에 들어오는 이미지 크기는 convolution filter 크기에 비해 상대적으로 크기 때문에 filter가 이미지를 커버할 수 있는 부분이 선과 같은 단순한 정보에요 (그리고 이러한 단순한 모양들을 edge라고 부릅니다). 예를 들어, 우리가 아래 그림의 오른쪽 사람을 매우가까운 거리에서 현미경으로 살펴본다고 했을 때 사람얼굴이 보이는게 아니라 무수히 많은 선들만 보이겠죠? 


아래 그림을 보시면 더 잘 이해하실거에요. 우리가 아래 그림처럼 7x7 conv filter를 갖고 있다고 가정해 볼게요. 그럼 아래 7x7 conv filter가 쥐 이미지(전체 이미지)를 천천히 순회하다보면 conv filter의 edge 부분과 일치하는 영역에서 굉장히 높은 값을 도출하게 될거에요.


      

 

<사진5>



지금까지 이야기한 것들을 바탕으로 convolution layer가 어떻게 동작하게 되는지 보여들게요.


아래 그림에서 45번째 convolution filter를 적용해볼게요. 아래 그림의 오른쪽 부분 녹색테두리 네모박스 부분이 45번째 convolution filter가 적용된 결과를 보여주는거에요. 아래 그림 왼쪽 부분에서 45번째 convolution filter를 보시면 좌측에서 우측으로 갈 수록 밝아지는걸 볼 수 있죠? 그렇다면, 이러한 filter가 오른쪽 이미지 좌측상단의 사람 이미지에 차례대로 적용된다고 했을때 좌측에는 어둡과 우측에는 밝은 영역을 지닌 부분에는 흰색으로 표시할거에요 (gray scale에서 흰색이 높은 값을 갖게 됩니다).


     

<사진6-1>


위의 그림에서는 96개의 filter가 있는데요. 96개의 filter를 쓴다는건 96개의 서로다른 feature를 뽑아내겠다는것과 같아요.


결과적으로 우리가 6개의 filter를 사용하면 아래 그림의 첫 번째 convolution layer에서는 6개의 결과값들이 나오게 되는데 이를 feature map(특징(feature)정보들이 들어있는 map(정보)인 거죠)이라고 불러요. (전체적인 과정은 뒤에서 다시 요약해서 설명해 드릴게요!) 즉, first convolution layer에서 6개의 convolution filter를 사용한 결과 6개의 feature maps (아래 연두색 그림 부분)을 얻게 되었네요! 각각의 feature map은 위에서 설명한 것과 같이 각각의 convolution filter와 부합하는 feature 정보들이 들어있을거에요.




처음에는 conv filter 역시 초기값 설정을 통해 무작위로 분포하게 되지만 학습을 통해서 아래의 오른쪽과 같이 완성된 edge filter로 만들어지게 됩니다.



<사진6-2>











2) Pooling layer


아래사진을 보면 convolution layer (Conv) 사이에 Pooling layer (pool)가 사이사이에 배치하고 있습니다. 이러한 Pooling layer은 CNN에서 어떤 역할을 담당하고 있는걸까요?


<사진7>


먼저 Pooling 연산에 대해서 알아보도록 할 텐데 Pooling 연산 자체는 크게 어렵지 않아요. convolution filter를 거친 결과로 얻은 각각의 feature map에서 특정영역을 형성하여 해당 영역 내에서 가장 큰 값을 도출하게 되요. 이러한 방법을 max pooling이라고 하는데, 실제로는 pooling에도 여러가지 종류가 있어요. 하지만, 여기에서는 max pooling을 기준으로 설명드릴게요~ 


Max pooling은 말그대로 특정영역에서 가장 큰 값을 꺼내어 쓰는거에요. '사진9'를 보면 모양은 그대로인데 pooling결과 좀 더 feature들이 뚜렷해지는 것을 볼 수 있죠? 당연히 pooling을 할때 주위의 영역중 가장 큰 값을 뽑기 때문에 이러한 결과가 나오는게 아닐까해요.


      <사진8>  



     

<사진9>



 '사진10'를 보시면 아시겠지만 pooling 연산을 통해서 형태는 유지하면서 기존의 이미지크기를 작게 만들어 줄 수 있게 됐어요 (이러한 작업을 down sampling이라고해요). 왜 이런 down sampling을 통해 이미지를 작게 만드는 걸까요?


        <사진10>      



앞서 conv filter의 size는 변함이 없다고 했죠? 만약 pooling을 통해 down sampling을 하게 된다면 이후의 conv filter는 어떻게 학습하게 될까요? First convolution layer에서의 conv filter는 edge 정보만 추출할 수 있다고 말씀드렸죠? 그런데 아래그림의 오른쪽 사람얼굴을 보면 전체 이미지 사이즈가 작아지니 conv filter의 크기가 상대적으로 조금 더 커졌다는걸 알 수 있어요. 그렇기 때문에 이제는 edge 정보가 아니라 눈과 같이 조금 더 추상적(abstract)인 정보를 볼 수 있는 conv filter를 갖을 수 있게 되었어요.


(그림 실력이....;;;)


이러한 pooling layer 때문에 CNN은 아래와 같은 설명이 가능해졌답니다. 즉, layer가 깊어지면 깊어질 수록 좀 더 abstract feature를 추출할 수 있게 되고, 이것을 통해서 아래와 같은 그림으로 CNN을 표현할 수 있게 됩니다. 



<사진11>

<사진12>






3) 중간점검


지금까지 Convolution layer와 pooling layer에 대해서 이야기 해보았어요. 마지막 단계는 FC layer인데 FC layer를 설명하기전에 지금까지 설명했던 부분을 아래그림을 통해 다시 요약해보려고해요.


먼저 첫 번째 convolution layer를 보면 6개의 convolution filter를 사용하고있어요. 그 결과 각각의 특징을 갖는 6개의 feature map이 만들어지겠네요. 그리고, pooling을 통해서 6개의 feature map size가 줄어들게 되었어요.



두 번째 convolution layer에서는 16개의 convolution filter가 사용되었네요. 첫 번째 convolution layer에서 사용된 convolution filter보다는 좀 더 abstract한 convolution filter 모양을 보일거에요. 그리고 두 번째 convolution filter 하나가 사용될 때에는 이전 conv layer-pooling layer를 통해 얻은 6개의 feature map에 동시에 적용되요. 


이렇게 되면 각 feature map을 합산한 하나의 feature map이 만들어 질거고 합산한 feature map에 두 번째 convolution layer에 있는 16개의 conv filter들을 적용해서 또 다른 16개의 feature map을 만들게 되요.


    


아래 영상을 참고하시면 더 이해하기 쉬우실거에요!



그리고 보통 layer가 뒤로갈 수록 filter의 총 개수가 많아지는데요. 그 이유는 두 가지 측면에서 해석해 볼 수 있을거 같아요.



첫 번째는 연산량이에요. 처음에는 이미지가 크기 때문에 6개의 conv filter로만 계산을 해도 굉장히 많은 연산을해야해요. 하지만 마지막 layer까지 가다보면 이미지의 크기 (or feature map)가 매우 작아지게 되는데 이때는 많은 conv filter로 convolutoin 연산을 적용해도 첫 번째 conv layer에서 6개의 filter를 적용한 계산량과 비슷하게 될거에요.


두 번째는 추출한 feature의 형태에요. 첫 번째 layer에서 뽑아낼 edge 정보는 굉장히 단순한 구조로 되어 있어요. 그렇기 때문에 많은 형태의 모양이 있을 필요가 없다고 판단할 수 있을거 같아요. 하지만 모양이 점점 추상적으로 바뀌어 갈수록 점점 형태가 복잡해져요. 예를들어, 강아지의 윤곽선을 만들기 위해서 쓰이는 edge가 직선, 대각선, 곡선 3가지라고 한다면 강아지의 귀를 만들기 위해서는 세모, 네모, 동그라미, 다각형, 구부러진 귀 모양 등등 더 다양한 형태가 필요하게 될거에요. 








4) FC layer


위에서 설명드린 방식으로 feature를 뽑다보면 마지막에는 물체와 유사한 형태들의 feature map들이 선별되게 될거에요.




결국 물체와 유사한 feature map을 통해서 classification(분류)를 하게 되는데요. 이때 사용되는 개념이 FC layer에요. 아래 그림의 FC layer를 보니 뭐가 떠오르시지 않나요? 맞습니다. 결국 FC layer는 기존의 Deep Neural Network(DNN; MLP)네요. 


<사진13>


앞에서 convolution filter를 통해 시각정보를 최대한 보존해 오면서 마지막 feature map들을 일렬로 늘린 후, 이들을 DNN과 같이 입력차원으로 받아드려서 하나의 hidden layer거쳐 classification(분류) 문제를 해결하게 되는거에요. (아래영상은 DNN에 대한 영상이지만 feature map들이 결국 어떻게 일렬로 펼쳐져서 입력되는지 이해하시는데 도움이 되실거에요)




지금까지 CNN 구조와 각각의 역할에 대해서 알아보았어요. 이번장에서는 CNN에 대한 전반적인 개념을 설명하려다 보니 구체적인 수식들은 배제했어요 (정확한 수식에 대해서는 '딥러닝 제대로 시작하기'라는 책을 참고하시면 더 좋을 것 같아요). 


다음글에서는 CNN이 기존 DNN구조에 비해 얼마나많은 연산량의 감소가 있었는지 그리고 이러한 부분이 왜 이미지영역에서 뛰어난 성과를 거두는데 기여하게 되었는지 살펴보도록 할게요!



(아래영상은 CNN이 진행되는 과정을 visualization한 영상이니 참고하시면 도움이 되실거에요~!)










[사진 래퍼런스]

사진1

밑바닥부터 시작하는 딥러닝

사진2

https://d2l.ai/chapter_convolutional-neural-networks/lenet.html

사진3

https://steemit.com/kr/@rubymaker/3ylvdc-rubymaker

사진4

https://stats.stackexchange.com/questions/296679/what-does-kernel-size-mean/296701

사진5

https://adeshpande3.github.io/A-Beginner%27s-Guide-To-Understanding-Convolutional-Neural-Networks/

사진6-1,9

https://www.youtube.com/watch?v=AgkfIQ4IGaM

사진6-2

밑바닥부터 시작하는 딥러닝

사진7

https://www.researchgate.net/figure/AlexNet-and-VGGNet-architecture_fig1_282270749

사진8

https://www.itread01.com/content/1544830204.html

사진10

http://cs231n.github.io/convolutional-networks/

사진11

https://www.researchgate.net/figure/Illustration-of-Convolutional-Neural-Network-CNN-Architecture_fig3_322477802

사진12

https://slideplayer.com/slide/3270662/

+ Recent posts