본문 바로가기
지능형시스템/머신러닝

[머신 러닝/딥 러닝] 합성곱 신경망 (Convolutional Neural Network, CNN)과 학습 알고리즘

by CHML 2019. 2. 6.
1. 이미지 처리와 필터링 기법

필터링은 이미지 처리 분야에서 광범위하게 이용되고 있는 기법으로써, 이미지에서 테두리 부분을 추출하거나 이미지를 흐릿하게 만드는 등의 기능을 수행하기 위해 이용된다. 필터링은 행렬의 형태로 표현된 이미지에 대해 행렬로 표현된 필터를 동일하게 적용함으로써 수행된다. 일반적으로 행렬로 표현된 필터링된 이미지의 $i$번째 행, $j$번째 열의 픽셀인 $G_{ij}$는 다음과 같이 원본 이미지 $X$와 필터 $F$의 합성곱 (convolution)으로 계산된다:

$$G_{ij} = (F*X)(i,j) = \sum_{m=0}^{F_H - 1} \sum_{n=0}^{F_W - 1} F_{m,n} X_{(i-m),(j-n)}. \tag{1}$$

위의 식 (1)에서 $F_H$와 $F_W$는 각각 필터의 높이 (행의 수)와 너비 (열의 수)이다. 그림 1은 다양한 종류의 필터와 각 필터의 기능을 보여준다.


그림 1. 필터의 종류와 기능 (출처: 위키피디아).


2. 합성곱 신경망 (Convolutional Neural Network, CNN)

CNN은 필터링 기법을 인공신경망에 적용함으로써 이미지를 더욱 효과적으로 처리하기 위해 (LeCun et al., 1989)에서 처음 소개되었으며, 이후에 (LeCun et al., 1998)에서 현재 딥 러닝에서 이용되고 있는 형태의 CNN이 제안되었다. 기존의 필터링 기법은 그림 1과 같이 고정된 필터를 이용하여 이미지를 처리했다. CNN의 기본 개념은 "행렬로 표현된 필터의 각 요소가 데이터 처리에 적합하도록 자동으로 학습되게 하자"는 것이다. 예를 들어, 이미지를 분류 알고리즘을 개발하고자 할 때 우리는 필터링 기법을 이용하여 분류 정확도 향상시킬 수 있을 것이다. 그러나 한 가지 문제점은 사람의 직관이나 반복적인 실험을 통해 알고리즘에 이용될 필터를 결정해야 한다는 것이다. 이러한 상황에서 CNN을 이용한다면, 알고리즘은 이미지 분류 정확도를 최대화하는 필터를 자동으로 학습할 수 있다.


2.1. CNN의 구조

일반적인 인공신경망은 그림 2와 같이 affine으로 명시된 fully-connected 연산과 ReLU와 같은 비선형 활성 함수 (nonlinear activation function)의 합성으로 정의된 계층을 여러 층 쌓은 구조이다.


그림 2. 일반적인 인공신경망의 구조.


CNN은 그림 3과 같이 합성곱 계층 (convolutional layer)과 풀링 계층 (pooling layer)이라고 하는 새로운 층을 fully-connected 계층 이전에 추가함으로써 원본 이미지에 필터링 기법을 적용한 뒤에 필터링된 이미에 대해 분류 연산이 수행되도록 구성된다.


그림 3. CNN의 구조.


합성곱 계층은 이미지에 필터링 기법이 적용하고, 풀링 계층은 이미지의 국소적인 부분들을 하나의 대표적인 스칼라 값으로 변환함으로써 이미지의 크기를 줄이는 등의 다양한 기능들을 수행한다.


2.2. 합성곱 계층 (Convolutional Layer)

이미지 데이터는 그림 4와 같이 높이X너비X채널의 3차원 텐서 (tensor)로 표현될 수 있다. 만약, 이미지의 색상이 RGB 코드로 표현되었다면, 채널의 크기는 3이 되며 각각의 채널에는 R, G, B 값이 저장된다.


그림 4. 컬러 이미지 데이터에 대한 텐서 표현.


