본문 바로가기

Data Science/Deep Learning

[밑바닥부터 시작하는 딥러닝 1] Ch 7. 합성곱 신경망(CNN)

이미지 인식 분야에서 딥러닝을 활용한 기법은 거의 다 합성곱 신경망(CNN)을 기초로 한다.

 

그렇다면 합성곱 신경망. 즉, CNN이란 무엇일까?

 

이번 포스팅에서는 CNN에 대해 정리해보도록 하겠다.

 

CNN의 네트워크 구조를 살펴보면, 지금까지 앞에서 공부한 완전연결 계층인 Affine 계층에 추가적으로 합성곱 계층(Convolutional Layer)풀링 계층(Pooling Layer)이 새롭게 등장한다.

 

CNN으로 이루어진 네트워크의 예시

 

여기서 주목할 점은 출력에 가까운 층에서는 지금까지 공부한 Affine-ReLU 구성을 사용할 수 있다는 것, 그리고 마지막 출력 계층에서는 Affine-Softmax 조합을 그대로 사용한다는 것이다.

 

CNN에서는 패딩(Padding), 스트라이드(Stride) 등 CNN 고유의 용어가 등장하며, 각 계층 사이에는 3차원 데이터같이 입체적인 데이터가 흐른다는 점에서 완전연결 신경망과 다르다.

 

지금까지 본 완전연결 신경망에서는 완전연결 계층(Affine 계층)을 사용했다. 그러나 Affine 계층의 문제점"데이터의 형상(shape)이 무시된다"는 것이다.

 

예시로 이미지 데이터의 경우는 통상 세로 x 가로 x 채널(색상)로 구성된 3차원 데이터인데, Affine 계층에 입력할 때는 이러한 3차원 데이터들은 평평한 1차원 데이터로 평탄화(flatten)해줘야 하기 때문에 형상에 담긴 공간적 정보를 무시하게 된다. (즉, 모든 입력 데이터를 같은 차원의 뉴런으로 취급한다)

 

반면, 합성곱 계층이미지도 3차원 데이터로 입력받으며 다음 계층에도 3차원 데이터로 전달하기 때문에 형상을 유지하게 된다. 이로 인해 CNN에서는 이미지처럼 형상을 가진 데이터를 제대로 이해할 수 있는 것이다.

 

 

 

합성곱 계층에서는 합성곱 연산을 처리하는데, 이는 이미지 처리에서 말하는 필터 연산에 해당한다.

 

합성곱 연산에 대해 설명하기 전에 먼저 "특징 맵(Feature Map)"이라는 것이 무엇을 의미하는지 정리하고 넘어가겠다.

 

  • 특징 맵(Feature Map)
    • 합성곱 계층의 입/출력 데이터를 의미함
    • 입력 데이터 입력 특징 맵(Input Feature Map), 출력 데이터 출력 특징 맵(Output Feature Map)이라고 함

자, 그럼 이제 합성곱 연산에 대해 설명을 해보도록 하겠다.

 

아래 그림과 같이 합성곱 연산은 입력 데이터에 필터를 적용하며, 데이터와 필터의 형상(높이, 너비)로 표기한다.

 

** "필터""커널"이라 부르기도 한다. **

 

합성곱 연산의 예시

 

합성곱 연산은 필터의 윈도우(window)를 일정 간격으로 이동해가며 입력 데이터에 적용한다. 먼저 아래 그림과 같이 입력 데이터와 필터에서 대응하는 원소끼리 곱한 후에 그 총합을 구한다. 그리고 나서 그 결과를 출력의 해당 장소에 저장하는 방식으로 연산이 이루어진다.

 

**여기서 윈도우(window)는 아래 그림에서 회색 부분에 해당된다. **

 

합성곱 연산의 계산 순서 예시

 

CNN에서는 필터의 매개변수가 앞서 공부해 온 "가중치"에 해당한다.

 

또한 CNN에서 편향까지 고려한다면 아래와 같이 합성곱 연산을 수행하게 된다.

 

편향은 항상 하나(1x1)만 존재하며, 그 하나의 값을 필터를 적용한 모든 원소에 더하는 것이다.

 

 

 

합성곱 연산을 수행하기 전에 입력 데이터 주변을 특정 값(일반적으로 "0")으로 채우기도 하는데, 이를 패딩(Padding)이라고 하며 합성곱 연산에서 자주 이용하는 기법이다.

 

