ディープラーニング学習メモ #4 誤差の逆伝搬

今日は誤差逆伝搬法(Backpropagation)について書いてみます。

Karpathy先生のCS231nの講義が秀逸すぎるのでそれを見れば十分です! (◍•ᴗ•◍)

これではあんまりなので特に覚えておきたいポイントをまとめてみようと思います。。

global勾配にlocal勾配を掛けて次のノードにエラーの誤差を伝搬させる

f:id:sanshonoki:20170321043543j:plain:w450

微分の連鎖律(チェインルール)です。

基本的な演算での伝搬を覚えよう

Add演算はそのまま誤差を伝搬させる

f:id:sanshonoki:20170322041057j:plain:w450

Mul演算は互いの値をクロスに掛けて誤差を伝搬させる

f:id:sanshonoki:20170322041124j:plain:w450

Max演算は値が大きい方へのみ誤差を伝搬させる

f:id:sanshonoki:20170322041153j:plain:w450

分岐ノードは誤差を加算する

f:id:sanshonoki:20170322050746j:plain:w450

RNNのhiddenノードも出力層からの誤差と次のRNNセルからの誤差が加算されます。(hは次のRNNセルへの入力でもあるため)

f:id:sanshonoki:20170322050844j:plain:w450

ベクトルの場合も同じ

computational graph network layer graph
f:id:sanshonoki:20170323051220j:plain:w400 f:id:sanshonoki:20170323051243j:plain:w200

入力がベクトルの場合も同じです。ただ、行列(W)の次元を考慮する必要があります。 掛け算するために転置(T)をしたり、掛ける順番を考慮しないと怒られます..。

ポイント
  • あるノードでの順方向(X)と逆方向(dX)の次元は同じ(当たり前だけど)
  • 出力されるべき次元に合わせて転置や掛ける順番を考える (紙に書けというアドバイスをよく見かける。地道に慣れろということ)
  • この例では W は (outsize, insize) になっているが実際のフレームワークでは W は基本的に (insize, outsize) という次元になる。バッチ単位で処理するため

個人的には computational グラフで考えると誤差の伝搬が計算しやすいです。

バッチ単位で考えたとき

f:id:sanshonoki:20170323051256j:plain:w300

このようにバッチ単位でまとめて行列計算したいときは W は (insize, outsize) となります。 また、WX ではなく D = XW と掛け算します。

今回はここまでです。 マウスで文字を書くのつらい.. (ノ゚ο゚)ノ