※これから少しずつ改良していきます。
はじめに
少し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}
$$
やっていることは、以下の図がわかりやすい。
参考:http://hokuts.com/2016/12/13/cnn1/
逆伝搬
カーネルの重み \(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}
$$
さらにその後ろに伝搬させる必要がある場合
\(\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
伝搬は単純に、二次元データのフィルタ適応部分で最も高い値を次の層に伝搬させる。
伝搬
\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}
$$
コメント