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