def 小児科医():

かけだし小児科医が仕事の合間にプログラミングを勉強するブログです。

ディープラーニングに挑戦してみる話②

前回の続き

 

defpediatric.hatenablog.com

 

手書き数字の画像を認識する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

ん、これであってんのか…?合ってることにしよう。

 

今回は完全写経だったけど将来的には自分で作れるように…なる頃には深層学習も廃れてそう。

 

というわけで

人工知能プログラミングのための数学がわかる本」読了。