패딩(Padding)은 주로 출력 크기(Output Size)를 조정할 목적으로 사용된다.

 

합성곱 연산의 패딩 처리 예시

 

합성곱 연산을 몇 번이나 되풀이하게 되면 출력 크기(Output Size)가 작아지는데, 이로 인해 특정 시점이 되면 출력 크기가 "1"이 되어버려서 합성곱 연산을 적용할 수 없게 된다.

 

반면, 위와 같이 패딩(Padding) 기법을 사용하면 데이터의 공간적 크기를 고정한 채로 다음 계층에 전달할 수가 있다.

 

또한 패딩(Padding)을 크게 하면 출력 크기(Output Size)가 커진다.

 

 

 

다음으로 스트라이드(Stride)에 대해 설명하도록 하겠다.

 

스트라이드(Stride)란 필터를 적용하는 위치의 간격이다. 아래의 그림은 스트라이드가 2인 합성곱 연산의 예시인데, 그림을 보면 알 수 있듯이 윈도우(Window)가 두 칸씩 이동하는 것을 알 수 있다.

 

스트라이드가 2인 합성곱 연산 예시

 

스트라이드(Stride)를 크게 설정하면 출력 크기(Output Size)는 작아진다. 

 

 

 

지금까지 설명한 특징 맵(Feature Map), 필터(Filter = Kernel), 패딩(Padding), 스트라이드(Stride) 사이의 관계를 이용하여, 출력 크기를 수식으로 표현하면 다음과 같다.

 

 

 

 

지금까지 2차원 형상을 다루는 합성곱 연산을 살펴보았다. 그러나 이미지 데이터"세로 * 가로 * 채널" 모두를 고려한 3차원 데이터이다. 때문에 이제 3차원 데이터를 다루는 합성곱 연산에 대해 살펴보도록 하겠다.

 

2차원 데이터와 다르게 3차원 데이터는 채널 수가 "1"이 아니다. 때문에 아래와 같이 입력 데이터와 필터의 합성곱 연산을 채널마다 수행하고, 그 결과를 더해서 하나의 출력을 얻는 식으로 진행된다.

 

** 여기서 주의할 점은 입력 데이터의 채널 수와 필터의 채널 수는 동일해야 한다는 것이다!! **

 

3차원 데이터 합성곱 연산의 예시

 

3차원 데이터의 경우, 앞서 본 2차원 데이터와 달리 직관적으로 이해하기가 조금 어려울 수 있다. 그러나 3차원 데이터의 합성곱 연산 시, 아래와 같이 데이터와 필터를 직육면체 블록이라고 생각하면 이해하기가 조금 수월하다.

 

** 3차원 데이터를 다차원 배열로 나타낼 때(채널, 높이, 너비) 순서로 형상을 쓰도록 하겠다. **

 

각 블록의 형상(shape)에 주의할 것!

 

 

 

위 예시에서 출력 데이터는 한 장의 특징 맵(Feature Map)이다. 그렇다면 만약 합성곱 연산의 출력으로 다수의 채널을 내보내고자 한다면 어떻게 해야 할까? 그럴 때는 아래 그림과 같이 다수의 필터("가중치"를 의미)를 사용하면 된다.

 

다수의 필터를 사용한 합성곱 연산 예시

 

여기에 "편향"까지 고려하고 싶다면 다음과 같이 합성곱 연산을 수행할 수 있겠다.

 

** 편향채널 하나에 값 하나씩으로 구성된다. **

 

편향이 추가된 다수의 필터를 사용한 합성곱 연산 예시

 

이처럼 합성곱 연산에서는 "필터의 수"도 고려를 해주어야 한다. 필터의 가중치 데이터는 4차원 데이터이며, (출력 채널 수, 입력 채널 수, 높이, 너비) 순으로 쓴다.

 

 

 

앞서 공부할 때, 신경망 처리에서는 입력 데이터를 한 덩어리로 묶어서 "배치"로 처리했다.

 

이와 마찬가지로 합성곱 연산도 "배치" 처리를 수행해 줄 수 있다. 이를 위해 다음과 같이 각 계층을 흐르는 데이터의 차원을 하나 늘려서 4차원 데이터로 저장하겠다. 구체적으로는 데이터를 (데이터 수, 채널 수, 높이, 너비) 순으로 저장한다.

 

데이터가 N개일 때, 합성곱 연산의 배치 처리 예시

 

