UFLDL Tutorial 14. Supervised Convolutional Neural Network – Convolutional Neural Network
http://deeplearning.stanford.edu/tutorial/
Convolutional Neural Network
Overview
Convolutional Neural Network (CNN)은 한개 혹은 그 이상의 convolutional층(보통은 서브샘플링 과정도 함께하는)과 그 뒤에 따라오는 다층신경망(multiplayer neural network)에서의 그것과 같은 한개 이상의 fully connected 층들로 구성되어있습니다. CNN의 구조는 이미지나 음성 신호와 같은 2D 구조를 띄는 입력에 맞도록 디자인 되었습니다. 이러한 점은 지역적인 연결 구조와 그것에 엮인 가중치, 그리고 그 이후에 행해지는 이동불변 효과를 갖는 pooling에서 나오는 효과들입니다. CNN의 다른 장점은 훈련시키기가 쉽다는 점과 같은 수의 은닉 유닛을 갖는 fully connected network에 비해서 파라미터의 수가 적다는 점이 있습니다. 이 글에서는 CNN의 구조와 그래디언트 기반의 최적화 알고리즘을 사용하기 위한 각 파라미터에 대한 역전파 알고리즘에 대해서 이야기하고자 합니다. Convolution과 pooling을 다루는 튜토리얼에서 각 연산을 자세히 살펴볼 수 있습니다.
Architecture
CNN은 여러 convolutional 층과 서브샘플링 층으로 구성되어있습니다. 여기에 fully connected 층이 추가되어 있을 수도 있습니다. Convolutional 층의 입력은 $m \times m \times r$크기의 이미지로, 이는 가로, 세로 크기 $m$과 $r$개의 채널로 구성되어있음을 의미합니다. 예로 RGB 이미지의 경우엔 $r=3$입니다. Convolutional 층은 $k$개의 필터, 혹은 커널을 갖는데 그 크기는 $n \times n \times q$로, $n$은 이미지의 크기보다 작은 크기이고, $q$는 채널 $r$과 같거나 작은 수입니다. 이들 숫자는 각 커널마다 다른 수를 사용할 수 있습니다. 필터의 크기는 지역적으로 연결된 구조(locally connected structure)로 이미지에 convolution되어 $k$개의 크기 $m-n +1$을 갖는 특징맵을 생성합니다. 각 맵은 다시 $p \times p$의 인접한 영역들에서 pooling하는 서브샘플링단계를 거칩니다. 이 pooling에는 보통 평균 혹은 최대값을 사용하며, MNIST같이 작은 이미지에서는 $p=2$를 사용하고, 큰 이미지더라도 5를 넘지 않습니다. 서브 샘플링 층 이전이나 그 후에 bias를 추가하거나 시그모이드 형식의 비선형성을 각 특징 맵에 추가할 수도 있습니다. 아래 그림은 CNN의 convolutional, 서브샘플링 일부를 보여주고 있습니다. 같은 색으로 칠해지는 유닛들은 같은 가중치를 갖음을 의미합니다.
Convolutional 층들이 모두 지나가면 몇개의 fully connected 층을 두게 됩니다. 촘촘하게 연결된 층들은 다층신경망의 그것과 완전히 동일합니다.
Back Propagation
Cost 함수를 $J(W, b; x, y)$라고 하였을 때의 $(l+1)$번째 층의 에러 항을 $\delta^{l+1)$라고 해 봅시다. 여기서 $W, b$는 파라미터를, $(x, y)$는 트레이닝 샘플과 그 레이블을 의미합니다. 만약 $l$번째 층이 $l+1$번째 층과 완전히 연결되어있다면 $l$층을 위한 에러는 다음과 같이 계산됩니다.
$$ \begin{align} \delta^{(l)} = \left((W^{(l)})^T \delta^{(l+1)}\right) \bullet f'(z^{(l)}) \end{align} $$
또한 그래디언트도 계산할 수 있습니다.
$$ \begin{align} \nabla_{W^{(l)}} J(W,b;x,y) &= \delta^{(l+1)} (a^{(l)})^T, \\ \nabla_{b^{(l)}} J(W,b;x,y) &= \delta^{(l+1)} \end{align}$$
만약 $l$번째 층이 convolutional, 서브샘플링 층이면 에러는 다음과 같이 전파됩니다.
$$ \begin{align} \delta_k^{(l)} = \text{upsample}\left((W_k^{(l)})^T \delta_k^{(l+1)}\right) \bullet f'(z_k^{(l)}) \end{align} $$
여기서 $k$는 필터 번호이고, $f'(z_k^{(l)})$는 활성함수의 미분 함수입니다. upsample
명령은 pooling 층으로 들어오는 각 유닛에 해당하는 에러를 계산하여 에러를 전파시켜야 합니다. 예를 들어, mean pooling의 경우, upsample
은 이전 층에서 올라온 유닛들의 각 pooling 유닛에 대해서 균등하게 에러를 전파시켜줍니다. Max pooling의 경우 가장 큰 값을 갖는 유닛이 선택되어 모든 에러를 받게 합니다. 입력에서 아주 작은 변화일지라도 그 유닛이 통해 결과가 변하게될 것입니다.
마지막으로 각 필터맵에 대해서 그래디언트를 계산하기 위해 convolution 과정을 다시 한번 거치고 나온 에러 행렬 $\delta_k^{(l)}$을 뒤집습니다.
$$ \begin{align} \nabla_{W_k^{(l)}} J(W,b;x,y) &= \sum_{i=1}^m (a_i^{(l)}) \ast \text{rot90}(\delta_k^{(l+1)},2), \\ \nabla_{b_k^{(l)}} J(W,b;x,y) &= \sum_{a,b} (\delta_k^{(l+1)})_{a,b} \end{align} $$
$a^{(l)}$은 $l$번째 층의 입력 값입니다. 따라서 $a^{(1)}$은 입력 이미지를 의미합니다. $(a_i^{(l)}) \ast \delta_k^{(l+1)}$는 $l$번째 층의 $i$번째 입력과 $k$번째 필터의 에러간의 "valid" convolution 작업을 의미합니다.