통계, IT, AI

딥러닝: 화풍을 모방하기 (11) - 책요약: 6. CNN 본문

머신러닝

딥러닝: 화풍을 모방하기 (11) - 책요약: 6. CNN

Harold_Finch 2017. 11. 30. 21:50

1. 개요

    CNN(Convoluional Neural Network; 합성곱 신경망)은 특히 이미지 인식 분야에서 자주 사용되는 신경망이다.[각주:1] 지금까지 본 신경망(이하 완전연결 신경망)과 다른 점은 그림 <1.1>[각주:2]과 같이 합성곱층(Convolution Layer)와 풀링층(Pooling Layer)이 추가되었다는 점이다.

<그림 1.1 CNN의 구조>

2. 합성곱 계층 Convolution Layer

2.1. 개요

    완전연결 신경망이 가진 가장 큰 문제점은 데이터의 형상이 무시된다는 것이다. 예를 들어 MNIST와 같은 이미지 데이터에서는 픽셀들이 서로 밀접한 관련을 갖고 있다. 가령 1이라는 이미지는 아래 또는 위 방향으로 비슷한 픽셀 값을 가질 확률이 높다. 게다가 컬러 이미지는 채널까지 포함하여 3차원 데이터이지만 완전연결 신경망에서는 이러한 구조가 무시된다. 하지만 합성곱 계층에서는 데이터의 형상을 유지한다. 이미지도 3차원 데이터로 입력받고 3차원 데이터로 출력한다. 그래서 CNN은 형상을 가진 데이터를 좀 더 잘 이해할 가능성이 있다.

2.2 합성곱 연산

    합성곱 계층에서는 입력받은 데이터에 필터 또는 커널에 대한 합성곱 연산을 수행한다. 필터의 각 원소와 필터가 위치한 데이터의 원소를 각각 곱한 후 모두 더하여 결과를 얻고 이를 일정한 간격으로 이동하며 다른 결과를 얻는다. 그림 <2.2.1>[각주:3]는 (4, 4) 크기의 입력데이터와 (3, 3) 크기의 필터에 대한 합성곱 연산(*)의 예시이다.


<그림 2.2.1 간단한 합성곱 연산>


    필터의 채널 수는 입력 데이터의 채널 수와 같아야 한다. 필터의 크기에 특별한 제한은 없지만 모든 채널의 필터는 같은 크기여야 한다. 입력 데이터가 여러 채널을 갖는 경우에도 연산은 위 그림과 크게 다르지 않다. 채널별로 합성곱 연산을 한 후 모두 더하면 되기 때문이다. 따라서 1개 필터에 대한 합성곱 연산의 결과는 그림 <2.2.2>[각주:4]와 같이 항상 1개 채널만 갖는다.


<그림 2.2.2 1개 필터에 대한 합성곱 연산>


    만약 출력 결과를 다수의 채널로 만들고자 한다면 그림 <2.2.3>[각주:5]과 같이 필터의 개수를 늘리면 된다.


<그림 2.2.3 여러개 필터에 대한 합성곱 연산>


    합성곱 연산의 최종 결과는 그림 <2.2.4>[각주:6]와 같이 완전연결 신경망처럼 편향(bias)을 더하여 얻는다. 이때 편향은 채널당 한가지 값을 갖는다.

<그림 2.2.4 합성곱층의 최종 결과>


    합성곱 연산은 어떤 작용을 하는 것일까? 답은 입력된 이미지로부터 필터의 명암 패턴과 유사한 명암패턴을 찾는다는 것이다. 즉, 필터가 나타내는 특징적인 명암구조를 이미지로부터 추출하는 과정이다. 그림 <2.2.5>[각주:7]를 보자.

