데이터 분석 일지

[Deep Learning] CNN (Convolutional Neural Network) 본문

Lecture or Textbook Review/Deep Learning

[Deep Learning] CNN (Convolutional Neural Network)

-ˋˏ ♡ ˎˊ- 2024. 2. 27. 21:01

1. Foundation Concept of CNN

 

1. 1. Before Deep Learning

 

딥러닝에 CNN이 적용되기 전에도 convolution filter는 널리 사용되어 왔다. 하지만 traditional machine learning에서의 feature는  hand-crafted feature의 형태로 많이 사용되었다. 딥러닝에서 CNN이 적용되고 나서는, feature를 가장 적절하게 찾아내는 convolution filter를 자동적으로 구축할 수 있는 형태로 사용된다. 

 

1. 2. Convolution Operation

 

convolution의 동작 원리는 아래의 그림과 같다. 입력 데이터에 filter를 맞추어 element-wise multiply를 계산하고, 이를 각 칸에 맞게 출력하는 형식이다. 이 filter를 convolutional kernel이라고 한다. 이 kernel은 weight parameter로 가지고 있는 것이다. 

 

convolutional operation

 

1. 3. CNN with Padding

 

아래의 그림과 같이 input이 kernel을 거쳐 output을 출력하는 과정에서 output의 크기는 줄어든다. 이는 테두리 부분의 입력 데이터에 대해서는 filter를 거치지 않기 때문이다. 따라서 이러한 단점을 보완하기 위하여 입력 테두리에 0으로 가득 찬 pad를 두르는 padding을 사용한다. kernel을 적용할 수 있는 범위가 넓어짐에 따라 output의 크기도 커질 수 있는 것이다. 

 

1. 4. Input & Output Channels

 

만약 컬러 이미지의 경우는 R, G, B의 3가지 input channel이 형성된다. 흑백 이미지의 경우는 input channel이 1이 된다. 또한 kernel의 개수에 따라 output channel의 개수가 결정된다. output channels = kernels인 셈이다. 

 

1. 5. Input & Output Tensors

 

이미지의 tensor의 형태는 (N, C, H, W)의 4차원으로 구성된다. N은 배치 사이즈, C는 channel 사이즈, H는 높이, W는 너비이다. 출력 크기의 계산 방법은 아래와 같다. CNN의 경우, FC Layer와 다르게 출력 사이즈가 입력 사이즈와 커널 사이즈에 따라 달라진다. 

 

CNN 출력 크기 계산 방법

 

위의 수식과 같이 출력 사이즈는 배치 사이즈는 그대로, channel 사이즈는 커널의 channel 사이즈, 높이는 입력의 높이 - 커널의 높이 + 1, 너비는 입력의 너비 - 커널의 너비 + 1의 형식으로 구성되어 있다. 

 

padding을 사용하는 경우의 출력 크기 계산 방법은 아래와 같다. 

 

CNN with padding 출력 크기 계산 방법

 

위의 수식과 같이 출력 사이즈는 배치 사이즈는 그대로, channel 사이즈는 커널의 channel 사이즈, 높이는 입력의 높이 - 커널의 높이 + 1 + 2 × 패딩 사이즈, 너비는 입력의 너비 - 커널의 너비 + 1 + 2 × 패딩 사이즈의 형식으로 구성된다. 따라서 패딩이 1이고, 커널이 (3, 3)으로 구성된다면 출력 사이즈는 입력 사이즈와 같게 된다. 

 

1. 6. Convolution Layer의 장점

 

convolution layer는 feature의 위치에 구애 받지 않는다. 예를 들어 MNIST 데이터셋에서 2를 작성한 손 글씨의 경우, 이 데이터에서 추출되는 특징이 어떤 위치에 있는지 구에 받지 않는다. FC Layer의 경우는 추출되는 특징의 위치에 따라 정보를 다르게 수집하기 때문에 신경 써야 하는 특징이 여러 개가 되는 것이다. 하지만 CNN의 경우 어떤 특징이 얼마나 어떤 강도로 있는지를 중요하게 여기기 때문에 숫자 2가 어떤 위치에 있던지 이를 더 효율적으로 특징을 추출할 수 있다. 

 

또한 같은 입출력을 갖는 FC Layer에 비해 더 적은 weight를 가진다. 예를 들어서 (4, 4)의 입력이 들어가서 (2, 2)를 출력하는 경우를 생각해보자. FC Layer에서는 4^2 × 2^2의 weight를 가진다. 하지만 CNN의 경우 (3, 3)의 커널을 사용하면 되기 때문에 더 적은 weight를 가지고도 출력을 도출해 낼 수 있다. 더 큰 입력과 출력을 가지는 경우를 생각해 보면, 두 신경망이 가지는 weight 수는 더 크게 차이 날 것이다. 

 

마지막으로 병렬 계산 구성이 쉬우므로, GPU에서의 연산이 매우 빠르다. CNN에서는 각 연산끼리 영향을 받지 않는 경우가 생기고 순서 또한 가지고 있지 않기 때문에, 병렬 계산을 빨리 처리하는 GPU를 사용한다면 빠른 연산을 수행할 수 있다. 

 

1. 7. Convolution Layer의 단점

 

CNN은 FC Layer에 비해 입출력의 크기가 계산이 까다로워, 네트워크 구성이 쉽지 않다. 위에서 설명한 것과 같이 CNN은 입력과 커널의 사이즈에 따라 출력 사이즈가 변한다. 따라서 각 입력 별로 적절한 네트워크를 구성하는 것이 쉽지 않게 된다. 

 

1. 8. Application of CNN

 

