ひとことで言うと
DQN(Deep Q-Network)は、状態と行動の組に対する行動価値 をニューラルネットで近似し、Q学習の更新を深層学習の勾配更新で実行する構成です。ネットワークへの入力は状態 、出力は各行動の価値で、最大の出力を選べば貪欲な行動になります。
ゲーム画面を見て「このボタンを押すと、この先どれくらい得をするか」を行動ごとに採点する担当者を、画像から採点できる関数に置き換えたものです。ただし採点結果をすぐ次の採点基準に使うと基準が揺れるため、過去のプレイ記録と、少し前の採点器を併用します。
なぜ必要か
表形式のQ学習なら、状態 と行動 の組ごとに値を持てます。しかし画像のように状態空間が大きいと、状態を一つずつ表に登録する方法は使えません。DQNは畳み込みニューラルネットを関数近似器にして、画素から特徴を抽出しながら、見たことのない状態にも価値を一般化します。原論文の初期構成は、生の画素を入力し、各行動の価値を出力するCNNです。
ここでQ学習へそのままニューラルネットを持ち込むと、二つの問題が出ます。
| 壊れる理由 | 何が起きるか | DQNの手当 |
|---|---|---|
| サンプルの相関 | 連続した時刻の遷移は似ており、ミニバッチが同じ局面に偏る | 経験再生で過去の遷移からランダムサンプル |
| 方策と教師の同時変化 | 重みを更新すると行動選択もQ学習のターゲットも変わる | 固定ターゲットネットワークを一定期間使う |
経験再生は遷移をメモリに保存し、そこからランダムに取り出します。これで隣接時刻の相関を弱め、過去の行動からも繰り返し学習できます。固定ターゲットは、更新するオンラインネットワークとは別のネットワークで教師値を計算し、その重みをしばらく固定します。どちらも「ニューラルネットを大きくすれば解決する」種類の問題ではありません。
仕組み
状態 、行動 、報酬 、次状態 、割引率 、オンラインネットワークの重み を使います。ネットワークは を出力し、経験再生から遷移 のミニバッチを選びます。終端でない場合のターゲットは、固定したターゲットネットワークの重み で次状態の最大価値を評価して作ります。
は次状態で候補となる行動、 は教師値、 は固定期間中に変えない重みです。終端状態なら将来報酬はないので、ターゲットは とします。オンライン側の予測 とターゲットの差を損失にし、 だけを更新します。
は経験再生メモリから作る遷移の分布です。重要なのは、ターゲット計算に使う を勾配更新の対象に含めないことです。一定回数ごとに とコピーし、教師側の変化を段階的にします。
行動選択は通常、常に最大値を選ぶのではなく ε-greedy にします。
は探索の確率です。学習中は未知の行動を試すためにランダム選択を残し、評価時には貪欲選択に寄せます。なお、Q学習は実際に従う探索方策とは別に、最大価値を取る方策を学ぶオフ方策の更新です。
画面入力では、画像をそのまま全結合層へ渡すのではなく、畳み込み層で局所的な視覚特徴を抽出し、最後の層で行動数個のQ値へ変換します。出力は「行動の確率」ではなく「各行動を選んだときの将来報酬の推定値」です。方策勾配系は、ここで扱う価値ベースの構成とは別系統です。
試験でどう問われるか
| 問われ方 | 正解に寄る条件 | 引っかけ |
|---|---|---|
| DQNの出力 | 状態から各離散行動のQ値を出す | softmaxで行動確率だけを出す |
| 経験再生の目的 | 相関した連続遷移をランダム化し、過去サンプルを再利用する | ターゲット値を固定する仕組みとする |
| 固定ターゲットの目的 | 別ネットワークの重みを一定期間固定して教師の揺れを抑える | 探索のために行動をランダム化する仕組みとする |
| ε-greedy | 最大Q値を確率 、ランダム行動を確率 で選ぶ | 常に最大Q値だけを選ぶ |
| 画像入力の構成 | 生の画素をCNNへ入力し、行動ごとの価値を出力する | 画像を人手で特徴量へ変換する前提にする |
実装で確かめる
次の最小例は、経験再生からバッチを取り出し、固定ターゲットでTDターゲットを作る部分です。ネットワーク自体は省き、配列の対応を確認します。
import numpy as np
rng = np.random.default_rng(0)
states = rng.normal(size=(6, 4))
actions = np.array([0, 1, 0, 1, 1, 0])
rewards = np.array([1., 0., -1., 2., 0., 1.])
next_states = rng.normal(size=(6, 4))
done = np.array([0, 0, 1, 0, 1, 0], dtype=bool)
idx = rng.choice(len(states), size=3, replace=False)
q_online = rng.normal(size=(3, 2))
q_target = rng.normal(size=(3, 2))
gamma = 0.99
y = rewards[idx] + gamma * (~done[idx]) * q_target.max(axis=1)
prediction = q_online[np.arange(3), actions[idx]]
print("batch", states[idx].shape, "target", np.round(y, 3), "prediction", np.round(prediction, 3))
このコードで states と next_states は同じ遷移の組として保持され、q_online からは実際に選んだ行動の値だけを取り出します。ターゲットは q_target の最大値を使い、done が真の遷移では割引された将来価値を足していません。実装でネットワークを分けるときも、この役割の分離が崩れていないかを確認します。
取り違えやすいもの
| 用語 | DQNとの切り分け |
|---|---|
| 表形式Q学習 | Q値を表に保持する。DQNはニューラルネットで状態からQ値を近似する |
| 経験再生 | 遷移を保存してサンプル相関を弱める仕組み。ネットワークではない |
| 固定ターゲットネットワーク | TDターゲットを作る重みを固定する仕組み。探索そのものではない |
| ε-greedy | 行動を選ぶ探索方策。Q値の教師を安定させる機構ではない |
| 方策勾配法 | 方策を直接パラメータ化して更新する系統。DQNの価値出力とは目的が違う |
| Double DQN | 最大行動の選択と評価を分ける派生手法。ここでの基本DQNの固定ターゲットとは別の論点 |
想起チェック
ニューラルネットでQ学習を行うとき、連続サンプルが問題になる理由は
隣接時刻の状態・行動が似ているため、ミニバッチのサンプルが強く相関します。経験再生は過去の遷移からランダムに取り出して、この相関を弱めます。
固定ターゲットネットワークは何を固定するか
ターゲット を計算するネットワークの重み を一定期間固定します。更新するオンラインネットワークの重み と同時には動かしません。
ε-greedyで確率εのときに行うことは
ランダムな行動を選びます。確率 では、Q値が最大の行動を選びます。
DQNの画像入力で、ネットワークの出力は何か
行動ごとのQ値です。行動確率ではなく、その行動から得られる将来報酬の推定値を出力します。