이번 포스팅에서는 기초 딥러닝 구조 중 하나인 CNN에 대해서 정리하겠습니다.
저도 간단한 conference paper만 한번 써봤을 뿐 딥러닝 분야 전문가는 아니기에 제가 확실히 아는 부분 중심으로만 정리하도록 하겠습니다. 가장 기초적인 딥러닝 구조로는 Feed-Foward Network가 있다는 건 다들 아시죠? 이 기본 구조로도 회귀나 분류를 위한 모델을 만들 수 있는데, 왜 CNN이 등장하게 되었을까요?
(라온피플 (https://blog.naver.com/laonple/220587920012) 자료를 일부 참조하였습니다.)
만약 Feed-Forward Network에다가 이미지를 넣는다면 어떻게 해야할까요? 이미지는 공간적으로 가로X세로 픽셀에 값이 입력이 되어 있는데 어차피 Feed-Forward Network는 이런 공간적 정보를 반영할 수 없습니다. 그냥 다 따로따로 개별적인 Input으로 인식하고 처리합니다. 그런데 이런 방식이라면 똑같은 이미지라도 조금만 틀어지거나 이동하게 되면 모델은 전혀 다른 새로운 이미지로 간주한다는 것이 문제입니다. 우리가 보기엔 그저 픽셀이 1칸씩 밀렸을 뿐인데도 말입니다. 그렇다면 픽셀이 조금 밀리든 회전하든 (픽셀 하나하나의 주변 정보를 반영해서) 유사한 상황으로 모델링 할 수 있는 방법은 없을까요? 그게 Convolutional Neural Network의 핵심입니다.
일단 먼저 딥러닝 맥락이 아닌 과학/공학에서도 사용되는 개념 Convolution을 알아보겠습니다.
수식적으로는 이렇습니다. (연속함수: 왼쪽, 이산함수: 오른쪽). 보통 Convolution은 전자과에서 신호처리 같은거 할 때 많이 쓰실겁니다. 전기신호같은 것이 특정 시스템에 들어가 상호작용한 뒤 output signal로 전환되는 상황을 생각해보세요. 넣어주는 input signal은 다 다르더라도 똑같은 시스템을 통과한다면 시스템에 영향을 받는 방식은 모두 동일할 것입니다. 수학적으로는 이 시스템의 고유한 특성(Filter/Kernel)과 input signal 간 Convolution값이 output signal인 겁니다.
(이거 그냥 곱하기 아닌가 생각이 드실 수도 있는데 위 예시는 신호가 단조롭고 일회성으로 오는 녀석들을 가지고 설명한 것이구요, 아래와 같은 시그널은 어떤가요? 시그널 간의 중첩이 일어나면 합쳐진 효과가 발현이 되어야겠죠? 그래서 Sum 혹은 Integral로 그 중첩효과를 더 합쳐줍니다)
사실 저는 전자공학이 아니라 푸리에 광학쪽에서 먼저 convolution 개념을 접했습니다. 현미경, 카메라 렌즈 등은 아무리 성능이 좋더라도 원 대상의 이미지 정보를 완벽하게 전달하지는 못합니다. (궁금하신 분들은 광학의 회절 관련 내용 등을 찾아보시기 바랍니다) 정보가 소실될 수 밖에 없구요 그래서 image plane에 상이 맺힐 때 약간 뿌옇게 흐려지는 현상이 나타납니다. 이 과정도 렌즈라는 시스템에 영향을 받아서 원래 정보가 블러링되는 것입니다(광학에서는 여기서 kernel로 작용하는 함수의 꼴을 point-spread function이라고 하죠).
컨볼루션 관련 더 궁금한 사항은 아래 블로그를 참고하세요
https://brunch.co.kr/@chris-song/24
컨볼루션(Convolution) 이해하기
Understanding Convolutions - Chris Olah | 이 글은 colah.github.io 의 블로그의 글을 저작자 Chris Olah의 허락을 받고 번역한 글입니다. 의 블로그의 글을 저작자 Chris Olah의 허락을 받고 번역한 글입니다. http://co
brunch.co.kr
CNN은 이러한 컨셉을 차용합니다. 픽셀 하나하나에 대응되는 weight들이 있는 것이 아니라 일정한 범위의 인접 지역에 공통적으로 적용되는 Filter의 weight를 학습시키는 것입니다. 이렇게되면 픽셀 주위의 환경(이웃 픽셀이되겠죠)이 동일한 경우에는 절대적인 위치에 변화(shift/tilt)가 생기더라도 크게 모델 학습의 입장에서 크게 달라지지 않지요.
움짤 이미지로 더 직관적인 이해를 원하시면 아래 블로그를 참고하세요 https://umbum.tistory.com/223
합성곱 신경망 ( CNN, Convolutional Neural Network )
CNN, Convolutional Neural Network CNN은 합성곱(Convolution) 연산을 사용하는 ANN의 한 종류다. Convolution을 사용하면 3차원 데이터의 공간적 정보를 유지한 채 다음 레이어로 보낼 수 있다. 대표적인 CNN으..
umbum.dev
그런데, 이렇게 필터를 적용하다보니 CNN층을 통과할 수록 나오는 값의 크기가 줄어들겁니다. 이 때문에 가장자리 테두리를(원래 없었던 차원인데) 둘러치는 작업을 하는데 이를 padding이라고 합니다.
그럼, input image (너비:W, 높이:H)에 P크기만큼의 padding을 하고, convolutional filter (너비:FW, 높이 FH)를 간격 S만큼 움직여가며 적용시켰을 때 출력되는 output의 크기는 어떻게 될까요?
자, 그리고 처음 예시는 간단하게 input image가 너비와 높이밖에 없다고 생각했지만 그렇지 않은 경우도 있습니다. 컬러 이미지인 경우에는 RGB따로 정보가 있을테니 input의 channel 개수가 1이 아닌 3입니다. 이럴 때도 적용이 가능해야겠죠? 각각의 채널 별 filter를 적용한 후에 최종적으로 합쳐진 값을 output으로 가져옵니다.
아래 블로그에 자세한 내용이 수록되어 있습니다. 오른쪽 이미지도 여기서 퍼왔습니다.
CNN, Convolutional Neural Network 요약
Convolutional Neural Network, CNN을 정리합니다.
taewan.kim
채널뿐만아니 필터 역시 여러개가 될 수 있을 겁니다. (아래 그림은 모두의 딥러닝 시즌 2에서 퍼왔습니다) CNN은 그림이 많아서 제가 다 그리기 어렵네요....
CNN의 기본 모듈 중 하나로 Pooling도 있습니다.
역시 이 그림은 숟가락을 올렸습니다. https://technical-support.tistory.com/65
Pooling을 사용하는 이유, pooling의 특징, pooling의 효과 (CNN, Sub sampling, Max pooling, Average pooling)
DNN은 기본적으로 layer라는 모듈을 조립하듯이 이어붙이는 구조를 가집니다. 여기서 layer의 종류는 다양하게 존재하는데 CONV layer, FC layer(Affine layer), BN layer, Pooling layer, activation 등이 존재합..
technical-support.tistory.com
그래서 이런 기본 모듈들을 활용해서 CNN 블럭으로 사용하는 구조는 보통 아래와 같다고 하는군요. (역시 이 그림은 패스트캠퍼스-김기현의 딥러닝을 활용한 자연어처리에서 가져왔습니다)
이러한 기본 구조를 활용해서 VGG, ResNet등과 같은 유명한 구조들이 나타나게 됩니다. 자연어처리 분야에서는 RNN을 몰아내고 트랜스포머 계열이 주류를 차지하고 있지만 아직 이미지 처리는 Visual Transformer가 주류라고 보기는 힘든 것 같습니다. (물론 빠르게 변화하는 딥러닝의 세계에 언제 뭐가 어떻게 될 지는 모르는 일이죠. 현재 '21년 11월 기준입니다)
CNN구조를 적용한 MNIST 분류문제(Tensorflow2.0/Keras 적용) 코드를 업로드합니다.
그럼 오늘 포스팅은 여기서 마치도록 하겠습니다.
'Data & Research' 카테고리의 다른 글
[Statistics] Bayesian Linear Regression (0) | 2021.11.27 |
---|---|
[Deep Learning] Deep Neural Network 기초 : Back propagation (0) | 2021.11.21 |
[Machine Learning] 모델의 평가 (0) | 2021.11.14 |
[Statistics] 샘플링(Sampling)과 MCMC (0) | 2021.11.10 |
[Statistics] 베이지안 통계학 (Frequentist vs. Bayesian) (0) | 2021.11.07 |