Convolutional Neural Networks
해당 글은 Adrew Ng 교수님의 Coursera 에 속한 강의 CNN 과정에서 출처합니다.
Computer Vision 분야에서는 기존에 사용되었던 일반적인 Deep Learning ( 일반적인 Layer 를 깊게 쌓아 올리는 방법)은 Large Scale (HIgh Quality Image) 에 적용하여 classification, recognition, detection 등의 작업을 진행하기엔 잘 동작하지 않는 문제가 발생하였다. 따라서 Convolutional filter 를 도입한 방법을 사용하기 시작하였다.
1. Edge Detection
https://en.wikipedia.org/wiki/Edge_detection#/media/File:%C3%84%C3%A4retuvastuse_n%C3%A4ide.png
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 인 것이다.
https://deepai.org/machine-learning-glossary-and-terms/stride
4. Pooling
풀링의 경우 간단하게는 이미지의 정보를 축약하는 것으로 이해하면 좋을 것 같다.
위의 과정을 보면 Max PooLing 이라는 방법인데, 2 x 2 만큼의 이미지를 stride = 2 로 점프하며 이미지 픽셀 값 중 가장 큰 값을 선택하여 이미지의 크기를 축약한다.
중요한 점은 이런 Pooling filter 의 경우엔 학습해야할 파라미터가 존재하지 않는다는 것이다.
이외에도 Average Pooling 방법이 있다. 설명은 아래의 그림으로 대체하려고 한다.
5. Number of Parameters in one layer (Conv vs Basic NN)
여기서 궁금해지는 점은 왜 Convolutional filter 처리를 하는지이다.
직관적으로 보면 Convolution filter 는 쌓으면 쌓을수록 이미지의 특정 부분을 확대해서 학습하는 경향을 확인할 수 있다.
이로써, 직관적인 이해를 확인하였으니, 또 다른 실질적인 도움에 대한 이해를 돕고자한다.
흔히, 우리는 딥러닝이란 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 개
이와 같이 정말 압도적인 매개변수의 크기 차이가 발생한다. 이런 차이는 우리에게 이미지 인식을 위한 연산과정을 파격적으로 줄여줄 수 있다는 장점을 부여한다.