본문 바로가기

Study doc./Deep Learning

[cs231n] Convolutional Neural Network (CNN)

순서

  1. Neural Network (NN)
  2. Convolutional Neural Network (CNN)
    1. 동작원리
    2. convolution layer
    3. activation function
    4. pooling layer
    5. fully connected layer
    6. 정리

 


 

1. Neural Network (NN)

지금까지 가중치(W)가 한 개인 함수를 다뤘습니다.

가중치가 한 개인 모델은 이미지의 분류 기준 특성이 적을 수 밖에 없고,

따라서 빨간 자동차만을 자동차로 인식하게 되는 한계가 있습니다.

 

이를 극복하기 위해 색깔 뿐만 아니라 더 다양하고 복잡한 특성을 고려해야 하는데요,

가중치(W)를 여러개 사용함으로써 이 문제를 해결할 수 있었습니다.

input(이미지, x)에 첫 가중치(W1)를 곱한 값이 다시 input이 되고, 그 input에 두 번째 가중치(W2)를 곱하는 방식으로 말이죠!!

 

하지만 이렇게 단순하게 계속 겹치는 방식은 여러 개의 선형함수를 겹치는 것과 동일하기 때문에 결과적으로는 하나의 선형함수식과 같아지게 됩니다.

즉 식이 복잡해졌을뿐 여전히 빨간 자동차만을 자동차로 인식합니다.

따라서 input과 W1을 곱한 후 활성화 함수를 적용함으로써 해당 문제를 해결했고, 

각 가중치(W) 마다 업그레이된(복잡한) 특성을 고려할 수 있게 되었습니다.

 

이렇게 선형 함수와 활성화 함수를 이용하여 input을 업그레이드 시키는, 즉 층(layer)을 쌓는 모델을 Neural Network 라고 합니다.

 

Neural Network Computational graph 예시

 

 

2. Convolutional Neural Network (CNN)

2-1. 동작원리

convoluntional neural network는 합성곱(convolution)을 이용한 neural network입니다.

이미지보다 작은 사이즈의 필터(filter)가 일반 NN에서의 가중치(W) 역할을 수행하고, 필터는 슬라이딩을 하며 순차적으로 모든 값에 가중치를 곱하는데, 자세한 내용은 CNN의 구성요소가 되는 층(layer)들을 소개할때 설명하겠습니다.

 

지금 중요한 것은 "CNN도 NN의 연장선이기 때문에 활성화 함수를 이용해서 input을 업그레이드 시키겠구나" 라는 직관을 가지시는 것입니다.

이 직관을 가지고 아래 예시를 바라보면 NN 동작원리의 큰 틀에서 벗어나지 않았음을 이해할 수 있습니다.

그럼 이제 각 layer의 역할은 무엇이고, 어떤 원리로 작동되는지 살펴보겠습니다.

 

기본 동작 원리 예시

 

2-2. convolution layer

 

convolution layer

 

 

지난 장에서 이미지에 가중치(W)를 곱하기 위해 이미지를 하나의 열로 펼친다고 배웠습니다. 

하지만 CNN에서는 score를 구하기 직전인 fully connected layer를 제외하고는 input의 형태를 보존합니다.

 

그렇다면 convolution layer에서는 W를 어떻게 곱할까요?

도입부에서 말씀드렸듯 CNN에서는 filter가 W의 역할을 하기 때문에 filter를 이용합니다.

이때 필터의 사이즈는 보통 3*3, 5*5, 7*7 형태이며, 깊이는 input의 깊이와 같이 설정합니다.

 

 

이렇게 생성된 작은 filter를 image 모든 값에 어떻게 적용시키느냐?

바로 아래 사진과 같이 좌측 상단에서부터 우측으로 이동하며 합성곱을 통해 하나의 값을 반환합니다.

 

우측으로 모두 이동하면 아래로 한 칸 이동한 좌측에서부터 우측으로 다시 이동하고, 

같은 과정으로 우측 하단에 도달할때까지 반복합니다.

초록색 부분 : filter

결국 5*5*1 사이즈의 값이 나오겠죠? 그것을 activation map이라고 합니다.

여기서 activation map의 값은 "이미지 중 어느 위치에서 해당 필터가 크게 반응하는지" 라는 직관을 가지면 좋을것 같습니다.

 

하나의 필터당 하나의 activation map이 생성되는데,

아래 예시에서는 32*32*3 사이즈의 이미지에 5*5*3 사이즈의 필터 6개 적용시켜 6개의 activation map을 얻었습니다.

결국 28*28*6의 새로운 input값을 가지게 되었습니다(upgrade).

 

 

아직 활성화 함수에 대해서 배우지 않았지만, 활성화 함수의 경우에는 사이즈를 변화시키지 않기 때문에

다음 예시를 통해 filter의 사이즈와 갯수에 따른 결과값의 변화를 정리할 수 있습니다.

 

 

이렇게 convolution layer를 지남에 따라 input 값과 크기가 변하게 되는데,

그냥 단순히 변하는 것이 아니라 더 복잡한, 더 높은 level의 특성을 고려한 input으로 업그레이드 되고 있습니다.

 

첫 번째 layer를 거친 값은 각 필터들의 합성곱을 통해 나온 값이므로 간단한 특성이 모두 고려된 값입니다.

