Convolutional Neural Networks (CNNs / ConvNets)

2016. 5. 20. 08:39

http://laonple.blog.me/220654387455

CNN backpropagation : http://www.slideshare.net/kuwajima/cnnbp

Convolutional Neural Networks (CNNs / ConvNets)


컨볼루션 인공 신경망은 일반적인 인공 신경망과 매우 유사하다 : 그들은 학습 가능한 가중치와 바이어스를 갖는 뉴런을 구성한다. 어떤 입력을 수신한 각각의 뉴런은 내적을 수행하고, 선택적으로 비선형(non-linearity)를 따른다.

전체 네트워크는 여전히 하나의 미분가능한 score 함수로 표현된다 : raw 영상의 픽셀로부터 클래스 점수로

그리고, 그것들은 여전히 마지막 레이어에서 loss 함수를 가지고 있으며, 인공 신경망에 학습을 위해 적용되는 모든 팁과 트릭을 가지고 있다.

그럼 무엇이 변화하였을까? ConvNet 구조는 입력된 영상에서 우리가 어떤 속성을 인코딩 할 수 있도록 명시적 가정을 만든다. 이들은 네트워크의 수많은 파라미터의 양을 줄이고, 좀 더 효율적인 구현을 위한 forward function을 만든다.


Architecture Overview


Recall : 일반적인 신경망, 인공 신경망은 입력을 수신하고, hidden 레이어로 변환한다. 각 hidden 레이어는 
모든 뉴런들이 연결된 뉴런을 생성한다. 그리고, 하나의 레이어에 있는 각 뉴런들은 완전히 독립적이며, 어떤 임의의 연결을 공유하지 않는다. 마지막 완전 연결된(fully-connected) 레이어를 출력 레이어라고 부르며, 분류 셋팅에서 이것은 클래스의 스코어로 표현된다.

일반적인 인공 신경망은 전체 영상으로 확장되지 않는다. CIFAR-10에서 이미지들은 오직 32*32*3(w*h*channel)의 크기를 갖고, 일반적인 인공 신경망의 첫번째 히든 레이어에 있는 전체 연결된 하나의 뉴런은 32*32*3 = 3072개의 가중치를 갖는다.

이 가중치의 수는 여전히 다루기 쉽게 보이지만, 이러한 전체 연결된 구조는 좀 더 큰 영상으로 확장되지는 않는다.

예를 들면, 좀 더 큰 영상 200*200*3의 영상은 200*200*3 = 120,000 개의 가중치를 갖는다. 더군다나, 우리는 좀 더 많은 뉴런들을 원할 것이며, 그럴 경우 파라미터의 수는 빠르게 증가할 것이다.


명백하게, 이러한 완전 연결성은 낭비미여, 엄청난 파라미터의 수는 오버피팅으로 이어질 것이다.


3D volumes of neurons

Convolution Neural Network 는 입력이 영상이라는 점을 활용하여 좀 더 합리적인 방식으로 구조를 제한한다.

특히, 일반 인공 신경망과 다르게, ConvNet의 레이어는 3차원 형태로 뉴런을 배치한다. 

예를 들면, CIFAR-10에 있는 입력 영상을 사용할 경우, 볼륨의 차원은 32*32*3이다.

레이어의 뉴런은 전체 연결되는 방법 대신에 레이어의 작은 영역으로만 연결된다.

또한 CIFAR-10에서는 ConvNet의 구조 마지막에서 전체 영상을 클래스 스코어의 single vector 형태로 줄이기 때문에, 최종 출력 레이어는 1*1*10의 차원을 갖는다.





Layers used to build ConvNets


위에서 설명한 바와 같이, 간단한 ConvNet은 레이어의 시퀀스이며, ConvNet의 모든 레이어는 미분가능한 함수를 통해 하나의 활성화 불륨에서 다른 볼륨으로 변환한다.


ConvNet 구조를 만들기 위해서는 3 종류의 레이어를 사용한다.


1. Convolutional Layer

2. Pooling Layer

3. Fully-Connected Layer


ConvNet은 이러한 레이어들을 쌓아 구조를 생성한다.


Example Architecture : 