<2.2.5 필터의 역할>


    위 그림에서는 입력 이미지에 두가지 필터를 합성곱하였다. 첫번째 필터는 우상향의 두꺼운 선 모양의 명암이다. 그 결과, 입력 이미지에서 유사한 구조를 갖는 부분, 이를테면 모자의 챙 부분에 강한 반응이 있는 것을 알 수 있다. 두 번째 필터는 우하향의 선이 반복되는 구조이다. 그 결과 모자의 오른쪽처럼 첫 번째 필터와는 다른 부분이 강한 반응을 보인다. 이와 같이 필터는 이미지에서 강조하고자 하는 패턴을 나타내는 파라미터이다. CNN의 합성곱층에서는 이 필터가 파라미터 즉, 학습 대상이다. 신경망이 입력 이미지에서 어떤 패턴을 "볼" 지 학습을 통하여 결정하도록 하는 것이다.

2.3. 패딩

    합성곱 연산을 수행하기 전, 입력 데이터 주변을 특정 값으로 채우기도 한다. 예를 들어 <그림 2.3.1>은 (4, 4)의 크기를 갖는 입력 데이터에 폭 1짜리 패딩을 적용한 후 합성곱 연산을 수행한 결과이다. <그림 2.3.1>[각주:8]에서 입력 데이터 주변의 점선이 패딩으로 값은 0으로 지정하였다.

<그림 2.3.1 패딩을 적용한 합성곱 연산>


    패딩은 주로 출력 크기를 조정할 목적으로 사용한다. 예를 들어 (4, 4)의 크기를 갖는 입력 데이터에 (3, 3)의 필터를 적용하면 출력이 (2, 2)가 되어 입력 데이터보다 사이즈가 작아진다. 하지만 패딩 1을 적용하면 입력과 출력의 사이즈를 같게 할 수 있다. 이때 패딩의 폭과 값은 특별히 정해진 값이 없다. 패딩 값에는 보통 0을 주는 경우가 많지만 이 처리로 인하여 출력 이미지 주변부가 어둡게 되는 부작용도 있다. 이를 막기 위하여 패딩 값을 임의의 값 또는 이미지 픽셀 값의 평균으로 하는 방법 등이 있지만 완벽한 방법은 없다.

2.4. 스트라이드

    필터를 적용하는 위치의 간격을 스트라이드라고 한다. 지금까지 본 예는 스트라이드가 1이었지만 스트라이드를 2로 설정하면 필터의 윈도우가 두 칸씩 이동하게 된다. 입력 크기를 \((H, W)\), 필터 크기를 \((FH, FW)\), 패딩을 \(P\) 그리고 스트라이드를 \(S\)라고 할 때, 출력 크기\((OH, OW)\)는 다음과 같다. 단, \(\left \lfloor x \right \rfloor\)는 \(x\)의 정수를 취하는 연산이다.


$$OH=\left \lfloor \frac{H+2P-FH}{S} \right \rfloor+1, \quad  OW=\left \lfloor \frac{W+2P-FW}{S} \right \rfloor+1$$

2.5. 구현

    합성곱 연산은 간단한 사칙연산이지만 수행해야 할 반복 작업의 수가 많다. 반복문을 중첩하면 간단하게 구현할 수 있지만 수행시간이 무척 오래 걸린다. 다른 좋은 방법은 입력 데이터와 필터에 적절한 변형을 가해 합성곱 연산을 매트릭스의 곱으로 변환하는 것이다. 그림<2.5.1>는 그 과정을 보이고 있다. \(a^{c}_{h,w}\)는 \(c\)번째 채널, \(h\)번째 행, \(w\)번째 열의 입력 데이터를 나타낸다. \(f^{n,c}_{h,w}\)는 \(n\)번째 필터, \(c\)번째 채널, \(h\)번째 행, \(w\)번째 열의 필터를 나타낸다. \(o^{c}_{h,w}\)는 \(c\)번째 채널, \(h\)번째 행, \(w\)번째 열의 결과를 나타낸다. 각 입력 데이터, 필터, 결과에서 \(c=2\)인 채널은 점선으로 나타냈다. 붉은색 계열은 첫번째 필터, 푸른색 계열은 두번째 필터에 대한 합성곱 연산이다.

