昨日書いたとおり、現状ではあまり上手くいってない。
でも、とりあえず書いてみる。
関数近似としてニューラルネットワークを使う
Sarsa()法の関数近似としてニューラルネットワークなどを使う場合、その関数のパラメータに関する勾配を求める必要がある。
以下、Sarsa()法でのパラメータの更新を再掲すると、
としたとき、
とする。
見ての通り、状態価値を近似している関数 のパラメータ
に関する勾配
が必要になっている。
ニューラルネットワークの場合、勾配が誤差逆伝播法で(比較的)簡単に計算できるというのがある。
以下、誤差逆伝播法による勾配計算を再掲すると、
- 入力
から、各層について
と
を計算する。
- 以下のようにして、デルタ
を計算する:
- 出力層で、
を計算する。
- 中間層で、
の順番で、デルタ
を次のように計算する:
- 出力層で、
- 以下のようにして、重み
とバイアス
に対する偏微分を計算する:
なお、出力層のデルタ は、誤差関数として二乗和誤差
を使う場合、
となる。
ただ、ここでいう勾配というのは、普通は誤差関数の重みに対する勾配 であって、ニューラルネットワークの出力自身の重みに関する勾配
ではないので、ちょっと注意が必要。
といっても、中間層のデルタは誤差関数の形に依存していないので、アルゴリズム自体はそのまま使えて、出力層のデルタのみ、 として計算すればいいだけ。
さらに、なので、出力層のデルタは単に
となる。
今日はここまで!