DeepLearning

Convolutional Neural Networks

MathematiciantoDatascientist 2021. 12. 23. 00:21

해당 글은 Adrew Ng 교수님의 Coursera 에 속한 강의 CNN 과정에서 출처합니다.

 

Computer Vision 분야에서는 기존에 사용되었던 일반적인 Deep Learning ( 일반적인 Layer 를 깊게 쌓아 올리는 방법)은 Large Scale (HIgh Quality Image) 에 적용하여 classification, recognition, detection 등의 작업을 진행하기엔 잘 동작하지 않는 문제가 발생하였다. 따라서 Convolutional filter 를 도입한 방법을 사용하기 시작하였다.

 

1. Edge Detection

Image detection 을 수행한 경우, Input Image (original image) 와 Edge detection Image 를 보여준다.

https://en.wikipedia.org/wiki/Edge_detection#/media/File:%C3%84%C3%A4retuvastuse_n%C3%A4ide.png

예) Input Image 의 값들이 vertical detect filter 에 적용되면 후에 결과는 vertical detect 값을 주목하여 나타낸다. 이때, 행렬 간 곱셈은 element-wise product 로 진행된다.

2. Padding

앞선 작은 예와 마찬가지로  이미지에 filter 처리를 하게되면 그 이미지의 원본에서 사이즈가 축소되는 경우가 발생할 수 있다. 패딩은 이때, 발생하는 이미지의 축소 과정을 보존할 수도 원하는 특정 크기로 변환하도록 유도할 수 있는 역할을 하게된다.

 

크게 두 가지 방법이 존재한다.

2.1) "Valid padding" : padding 을 사용하지 않는다는 뜻으로 정확하게는 패딩 처리가 되지 않았다고 생각할 수 있다.

이 경우, 패딩을 적용하지 않았으니 원본이미지가 n x n 의 크기를 갖는다고 가정하고 필터가 f x f 의 크기라고 하면 해당 필터 처리가 끝난 결과 이미지는 (n-f+1) x (n-f+1) 의 크기를 갖게된다. (Stride = 1 이라고 가정) 

# Stride 는 직후에 설명할 것.

2.2) "Same padding" : 결과 이미지의 사이즈를 원본 이미지의 크기와 동일하게 산출하기 위한 방법으로 보통의 경우 패딩이 되는 값을 0으로 처리한다.

(n+2p-f+1) x (n+2p-f+1) 의 값이 결과 이미지의 크기로 계산되는 것인데 2p 는 패딩의 경우 사이즈를 1로 설정하더라도 좌우(상하) 동시에 채워지기 때문에 전체 사이즈는 width 와 height 가 2 증가하기 떄문이다.

앞서 말했던 필터 처리 이후 동일한 사이즈를 갖기 위해서는 아래의 수식이 만족되어야 한다.

n+2p-f+1 = n --> p = (f-1) / 2 와 같이 설정된다.

 

3. Stride (Convolution filter moving step size)

 

아래의 그림과 같이 Convolutional filter 가 shift 하면서 연산을 진행하는데 이때, 몇 칸을 움직이며 연산할지를 말하는 것이다.

아래의 그림은 Stride 가 1 인 것이다.

Stride 의 설명으로 Convolutional filter 가 움직이는 크기를 의미한다.

https://deepai.org/machine-learning-glossary-and-terms/stride

 

4. Pooling

 

풀링의 경우 간단하게는 이미지의 정보를 축약하는 것으로 이해하면 좋을 것 같다.

 

Max Pooling : pooling filter 의 크기는 2 x 2 로 사용하고 stride = 2 로 설정

위의 과정을 보면 Max PooLing 이라는 방법인데, 2 x 2 만큼의 이미지를 stride = 2 로 점프하며 이미지 픽셀 값 중 가장 큰 값을 선택하여 이미지의 크기를 축약한다.

중요한 점은 이런 Pooling filter 의 경우엔 학습해야할 파라미터가 존재하지 않는다는 것이다.

 

이외에도 Average Pooling 방법이 있다. 설명은 아래의 그림으로 대체하려고 한다.

 

Average PooLing

 

5. Number of Parameters in one layer (Conv vs Basic NN)

 

여기서 궁금해지는 점은 왜 Convolutional filter 처리를 하는지이다. 

직관적으로 보면 Convolution filter 는 쌓으면 쌓을수록 이미지의 특정 부분을 확대해서 학습하는 경향을 확인할 수 있다.

그림으로 보면 정확히 확인하기 어려울 수 있으나 Convolution filter 가 가지고 있는 정보들은 가령 차를 Input 으로  넣는다면 차의 부분적인 구조를 각 node 에서 학습하고 이후의 Convolutional Layer 에서 해당되는 구조를 더욱 확대하여 학습하는 경향을 볼 수 있다.

이로써, 직관적인 이해를 확인하였으니, 또 다른 실질적인 도움에 대한 이해를 돕고자한다.

 

흔히, 우리는 딥러닝이란 layer 를 깊게 쌓을수록 성능이 좋아질 수 있다고 오해를 하곤한다. 하지만, 결과적으로 그렇지 않다는 것이 밝혀졌다. 이유는 많겠지만 많은 층을 갖는 네트워크는 그만큼 학습하는 동안 Training set 에 과하게 적합되는 경우가 있다. 이러한 과적합 문제와 더불러 현실적인 문제는 계산해야하는 파라미터 수가 기하급수적으로 늘어나는 것이다.

 

여기서 Convolution filter 를 쌓는 방법의 장점이 나올 수 있다. ( 일반적인 Neural Network 와 비교하여 보겠다.)

 

(1) Basic NN 

만약 10 x 10 x 3 (10 x 10 크기의 이미지에 3( R, G, B) ) 와 10개의 노드가 하나의 층을 이루는 가벼운 경우를 가정하자.

그렇다면 여기서 발생하는 학습해야할 parameter 의 숫자는

10 x 10 x 3 x ( 10(number of weight) + 1(number of bias) ) = 3300 개가 발생한다.

(2) Conv NN

Convolution Neural Network 에서 유의미한 점은 Input size 가 parameter 의 숫자에 영향을 주지 않는다는 것이다.

만약 10 x 10 x 3 의 동일한 이미지에 10개의 필터를 적용한다면 ( 3 x 3 filters)

number_of_parameters = (3(filter width) x 3(filter height) x 3(#channels) +1(bias) ) x 10 (number of filters) = 280 개 

 

이와 같이 정말 압도적인 매개변수의 크기 차이가 발생한다. 이런 차이는 우리에게 이미지 인식을 위한 연산과정을 파격적으로 줄여줄 수 있다는 장점을 부여한다.