합성곱 신경망 (Convolutional Neural Networks, CNN)

chy0428·2020년 7월 24일
1

DeepLearning

목록 보기
9/12
post-thumbnail

ResNet 논문을 읽다가 CNN(Convolutional Neural Network)에 대해서도 정리해놔야겠다는 생각이 들어서 적는 글!


Background

CNN이 등장한 배경으로는 신경과학적 측면과 학습 이론 측면을 살펴 볼 수 있다.

신경과학적 측면에서 어떤 물체를 인식할 때, 모든 뉴런이 반응하는 것이 아니라 물체의 모양이나 패턴(lines and edges)에 따라 특정한 뉴런이 반응한다는 실험 결과가 있었다.

학습 이론 측면에서 봤을 때, CNN의 합성곱 구조는 하나의 regularization과정이라고 볼 수 있다. 정규화는 머신러닝에서 주로 정답의 복잡도에 패널티를 가해 최적화 문제에 제한을 두는 것을 말하며, label이주어진 데이터에 과적합을 방지하기위해 사용된다. convolution layer는 정해진 크기의 합성곱을 매우 작은 합성곱의 크기로 차원을 축소시킨다.


CNN

CNN은 데이터를 학습하고, 패턴을 이용하여 이미지를 분류해낸다. 전통적인 신경망 앞에 여러 계층의 Convolutional layer를 붙여, input image에 대한 feature를 추출하여 추출된 feature를 기반으로 기존 신경망을 이용하여 이미지 분류를 하게 된다.

대부분의 CNN layer의 input/output은 3-5D 텐서로 이루어진다.

3D: channels, rows, columns
4D: channels, rows, columns + batch
5D: channels, rows, columns + batch + time

CNN은 기본적으로 3차원 구조를 가지며, 아래 그림과 같이 layer들이 여러 개의 feature map으로 구성되어 있다. 각각의 feature map은 뉴런들이 2차원적으로 배열되어 있는 벽이라 생각하면 된다.

개념적으로는 channels과 row, column으로 이루어진 3차원 텐서이지만 현실적으로는 4차원 텐서를 이용한다. 이는 데이터가 많아질수록 계산량이 많아지기 때문에 병렬 처리를 하기 위함이다. sample 데이터를 학습할 때, sample을 1개 주고 학습을 하면 병렬성이 충분하지 않으므로 32, 64, 128개와 같이 여러 개를 한꺼번에 학습한다. (이것을 mini-batch라고 한다.) gpu에 있는 수천개의 코어를 사용하여 속도를 가속화할 수 있다. 따라서 4차원 텐서에서의 batch 축은 미니배치의 크기에 따른 dimension이 된다. (ex. mini-batch: 32, 32 dimension)
5차원 텐서에는 time축이 존재한다. RNN의 경우 시간 축에 따라 값들이 바뀌어 가는데, CNN에서도 RNN의 개념을 도입할 때가 있다. 이를 Recurrent convolutional layers라고 한다. (일반적인 경우는 아니다. )

Composed of heterogeneous layers

  • Convolution (standard, transposed, dilated, separable)
  • Pooling (max, global average, average, ...)
  • Fully-connected
  • Batch/instance/layer/group normalization, dropout

Convolutional layer

Convolutional layer는 input data로부터 feature를 추출하는 역할을 한다.
이미지 데이터는 앞에서 살펴본 것처럼 channel * row * column의 3차원 텐서로 표현될 수 있다. 이미지가 RGB라면 채널의 크기는 3이고, 각각의 채널에는 R,G,B값이 저장되는 것이다. 하나의 컨볼루션 레이어에는 입력된 이미지의 채널 갯수만큼의 filter가 존재하며, 각각의 채널에 할당된 마스크를 적용함으로써 합성곱 출력 이미지가 생성된다. 컨볼루션 레이어는 feature를 추출하는 filter와 filter에서 얻은 값을 비선형으로 바꿔주는 activation 함수로 이루어진다.

