今回は、DQNの派生形である、Double DQN(DDQN)を試す。
Double DQN(DDQN)
一般的にQ学習は、の項が行動価値を過大評価する傾向があり、それを抑制する手法としてDouble Q学習という手法がDQN以前からあった。
Double DQNは、Double Q学習の手法をDQNに適用したアルゴリズムになる。
[1509.06461] Deep Reinforcement Learning with Double Q-learning
具体的には、DQNでは行動価値の評価に単一のネットワークを使用していたが、DDQNではパラメータとの2つのネットワークを使用して、 以下の式で行動価値を評価する。
この式は、パラメータのネットワークが行動価値の最大となる行動を選択し、パラメータのネットワークがその行動の行動価値を評価することを意味している。
学習方法
オリジナルのDouble Q学習では、2つのネットワークをランダムに割り当て、どちらかを一方を学習することで学習を行っている。
DDQNでは、ネットワークを完全に分離するのではなく、ネットワークのパラメータを定期的にコピーすることで、2つのネットワークを実現している。
これは、DQNでも行っていたことで、DQNの自然な発展となっている。
パラメータのネットワークの部分を、DQNの挙動方策に使用していたネットワーク(policy_net)を使用することで簡単に実現できる。
実装
DQNのコードとほとんど同じため、実行時引数によって、学習処理を条件分岐するようにして実装した。
if args.ddqn: max_a = policy_net(non_final_next_states).gather(1, non_final_next_actions).max(1)[1].unsqueeze(1) target_q = target_net(non_final_next_states).gather(1, non_final_next_actions) next_state_values[non_final_mask] = -target_q.gather(1, max_a).squeeze().detach() else: target_q = target_net(non_final_next_states) next_state_values[non_final_mask] = -target_q.gather(1, non_final_next_actions).max(1)[0].detach()
DQNでは、target_netの出力の最大値(合法手のみ)を直接使用して、next_state_valuesを算出していたところを、DDQNでは、一旦policy_netで出力したQ値が最大(合法手のみ)となる手を選択した後、その手をtarget_netで評価している。
学習結果
学習結果は以下のようになった。
強さ
ランダムプレイヤーと1000局対局を行った結果は以下の通りになった。
結果 | 勝率(信頼区間95%) | |
---|---|---|
DQN | 833勝152敗15分 | 86.7~82.2% |
DDQN | 847勝131敗22分 | 88.6~84.3% |
DDQNの方が勝率が少し高くなっている。
DDQNとDQNの対局結果は以下の通りとなった。
先後入れ替えてそれぞれ1000局対局した。
グリーディー戦略では、勝敗が決定的になるため、ソフトマックス戦略で温度は0.1とした。
先手 | 後手 | 結果 | 勝率(信頼区間95%) |
---|---|---|---|
DDQN | DQN | 451勝523敗26分 | 49.4~43.2% |
DQN | DDQN | 474勝491敗35分 | 52.2~46.0% |
計(DDQN-DQN) | 942勝997敗61 | 52.2~50.8% |
直接対局では、顕著な差ではないが、DQNの方がわずかに強いという結果になった。