CNN은 이미지 및 영상 처리 기술을 연구하는 Computer Vision 분야에서 많이 사용된다. 이외에 음성 처리 기술에서도 CNN 기술을 사용한다. 음성 데이터의 경우, 가로축을 frame(시간), 세로축을 frequency bands(주파수의 세기)로 구성하는데 이는 이미지와 매우 흡사하게 적용할 수 있다.

 

또한 텍스트 처리 기술(NLP)에서도 사용될 수 있다. Text Classification의 경우, 문장 데이터를 단어로 나누어 나열하고, 이에 따른 각각의 word embedding vector를 부여한다. 각각의 단어는 배치 사이즈, 단어의 길이, word embedding의 차원 수로 이루어진다. 또한 Machine Translation의 경우에도 CNN을 활용할 수 있다. 

 

Time Series에서도 사용할 수 있다. 예를 들어 주식 그래프의 경우에서는, 증감 모양을 이미지로 인식하여 특징을 추출할 수 있는 것이다. 

 

2. Max-pooling and Stride

 

2. 1. Dimension Reduction

 

지난 블로그에서 dimension redution은 고차원 공간의 sparse한 데이터를 저차원 공간에 mapping하는 것이라고 설명했었다. 하지만 CNN에서는 크기 (3, 3)의 커널과 크기 1의 padding을 사용하는 경우, 입력과 같은 크기의 출력이 출력된다. 이러한 CNN에서 dimension reduction을 수행하도록 하는 것이 Max-pooling과 Stride이다. 

 

2. 2. Max-pooling

 

max-pooling은 convolution operation을 수행 후 출력된 값 속 정해진 영역에서 최댓값을 추출하는 방법이다. (4, 4) 크기의 입력에 크기 1의 padding을 사용하고, (3, 3) 크기의 커널을 거쳐 (4, 4) 크기의 출력이 나왔을 경우를 아래의 그림의 왼쪽 layer로 표현하였다. 이때 (2, 2) 크기의 max-pooling을 사용하면 아래의 그림의 오른쪽 layer가 출력된다. 

 

Max-pooling example

 

위 그림의 오른쪽 layer는 왼쪽 layer를 (2, 2)로 나누었을 때, 각 영역의 최댓값을 추출한 것이다. 이와 같이 dimension reduction을 수행할 수 있게 된다. 이 기법은 DNN에 CNN을 적용하기 시작했을 초기에 많이 사용하던 기법이다. 

 

2. 3. Stride

 

max-pooling 기법은 convolution layer(커널) 이외의 이 기법을 수행하기 위한 추가의 연산을 가지는 것이 특징이다. 하지만 stride의 경우에는 추가적인 연산 없이, 기존의 convolution operation에서 거처야할 연산을 건너뛰어 수행하게 된다. 이에 따라 dimension reduction이 가능하다. 만약 stride 값을 2로 지정하게 된다면 convolution operation을 수행할 때 옆으로나 아래로 항상 2칸씩 건너뛰어 연산하게 된다. 이 기법은 근래에 많이 사용되는 기법이다. 같은 convolution layer 내에서 간단히 동작하기 때문이다. 

 

이 기법을 사용할 경우의 출력 layer의 크기는 아래와 같이 계산한다. 

 

CNN with padding & stride 출력 크기 계산 방법

 

위의 수식과 같이 출력 사이즈는 배치 사이즈는 그대로, channel 사이즈는 커널의 channel 사이즈, 높이는 [{입력의 높이 + 2 × 패딩 사이즈  - (커널의 높이 - 1) - 1} / stride의 높이] + 1에 floor를 적용한 것이고, 너비는 [{입력의 너비 + 2 × 패딩 사이즈  - (커널의 너비 - 1) - 1} / stride의 너비] + 1에 floor를 적용한 것의 형식으로 구성된다. 

 

3. How to Design CNN Architecture

 

위에서 설명한 바와 같이 CNN은 FC Layer에 비해 입출력 크기가 계산이 까다로워, 네트워크 구성이 쉽지 않다. 보통 어떻게 구성하는지 알아보자. 

 

CNN Block을 여러 단계에 거쳐 수행하고, 마지막에 FC Layer를 거친 후, 활성화 함수를 수행하게 된다. 예시를 들어본다면 CNN Block은 아래와 같은 구조를 가질 수 있다. 

  1. 3 × 3 Convolution Layer with padding(= 1)
  2. ReLU
  3. Batch Normalization
  4. 3 × 3 Convolution Layer with padding(= 1) (+ with Stride size (2, 2))
  5. ReLU
  6. Batch Normalization
  7. (+ Max-pooling if no stride)

위와 같은 CNN Block을 해석해보자. 먼저 첫 번째 convolution layer를 거치면 padding이 1이고, 3 × 3의 convolution layer를 거치기 때문에 입력 크기와 똑같은 출력이 나타난다. 다음으로 비선형 활성화 함수를 거치고, batch normalization을 거친다. 이를 하나의 비선형 모듈이라고 할 수 있다. 그다음의 convolution layer에서는 첫 번째와 동일하지만 output channel, 즉 kernel의 크기를 늘려 더 많은 feature를 수집한다. 또한 (2, 2) 크기의 stride가 추가 실행되며, dimension reduction이 수행된다. 만약 이때 stride를 사용하지 않는다면 마지막 단계에서 max-pooling을 거쳐 dimension reduction을 수행할 수 있다. 이와 같이 CNN Block을 구성할 수 있다. 

 

이런 식으로 CNN Block을 사용하게 되면 입력 데이터의 크기를 축소하여 latent vector를 얻을 수 있다. 이에 FC Layer를 거치고 활성화 함수를 거쳐서 하나의 모델을 구성할 수 있다. 

 

이러한 형식의 모델을 MNIST 데이터셋에 적용시키면 아래와 같은 구조를 가진다. 

 

CNN architecture for MNIST