- 誤差逆伝播法の理解の方法は2種類ある
- 数式によるもの
- 計算グラフ(computational graph)によるもの
- 視覚的に意味を理解できる.
- 局所的な計算を伝播することによって,最終的な結果を得ることができる
- 逆方向の伝播によって微分を効率的に計算できる
- 計算グラフを使って問題を解くステップ
- 計算グラフを構築する
- 計算グラフ上で計算を左から右へ進める
連鎖律(chain rule)
- 計算グラフの逆伝播は連鎖律によって成り立つ
- 加算ノードの逆伝播
- 乗算ノードの逆伝播
活性化レイヤの実装
ReLUレイヤ
- 活性化関数として使われるReLUは下記で表される
$$
y =
\left\{
\begin{array}{}
x & (x > 0) \\
0 & (x \leq 0)
\end{array}
\right.
$$
- 微分すると下記のようになる
- この式を見ると以下のことが分かる.
- 順伝播時の入力であるxが0より大きければ,逆伝播は上流の値をそのまま下流に流す
- 逆に,xが0以下であれば,逆伝播時に下流への信号をそこでストップする
$$
\frac{\partial y}{\partial x} =
\left\{
\begin{array}{}
1 & (x > 0) \\
0 & (x \leq 0)
\end{array}
\right.
$$
class Relu:
def __init__(self):
self.mask = None
def forward(self, x):
self.mask = (x <= 0)
out = x.copy()
out[self.mask] = 0
return out
def backward(self, dout):
dout[self.mask] = 0
dx = dout
return dx
- ReLUレイヤは回路におけるスイッチのようにはたらく
- 順伝播時に電流が流れていればONにし,流れなければスイッチをOFFにする
- 逆伝播時には,スイッチがONであれば電流がそのまま流れ,OFFであればそれ以上電流は流れない.
Sigmoidレイヤ
- Sigmoid関数は下記で表される
$$
y =
\frac{1}{1 + \exp(-x)}
$$
- sigmoid関数の逆伝播の考え方(省略)
- sigmoidレイヤの実装
def Sigmoid:
def __init__(self):
self.out = None
def forward(self, x):
out = 1 / (1 + np.exp(-x))
self.out = out
def backward(self, dout):
dx = dout * (1.0 - self.out) * self.out
return dx
Affineレイヤ
バッチ版Affineレイヤ
Softmax-with-Lossレイヤ
- ソフトマックス関数は入力値を正規化して出力する
- Softmaxレイヤの逆伝播の値は,Softmaxレイヤと教師ラベルの差分になる
- ニューラルネットワークの学習の全体図
- 前提
- 訓練データの中からランダムに一部のデータを選び出す
- 各重みパラメータに関する損失関数の勾配を求める
- 重みパラメータを勾配方向に微小量だけ更新する
- 上記を繰り返す
本章で学んだこと
- 計算グラフを用いれば,計算過程を視覚的に把握することができる
- 計算グラフのノードは局所的な計算によって構成される.局所的な計算が全体の計算を構成する.
- 計算グラフの順伝播は,通常の計算を行う.一方,計算グラフの逆伝播によって,各ノードの微分を求めることができる.
- ニューラルネットワークの構成要素をレイヤとして実装することで,勾配の計算を効率的に求めることができる.
- 数値微分と誤差逆伝播法の結果を比較することで,誤差逆伝播法の実装に誤りがないことを確認できる.
後で調べたいこと
yusuke-ujitoko.hatenablog.com
yusuke-ujitoko.hatenablog.com