TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

リバーシ(オセロ)で深層強化学習 その5(DDQN)

前回は、環境を並列実行することでDQNの高速化を行った。

今回は、DQNの派生形である、Double DQN(DDQN)を試す。

Double DQN(DDQN)

一般的にQ学習は、\max _{a} Q\left(s_{t+1}, a\right)の項が行動価値を過大評価する傾向があり、それを抑制する手法としてDouble Q学習という手法がDQN以前からあった。
Double DQNは、Double Q学習の手法をDQNに適用したアルゴリズムになる。
[1509.06461] Deep Reinforcement Learning with Double Q-learning


具体的には、DQNでは行動価値の評価に単一のネットワークを使用していたが、DDQNではパラメータ\theta\theta'の2つのネットワークを使用して、 以下の式で行動価値を評価する。

\displaystyle
\begin{equation}\label{TDDQ}
Y^{\text{DoubleQ}}_t \equiv R_{t+1} + \gamma Q(S_{t+1}, argmax_a Q(S_{t+1}, a; \theta_t); \theta'_t ) \,.
\end{equation}

この式は、パラメータ\thetaのネットワークが行動価値の最大となる行動を選択し、パラメータ\theta'のネットワークがその行動の行動価値を評価することを意味している。

学習方法

オリジナルのDouble Q学習では、2つのネットワークをランダムに割り当て、どちらかを一方を学習することで学習を行っている。
DDQNでは、ネットワークを完全に分離するのではなく、ネットワークのパラメータを定期的にコピーすることで、2つのネットワークを実現している。
これは、DQNでも行っていたことで、DQNの自然な発展となっている。

パラメータ\thetaのネットワークの部分を、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イテレーション移動平均)は以下の通りになった。
比較のためにDQNのグラフも載せている。
f:id:TadaoYamaoka:20191215175448p:plain

6000イテレーションくらいまでは、DQNよりも速く学習できている。
それ以降は、だいたい同じになっている。

強さ

ランダムプレイヤーと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の方がわずかに強いという結果になった。

Atariの結果でも、ゲームよっては悪化していたり、ほとんど差がないものもある。
f:id:TadaoYamaoka:20191215183933p:plain:w400
リバーシは差が出にくいようだ。

まとめ

DDQNでリバーシの学習を行った。
DQNと比較して、損失が速く低下するが、学習が進むと同じになることが確かめられた。
DQNと強さに明確な差はなかった。


次回は、Dueling Networkを試します。
(続く)