CNNの伝搬と逆伝搬

※これから少しづつ改良していきます。

はじめに

少しCNNを触る機会があったので、

CNNにおいての伝搬、逆伝搬のところを勉強して自分用としてまとめた。

正直、数式はほとんど以下のサイトと同じである。

こちらの都合により \(a\) を \(y\) と変更しているなど、いくつか変更してある。

まず以下のサイトで理解してみることをおすすめする。

数式で書き下す Convolutional Neural Networks (CNN) – Yusuke Sugomori’s Blog

上記のサイトの前半部分と同様に、

カーネル数が1の場合を今回は紹介する。

下記の2つの層の伝搬と逆伝搬についてのみ扱う。

  • Convolution Layer
  • MaxPooling Layer

Convolution Layer

まず、Convolution Layerの伝搬と逆伝搬について説明する。

伝搬

畳込みは以下の式で表現される。

$$
\begin{equation}
y_{ij} = \sum^{m–1}_{s=0}\sum^{n–1}_{t=0} w^{k}_{st} x_{(i+s)(j+t)} + b^k
\end{equation}
$$

やっていることは、以下の図がわかりやすい。

f:id:ttt242242:20170423213119p:plain:w200

f:id:ttt242242:20170423212953p:plain:w300

参考:http://hokuts.com/2016/12/13/cnn1/

逆伝搬

f:id:ttt242242:20170423212023j:plain:w300

カーネルの重み \(w\) とバイアスである \(b\) を更新する。

$$
\begin{equation} w^{k}_{st} = w^{k}_{st} – \epsilon \frac{\partial E}{\partial w^{k}_{st}} \\ b^k = b^k – \epsilon \frac{\partial E}{\partial b^{k}} \end{equation}
$$

カーネルの \(w^{k}_{ij}\) は畳み込んだ結果の二次元データ \(y^{k}\) すべてに影響を与えているので、以下のように \(y\) から勾配\(\frac{\partial E}{\partial w^{k}_{st}}\) ,\(\frac{\partial E}{\partial b^{k}}\) を求める。

$$
\begin{eqnarray}
\frac{\partial E}{\partial w^{k}_{st}} &=& \sum^{M–2(m/2)}_{i=0}\sum^{N–2(n/2)}_{j=0} \frac{\partial E}{\partial y^{k}_{ij}}\frac{\partial y^{k}_{ij}}{\partial w^{k}_{ij}} \\
&=& \sum^{M–2(m/2)}_{i=0}\sum^{N–2(n/2)}_{j=0} \frac{\partial E}{\partial y^{k}_{ij}} x_{(i+s)(j+t)} \\
\frac{\partial E}{\partial b^k} &=& \sum^{M–2(m/2)}_{i=0}\sum^{N–2(m/2)}_{j=0} \frac{\partial E}{\partial y^{k}_{ij}}\frac{\partial y^{k}_{ij}}{\partial b^{k}}
\end{eqnarray}
$$

\(\frac{\partial y^{k}_{ij}}{\partial b^{k}}\) は1より、

$$
\begin{equation}
= \sum^{M–2(m/2)}_{i=0}\sum^{N–2(n/2)}_{j=0} \frac{\partial E}{\partial y^{k}_{ij}}
\end{equation}
$$

さらにその後ろに伝搬させる必要がある場合

f:id:ttt242242:20170423212029j:plain:w300

\(\frac{\partial E}{\partial x_{ij}}\)は

$$
\begin{eqnarray}
\frac{\partial E}{\partial x_{ij}} &=& \sum^{m–1}_{s=0}\sum^{n–1}_{t=0} \frac{\partial E}{\partial y^{k}_{(i–s)(j–t)}}\frac{\partial y^{k}_{(i–s)(j–t)}}{\partial x_{ij}} \\
&=& \sum^{m–1}_{s=0}\sum^{n–1}_{t=0} \frac{\partial E}{\partial y^{k}_{(i–s)(j–t)}}w^{(k)}_{st}
\end{eqnarray}
$$

\(i-s < 0\) もしくは \(j-t < 0\) の場合は

$$
\begin{equation} \frac{\partial E}{\partial y^{k}_{(i–s)(j–t)}} = 0 \end{equation}
$$

と計算する。

MaxPooling Layer

f:id:ttt242242:20170423212037j:plain:w300

伝搬は単純に、二次元データのフィルタ適応部分で最も高い値を次の層に伝搬させる。

伝搬

$$
\begin{equation} y_{ij} = max(x_{(li+s)(lj+t)})\ \ \ \ \ where \ \ (s \in l)\,(t \in l)
\end{equation}
$$

逆伝搬

逆伝搬は単純に、最も高い値だったユニットに逆伝搬させるだけ。

$$
\begin{equation}
\frac{\partial E}{\partial x_{(li+s)(lj+t)}} = \begin{cases} \frac{\partial E}{\partial y^{k}_{ij}} \ \ \ \ (y_{ij} = x_{(li+s)(lj+t)}) \\ 0 \ \ \ \ \ (otherwise) \end{cases} \end{equation}
$$

Activation Layer

ここは参考サイトを見ればわかると思うので省略。

伝搬

$$
\begin{equation} y_{ij} = ReLU(x_{ij}) = max(0,x_{ij}) \end{equation}
$$

逆伝搬

$$
\begin{equation} \frac{\partial E}{\partial x^{k}_{ij}} = \begin{cases} \frac{\partial E}{\partial x^{k}_{ij}} \ \ \ (y_{ij} \geq 0) \\ 0 \ \ \ \ \ (otherwise) \end{cases} \end{equation}
$$

コメント

タイトルとURLをコピーしました