この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
ガバガバックプロパゲーション感漂う記事です。
はじめに
皆さんお久しぶりです、武道館のアリーナA一桁列引いて最近テンション高いくろすです。
マルチプロセス&複数サーバー環境下でのRailsの各キャッシュについてとか、stackprofを使ってプロファイリングしてみたって感じのこと書こうと思ってたんですけど、あまりうまく纏まらないので適当な流し記事を書くことにしました。
みなさん、微分積分いい気分で行きましょう。
Backpropagation
Backpropagation(誤差逆伝播法)はニューラルネットワークの学習に使われるアルゴリズムです。教師信号と出力の誤差をネットワークの各重みに反映するための勾配計算に使われます。この勾配を利用した最急降下法まで含めてBackpropagationと呼ばれることもあります。
Backpropagation自体はNNの学習に必要な数値の計算に使われるだけなので、何らかの形でネットワークの出力を誤差に変換することができるならば、教師ありなし問わず使えます。
導出
l層目k番目のパーセプトロンの入出力を以下のように設定
入力 :
出力 :
誤差関数Eに対する重みの勾配は以下の式
ここで右辺はパーセプトロンの入出力の式から
なので無事以下のようにl-1層目のi番目のパーセプトロンとl層目j番目の間の重みとEの勾配が既知の値を使って表現できるわけですね。
でこの勾配を指標にして学習率をかけて引いてみたり、慣性項を追加してみたり、正則化項を追加してみたり色々するわけです。
まあこれ自体はちょっとハチャメチャすぎてプログラムに起こすのが大変そうなのでざっくり行列で行きましょう。
活性化関数にシグモイド、誤差関数にクロスエントロピーを使うとサクッといけます。
tが誤差計算に使われる教師信号から計算される出力なので
o-1 は前段階の出力になってます
気持ちいいですね。
終わりに
以上、エンジニアにあるまじき思考放棄の数式画像の連投でした。
誤差関数と活性化関数の微分ができれば(微分可能であれば)データに合わせた関数を適宜選択して学習ができます。
自分で書く機会なんてほとんどない気もしますが。
今回ここに書いたようなことはだいたいここの2章や3章あたりに読みやすくまとまってると思います。