daruma3940の日記

理解や文章に間違い等あればどんなことでもご指摘お願いします

ニューラルネろうじぇ

f:id:daruma3940:20160520223745p:plain
みなさんおっはー!まりちゃなのじぇ!
今日は皆さんと一緒にニューラルネろうとおもいまーーす!

今日は
{ \displaystyle
 \vec{y}=W\vec{x}+\vec{b}
}
を計算するためのレイヤー、Affineレイヤーを作っていこうと思いま~~す
f:id:daruma3940:20160521003616p:plain
youtuberかな??
f:id:daruma3940:20160520223745p:plain
前向き伝搬は上の式をそのまま実装すればいいので簡単ですね~~
問題は誤差逆伝搬の方ですね~~~
f:id:daruma3940:20160520223745p:plain
とりあえず損失関数を定義しま~~す
{ \displaystyle
 \vec{y}=W\vec{x}+\vec{b}
}
に対していきなり損失を考えま~~す
{ \displaystyle
 \vec{t}
}
を正解となる教師データとしまーす
そうすると正解に対する損失は
{ \displaystyle
 E= \frac{1}{2} ( \vec{y}-\vec{t})^2 
}

となりま~~す
この損失に対してパラメーターをどの方向に動かせばいいか決めるために
\[
\frac{\partial E}{\partial W},
\frac{\partial E}{\partial \vec{b}},
\frac{\partial E}{\partial x}
\]
を計算しまーーす

ベクトルとか行列で微分するのは結構面倒な作業なので成分ごとに微分をみていってそのあと行列の形式に戻していきましょーー


まずはWについて!
\[
\frac{\partial E}{\partial W_{np}}=\frac{\partial }{\partial W_{np}} (\frac{1}{2} \sum_{i} ( y_{i}-t_{i})^2)= \frac{\partial }{\partial y_{i}} (\frac{1}{2} \sum_{i} ( y_{i}-t_{i})^2 )\frac{\partial y_{i}}{\partial W_{np}}
\]
ここで
\[
\frac{\partial }{\partial y_{i}} (\frac{1}{2} \sum_{i} ( y_{i}-t_{i})^2 )=\sum_{i}(y_i-t_i)
\]
\[
\frac{\partial y_{i}}{\partial W_{np}}= \frac{\partial}{\partial W_{np}}( \sum_{l} W_{il}x_{l}+B_i )=\delta_{in}\delta_{pl}x_l
\]
なので
\[
\frac{\partial E}{\partial W_{np}}=\sum_{i}(y_i-t_i)\delta_{in}\delta_{pl}x_l=(y_{n}-t_{n})x_p
\]
これより
\[
\frac{\partial E}{\partial W} =
\left(
\begin{array}{c}
\frac{\partial E}{\partial W_{np}} \\
\end{array}
\right)
=
  \left(
\begin{array}{cccc}
\frac{\partial E}{\partial W_{11}} & \frac{\partial E}{\partial W_{12}} & \ldots &\frac{\partial E}{\partial W_{1n}} \\
\frac{\partial E}{\partial W_{21}} & \frac{\partial E}{\partial W_{22}} & \ldots & \frac{\partial E}{\partial W_{2n}} \\
\vdots & \vdots & \ddots & \vdots \\
\frac{\partial E}{\partial W_{m1}} & \frac{\partial E}{\partial W_{m2}} & \ldots & \frac{\partial E}{\partial W_{mn}}
\end{array}
\right)
\]
がけいさんできて
\[
\frac{\partial E}{\partial W} =
  \left(
\begin{array}{cccc}
(y_1-t_1)x_1 & (y_1-t_1)x_2 & \ldots & (y_1-t_1)x_n \\
(y_2-t_2)x_1 & (y_2-t_2)x_2 & \ldots & (y_2-t_2)x_n \\
\vdots & \vdots & \ddots & \vdots \\
(y_m-t_m)x_1 & (y_m-t_m)x_2 & \ldots & (y_m-t_m)x_n
\end{array}
\right)
\]

つまりここから
\[
\frac{\partial E}{\partial W} =
\left(
\begin{array}{c}
y_1-t_1 \\
y_2-t_2 \\
\vdots \\
y_n-t_n
\end{array}
\right)
\left(
\begin{array}{c}
x_1,
x_2
\ldots
x_n
\end{array}
\right)
\]
行列形式になおすと
\[
\frac{\partial E}{\partial W} =(\vec{y}-\vec{t})\vec{x}^T
\]
と求まるじぇ


次はbについて
\[
\frac{\partial E}{\partial b_{n}}=\frac{\partial }{\partial b_{n}} (\frac{1}{2} \sum_{i} ( y_{i}-t_{i})^2)= \frac{\partial }{\partial y_{i}} (\frac{1}{2} \sum_{i} ( y_{i}-t_{i})^2 )\frac{\partial y_{i}}{\partial b_{n}} \\
ここで \\
\frac{\partial y_{i}}{\partial b_{n}}= \frac{\partial}{\partial b_{n}}( \sum_{l} W_{il}x_{l}+b_i )=\delta_{in}\\
なので\\
\frac{\partial E}{\partial b_{n}}=\sum_{i}(y_i-t_i)\delta_{in}=(y_{n}-t_{n})
\]
つまり行列形式になおすと
\[
\frac{\partial E}{\partial b}=(\vec{y}-\vec{t})
\]


