ニューラルネットワークの学習アルゴリズムのメモ
表記の定義
定義記号(左辺を右辺で定義)
ベクトル:
ベクトルの第i成分:
ベクトルのスライス:
行列:
行列の第i行目ベクトル :
行列の第j列目ベクトル :
行列の第i行第j列成分:
ベクトルの内積:
ベクトルの要素積:
ベクトルの直積:
ベクトルと行列の積:
ベクトル関数: (各成分の関数自体は等しい)
ネットワークの構造
ネットワークは層構造を成していて、特に最初の層を「入力層」、最後の層を「出力層」、それ以外を「隠れ層」と呼ぶ。
計算するにあたり、今回は任意の層1つに注目して次の値を定義する。
層の入力ベクトル:
層のウェイト:
層のバイアス:
層の中間生成ベクトル:
層の活性化関数 :
層の出力ベクトル:
ウェイト・バイアスの修正方法
今回提示する修正法は、ニューラルネットの出力が期待される値とどれくらいずれているかの指標である損失関数が小さくなるようにウェイト・バイアスを修正する勾配降下法である。
すなわち、
という式をもってウェイトとバイアスを更新する。
ここで、は学習率であり、勾配をどれだけ下るかの”重み”である。
出力層である場合
この層が出力層である場合、損失関数は出力層の出力で計算されるため具体的に計算することができる。
簡単なニューラルネットではを簡単にするために損失関数を、
となるように決められていたりする。
計算すると、その場合の損失関数は二乗誤差関数であるとわかる。
隠れ層である場合
この層の出力は次の層の入力ベクトルである。
そこで、次の層の種々の値をチルダ()を付けて表すことにする。
つまり、
したがって、
最後の式変形は"計算"の途中式を追うと、であることから。
この層の次のレイヤーが出力層だとすると、 は計算出来て、もちろんも既知だからが求まって、行列表示としてまとめると、
これを繰り返すことで全ての隠れ層について、その勾配を計算することができる。
バイアスについて
したがって、
ウェイトの場合と同様にを出力層から遡って計算すればよい。
numpyでの実装
import numpy as np
ベクトル: → 一次元配列x
(例:np.array([...])
行列: → 二次元配列W
(例:np.array([[...] ... ])
ベクトルのスライス: x[k:l]
行列の第i行目ベクトル : W[i, :]
行列の第j列目ベクトル : W[:, j]
行列の第i行第j列成分: W[i, j]
ベクトルの内積: x @ y
ベクトルの要素積: x * y
ベクトルの直積: np.outer(x, y)
ベクトルと行列の積: W @ x