하나의 합성곱 계층에는 입력되는 이미지의 채널 개수만큼 필터가 존재하며, 각 채널에 할당된 필터를 적용함으로써 합성곱 계층의 출력 이미지가 생성된다. 예를 들어, 높이X너비X채널이 4X4X1인 텐서 형태의 입력 이미지에 대해 3X3 크기의 필터를 적용하는 합성곱 계층에서는 그림 5와 같이 이미지와 필터에 대한 합성곱 연산을 통해 2X2X1 텐서 형태의 이미지가 생성된다.


그림 5. 하나의 채널에 대한 합성곱 계층의 동작.


그림 5의 예시에서는 bias를 더하는 것이 생략되었는데, 실제 구현에서는 합성곱을 통해 생성된 행렬 형태의 이미지에 bias라는 스칼라값을 동일하게 더하도록 구현되기도 한다.

이미지에 대해 필터를 적용할 때는 필터의 이동량을 의미하는 스트라이드 (stride)를 설정해야한다. 그림 6은 동일한 입력 이미지와 필터에 대해 스트라이드 값에 따른 출력 이미지의 변화를 보여준다.


그림 6. 스트라이드가 1로 설정된 경우 (좌)와 2로 설정된 경우 (우).


CNN을 구현할 때 합성곱 계층의 스트라이드는 주로 1로 설정되며, 그림 5의 예제 또한 스트라이드가 1로 설정된 것을 확인할 수 있다.

그림 5에서 볼 수 있듯이 입력 이미지에 대해 합성곱을 수행하면, 출력 이미지의 크기는 입력 이미지의 크기보다 작아지게 된다. 그러므로 합성곱 계층을 거치면서 이미지의 크기는 점점 작아지게 되고, 이미지의 가장자리에 위치한 픽셀들의 정보는 점점 사라지게 된다. 이러한 문제점을 해결하기 위해 이용되는 것이 패딩 (padding)이다. 패딩은 그림 7과 같이 입력 이미지의 가장자리에 특정 값으로 설정된 픽셀들을 추가함으로써 입력 이미지와 출력 이미지의 크기를 같거나 비슷하게 만드는 역할을 수행한다. 그림 7의 예시처럼 이미지의 가장자리에 0의 값을 갖는 픽셀을 추가하는 것을 zero-padding이라고 하며, CNN에서는 주로 이러한 zero-padding이 이용된다.


그림 7. 패딩이 적용되지 않은 합성곱 연산 (좌)과 zero-padding이 적용된 합성곱 연산 (우).


2.3. 풀링 계층 (Pooling Layer)

CNN에서 합성곱 계층과 ReLU와 같은 비선형 활성 함수를 거쳐서 생성된 이미지는 풀링 계층에 입력된다. 풀링 계층은 주로 max-pooling을 기반으로 구현된다. 아래의 그림 8은 스트라이드가 2로 설정된 max-pooling 기반 풀링 계층의 동작을 보여준다.


그림 8. Max-pooling 기반 풀링 계층의 동작.


그림 8의 예시에서는 2X2 크기의 국소 영역마다 max-pooling을 적용했으며, 일반적으로 풀링 계층의 스트라이드는 국소 영역의 높이 또는 너비의 크기와 동일하게 설정된다.

이미지 데이터의 특징은 인접 픽셀들 간의 유사도가 매우 높다는 것이다. 따라서 이미지는 픽셀 수준이 아니라, 특정 속성을 갖는 국소 영역 수준으로 표현될 수 있으며, 풀링 계층은 이미지 데이터의 이러한 특징을 바탕으로 설계되었다. Max-pooling의 경우에는 국소 영역에서 가장 큰 값을 해당 영역의 대표값으로 설정하는 것과 같다. CNN에서는 이러한 풀링 계층을 이용함으로써 아래와 같은 다양한 이점들을 얻을 수 있다.


  • 국소 영역 내부에서는 픽셀들이 이동 및 회전 등에 의해 위치가 변경되더라도 출력값을 동일하다. 따라서, 풀링 계층을 이용할 경우, 이미지를 구성하는 요소들의 이동 및 회전 등에 의해 CNN의 출력값이 영향을 받는 문제를 완화할 수 있다.

  • CNN이 처리해야하는 이미지의 크기가 크게 줄어들기 때문에 인공신경망의 model parameter 또한 크게 감소한다. 따라서, 풀링 계층을 이용함으로써 CNN의 학습 시간을 크게 절약할 수 있으며, 오버피팅 (overfitting) 문제 또한 어느정도 완화할 수 있다.


