誤差逆伝播を1から解説 — 連鎖律だけで全部わかる
1000万個のパラメータの勾配を、なぜ順伝播1回ぶんの手間で全部求められるのか。連鎖律の復習から計算グラフ、2層ネットの手計算1ステップ、そして勾配消失が起きる理由までを、記号を1つずつ説明しながら追います。
スープが塩辛い。犯人はどの調味料か
作ったスープが塩辛すぎたとします。原因は塩か、醤油か、煮詰めすぎか。あなたが本当に知りたいのは「どれをどれだけ減らせば、しょっぱさがどれだけ和らぐか」です。
素朴なやり方は、塩だけをほんの少し減らしてもう一度作り、味を比べること。次は醤油だけを変えてもう一度。調味料が20種類なら20回作り直します。これを数式にしたのが数値微分です。
記号を1つずつ説明します。 は損失(モデルの間違い具合を表す1つの数値)、 は全パラメータをまとめたもの、 はそのうち 番目の1個、(イプシロン)はごく小さい数、 は「 番目だけ1で他は全部0」というベクトルです。(ラウンド・ディー)は、他を固定して1つの変数だけで微分する記号です。
この式が言っているのは要するに、つまみを1個だけほんの少し回して、損失がどれだけ変わったかを測るということ。正しい方法ですが、致命的に遅い。パラメータ1個につき順伝播(入力を通して出力を出す計算)が1回必要なので、1000万個なら1回の学習ステップに1000万回の順伝播が要ります。これでは終わりません。
誤差逆伝播(backpropagation)は、レシピの手順を逆向きに辿ることで、順伝播1回ぶんと同じオーダーの手間で全パラメータの勾配を一度に出す方法です。魔法ではなく、高校で習う連鎖律をひたすら適用しているだけです。
なお本記事はニューラルネットワークの基礎——ニューロンが を計算していること、順伝播が行列積の連鎖であること——を前提にします。
連鎖律 — 微分は「倍率」、連鎖律は「倍率の掛け算」
連鎖律は次の1行です。
が変われば が変わり、 が変われば が変わる、という3段の関係を考えています。
この式が言っているのは要するに、倍率は掛け算で繋がるということです。 を1だけ動かすと が3動く(倍率3)、 が1動くと が2動く(倍率2)。なら を1動かしたとき は6動く。歯車を噛み合わせたときの回転比と同じ理屈です。
微分とは、この「局所的な倍率」のことです。ある点でほんの少し入力をずらしたら出力が何倍ずれるか。それだけの意味しかありません。そして深いネットワークは、この歯車が何十段も噛み合った装置にすぎません。
計算グラフ — 順方向で値、逆方向で勾配
ネットワークを、演算を頂点・値の流れを辺とする計算グラフとして見ます。 の掛け算が1つの頂点、 の足し算が次の頂点、ReLU がその次、という具合です。
このグラフの上で、逆伝播は驚くほど機械的な作業になります。各頂点が知っている必要があるのは自分の局所微分——自分の入力を少し動かしたら自分の出力がどれだけ動くか——だけです。あとは、
上流から降ってきた勾配 × 自分の局所微分 = 下流へ渡す勾配
を計算して隣に渡す。これを出力側から入力側へ繰り返すだけで、巨大な式を展開する必要はありません。頂点が自分の足元しか知らなくても全体の勾配が正しく求まる——ここが逆伝播の美しいところです。
ただし条件が1つあります。局所微分を計算するには順伝播のときの値が必要なので、順伝播で通った中間の値を捨てずに覚えておく必要があります。学習時にメモリを大量に食う理由はここにあります。
そして「自分の局所微分」の代表格が、活性化関数の傾きです。次の図で傾きの大きさを確かめておいてください。ここで見た傾きの値が、そのまま逆伝播で掛け算される数字になります。
コメント
コメントにはログインが必要です