マイノート

いろいろ勉強したことをまとめていきます

MENU

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_{ij}$ は 畳み込んだ結果の二次元データ $y$ すべてに影響を与えているので、以下のように $y$ から勾配 $\frac{\partial E}{\partial w^{k}_{st}}$,$\frac{\partial E}{\partial b^{k}}$ を求める。

\begin{equation} \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{equation}

$\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{equation} \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{equation}

$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}