DDQNについて何となく理解してること


※この記事にはソースコードは一切ありません
※まだ理解しきれているとは言い難いので、もし間違っていればご指摘お願いします

はじめに

 今、Ape-XをKerasで実装しようとしているけど、それに使われている手法「DDQN(Double Deep Q Network)」の理解がようやくできたので書いていきます。

DDQNの誕生

 まず、DDQNが誕生した経緯を説明していきます。
 従来使われていたDQN(Double Q NetWork)では、行動を決定するときに使うネットワークと、あとでその行動を評価するときに使うネットワークが同じであることが問題でした。言い換えると、自分の行動を自分で評価しているため、過大評価・過小評価になってしまうということです。
 これを解決するために、自分の行った行動を「第三者」に評価してもらおう、というのがDDQNの基本的な考え方です。

DDQNの流れ

 まずは疑似コード(っぽいもの)を書いてみます。

DDQN
行動決定用ネットワークを定義
価値計算用ネットワークを定義
経験を保存するためのMemoryを定義

for epoch in range(試行回数):
    行動決定用ネットワークによる行動決定(a)
    実際にaを行ってみる(b)
    Memoryに(行動前の状況行動行動後の状況報酬)を格納

    行動決定用ネットワークの重みを価値計算用ネットワークにコピー
    if Memory.len()>batch_size(=学習が可能なくらい経験がたまった):
        学習()

def 学習():
    Memoryから一定数取り出す(batchに格納)
    batchのそれぞれのデータについてそのときの次の状態(state(time+1))における行動を行動決定用ネットワークを使って選択
    選択した行動を価値計算用ネットワークで評価
    これに割引率をかけたものとそのとき得られた報酬(reward(time))を足し合わせて教師用データに
    state(time)はターゲットデータ(ねっっとワークに与える情報)にする

    ターゲットデータと教師用データで行動決定用ネットワークを更新

こんな感じです
こうすると、ループの初め(行動決定(a)のとき)で、
行動決定用ネットワークは学習後の状態に
価値計算用ネットワークは学習前の状態に
なります。

(Ape-Xのコードはgithubにあります(2020年12月21日時点制作中))

参照ページ
【強化学習初心者向け】シンプルな実装例で学ぶQ学習、DQN、DDQN【CartPoleで棒立て:1ファイルで完結、Kearas使用】