[ML] 합성곱 신경망(CNN)이란 무엇일까?
포스트
취소

[ML] 합성곱 신경망(CNN)이란 무엇일까?

개요

합성곱 신경망(CNN, Convolution Neural Network) 알고리즘은 이미지의 특징을 추출하여 학습하기 위해 고안된 알고리즘 입니다.

일반적인 이미지는 각 채널별로 이미지 데이터를 가지고있습니다. 예를들어 가로와 세로 픽셀 개수가 600인 RGB채널의 이미지는 각 채널별로 600x600개의 픽셀이 존재합니다.

문제는 기존 다층 퍼셉트론(Multi Layer Perceptron) 학습은 각 피처의 값을 입력값으로 넣어주는, 다시말해 1차원으로 입력 데이터를 넣어주는 방식으로 학습됩니다. 이미지를 MLP 알고리즘으로 학습하려면 1차원으로 만들어서 입력값으로 넣어줘야 합니다. 그렇다보니 3차원의 이미지 데이터의 각 픽셀의 특징, 연관성과 같은 정보는 기존의 방식으로는 제대로 학습할 수 없고, 학습에 필요한 연산도 과도하게 많아지는 문제가 있습니다.

CNN 알고리즘은 이러한 문제를 해결한 알고리즘입니다. 그래서 주로 비전 분야에서 사용됩니다.

원리 및 과정

basic 출처: https://towardsdatascience.com/a-comprehensive-guide-to-convolutional-neural-networks-the-eli5-way-3bd2b1164a53

CNN 알고리즘은 다음과 같은 연산 과정을 거칩니다.

1. 합성곱 층(Convolutional Layer)

이름 그대로 합성곱 연산을 처리하는 레이어 입니다. \(n \times m\) 크기의 이미지가 입력되면 \(i \times j (i \lt n, j \lt m)\) 크기의 필터(filter)를 이용해 합성곱 연산을 수행합니다.

col 합성곱 연산 과정
출처: https://towardsdatascience.com/cnn-part-i-9ec412a14cb1

필터에는 각 칸에 곱할 가중치가 있으며, 오차역전파에 의해 보정되며 학습됩니다.
필터는 한번에 몇 칸을 움직일지 정하는 stride라는 파라미터가 있습니다. stride는 보통 1로 설정됩니다.

합성곱 연산 후 각 픽셀의 정보는 압축되어 출력됩니다.

pad 출처: https://medium.com/machine-learning-algorithms/what-is-padding-in-convolutional-neural-network-c120077469cc

이때 필요에 따라 결과물에 패딩(padding)을 추가할 수 있습니다. 패딩은 이미지가 지나치게 압축되에 정보를 잃는것을 방지합니다. 주로 맨 바깥에 0을 추가하는 방식으로 적용됩니다.

이미지의 가로/세로 크기를 n/m, stride를 s, 필터의 가로/세로 크기를 i/j, 패딩 크기를 p라고 할 떄, 합성곱 연산을 수행한 후 결과물의 크기는 다음과 같습니다.

\[\left ( \frac{n - i + 2p}{s} + 1 \right ) \times \left ( \frac{m - j + 2p}{s} + 1 \right )\]

2. 풀링 층(Pooling Layer)

합성곱 연산을 수행한 후, 특정 기준의 값만 추출하는 레이어입니다. 주로 \(2 \times 2\) 크기로 수행합니다.

pol 출처: https://pub.towardsai.net/introduction-to-pooling-layers-in-cnn-dafe61eabe34

여러가지 풀링 알고리즘이 존재하지만, 대표적인 알고리즘은 최대 풀링(Max Pooling), 평균 풀링(Average Pooling) 입니다.
풀링을 수행한 후 크기는 보통 절반으로 줄어듭니다.


CNN 알고리즘 연산이 완료된 후, 결과물을 1dArray로 펴서(flatten) Fully-Connected Layer를 통해 원하는 값을 출력하게 됩니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

[선형대수] 실벡터 공간

[선형대수] 부분공간