2.4. Fully-connected neural networks (FNNs)의 문제점과 CNN

이미지를 처리할 때 발생하는 FNN의 첫 번째 문제점은 인접 픽셀 간의 상관관계가 무시된다는 것이다. FNN은 벡터 형태로 표현된 데이터를 입력 받기 때문에 그림 9와 같이 이미지를 반드시 벡터화해야한다.


그림 9. FNN을 이용하여 이미지를 처리하기 위한 이미지 벡터화.


그러나 이미지 데이터에서는 일반적으로 인접 픽셀간의 매우 높은 상관관계가 존재하기 때문에 이미지를 벡터화 (vectorization)하는 과정에서 막대한 정보 손실이 발생한다. 반면에 CNN은 이미지의 형태를 보존하도록 행렬 형태의 데이터를 입력 받기 때문에 이미지를 벡터화하는 과정에서 발생하는 정보 손실을 방지할 수 있다. 이러한 이유로 이미지를 다루는 문제에 대해서는 대부분 CNN이 이용되고 있다.

두 번째 FNN의 문제점은 막대한 양의 model parameter이다. 만약 FNN을 이용하여 1024X1024 크기의 컬러 이미지를 처리하고자 한다면, FNN에 입력되는 벡터의 차원은 약 315만 ($=1024^2 \times 3$)이라는 막대한 수가 된다. 300만 차원의 입력을 처리하기 위해서는 필연적으로 막대한 양의 뉴런이 필요하고, 이에 따라 인공신경망 전체의 model parameter는 기하급수적으로 증가한다. 그러나 CNN을 이용한다면 단순히 필터들을 모수화 (parameterization)할 수 있을 정도의 model parameter만 필요하며, CNN의 마지막 fully-connected layer는 원본 이미지가 아닌 풀링 계층을 통해 축소된 이미지를 처리하기 때문에 fully-connected layer의 가중치 또한 크게 줄어든다. CNN은 기존 FNN보다 매우 적은 model parameter를 갖는다는 점 때문에 이미지뿐만 아니라 다양한 고차원 데이터에 대해서도 광범위하게 활용되고 있다.


3. 역전파 (Backpropagation) 알고리즘을 이용한 CNN 학습

기존의 인공신경망처럼 CNN 또한 주로 역전파 알고리즘을 이용하여 학습시킨다. 이 글에서는 기존 인공신경망을 위한 역전파 알고리즘을 알고 있다는 가정 하에 CNN에 대한 역전파 알고리즘을 설명한다. 이해를 돕기 위해 이 글에서 스트라이드는 1로 설정되었다고 가정한다.

스트라이드가 1로 설정되었다고 가정할 경우, CNN의 $l$번째 합성곱 계층의 출력 이미지 $\textbf{X}^{(l)}$의 $k$번째 채널에 대한 $i$번째 행, $j$번째 열의 요소는 다음과 같이 계산된다:

$$\textbf{X}_{k,i,j}^{(l)} = \sum_{m=0}^{F_H^{(l)}-1}\sum_{n=0}^{F_W^{(l)}-1} \textbf{W}_{k,m,n}^{(l)} f\left(\textbf{X}_{k,(i+m),(j+n)}^{(l-1)} \right) + b_{k}^{(l)} \tag{2}.$$

위의 식 (2)에서 $\textbf{W}_{k}^{(l)}$은 $l$번째 합성곱 계층의 $k$번째 필터, $F_H^{(l)}$과 $F_W^{(l)}$은 각각 $l$번째 합성곱 계층 필터의 높이와 너비를 의미하고, $f$는 ReLU와 같은 비선형 활성 함수이다.

식 (2)에서 정의된 합성곱 연산에서는 식 (1)에서 합성곱 연산을 정의한 것과 다르게 행렬로 표현된 이미지를 $m$과 $n$만큼 증가된 방향으로 읽어가는 것을 볼 수 있다. 즉, 합성곱 연산 시에 $(i, j)$에 $(m, n)$을 빼는 것이 아니라 $(m, n)$을 더해가면서 필터를 적용한다. 이는 엄밀히 말하면 합성곱이 아니라 상호 상관 (cross-correlation)이다. 그러나 합성곱과 상호 상관은 적용되는 필터를 회전시켜 적용한다는 점에서만 차이가 있을 뿐이기 때문에 필터 자체를 학습하는 CNN에서는 합성곱과 상호 상관을 구분하지 않는다.