좀 더 자세히 보자. 아래는 CNN을 설명할 때 가장 많이 쓰이는 사진이다. image에 filter를 아래와 같이 한칸씩 이동시키면서 (이동하는 간격을 stride라고 하며, 임의로 정할 수 있다.) 이를 통해 이미지의 convolved feature map을 뽑아낸다.


Filter(=mask =kernel)


필터(마스크와 커널도 같은 뜻으로 사용된다)는 어떤 특징이 input image에 있는지 없는지를 검출해준다. 아래 예제를 통해 필터의 개념에 대해 이해해보자.

예제

이미지 출처: https://adeshpande3.github.io/A-Beginner%27s-Guide-To-Understanding-Convolutional-Neural-Networks/

먼저, 아래와 같이 곡선을 검출해주는 필터가 있다고 가정한다.

아래 쥐 그림에서 노란 박스 부분을 잘라내어 필터를 적용하는 과정이다. 잘라낸 이미지와 필터를 곱하면 Multiplication and Summation = (50*30)+(50*30)+(50*30)+(20*30)+(50*30) = 6600으로 큰 값이 나오는 것을 볼 수 있다.

만약 아래 그림처럼 곡선을 검출하는 필터와 비슷하지 않은 부분을 잘라 필터를 적용하여 계산하면 0의 결과가 나옴을 볼 수 있다.

이처럼 필터는 입력 이미지가 필터의 특징을 가지고 있으면 큰 값을 결과로 도출하고, 특징을 가지고 있지 않은 경우 0에 수렴하는 값을 출력하여, 입력 이미지가 해당 특징을 가지고 있는지 없는지를 판단할 수 있다.
여기서 중요한 것은 CNN이 다른 이미지 처리에서 사용한는 필터와 다른 점은, 신경망에서 학습을 통해 자동으로 적합한 필터를 생성해준다는 것이다.


Padding

CNN에서 필터를 적용하면 결과 값이 작아지면서, 처음 이미지에 비해 특징이 유실될 수가 있다. 이는 특징이 충분히 추출되기 이전에 특징이 소실되는 문제가 발생할 수 있으므로 padding 기법을 이용한다.

아래 그림처럼 32x32x3 이미지에 5x5x3필터를 적용시켰을 때 feature map은 28x28x3이 된다. conv layer를 계속해서 적용하면 이미지의 크기가 원하는 것보다 빠르게 줄어든다. 네트워크 초기 계층에서는 저수준 기능을 추출할 수 있도록, 원래의 입력 이미지에서 많은 정보를 유지하려고 하기 때문에 특징이 소실 되는 것을 막아야 한다. 또한 여기서는 출력 feature map을 32x32x3으로 유지하려고 한다고 가정한다. 이를 위해 해당 layer의 크기에 2씩 zero padding을 적용할 수 있다. zero padding을 2로 채우면, 36x36x3 입력 이미지가 된다.

K는 필터 크기, 입력과 출력 이미지는 동일한 차원을 갖는다.

conv layer의 출력 사이즈를 계산하는 공식이다.
O는 height와 length의 아웃풋이며, W는 height와 length의 인풋, K는 필터 사이즈, P는 패딩, S는 stride를 의미한다.

padding은 위와 같이 feature map이 작아지는 것을 막아 특징 손일을 방지하며, 원본 데이터에 0값이 들어가 계산되므로 원래 이미지의 특징을 희석시켜 오버피팅을 방지하기도 한다.


Activation function

conv layer를 통해 추출된 feature map을 activation function에 적용한다. 활성화 함수는 인공신경망에서 입력받은 데이터의 output을 결정하는 역할을 한다. input이 다음 레이어로 전달 될 때, 해당 input이 모델의 예측과 관련이 있는지 없는지를 근거로 삼아 활성화 여부를 결정한다. 활성화 함수에 따라 그 결과를 0, 1 또는 -1, 1의 값으로 normalization하여 모델이 복잡한 데이터를 학습하는데 도움을 준다. 어떤 활성화 함수를 사용하냐에 따라 그 출력 값이 달라지므로, 적절한 활성화 함수를 사용하는 것이 필요하다.
위에서 살펴보았던 필터의 예제에서는 추출값이 각각 6000, 0으로 나타났다. 이 값을 비선형 값으로 바꿔주는 과정을 relu function을 사용한다.