아래에서 좀 더 자세히 다루겠지만,  CIFAR-10 분류를 위한 간단한 ConvNet은 [Input -> Conv -> ReLU -> Pool - FC] 의 구조를 가질 수 있다.


  • Input [ 32 * 32 * 3]은 영상의 raw 픽셀 값이다. width 32, height 32, RGB

  • CONV 레이어는 Input에서 지역 영역으로 연결된 출력 뉴런을 계산할 것이다.  입력 볼륨에서 가중치와 작은 영역의 내적을 통해. 만약 사용하는 필터의 수가 12개라면, 32*32*12개의 결과를 얻을 것이다.

  • RELU 레이어는 각 엘리먼트마다 활성화 함수를 적용할 것이다. 이 활성화함수는 제로 임계값인 max(0,x)를 사용한다. 하지만 출력 볼륨의 크기 ( 32*32*12)는 변하지 않을 것이다.

  • POOL 레이어는 공간적으로 다운 샘플링을 수행할 것이다. 그것의 결과로는 [16*16*22]가 될 것이다.

  • FC( Fully-connected) 레이어는 클래스의 스코어를 계산할 것이다. 그것의 결과는 [1*1*10]이 될 것이며, 10에 대응하는 것은 각 클래스 별 스코어가 될 것이다. CIFAR-10은 10개의 카테고리를 갖기 때문이며, 보통의 인공 신경망과 같이 이전 볼륨의 모든 뉴런과 연결될 것이다.

이와 같이, ConvNets은 원본 픽셀 값에 의해 원 영상을 클래스 스코어로 변환한다. 어떤 레이어는 파라미터를 포함하며, 어떤 것은 포함하지 않는다. 특히, CONV/FC 레이어는 입력 볼륨의 활성화 기능 뿐만 아니라, 파라미터(가중치와 바이어스)도 변환을 수행한다. 

한편, RELU/POOL 레이어는 고정된 기능을 수행할 것이다. 

CONV/FC 층의 파라미터는 각 영상의 label과 일치하는 클래스 스코어를 갖도록 gradient descent를 통해 학습 될 것이다.



In summary : 


  •  ConvNet 구조는 가장 간단한 케이스의 경우  입력 볼륨을 출력 볼륨으로 변환하는 레이어의 리스트이다.

  • 그것들은 몇 종류의 레이어를 가지고 있다. ( CONV/FC/RELU/POOL)

  • 각 레이어는 3D 볼륨을 받아들이고, 미분 가능한 함수를 통해 3D 볼륨의 출력 형태로 변환한다.

  • 각 레이어는 파라미터를 가질 수도 있고, 아닐 수도 있다. ( CONV/FC 는 파라미터 필요, RELU/POOL은 불필요)

  • 각 레이어는 추가적인 하이퍼파라미터를 가질 수도 있고, 아닐 수도 있다. ( CONV/FC/POOL 필요, RELU 불필요)


위의 그림은 ConvNet의 구조를 모여준다. 초기 볼륨은 raw 영상 픽셀이며, 마지막 볼륨은 클래스 스코어이다.



Convolutional Layer :

Conv 레이어는 컨볼루션 네트워크의 많은 연산량을 갖는 핵심 블록이다.


Overview and intuition without brain stuff.


먼저, 뉴런/뇌의 유추법 없이 Conv 레이어를 계산하는 것에 대해 이야기해보자.


Conv 레이어의 파라미터는 학습 가능한 필터로 구성된다. 모든 필터는 공간적으로 작은 영역이지만, 입력 볼륨의 전체 깊이를 통해 확장된다.


예를 들면,  ConvNet의 첫번째 층에 있는 일반 필터는 5*5*3의 크기를 가질 수 있다. 계산하는 동안, 각 필터는 입력 볼륨의 가로와 세로 사이에 컨볼루션 되고, 어떤 임의의 영역에서 필터와 내적을 계산한다. 

우리는 필터가 영상의 가로와 세로로 이동하면서 필터를 수행함으로써, 2차원 활성화 맵을 생산할 것이다.


