【DeepLearning特訓】MLPの基礎 誤差逆伝播
E資格向けの自習アウトプット
自分用メモ
モデル(ニューラルネットワーク)の最適化は、コスト関数をより小さくなるようにパラメータ(重み:w、バイアス:b)を更新することが必要
パラメータに対するコスト関数の勾配(微分)が分かれば、パラメータをどの方向に更新すればよいか分かる(どれだけ?なのかは微分では分からない)
誤差逆伝播は、出力層から入力層の方向に勾配を順に求めていき逆方向に伝播させていく手法
この手法の発明によってディープラーニングが一気にブームになったという
ReLUの勾配(微分)
ReLU の微分はこんな感じなるらしい
順伝播時の「0」以下になったインデックスを覚えておき、逆伝播時にも「0」にマスクする
# 順伝播:活性化関数 ReLU # mask: 勾配の計算用 def relu(x): mask = (x <= 0) return np.maximum(0, x), mask # 誤差逆伝播:ReLU def drelu(dout, mask): dout[mask] = 0 return dout
計算グラフを使って、逆伝播をイメージする
計算グラフを使うメリットは、「局所性」にある。前後の入力、出力を意識せず「局所的な勾配(微分)」逆方向に渡していき、最終的な結果(勾配)を求めていく
微積分の連鎖率までカバーしようと思うとなかなか骨が折れそうなので、一旦後回し、丸暗記すべきないくつかの計算グラフをメモ
ソフトマックス with クロスエントロピー誤差 - コスト関数
すごくシンプルになりますが、もちろんシンプルになるように元の数式が組まれているのです
# ソフトマックス with クロスエントロピー誤差 dx = (y - t) / batch_size # t: 正解データ、y: 予測データ
シグモイド - 活性化関数
シグモイドはなので、計算をすすめると
こちらもいたってシンプル
# シグモイドの勾配 # dout: 逆伝播で前から受け取ったデータ、out: 順伝播時の出力 dx = dout * out * (1.0 - out)
まとめ
数式の導出方法を完全に理解するには時間がかかりそう。。。
Python で実装しながら、全体の理解することにする