konchangakita

KPSを一番楽しんでいたブログ 会社の看板を背負いません 転載はご自由にどうぞ

【DeepLearning特訓】MLPの基礎 誤差逆伝播

E資格向けの自習アウトプット
自分用メモ

モデル(ニューラルネットワーク)の最適化は、コスト関数をより小さくなるようにパラメータ(重み:w、バイアス:b)を更新することが必要
パラメータに対するコスト関数の勾配(微分)が分かれば、パラメータをどの方向に更新すればよいか分かる(どれだけ?なのかは微分では分からない)
誤差逆伝播は、出力層から入力層の方向に勾配を順に求めていき逆方向に伝播させていく手法
この手法の発明によってディープラーニングが一気にブームになったという

ReLUの勾配(微分

ReLU の微分はこんな感じなるらしい
f:id:konchangakita:20210106143618p:plain

順伝播時の「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

平均二乗誤差の勾配(微分

コスト関数の平均二乗誤差を微分してみると
f:id:konchangakita:20210105195312p:plain
こうなる
f:id:konchangakita:20210105195358p:plain

いたってシンプル

# 平均二乗誤差の勾配計算
dx = -2 * (t -y) # t: 正解データ、y: 予測データ


計算グラフを使って、逆伝播をイメージする

f:id:konchangakita:20210103233009p:plain

計算グラフを使うメリットは、「局所性」にある。前後の入力、出力を意識せず「局所的な勾配(微分)」逆方向に渡していき、最終的な結果(勾配)を求めていく
f:id:konchangakita:20210103233856p:plain

微積分の連鎖率までカバーしようと思うとなかなか骨が折れそうなので、一旦後回し、丸暗記すべきないくつかの計算グラフをメモ

ソフトマックス with クロスエントロピー誤差 - コスト関数

f:id:konchangakita:20210105173129p:plain

すごくシンプルになりますが、もちろんシンプルになるように元の数式が組まれているのです

# ソフトマックス with クロスエントロピー誤差
dx = (y - t) / batch_size  # t: 正解データ、y: 予測データ


シグモイド - 活性化関数

f:id:konchangakita:20210105173520p:plain

シグモイドはf:id:konchangakita:20210105212604p:plain:w90なので、計算をすすめると
f:id:konchangakita:20210105212649p:plain

こちらもいたってシンプル

# シグモイドの勾配
# dout: 逆伝播で前から受け取ったデータ、out: 順伝播時の出力
dx = dout * out * (1.0 - out)


まとめ

数式の導出方法を完全に理解するには時間がかかりそう。。。
Python で実装しながら、全体の理解することにする