Search
🤖

[DL] CNN이란?

1. 개요

CNN은 Convolutional Neural Network를 줄인 말이며, 주로 컴퓨터 비전과 이미지 처리 작업에 사용되는 인공 신경망이다.
대부분의 AI 입문자들이 쉽게 접하는 모델이 바로 CNN이며, 나도 첫 AI 프로젝트로 마스크 착용 여부를 탐지하는 프로젝트를 진행했을 때, 이 CNN 모델을 사용했던 기억이 난다.
CNN은 이미지의 특징을 자동으로 추출하고 인식하는 데 탁월한 성능을 발휘하며, 주로 이미지 분류, 객체 검출, 얼굴 인식 등의 작업에서 널리 활용된다.

2. 왜 등장하게 되었나?

CNN이 등장하기 전에는 MLP만으로 이미지를 입력받았다. 하지만 이런식으로 이미지를 받는다면 각 뉴런에 입력되는 데이터의 위치를 반영할 수 없게 된다. 감이 안오니 그림으로 간단히 설명해보자면, 아래와 같이 강아지 사진을 모델에 입력시킨다고 해보자.
MLP의 노드에 입력되는 벡터는 아래와 같이 일렬로 쭉 늘여서 표현될 수 있다.
입력되는 벡터는 인간의 사고방식이 사뭇 다르다는 생각이 든다. 가령, 강아지 귀 끝에서 귀 아래로 이어져 머리까지 확인해야 강아지임을 알텐데, 이렇게 쭉 이어버리면 뭐가 뭔지 보이질 않는다. 이렇게 각 픽셀을 한줄로 이어버리면 공간 정보를 잊어버리게 되어 문제가 많다는 생각을 할 수 있다.

정확히 어떤 문제가 있을까?

1.
지역적 패턴을 파악하기 어렵다 : 위 예시와 같이 MLP는 이미지의 공간적인 구조나 패턴을 제대로 이해하기 어렵다. 앞서 설명한 것과 같이 이미지에는 주변 픽셀 간의 연관성이나 지역적 패턴을 파악하는 것이 중요한데, MLP는 이러한 정보를 무시하고 한줄의 벡터로 쭉 줄세워 전달하기에 지역적 패턴을 파악하기 어려워진다.
2.
Parameter가 너무 많아진다 : MLP는 FC layer로 구성되어 있어 모든 input 노드와 output 노드 간에 연결이 된다. 그렇기 때문에 이미지의 각 픽셀마다 weight가 필요하게된다. 이런식으로 parameter가 매우 많아지면 모델의 크기가 매우 커져 메모리 소모가 커질 뿐만 아니라 Overfitting이 발생할 수도 있다.
3.
Robustness가 부족하다 : 앞선 Overfitting과 이어지는 내용일 수 있다. 모델이 위 강아지 이미지를 학습했다고 생각해보자. 예측을 원하는 강아지 이미지가 시계방향으로 90도 틀어져서 input되었다면, 각 픽셀의 픽셀강도가 매우 변하게 된다.
위 예시와 같이 왼쪽과 오른쪽의 각 픽셀마다 색상(픽셀 강도)을 비교해보면 대부분 픽셀 색상이 변했다는 것을 알 수 있다. 따라서 모델은 학습된 이미지와 큰 차이가 있다고 판단하여 강아지로 예측하는데 실패할 것이다.

3. CNN은 뭐가 다른가?

제일 중요한 건 2가지, Convolution Layer, Pooling Layer이다. 이 두가지 Layer를 거쳐 이미지의 특징을 추출해내고, 그 특징들을 FC Layer를 거쳐 여러가지 Task들에 활용 가능한 Classifier의 역할을 수행한다.
1.
Convolutional Layer : 이미지에서 작은 부분 영역을 추출하고 이를 통해 이미지의 특징을 감지하는 역할을 한다. 커널(필터)을 사용하여 이미지를 스캔하며, 각 영역과 커널 사이의 합성곱을 계산하여 새로운 Feature map을 생성한다.
2.
Pooling Layer : Feature map의 크기를 줄이고 계산 부담을 줄이기 위해 사용된다. 일반적으로 max pooling이나 average pooling이 적용되는데, Task에 따라 어떤 것을 사용될지가 결정된다. 특징의 중요한 정보를 보존하면서 해상도를 낮추는 역할을 한다. Subsampling이라고도 한다.
3.
Fully Connected Layer : 추출된 특징들을 기반으로 최종 결과를 계산하는데 사용한다.
위 그림과 같이 이미지가 input되면 이미지의 부분 부분을 돌면서 Conv Layer로 특징을 추출하고, Pooling Layer를 거쳐 압축하고 하는 과정을 계속 반복한다.
그리고 마지막 Pooling Layer 이후에는 추상화된 핵심 특징들만 남는 것을 기대할 수 있다. 이러한 핵심 특징들을 한줄로 쭉 피는 flattening을 한 뒤, FC Layer를 거치면서 Classifier의 역할을 수행할 수 있도록 한다.
이 때, 특징을 추출할 때 얼만큼의 지역적 공간을 보고 추출할지 결정하는 필터 사이즈를 정할 수 있으며, 지역적 공간을 쭉 훑을 때, 몇 칸씩 이동하며 확인할지(stride)도 정할 수 있다.

4. 그래서 얻는 이점은?

1.
지역적 패턴 학습 : 이미지는 픽셀 간에 공간적인 구조를 가지고 있어 지역적인 패턴을 학습해야한다. MLP와 달리 CNN은 이러한 공간적 구조를 이해하고 활용할 수 있다. Convolution Layer는 이미지의 작은 부분들을 캡처하여 패턴을 감지하고, 이를 통해 이미지의 각 위치별 특징을 학습할 수 있다. Conv - Pooling - Conv - Pooling을 반복해서 거치면, 특징에서 특징을 찾는 과정을 거치게 되는 것이므로, 더 세부적인 이미지의 특징을 찾아낼 수 있게 된다.
2.
파라미터 공유 : CNN은 각각의 필터(커널)를 사용하여 이미지의 다양한 부분에서 특징을 추출한다. 이러한 필터들은 이미지의 이곳저곳을 돌며 하나의 feature map을 추출하는 역할을 하며, 이를 통해 parameter의 개수를 효율적으로 하여 모델의 크기를 줄일 수 있다.
3.
모델의 Robustness : CNN은 이미지 내에서 특징을 인식할 때 위치에 상관없이 패턴을 감지할 수 있다. Pooling Layer를 통해 특징을 압축하기 때문에 이미지 내에서 물체의 이동이나 변형에 덜 민감하게 된다.

4. 정리

CNN은 기존 MLP에 비해 노드의 연결을 지역적으로만 제한을 두고 학습을 하므로 기존 MLP구조에 비해 메모리 소비도 적고, 더 높은 성능을 기대할 수 있다.
현재까지도 많은 최신 기술들의 기반 모델이 되기도 하여 인공지능에 관심이 있다면, 꼭 알아야할 모델 중 하나라고 생각한다.

5. Reference

아래 글을 참고하여 작성했습니다.