본문 바로가기

AI/cs231n

[강의정리] Lecture 5: Convolutional Neural Networks

-강의 영상

 

- Introduction

강의 도입부에서는 CNN의 발전과정과 역사를 소개하고 간단한 application을 예로 들어준다. 해당 부분은 생략하며, 자세한 내용이 궁금할 경우 강의자료와 영상을 참고하면 된다.

 

 

 

- Convolutional Neural Networks

앞선 강의들에서는 image를 처리할 때 32*32*3 크기의 input 이미지를 stretch 하여 3072*1로 변환하고 내적 연산을 수행했다. 이러한 연산을 Fully connected 연산이라 하는데, 이번 강의에서는 Convolution 연산을 수행하는 Convolution Layer에 대해서 소개한다. 해당 연산이 가지는 FC와의 차이점은 입력 차원의 구조를 그대로 보존시킨다는 것이다. 위를 보면 5*5*3 크기의 filter가 있다. 이러한 filter가 가중치 역할을 수행한다. filter를 input image에 슬라이딩하면서 공간적으로 내적을 수행하는데, 이를 convolution 연산이라 한다. fliter의 depth는 input image와 같게 확장하는데, 필터의 특정 위치에서 하나의 값이 나올것이고 그 값들이 모인 결과가 출력이 된다. 위의 그림에서는 filter가 1칸씩 움직인 경우이고 그 값들이 모여 28*28개의 값이 나왔다. 이러한 출력값을 우리는 activation map이라고 한다. filter의 갯수만큼 activation map의 갯수가 늘어날 것이고 즉, output map의 depth가 늘어날 것이다.

 

 

우리가 말하는 CNN(convolutional neural network)는 이러한 filter를 사용하는 해당 layer들의 연속적인 형태라고 할 수 있다. 위 그림에서의 ReLU는 앞선 강의에서의 Linear한 NN과 마찬가지로 activation function을 사용한 출력이다. 이렇게 전단계 layer의 출력이 입력으로 들어가는 계층적 구조이며, 추가적으로 pooling layer가 들어가기도 한다.(뒤에서 설명)

 

 

해당 슬라이드는 앞쪽 filter부터 계층적인 구조를 시각화한 모습이다. 이러한 CNN 구조의 특징은 앞쪽 Layer일 수록 Low-level의 feature를 활성화하고 뒤쪽으로 갈수록 High-level의 feature를 활성화한다. 여기서 Low-level은 edge와 같은 단순한 feature일 것이고, high-level로 갈수록 개체와 가까운 feature일 것이다. (즉, Layer의 계층에 따라 단순한 것부터 복잡한 특징까지 존재한다.) 해당 그림의 각 grid는 하나의 filter이며 시각화 된 모습은 filter가 그림과 같이 시각화된 모습일 때, 뉴런의 활성이 최대화가 된다는 것을 보여준다. 위의 그림에서 알 수 있듯이 layer의 깊이가 깊어질수록 복잡한 feature를 찾고있다는 것을 알 수 있다.

 

 

 

- Convolution 연산

Convolution layer에서 수행하는 convolution 연산에 대해 자세히 알아보자. 위 그림의 7*7 크기의 큰 박스가 input 이미지이고 3*3 크기의 녹색 박스가 filter이다. 앞서 설명한 내적 연산은 녹색 박스의 값들과 해당 위치의 input 값들의 내적연산을 수행한다. 해당 연산은 filter를 좌상단 부터 슬라이딩 하는데, 이 때 움직이는 칸수를 stride라고 한다. stride는 하이퍼파라미터이며, 위 경우에는 옆으로 5칸, 아래로 5칸 씩 이동하여 총 5*5 크기의 activation map이 출력될 것이다.

 

stride가 2인경우는 그림과 같이 2칸씩 이동을 한다. 이 경우에는 옆으로 3칸, 아래로 3칸씩 이동하여 총 3*3 크기의 activation map이 출력될 것이다.

 

 

N : 이미지의 크기, F : filter의 크기