<그림 2.5.1 합성곱 연산과 매트릭스 곱의 관계>


    입력 이미지에서 합성곱 연산의 대상이 되는 부분을 가로로, 필터를 세로로 쌓으면 합성곱 연산과 정확하게 같은 것을 확인할 수 있다. 비록 입력 이미지와 필터를 매트릭스로 만들고 결과를 변환하는 등 추가 작업이 필요하지만 결과적으로 매트릭스 곱을 이용하는 것이 훨씬 더 빠르다. 많은 라이브러리에서 매트릭스 연산을 최적화해 두었기 때문이다. 이때 입력 이미지를 매트릭스로 변환하는 작업을 im2col이라고 하자.

3. 풀링 계층 Pooling Layer

3.1. 개요

    풀링은 가로, 세로 방향의 공간을 줄이는 연산이다. 그림<3.1.1>은 (4, 4)의 데이터에 (2, 2)의 윈도우를 적용한 최대 풀링Max Pooling의 예이다.

<그림 3.1.1 최대 풀링>


    풀링 계층의 스트라이드는 윈도우의 값과 같게 하는 것이 보통이며 최대 풀링 이외에도 평균 등의 집계 함수를 사용할 수 있다. 이미지 인식 분야에서는 보통 최대 풀링을 사용한다.


    풀링 계층은 학습해야 할 파라미터가 없고 데이터의 채널은 유지한다는 특징이 있다. 또한 입력 데이터의 변화의 영향을 적게 받는다. 입력 데이터의 값이 약간 변해도 집계 함수의 결과에 큰 영향을 주기는 어렵기 때문이다.

3.2. 구현

    합성곱 계층에서 살펴본 im2col을 응용하면 풀링 계층을 쉽게 구현할 수 있다. 먼저 im2col을 사용하여 이미지를 매트릭스로 변환한 후, 채널을 세로로 쌓는다. 그리고 행별로 최대값 등의 집계 함수를 적용한 뒤 적당하게 이미지 형식으로 변환하면 된다. 풀링 계층에는 학습시킬 파라미터가 없으므로 집계 함수의 결과가 된 원소에만 기울기를 전파시키면 된다.

4. Flatten Layer

    합성곱 계층이나 풀링 계층의 결과는 채널을 포함한 다차원 데이터이다. 이를 완전연결 신경망이나 softmax 등의 함수로 연결시키기 위해선 적절한 변형이 필요한데 이것을 Flatten Layer에서 처리한다. Flatten Layer에서는 아무런 연산을 하지 않고 입력 데이터를 2차원 데이터로 변경하는 작업만 진행한다. 이 계층을 따로 명시하지 않고 합성곱 계층이나 풀링 계층에서 처리할 수도 있다.




  1. 이전 포스팅까지는 <딥러닝 제대로 시작하기>의 내용을 기반으로 구현하고 포스팅하였다. 하지만 CNN부터는 그것이 쉽지 않아 <밑바닥부터 시작하는 딥러닝>을 참조하였다. [본문으로]
  2. 출처: http://www.wildml.com/2015/11/understanding-convolutional-neural-networks-for-nlp/ [본문으로]
  3. 밑바닥부터 시작하는 딥러닝 그림7-3을 동적으로 구성함. [본문으로]
  4. 출처: 밑바닥부터 시작하는 딥러닝 그림 7-10 [본문으로]
  5. 출처: 밑바닥부터 시작하는 딥러닝 그림 7-11 [본문으로]
  6. 출처: 밑바닥부터 시작하는 딥러닝 그림 7-12 [본문으로]
  7. 출처: 딥러닝 제대로 시작하기 그림 6-4를 재구성함 [본문으로]
  8. 출처: 밑바닥부터 시작하는 딥러닝 그림 7-6 [본문으로]
Comments