일반적인 인공신경망에 대해 역전파 알고리즘 기반의 경사하강법 (gradient descent method)을 이용한 학습에서 인공신경망의 가중치 $\textbf{W}$는 아래와 같이 계산된다:
$$\textbf{W} = \textbf{W} - \eta \frac{\partial L}{\partial \textbf{W}}. \tag{3}$$
이 식에서 $L$은 손실 함수 (loss function), $\eta$는 학습률 (learning rate)이다. CNN에서는 일반적인 인공신경망의 가중치가 합성곱 계층의 필터에 해당하기 때문에 CNN을 학습시킨다는 것은 필터들의 각 요소를 학습하는 것과 같다. 이를 위해 CNN의 $l$번째 합성곱 계층에서 $k$번째 필터의 $i, j$번째 요소인 $\textbf{W}_{k,i,j}^{(l)}$에 대해 손실 함수 $L$을 편미분하면 다음과 같다:

$$\begin{align*} \frac{\partial L}{\partial \textbf{W}_{k,i,j}^{(l)}} &= \sum_{m=0}^{\textbf{X}_H^{(l-1)} - F_H^{(l)}} \sum_{n=0}^{\textbf{X}_W^{(l-1)} - F_W^{(l)}} \frac{\partial L}{\partial \textbf{X}_{k,m,n}^{(l)}} \frac{\partial \textbf{X}_{k,m,n}^{(l)}}{\partial \textbf{W}_{k,i,j}^{(l)}}\\&=\sum_{m=0}^{\textbf{X}_H^{(l-1)} - F_H^{(l)}} \sum_{n=0}^{\textbf{X}_W^{(l-1)} - F_W^{(l)}} \delta_{k,m,n}^{(l)} \frac{\partial \textbf{X}_{k,m,n}^{(l)}}{\partial \textbf{W}_{k,i,j}^{(l)}}. \tag{4} \end{align*}$$

위의 식 (4)에서 $\textbf{X}_H^{(l-1)}$과 $\textbf{X}_{W}^{(l-1)}$은 각각 $l-1$번째 합성곱 계층에서 출력된 이미지의 높이와 너비를 의미한다. 먼저, 식 (4)를 계산하기 위해 $\partial \textbf{X}_{k,m,n}^{(l)} / \partial \textbf{W}_{k,i,j}^{(l)}$을 다음과 같이 계산한다:

$$\begin{align*} \frac{\partial \textbf{X}_{k,m,n}^{(l)}}{\partial \textbf{W}_{k,i,j}^{(l)}} &= \frac{\partial}{\partial \textbf{W}_{k,i,j}^{(l)}} \left\{\sum_{p=0}^{F_H^{(l)} - 1} \sum_{q=0}^{F_W^{(l)} - 1} \textbf{W}_{k,p,q}^{(l)} f \left(\textbf{X}_{k,(m+p),(n+q)}^{(l-1)}\right) + b_k^{(l)} \right\}. \tag{5} \end{align*}$$

미분 과정에서 $\textbf{W}_{k,i,j}^{(l)}$과 독립적인 항은 모두 0이 될 것이기 때문에 식 (5)에서 $p = i$ 그리고 $q = i$인 항만 고려하여 식을 쓰면 다음과 같다:

$$\frac{\partial \textbf{X}_{k,m,n}^{(l)}}{\partial \textbf{W}_{k,i,j}^{(l)}} = \frac{\partial}{\partial \textbf{W}_{k,i,j}^{(l)}} \left\{ \textbf{W}_{k,i,j}^{(l)} f \left(\textbf{X}_{k,(i+m),(j+n)}^{(l-1)}\right) \right\}. \tag{6}$$

따라서, $\partial \textbf{X}_{k,m,n}^{(l)} / \partial \textbf{W}_{k,i,j}^{(l)}$은 아래의 식 (7)과 같이 계산된다:

$$\frac{\partial \textbf{X}_{k,m,n}^{(l)}}{\partial \textbf{W}_{k,i,j}^{(l)}} = f \left(\textbf{X}_{k,(i+m),(j+n)}^{(l-1)}\right). \tag{7}$$