위의 연산 과정에서 살펴봐서 알 수 있듯이, stride크기는 출력 map의 크기에 영향을 준다. stride 뿐 만 아니라 input 이미지의 크기와 filter의 크기 또한 출력 크기에 영향을 줄 것이다. 이러한 값들에 대한 output size를 계산하는 공식은 위와 같다. stride 3의 경우와 같이 output size가 실수인 경우는 사용하지 않는다.

 

 

 

경우에 따라, 가장자리의 값들도 필터연산에 적용하고 싶거나, 출력크기를 down sampling하고 싶지 않은 경우가 생길 수 있다. 위의 슬라이드는 이러한 경우 사용하는 padding 기법에 대해 설명한다. 단순하게 input 가장자리에 값들을 채워주는 것이다. 일반적으로 그 값은 0으로 채워주며 해당 기법을 zero padding 기법이라한다. 해당 기법을 사용하면 input 이미지의 크기가 크기 때문에 출력 map의 크기를 보존할 수 있다.

 

 

다음은 Convolution Layer에 대해 요약한 정보이다. filter 개수 K는 일반적으로 2의 제곱승으로 설정한다고 한다. 

 

 

 

- Pooling layer

CNN을 구성하는 layer 중 Convolution layer 이외에 Pooling layer를 사용하는 경우도 있다. pooling layer의 pooling 연산은 activation map을 downsampling하는 역할을 하며, 파라미터의 수를 줄이는 역할을 한다. downsampling을 할 때에는 W,H의 크기를 줄여주는 반면에 depth에는 영향을 주지 않는다는 특징이 있다.

 

 

 pooling 연산의 과정을 살펴보자. pooling 연산 역시 convolution 연산과 동일하게 filter를 사용한다. 위의 그림은 색깔별로 filter의 위치를 나타낸 것이며, 2*2 크기의 filter와 stride 2를 사용하여 연산을 수행하였다. pooling 연산 중 하나인 max pooling은 filter를 슬라이딩 하면서 해당 filter 크기의 영역에 있는 값중 가장 큰 값을 출력한다. 위의 그림에서는 빨간색 영역에는 6, 초록색 영역은 8, 노란색은 3, 파란색은 4의 값이 가장 큰값이므로 출력 또한 위처럼 나오는 것을 확인할 수 있다.

 pooling 연산은 convolution 연산과 다르게 filter가 겹치지 않도록 하는것이 일반적이다. 그래서 stride와 filter 크기를 적절하게 설정해줘야 한다. 또한 max pooling 말고도 filter영역의 값들의 평균을 출력하는 average pooling 연산도 있다. 하지만 일반적으로 max pooling을 많이 사용한다.

 

 

Fooling layer의 output 크기를 공식화 하면 위와같이 (W-F)/stride+1로 나타내어지며 Fooling 연산은 downsampling하는 것이 목적이기 때문에 padding 기법을 고려하지 않는다. 위의 빨간색으로 표시된 common setting의 F와 S는 일반적으로 사용되어지는 filter size와 stride를 나타낸다. 

 

 

해당 슬라이드는 일반적으로 사용하는 CNN 구조를 나타낸다. 우리가 그동안 살펴봤던 Convolution layer와 pooling layer가 CNN을 구성하고 있음을 알 수 있다. RELU는 앞선 강의의 Linear NN의 activation function과 같은 역할을 수행한다. 위의 각 그림이 나타내는 것은 해당 layer의 출력 activation map이다. 마지막 POOL을 지나면 3차원 출력을 stretch하여 1차원 vector로 만들어 주는데, 앞선 강의에서 배웠던 FC를 이용하여 공간적인 구조를 고려하지 않고 마지막에는 하나로 통합하여 최종 추론을 수행하는 것을 알 수 있다.

 

- Lecture additional information

1. filter의 크기를 receptive field라고 하며, 한 뉴런이 한번에 수용할 수 있는 영역을 의미한다.

2. stride가 커질수록 down sampling 효과를 주는데, 이는 최근에 pooling보다 성능이 더 좋다고 알려져있다.

 

 

출처 : Stanford University School of Engineering, http://cs231n.stanford.edu/