예를 들어 이미지의 어떤 부분에 가장자리(edge)가 있는지 처럼 이미지의 가장 낮은 level의 특성들이 고려되었습니다.

 

두 번째 layer에서는 input이 가장자리의 위치를 알기 때문에 filter를 이용해서 더 높은 level의 특성을 고려하게 됩니다.

예를 들어 이미지에서 코너(corner)가 어디에 있는지가 됩니다.

 

 


 

지금까지 convolution layer의 동작 원리를 살펴봤습니다. 

이제 좀 더 나아가서 두 가지 문제에 대해 더 배워보겠습니다.

 

1) filter가 두 칸씩 이동할 수는 없을까?

이전 예시에서 필터는 한 칸씩 이동했습니다. 

혹시 두 칸씩 이동할 수는 없을까요?

이렇게 말이죠!!

두 칸씩 이동 예씨

당연히 가능합니다!!

몇 칸씩 이동할지를 결정하는 매개변수가 stride이고, 이렇게 함으로써 다운 샘플링의 효과도 볼 수 있습니다.

stride가 1이었던 예시의 경우에는 output 크기가 5*5 였는데, stride가 2인 예시에서는 output의 크기가 3*3 입니다. 

 

그렇다면 stride가 3인 것도 가능할까요?

위의 예시에서는 마지막 한 열이 남기때문에 불가능 합니다.

 

즉 input의 모든 값이 filter의 영향을 동일하게 받아야 한다는 말인데요,

아래의 output size 공식 결과값이 정수로 나와야 사용 가능하다는 말과 동일합니다.

 

일반적으로 3*3 필터에서는 stride를 1로 주고, 5*5에서는 2 그리고 7*7에서는 3을 준다고 합니다.

필터의 개수는 보통 2의 제곱수만큼 사용한다고 하니 참고하시면 좋을것 같습니다 :)

 

 

2) input의 가장자리는 영향을 적게 받는게 아닐까?

filter를 순차적으로 적용하는데, 그렇게 되면 input의 가장자리 값들은 상대적으로 적은 영향을 받게 될 것입니다.

따라서 가장자리를 임의의 값으로 둘러싸는 방법을 고안했는데요, 이를 padding이라 합니다.

일반적으로 0으로 둘러싸는 zero-padding을 많이 사용합니다.

 

padding은 모든 값에 동일한 영향을 보장할 뿐만 아니라, input의 사이즈를 유지하는 역할도 합니다.

원래 convolution layer를 통과하면 input의 사이즈가 줄어들었는데, 수많은 layer로 구성되어있다면 input이 남아나지 않습니다. 

 

결국 input의 사이즈를 유지시켜주기 위해 padding을 사용하기도 하고,

따라서 filter size에 따라 둘러싸는 두께도 달라집니다.

 

 

2-3. activation function

 

activation function

 

activation function(활성화 함수)을 사용하는 이유는 NN의 동작원리에서 설명드렸습니다.

만약 선형함수로 계속해서 층을 쌓게 되면 결국 하나의 선형함수와 같아지기 때문에 결과적으로 층을 쌓는 의미가 없기 때문인데요, 따라서 활성화 함수는 값들을 비선형으로 만들기 위해 사용됩니다.

다음은 주로 사용되는 활성화 함수 입니다.

 

 

 

2-4. pooling layer

 

pooling layer

 

pooling layer의 존재 목적은 다운 샘플링 입니다.

깊이(depth)에는 변화를 주지 않고, 사이즈를 줄이는 것을 목표로 하는데요,

input의 크기가 너무 커서 연산에 사용되는 파라미터 수가 많기 때문에 사용됩니다.

 

 

일반적으로 그룹에서 최댓값을 이용하는 max poolilng을 사용합니다.

어디에서 큰 값에 반응했는지 보다 얼마나 큰 값으로 반응했는지가 사용자에게 더 중요하기 때문입니다.

 

보통은 겹치지 않게 pooling 하는것이 일반적이고, 보통 2*2 사이즈로 stride=2 로 합니다.

 

 

 

2-5. fully connected layer

 

fully connected layer

 

fully connected layer에서는 input으로 들어온 3차원 행렬을 1차원 벡터로 펼쳐 가중치(W)를 곱해 score를 냅니다.

CNN의 마지막 단계에 있으며, score를 내기 위한 과정이라고 생각하면 됩니다.

 

 

 

2-6. 정리

지금까지의 과정을 정리해보겠습니다.

이미지를 받으면 convolution layer의 input으로 들어옵니다.

여기서 사용자가 정의한 설정대로 filter가 슬라이딩 하며 가중치를 곱해 activation map을 생성하고, 

activation function을 거쳐 업그레이드 된 새로운 input으로 거듭나게 됩니다.

 

두번째 convolution layer를 거치며 새로운 activation map을 생성하는데, 

여기서는 첫번째 convolution layer보다 더 구체화된 특성을 다룹니다.

예를 들어 처음에는 이미지의 스케치를 완성했고, 지금은 이미지의 특징을 잡아내는 과정이라고 이해하면 됩니다.

층이 많을 수록 더욱 구체적이고 정확한 분류를 할 수 있겠죠?  

 

종종 pooling layer를 지나면서 너무 큰 사진에 대해 다운 샘플링을 진행합니다.

마지막으로 fully connected layer를 통해 각 클래스별 score 값을 도출해내고, 

이를 통해 최종적으로 이미지를 학습/판단하게 됩니다.