데이터과학 유망주의 매일 글쓰기 — 66일차
Convolutional Neural Network (CNN)
# CNN
오늘 한일:
딥러닝 마지막 수업 주차는 드디어 CNN을 배우는 시간이다. CNN이란 Convolutional Neural Network라고 하여, 이미지 학습에서 특히 널리 사용되는 기술이다. CNN을 모르면서 딥러닝을 안다고 말하는 사람은 아예 모르거나 사기꾼이라는 말까지 있을 정도다.
그렇다면 CNN에서 가장 근간을 이루는 기본 개념은 어떤 것이 있을까? 오늘은 CNN을 이해하기 위해 필요한 개념에 대해 요약해보았다.
Convolutional Neural Network
CNN은 고양이의 시각 피질의 수용 영역(receptive field)에서 영감을 받아 만들어진 것이라고 한다. 실제 동물의 뇌에서는 특정 사물을 볼 때, 뇌의 각 영역에서 사물의 형태, 색상, 부피, 이동 방향 등의 정보를 처리한다. 이것을 모티브로 하여, CNN 신경망의 낮은 부분에서는 사물의 전체적인 형태와 색상을 처리하고, 좀 더 높은 부분으로 갈수록 더 디테일한 형태와 색상 등의 정보를 처리한다.
Convolution
CNN은 Convolution이라는 개념을 사용하여 정보를 학습한다. 이 기법은 입력 이미지 데이터를 mxn의 차원으로 숫자화한 매트리스상에서 정해진 값을 가지고 있는 특정한 filter가, 정해진 숫자(stride)만큼 움직이며 이미지 데이터의 중요부분을 확대하고 학습하는 기법이다. Filter는 종류에 따라 연산을 하면서, 차원 축소된 매트리스에 최대값(max)이나 최소값(min), 또는 평균값(mean)등등을 선택할 수 있다.
Padding
Stride마다 움직이면서 위 convolution을 하게된다면, 분명 가장자리에 있는 것들은 단 1번 밖에 연산이 되지 못할 것이다. 따라서, 이 부분에 있는 이미지의 특징들이 상대적으로 학습이 덜 될 수 있는 문제가 생긴다. 이를 방지하기 위한 개념이 padding인데, 입력 데이터의 매트리스주변에 0으로 채워진 테두리를 만드는 것이다. 이렇게 하면 출력값의 매트리스의 크기가 유지되면서, 모든 위치에 있는 이미지 데이터의 값을 학습할 수 있다.
Stride
원래 단어의 뜻은 “성큼성큼 걷다"라는 뜻이다. convolution은 한번에 얼마나 많은 행과 열을 skip할지를 말한다. stride가 1인 경우, 행과 열을 1씩 움직이며 연산하고, 2일 경우 행과 열을 2개씩 움직인다. 입력 데이터의 매트리스 사이즈는 정해져 있고, stride에 따라 출력 매트리스의 사이즈가 줄어들 수 있으므로, stride에 따라 출력 매트리스의 크기를 예측할 수 있다.
Filter
위 stride만큼 입력 데이터의 매트리스에서 움직이면서 연산을 하는 주체다. 이 필터에 정의되는 값이 바로 가중치(weight)들이며, 이 것이 입력 매트리스를 움직이며, 각 매트리스 부분의 갑들과 곱해진다. 이 필터를 이용하여 convolution을 하면 가장 디테일한 이미지의 특징을 잡아낼 수 있다. 쉬운 말로 “sliding window(미끄러지는 창)”이라고 부르기도 한다. Convolution을 통해 이미지의 특징이 학습되고 더 작은 차원의 매트리스로 출력된다.
Pooling
stride를 활용한 convolution에서는 차원을 자동으로 축소하기 때문에, pooling이 자동으로 된다고 할 수 있다. Pooling은 연산된 여러 값들에서 특정한 값을 추출하는 방식을 말하는데 Pooling의 종류(최대(max), 최소(min), 평균(mean), 총합(sum) 등)에 따라 출력 매트리스에 기록되는 숫자가 정해진다.
앞으로 할일:
오늘은 그렇게도 많이 들어왔으나 정확히 알지 못했던 Convolution에 대해 확실히 알 수 있었다. 이 Convolution을 이해하는 것이 가장 유용한 딥러닝 신경망 중 하나인 CNN의 90%를 이해하는 것이라고 할 수 있다. 그런 점에서 오늘 배운 것을 정확하게 숙지하는 것은 매우 중요하다고 본다.
앞으로 이어지는 3일 동안의 마지막 딥러닝 과정에서 CNN의 개념이 활용될 것이라고 생각한다. 딥러닝관련 면접을 보게 된다면 이 개념에 대한 질문은 거의 반드시 나오는 만큼, 이를 제대로 알고 넘어가야겠다는 생각이 강하게 들어 오늘 블로그에서는 시간을 좀 더 많이 할애했다.
CNN은 생각보다 그렇게 어렵지 않았다. 오히려 지난주에 배운 Backpropagation을 수식으로 정리하고 제대로 이야기 할 수 있는 것이 더 어려워 보일 정도다. 딥러닝을 계속 배우면서 느끼는 것은 기초가 가장 어렵다는 것이다. 하지만 반대로, 기초적인 개념을 잘 이해하면, 이후의 개념들은 상대적으로 수월해질 수 있다는 뜻도 된다. 딥러닝에서 벌어지는 기본적인 수학적 연산이 원래 복잡하기 때문이다. 그것을 이해한다면, 딥러닝 엔지니어가 되는 것도 그렇게 머나먼 목표 같다는 생각이 들지 않는다.
그러므로, 앞으로도 더 노력해야할 이유와 충분한 현실적 동기 부여가 보이기 시작했다. 좀 더 추진력과 열정을 가지고 임한다면, 나에게도 딥러닝 면접이 그렇게 무섭지는 않을 것 같다는 느낌적인 예감이 든다. 하지만 좀 더 확신과 자신감을 가질 수 있도록 계속 노력하자. 내일도 한 걸음 더 Go!
참조:
(1) Understanding of Convolutional Neural Network (CNN) — Deep Learning
(2) https://mlnotebook.github.io/img/CNN/convExample.png
(3) What is Padding in Machine Learning?
(4) Understanding of Convolutional Neural Network (CNN) — Deep Learning
(5) https://indoml.files.wordpress.com/2018/03/convolution-with-multiple-filters2.png?w=979