그 다음, $\delta_{k,m,n}^{(l)} = \partial L / \partial \textbf{X}_{k,m,n}^{(l)}$은 다음과 같이 계산된다:

$$\begin{align*} \delta_{k,m,n}^{(l)} &= \frac{\partial L}{\partial \textbf{X}_{k,m,n}^{(l)}}\\&= \sum_{p=0}^{F_H^{(l+1)} - 1} \sum_{q = 0}^{F_W^{(l+1)}-1} \frac{\partial L}{\partial \textbf{X}_{k,(m-p),(n-q)}^{(l+1)}} \frac{\partial \textbf{X}_{k,(m-p),(n-q)}^{(l+1)}}{\partial \textbf{X}_{k,m,n}^{(l)}}\\&= \sum_{p=0}^{F_H^{(l+1)} - 1} \sum_{q = 0}^{F_W^{(l+1)}-1} \delta_{k,(m-p),(n-q)}^{(l+1)}\frac{\partial \textbf{X}_{k,(m-p),(n-q)}^{(l+1)}}{\partial \textbf{X}_{k,m,n}^{(l)}}. \tag{8} \end{align*}$$

식 (8)에서 $\partial \textbf{X}_{k,(m-p),(n-q)}^{(l+1)}/\partial \textbf{X}_{k,m,n}^{(l)}$은 다음과 같이 계산된다:

$$\begin{align*} \frac{\partial \textbf{X}_{k,(m-p),(n-q)}^{(l+1)}}{\partial \textbf{X}_{k,m,n}^{(l)}} &= \frac{\partial}{\partial \textbf{X}_{k,m,n}^{(l)}} \left\{\sum_{r=0}^{F_H^{(l+1)} - 1} \sum_{s=0}^{F_W^{(l+1)}-1} \textbf{W}_{k,r,s}^{(l+1)} f\left(\textbf{X}_{k,(m-p+r),(n-q+s)}^{(l)}\right)\right\}. \tag{9} \end{align*}$$

미분 과정에서 $\textbf{X}_{k,m,n}^{(l)}$과 독립적인 항은 모두 0이 되기 때문에 식 (9)에서 $m-p+r = m\;\;(r=p)$과 $n-q+s = n\;\;(s=q)$인 항만을 고려하여 식을 쓰면 다음과 같다:

$$\frac{\partial \textbf{X}_{k,(m-p),(n-q)}^{(l+1)}}{\partial \textbf{X}_{k,m,n}^{(l)}} = \frac{\partial}{\partial \textbf{X}_{k,m,n}^{(l)}} \left\{ \textbf{W}_{k,p,q}^{(l+1)} f\left(\textbf{X}_{k,m,n}^{(l)}\right) \right\}. \tag{10}$$

따라서, $\partial \textbf{X}_{k,(m-p),(n-q)}^{(l+1)}/\partial \textbf{X}_{k,m,n}^{(l)}$은 다음과 같이 계산된다:

$$\frac{\partial \textbf{X}_{k,(m-p),(n-q)}^{(l+1)}}{\partial \textbf{X}_{k,m,n}^{(l)}} = \textbf{W}_{k,p,q}^{(l+1)} f^{'}\left(\textbf{X}_{k,m,n}^{(l)} \right). \tag{11}$$

최종적으로, $\delta_{k,m,n}^{(l)}$은 다음과 같다:

$$\delta_{k,m,n}^{(l)} = \sum_{p=0}^{F_H^{(l+1)} - 1} \sum_{q = 0}^{F_W^{(l+1)}-1} \delta_{k,(m-p),(n-q)}^{(l+1)}\textbf{W}_{k,p,q}^{(l+1)} f^{'}\left(\textbf{X}_{k,m,n}^{(l)} \right). \tag{12}$$

식 (7)과 (12)의 결과를 식 (4)에 대입하면 $\textbf{W}_{k,i,j}^{(l)}$에 대한 $L$의 구배 (gradient)를 계산할 수 있으며, 이를 이용하여 식 (3)과 같이 $\textbf{W}_{k,i,j}^{(l)}$를 update한다. Bias를 의미하는 $b_k^{(l)}$ 또한 $\textbf{W}_{k,i,j}^{(l)}$과 비슷한 방식으로 update한다.