ディープラーニングに挑戦してみる話②
前回の続き
手書き数字の画像を認識するAI作り。
DNNの仕組みはわかったけど重みづけはどうするのって話。
・損失関数
それには損失関数が最小になる重みを決定する。
一般的なのはクロスエントロピーの誤差
正解ラベルをt、出力値をyとして
E=Σtlogy
なんだけど今回は2乗誤差
E=Σ1/2||t-y||2 を使う。
重みをwとして、最小値となるwを見つける。
つまりdE/dw=0となるwを見つける。
・勾配投下法
これには勾配投下法を用いる。
ある関数f(x)がある時、微小変化Δxについて
df(x)/dx・Δx<0なら傾きは負になる。
ので、Δx=-μ{df(x)/dx}(μは0<μ<1)
これも満たすx(損失関数ではw)を探す感じ。
・誤差逆伝播法
で、なんかこれは計算難しいらしいので
誤差逆伝播法というものを使うらしい。
出力値と正解ラベルの誤差を見るのだが、
出力値→入力値の方向に重みを更新していくものらしい。
んで、なんか色々微分とかしてたんだが、正直よくわからなかった^_^
誤差δを損失関数をE、重みw、L-1層での出力a、バイアスをb、正解ラベルをy、活性化関数をς(x)で表す式。
なので流れとしては
①損失関数Eを決める
②勾配投下法でdE/dw,dE/dbが負になるw、bを探す
③誤差逆伝播法を用いてw、bを更新していく。
・過学習対策
今までは正規化を用いていたが、今回はドロップアウト法というのを用いるらしい。
DNNのニューロンを一定数ランダムに消失させて、訓練を行う方法らしい。
ドロップアウト=0.2とすると20%のニューロンが消失される感じ。
これでモデルは完成。
プログラミングを起動するとエポックごとにゲージが溜まっていく感じが好きだった。
loss(損失値)が下がってaccuracy(正答率)も上がっていく。
そして最後はこう。
loss: 0.2391 accuracy: 0.9316
ん、これであってんのか…?合ってることにしよう。
今回は完全写経だったけど将来的には自分で作れるように…なる頃には深層学習も廃れてそう。
というわけで
「人工知能プログラミングのための数学がわかる本」読了。