직관적으로 네트워크는 첫번째 레이어에서 색상의 얼룩, 에지의 방향과 같은 비주얼 특징 형태가 있을 때 활성화되는 필터를 학습할 것이다.  결국 좀 더 상위 레이어에서는 전체 벌집 또는 휠과 같은 패턴을 학습 할 것이다.


이제, 우리는 각 Conv 레이어에서 전체 필터의 셋을 가질 것이며, 그들 각각은 2차원의 활성화 맵을 생성할 것이다. 우리는 깊이 차원에 따라 활성화 맵을 쌓고, 출력 볼륨을 생성할 것이다.


The brain view.

만약,  당신이 brain/neuron 유추법?의 팬이라면, 3d 출력 볼륨의 모든 entry는 뉴런의 출력으로서 해석될 수 있다.  


Local Connectivity.

이미지와 같은 고차원의 입력을 다룰 때, 위에서 본 것과 같이, 이전 볼륨과 모든 뉴런을 연결하는 것은 비실용적이다.

대신에, 우리는 오직 입력 볼륨의 로컬 영역에 각각 뉴런을 연결할 것이다.  

이 연결의 공간적인 범위는 뉴런의 수용장(Receptive Field)이라고 불리는 하이퍼파라미터이다.


깊이 축을 따라 연결되는 범위는 항상 입력 볼륨의 깊이와 같다.  공간적인 차원(width, height)과 깊이에 대해 다루는 방법에서 비대칭성을 강조하는 것은 중요하다.  : 이러한 연결은 공간에서는 지역적이며, 입력 영상의 깊이에서는 전체 깊이 사이에 항상 전체 연결된다.


Example 1.  입력 볼륨의 사이즈가 [ 32* 32*3]이라고 가정하자. 만약 수용장이 5*5라면, Conv 레이어에서 각 뉴런은 5*5*3의 가중치를 갖는다. 결국 전체 가중치는 5*5*3 = 75 이며, 여기에 1개의 바이어스가 추가된다. 여기서 입력 볼륨의 깊이가 3이기 때문에, 깊이 축의 연결의 범위는 반드시 3이 되어야 한다.


Example 2. 입력 볼륨의 크기를 16*16*20으로 가정하자. 그러면 수용장의 크기를 3*3을 사용한다면, Conv 레이어에서  모든 뉴런은 3*3*20 =180개의 연결을 갖는다. 



Spatial Arrangement

우리는  입력 볼륨에 대해 Conv 레이어에서 각 뉴런의 연결성에 대해 설명하였다. 하지만 아직, 출력 볼륨에서 얼마나 많은 뉴런들이, 어떻게 배치되는지에 대해서는 논의하지 않았다. 세개의 하이퍼파라미터는 출력 볼륨의 크기를 제어한다. (깊이, stride, zero-padding)


1. 먼저, 출력 볼륨의 깊이는 하이퍼파라미터이다. 이것은 우리가 사용하는 필터의 수(입력에서 다른 무엇인가를 찾기 위해 배우는)에 대응된다. 예를 들면, 만약 첫번째, 컨볼루션 레이어가 raw 영상을 입력으로 사용한다면,  깊이에 따른 다른 뉴런들은 컬러의 블럽, 다양한 에지 방향의 존재에 따라 활성화 될 수 있다.  우리는 깊이 컬럼에 따라 입력된 같은 경역에서 찾아진 뉴런의 집합으로 간주할 것이다.


2. 우리는 필터의 컨볼루션 Stride를 정해야 한다. 만약 stride가 1이라면 1픽셀씩 이동하여 컨볼루션을 계산한다. 만약 stride가 2 라면, 2픽셀 씩 이동하여 컨볼루션을 계산한다. 이렇게 할 경우 좀 공간적으로 더 작은 출력 볼륨을 생성할 것이다.


3. 가끔은 입력 볼륨 주위에 패딩하는 것이 편리할 것이다. 제로 패팅의 크기는 하이퍼 파라미터이다. 제로 패딩의 좋은 기능은 출력 볼륨의 크기를 제어할 수 있는 것이다. ( 많은 경우에서, 입력 볼륨과 출력 볼륨의 크기를 같게 유지하기 위해 사용될 것이다.)