여기서 주의할 점은 신경망에 4차원 데이터가 하나 흐를 때마다, 데이터 N개에 대한 합성곱 연산이 이뤄진다는 것이다.

(즉, N회 분의 처리를 한 번에 수행한다는 뜻이다)

 

 

 

다음으로 풀링(Pooling) 계층에 대해 설명하도록 하겠다.

 

풀링(Pooliing)세로 * 가로 방향의 공간을 줄이는 연산으로, 일종의 subsampling이 주된 목적이라고 할 수 있겠다.

(즉, 이미지의 크기를 축소하는 것이 목표라는 의미이다)

 

풀링 방법으로는 "최대 풀링(Max Pooling)""평균 풀링(Average Pooling)"이 있으나, 이미지 인식 분야에서는 주로 최대 풀링(Max Pooling)을 사용한다.

 

또한 다음과 같이 풀링(Pooling)의 윈도우(Window) 크기스트라이드(Stride)는 같은 값으로 설정하는 것이 일반적이다.

 

Max Pooling과 Average Pooling의 예시

 

풀링 계층의 특징으로는 아래와 같이 3가지를 들 수 있겠다.

 

  • 학습해야 할 매개변수가 없음
  • 채널 수가 변하지 않음 (입력 데이터의 채널 수 그대로 출력 데이터로 내보냄)
  • 입력 데이터의 변화에 영향을 적게 받음 (즉, 강건함 = Robust)

 

 

 

지금까지 정리한 내용들을 토대로, 합성곱 계층과 풀링 계층의 구현에 대해 자세히 살펴보도록 하겠다.

 

먼저 합성곱 계층의 구현에 대해 살펴볼텐데, 합성곱 연산을 구현하기 위해서는 입력 데이터를 필터링(가중치 계산)하기 좋게 전개(flatten)해야 한다. (ex. "3, 4차원 데이터 >> 2차원 데이터"로 변환)

 

 

합성곱 계층의 구현을 3단계로 정리해보면 아래와 같다.

 

  1. 필터(Filter)를 세로로 1열로 전개
  2. im2col이 전개한 입력 데이터와 필터의 행렬 곱을 계산
  3. 출력 데이터의 형상을 변환(reshape)

다음은 풀링 계층의 구현에 대해 살펴보겠다.

 

풀링 계층의 구현도 마찬가지로 입력 데이터를 전개하지만, 풀링 적용 영역을 채널마다 독립적으로 전개한다는 점이 다르다.

 

 

풀링 계층의 구현은 다음과 같이 3단계로 진행된다.

 

  1. 입력 데이터를 전개
  2. 행별 최댓값 계산
  3. 적절한 형상으로 변환(reshape)

 

 

 

여기까지 해서 합성곱 신경망(CNN)에 대한 중요한 내용들은 어느 정도 정리가 된 듯 싶다.

 

CNN을 시각화해보면, 합성곱 계층을 여러 겹 쌓으면 층이 깊어지면서 더 복잡하고 추상화된 정보가 추출된다.

 

즉, 층이 깊어지면서 뉴런이 반응하는 대상이 단순한 모양에서 "고급" 정보로 변화해간다는 뜻이다.

 

 

어떠한가? 놀랍지 않은가? 이런게 바로 딥러닝의 매력인 듯 싶다!!

 

 

 

끝으로 대표적인 CNN 모델인 LeNetAlexNet에 대해 소개하고 이번 포스팅을 마무리하고자 한다.

 

  1. LeNet
    • 손글씨 숫자를 인식하는 네트워크로 1998년에 제안됨
    • 합성곱 계층과 풀링 계층(여기서는 단순한 subsampling 계층. 즉, 최대 풀링 사용 x)을 반복하고, 마지막에 완전연결 계층을 거치면서 결과를 출력
    • 활성화 함수로 Sigmoid 함수를 사용함
  2. AlexNet
    • LeNet과 비교하면 훨씬 최근인 2012년에 발표된 네트워크임
    • 기본적인 구성은 LeNet과 크게 다르지 않으나, 다음과 같은 변화를 주었음
      • 활성화 함수로 ReLU 함수를 사용함
      • Local Response Normalization이라는 국소적 정규화를 실시하는 계층을 이용
      • 드롭아웃(Dropout)을 사용함

LeNet의 구성

 

AlexNet의 구성

 

 

★ 참고 자료

- 밑바닥부터 시작하는 딥러닝 교재