ReLU function(Rectified Linear Unit)는 입력 값이 0을 넘으면 입력 그대로 출력하고, 음수 값이면 0을 출력한다. Relu(x)=max(0,x) Relu는 기울기가 0 또는 1의 값을 가지므로 sigmoid 함수에서 나타났던 vanishing gradinet 문제가 발생하지 않는다. 또한 비선형 함수이므로, layer를 deep하게 쌓을 수 있다는 장점이 있다.

Vanishing gradient problem


Vanishing gradient problem은 뉴럴넷에서 gradient를 이용하여 weight parameter를 업데이트하며 모델을 학습 시킬 때 발생하는 문제이다.


위의 sigmoid function과 tanh function 모두 x가 0일때 기울기가 최대가 된다. 이 때의 미분 값은 sigmoid'(0) = 1/4, tanh'(0) = 1이다. 성능을 올리기 위해서는 deep한 layer를 쌓아야 하는데, 작은 미분 값은 layer를 거칠 때마다 곱하기 연산을 통해 deep할수록 기울기가 손실될 수 있다. 작은 미분 값은 네트워크의 학습속도를 매우 느려지게 하며, global minima가 아닌 local minima에서 loss가 수렴하게 되어 학습이 종료되며, 네트워크의 accuracy가 줄어든다. 또한 backpropagation을 할 경우 layer가 깊어질수록 급격히 기울기 값이 줄어들게 되어 학습이 잘 되지 않는 문제가 발생한다.


Pooling (=sub sampling)

입력 이미지의 크기를 유지한 상태에서 fully conneted layer에 집어넣게 된다면 계산량이 기하급수적으로 커질 것이다. 따라서 입력 이미지의 크기를 적당히 줄여 연산량을 줄이면서도, feature가 잘 강조될 수 있어야 하는데 이 역할을 Pooling layer가 한다. Pooling의 방법에서 max pooling, average pooling, min pooling이 있다. CNN에서는 Max pooling일 때 성능이 좋아 max pooling을 주로 사용한다.

Max pooling은 feature map을 X x Y 크기로 잘라내어, 그 안에서 가장 큰 값들을 뽑아내는 방법이다. 위의 그림은 2x2 max pooling filter를 stride=2로 하여 pooling을 한 그림이다. 각각에서 가장 큰 값인 6, 8, 3, 4를 추출해낸 것을 볼 수 있다.


Fully connected layer

앞서 설명했던 conv filter + relu + pooling을 반복하여 특징을 추출해낸다. feature extraction 과정에서 특징이 추출되었으면, 이 특징 값을 기존 신경망에 넣어 classification 과정을 거친다.


Dropout layer


Dropout은 오버피팅을 방지하기 위한 방법 중 하나로 인공신경망이 학습중일때 특정 노드들을 p의 확률로 사용하는 방법이다. dropout을 적용하면 적용하지 않았을 때보다 각 node들의 결과값이 1/p배만큼 증가한다.


dropout으로 인해 성능이 좋아진 것을 확인할 수 있다.


Softmax function


Softmax 함수도 activation function의 일종이다. softmax를 사용하는 이유는 결과를 확률값으로 해석하기 위함이다. 위 그림에서 input data가 hidden layer를 거쳐 softmax를 사용해 입력된 데이터를 y1, y2, y3으로 분류한다. 여기서, x 입력이 어떤 출력이 될 확률을 계산하는 것이 softmax가 하는 역할이다. y1, y2, y3이 나올 확률의 합은 1이고, 하나의 레이블의 확률이 올라가면 상대적으로 다른 레이블의 확률이 내려가게 된다. 따라서 Normalization의 효과를 볼 수 있다.


Reference

https://hunkim.github.io/ml/
https://youtu.be/UY9vvd7DNCs
https://untitledtblog.tistory.com/150
https://pod3275.github.io/paper/2019/05/31/Dropout.html

profile
Computer Science Student 👩🏻‍💻🍒🍑

0개의 댓글