最後にxについてなのじぇ。ここでは使わないけれどこれは下のレイヤーに送るのじぇ
\[
\frac{\partial E}{\partial x_{n}}=\frac{\partial }{\partial x_{n}} (\frac{1}{2} \sum_{i} ( y_{i}-t_{i})^2)= \frac{\partial }{\partial y_{i}} (\frac{1}{2} \sum_{i} ( y_{i}-t_{i})^2 )\frac{\partial y_{i}}{\partial x_{n}} \\
ここで\\
\frac{\partial y_{i}}{\partial x_{n}}= \frac{\partial}{\partial x_{n}}( \sum_{l} W_{il}x_{l}+B_i )=W_{in}\\
なので\\
\frac{\partial E}{\partial x_{n}}=\sum_{i}(y_i-t_i)W_{in}
\]
ここから行列形式になおそうじぇ
\[
\frac{\partial E}{\partial \vec{x}} =
\left(
\begin{array}{c}
\frac{\partial E}{\partial x_1} \\
\frac{\partial E}{\partial x_2} \\
\vdots \\
\frac{\partial E}{\partial x_n}
\end{array}
\right)
=
\left(
\begin{array}{c}
\sum_{i}(y_i-t_i)W_{i1} \\
\sum_{i}(y_i-t_i)W_{i2} \\
\vdots \\
\sum_{i}(y_i-t_i)W_{in}
\end{array}
\right)
=
\left(
\begin{array}{c}
\sum_{i} (W^{T})_{1i}(y_i-t_i) \\
\sum_{i}(W^{T})_{2i}(y_i-t_i) \\
\vdots \\
\sum_{i}(W^{T})_{ni}(y_i-t_i)
\end{array}
\right)
\]

\[
W^{T} =
\left(
\begin{array}{c}
\vec{w^t_1} \\
\vec{w^t_2} \\
\vdots \\
\vec{w^t_n}
\end{array}
\right)
\]
のように書くと
\[
\left(
\begin{array}{c}
\sum_{i} (W^{T})_{1i}(y_i-t_i) \\
\sum_{i}(W^{T})_{2i}(y_i-t_i) \\
\vdots \\
\sum_{i}(W^{T})_{ni}(y_i-t_i)
\end{array}
\right)
=
\left(
\begin{array}{c}
(\vec{w^{T}_1})(\vec{y}-\vec{t}) \\
(\vec{w^{T}_2})(\vec{y}-\vec{t}) \\
\vdots \\
(\vec{w^{T}_n})(\vec{y}-\vec{t})
\end{array}
\right)
=
W^{T}(\vec{y}-\vec{t})
\]


さあこれでAffineレイヤーは順方向逆方向両方実装すべきことは分かったのじぇ
これを用いて
ニューラルネットワーク - Wikipedia
wikiにある
\[ y=2x^2-1 \]
を学習しようじぇ
今回はwikiにある通りの構造
入力→Affineレイヤー→ReLU→Affine→出力
で行くのじぇ
f:id:daruma3940:20160520223745p:plain
これが初期値でプロットしたやつ
f:id:daruma3940:20171219213834p:plain
f:id:daruma3940:20160521003616p:plain
まあ初期値だしこんなもんかしらね

f:id:daruma3940:20160520223745p:plain
これが途中でプロットしたやつ
f:id:daruma3940:20171219213902p:plain

f:id:daruma3940:20160521003616p:plain
いい感じに学習途中感が出てるじゃない!とかいはね!
f:id:daruma3940:20160520223530p:plain
もうちょっと中央の値が下がってくれば文句なしだねっ
f:id:daruma3940:20160520223745p:plain
これが学習終了時のプロット
f:id:daruma3940:20171219214038p:plain
f:id:daruma3940:20160520223745p:plain
なんでうまくいってないのおおお??
f:id:daruma3940:20160521003616p:plain
は??
まっ平らじゃん
うまいオチのついた3コママンガね...
f:id:daruma3940:20160520223530p:plain
はい無能 世界一プログラミングが下手 実質バグ
f:id:daruma3940:20160520223745p:plain
これ絶対C++の線形台数ライブラリ(Eigen)がわるいきがするのじぇ...
だって内積がベクトル同士でしかできないし外積は3*3までしかできないしcolとrowがたてかよこかこんがらがるしうんたらかんたら...(無能特有の責任転嫁)
どこか間違ってたら誰か教えてください....

「追記」

f:id:daruma3940:20171220141510p:plain
ReLUを
return (x >= 0.0) ? x : 0.0;
にして、学習率を調整したらうまくいったのじぇ....よくわからないのじぇ....