E資格対策・強化学習の重要数式の覚え方(9)DQNの損失関数を語呂合わせと計算例で確実に覚える

こんにちは。ゆうせいです。

E資格の強化学習で出題される重要数式を、1つずつ覚えていくシリーズの第9回です。

前回は、次の状態での Q 値の最大値を使って行動価値を学ぶ「Q学習」を学びました。今回は、Q学習をニューラルネットワークで行う「DQN(Deep Q-Network)」の損失関数を取り上げます。

DQNは、強化学習とディープラーニングを組み合わせた「深層強化学習」の代表的な手法です。テレビゲームの画面を見ながら、人間と同じくらい上手にプレイできるようになったことで広く知られるようになりました。E資格では、損失関数の式に加えて、「ターゲットネットワーク」と「経験再生」という2つの工夫の目的がよく問われます。

この記事のゴール

  • DQNの損失関数を、何も見ずに書けるようになる
  • Q学習の更新式と、DQNの損失関数のつながりを説明できるようになる
  • ターゲットネットワークと経験再生の目的を説明できるようになる
  • 損失関数の値を手計算できるようになる

第8回の復習

前回学んだQ学習の更新式を確認します。

Q(S_t, A_t) \leftarrow Q(S_t, A_t) + \alpha [R_{t+1} + \gamma \max_{a'} Q(S_{t+1}, a') - Q(S_t, A_t)]

覚え方は次のとおりでした。

  • キュー学習は、究極(きゅうきょく)の一手で答え合わせ
  • Q学習は、ある我慢、次のマックスキュー
  • 大文字は実際、小文字は候補

なぜニューラルネットワークを使うのか

Q学習では、状態と行動の組み合わせごとに Q 値を表(Qテーブル)に記録しました。この方法は、状態の数が少ないときにはうまくいきます。

しかし、テレビゲームの画面を状態として扱う場合はどうでしょうか。画面は数万個の画素(ピクセル)でできていて、それぞれの画素の色の組み合わせは天文学的な数になります。すべての画面について Q 値を表に書き込むことは、とてもできません。また、表では、一度も見たことのない画面の Q 値は分かりません。

そこで、表の代わりにニューラルネットワークを使って Q 値を計算します。

方法入力出力得意なこと
Qテーブル状態と行動表に書かれた Q 値状態の数が少ない問題
DQN状態(ゲーム画面など)行動ごとの Q 値状態の数が非常に多い問題、見たことのない状態

DQNのネットワークは、状態を入力すると、選べるすべての行動の Q 値を一度に出力します。たとえば、行動が「左、右、ジャンプ」の3つなら、出力は3つの数値になります。似た画面には似た Q 値を出力できるので、一度も見たことのない画面にも対応できます。

DQNの損失関数

今回覚える式は次のとおりです。

L(\theta) = \mathbb{E}[(r + \gamma \max_{a'} Q(s', a'; \theta^{-}) - Q(s, a; \theta))^2]

記号の意味は次のとおりです。

記号読み方意味
L(\theta)エル・シータ損失関数。小さいほど予想が正確であることを表す
θシータ学習中のネットワーク(メインネットワーク)の重み
\theta^{-}シータ・マイナスターゲットネットワークの重み。少し前の θ のコピー
Q(s, a; \theta)キュー重み θ のネットワークが出力する、状態 s と行動 a の Q 値
セミコロン(;)-左側が入力(状態と行動)、右側がネットワークの重み
\mathbb{E}イー期待値。実際には、ミニバッチの平均で計算する

かっこの中を、2つに分けて見てみます。

  • 目標値:r + \gamma \max_{a'} Q(s', a'; \theta^{-})
  • 予想:Q(s, a; \theta)

式全体を日本語にすると、次のようになります。

「ターゲットネットワークで計算した目標値と、メインネットワークの予想とのズレを2乗して平均した値」

ディープラーニングでは、この損失が小さくなるように、勾配降下法でメインネットワークの重み θ を少しずつ更新します。

練習問題1

DQNの損失関数として正しいものを選んでください。

  • ア:L(\theta) = \mathbb{E}[(r + \gamma \max_{a'} Q(s', a'; \theta) - Q(s, a; \theta^{-}))^2]
  • イ:L(\theta) = \mathbb{E}[r + \gamma \max_{a'} Q(s', a'; \theta^{-}) - Q(s, a; \theta)]
  • ウ:L(\theta) = \mathbb{E}[(r + \gamma \max_{a'} Q(s', a'; \theta^{-}) - Q(s, a; \theta))^2]
  • エ:L(\theta) = \mathbb{E}[(r + \gamma Q(s', a'; \theta^{-}) - Q(s, a; \theta))^2]

練習問題1の解答と解説

正解はウです。

目標値にはターゲットネットワークの重み \theta^{-} を使い、予想にはメインネットワークの重み θ を使います。そして、そのズレを2乗します。

  • アは誤りです。θ と \theta^{-} が入れ替わっています。ターゲットネットワークは、目標値の計算に使います。
  • イは誤りです。2乗していません。2乗しないと、プラスのズレとマイナスのズレが打ち消し合ってしまいます。
  • エは誤りです。max がありません。DQNはQ学習をもとにした手法なので、次の状態での Q 値の最大値を使います。

語呂合わせで覚える

語呂合わせ1:DQNの損失は、Q学習のズレの2乗

DQNの損失関数のかっこの中は、Q学習のTD誤差とほぼ同じ形です。

Q学習のTD誤差:

\delta_t = R_{t+1} + \gamma \max_{a'} Q(S_{t+1}, a') - Q(S_t, A_t)

DQNの損失関数:

L(\theta) = \mathbb{E}[(r + \gamma \max_{a'} Q(s', a'; \theta^{-}) - Q(s, a; \theta))^2]

覚え方は「DQNの損失は、Q学習のズレの2乗」です。

ディープラーニングで回帰問題を解くときには、「正解 − 予想」を2乗して平均する平均二乗誤差(MSE)を損失関数にすることがよくあります。DQNは、Q学習の目標値を「正解」の代わりに使って、平均二乗誤差を最小にしているのです。

ディープラーニングの回帰DQN
正解ラベル目標値 r + \gamma \max_{a'} Q(s', a'; \theta^{-})
ネットワークの予想Q(s, a; \theta)
損失関数ズレの2乗の平均(平均二乗誤差)

Q学習では、学習率 α を掛けて Q テーブルの値を直接直していました。DQNでは、損失関数の勾配を使ってネットワークの重みを直します。直す対象は違いますが、「目標に予想を近づける」という考え方は同じです。

語呂合わせ2:目標は昔の自分、予想は今の自分

θ の右肩のマイナス記号は、「少し前の重みのコピー」であることを表しています。

  • θ:今まさに学習している重み(今の自分)
  • \theta^{-}:一定の間隔でコピーされた、少し前の重み(昔の自分)

覚え方は「目標は昔の自分、予想は今の自分」です。

目標値を計算するのは昔の自分(\theta^{-})、予想を出すのは今の自分(θ)です。マイナスは「少し前」を表す印だと考えておくと、2つの重みの位置を間違えにくくなります。

語呂合わせ3:セミコロンの後ろはネットワークの中身

Q(s, a; \theta) のセミコロン(;)は、入力と重みを区切る記号です。

  • セミコロンの前:状態 s と行動 a(ネットワークに入力するもの)
  • セミコロンの後ろ:重み θ(ネットワークの中身)

覚え方は「セミコロンの後ろはネットワークの中身」です。

同じ状態と行動を入力しても、重みが違えば出力される Q 値は変わります。どちらのネットワークで計算した Q 値なのかを区別するために、セミコロンの後ろに重みを書いています。

工夫1:ターゲットネットワーク

なぜ目標値を別のネットワークで計算するのか

Q学習の目標値には、Q 値そのものが含まれていました。もし、目標値も予想と同じネットワーク θ で計算すると、次のような問題が起きます。

  1. 予想を目標値に近づけるために、重み θ を更新する
  2. 重み θ が変わると、目標値も同時に変わってしまう
  3. 目標値が動くので、また重みを更新する
  4. 1から3を繰り返し、目標値と予想が追いかけっこをして学習が安定しない

弓道で、的が毎回動いていたら、なかなか当たりません。そこで、目標値を計算するためのネットワーク(ターゲットネットワーク)を別に用意し、その重み \theta^{-} は一定の間隔でしか更新しないようにします。こうすると、しばらくの間は的が止まるので、落ち着いて狙いを定められます。

覚え方は「動く的には当てにくい。だから的を止める」です。

ターゲットネットワークの更新方法

ターゲットネットワークの重みは、たとえば数千回の更新ごとに、メインネットワークの重みをそのままコピーして更新します。

\theta^{-} \leftarrow \theta

コピーしてから次のコピーまでの間は、\theta^{-} は変わりません。その間、メインネットワークだけが学習を進めます。

勾配は目標値の側には流さない

損失関数を重み θ で微分するとき、目標値の側は定数として扱います。目標値は \theta^{-} で計算されているので、θ を変えても目標値は変わらないからです。

損失をメインネットワークの出力で微分すると、次のようになります。

\frac{\partial L}{\partial Q(s, a; \theta)} = -2(y - Q(s, a; \theta))

ここで y は目標値です。予想が目標値より小さければ微分の値は負になり、勾配降下法によって予想を大きくする方向に重みが更新されます。前回までの「TD誤差が正なら上方修正」と同じ動きです。

練習問題2

DQNでターゲットネットワークを使う主な目的として、最も適切なものを選んでください。

  • ア:学習の目標値が更新のたびに大きく動くのを防ぎ、学習を安定させる
  • イ:過去の経験を保存しておき、ランダムに取り出して学習に使えるようにする
  • ウ:ランダムな行動を選ぶ確率を、学習の進み具合に合わせて小さくしていく
  • エ:Q 値が最大の行動を選ぶ役と、その行動を評価する役を別々に分ける

練習問題2の解答と解説

正解はアです。

ターゲットネットワークは、目標値の計算に使う重みを一定期間固定することで、目標値が動き続ける問題を防ぎます。

  • イは誤りです。過去の経験を保存してランダムに取り出すのは、次に説明する経験再生の目的です。
  • ウは誤りです。ε-greedy 法の ε を小さくしていく工夫の説明です。
  • エは誤りです。行動を選ぶ役と評価する役を分けるのは、後で紹介する Double DQN の工夫です。

工夫2:経験再生(Experience Replay)

なぜ経験をためてから学習するのか

ゲームをプレイして得られる経験は、時間的に連続しています。ある画面の次の画面は、ほとんど同じ見た目です。このような似た経験ばかりを続けて学習すると、ネットワークが直近の状況に偏って学習してしまいます。

また、1回の経験を1回だけ使って捨ててしまうのは、もったいないことでもあります。

そこで、経験再生という工夫を使います。

  1. 経験(状態 s、行動 a、報酬 r、次の状態 s')を、リプレイバッファと呼ばれる記憶領域にためておく
  2. 学習するときは、リプレイバッファからランダムに複数の経験を取り出す(ミニバッチ)
  3. 取り出した経験を使って、損失関数を計算し、重みを更新する

経験再生には、次の2つの効果があります。

効果内容
経験どうしの相関を弱めるランダムに取り出すので、連続した似た経験ばかりで学習することを避けられる
経験を何度も再利用できる1つの経験を複数回の学習に使えるので、データを効率よく使える

覚え方は「経験はためて、シャッフルして復習」です。

試験勉強で、1つの単元だけを続けて解くより、いろいろな単元の問題を混ぜて復習した方が、偏りなく力が付きます。経験再生も同じ考え方です。

経験再生が使えるのは方策オフ型だから

前回、Q学習は方策オフ型なので、過去に別の方策で集めた経験データを使って学習できる、と説明しました。リプレイバッファにたまっている経験は、少し前の方策で集めたものです。それでも学習に使えるのは、DQNがQ学習をもとにした方策オフ型の手法だからです。

前回の「サルサは5ステップ、キュー学習は4ステップ」のとおり、Q学習の更新には次の行動が必要ありません。リプレイバッファに保存するのが、状態、行動、報酬、次の状態の4つで済むのもそのためです。

計算例で確かめる

計算例1:1つの経験での損失

リプレイバッファから、次の経験を1つ取り出したとします。

  • 報酬:r = 1
  • 割引率:γ = 0.9
  • ターゲットネットワークが出力した、次の状態での Q 値:行動 a_1 が 5、行動 a_2 が 8
  • メインネットワークが出力した、今の状態と行動の Q 値:Q(s, a; \theta) = 6

まず、目標値を計算します。次の状態での Q 値の最大値は 8 です。

y = 1 + 0.9 \times 8 = 1 + 7.2 = 8.2

次に、ズレを計算します。

8.2 − 6 = 2.2

最後に、ズレを2乗します。

L = 2.2^2 = 4.84

計算例2:ミニバッチでの損失

実際の学習では、複数の経験をまとめて取り出し、損失の平均を計算します。ミニバッチの大きさを N とすると、損失関数は次のように計算します。

L(\theta) = \frac{1}{N} \sum_{i=1}^{N} (y_i - Q(s_i, a_i; \theta))^2

3つの経験を取り出し、目標値と予想が次のようになったとします。

経験目標値 y予想 Qズレズレの2乗
18.262.24.84
234-11
35500

損失は、ズレの2乗の平均です。

L = \frac{4.84 + 1 + 0}{3} = \frac{5.84}{3} \approx 1.95

経験2のようにズレがマイナスでも、2乗すると正の値になります。2乗することで、プラスのズレとマイナスのズレが打ち消し合わないようにしています。

計算例3:終端状態に移った経験

次の状態が終端状態のときは、その後に行動がないので、目標値は報酬だけになります。

y = r

たとえば、報酬が 10、予想が 7 であれば、損失は (10 − 7) の2乗で 9 です。

実際のプログラムでは、終端状態かどうかを表す値 d(終端なら1、そうでなければ0)を使って、次のように目標値を計算することがよくあります。

y = r + \gamma (1 - d) \max_{a'} Q(s', a'; \theta^{-})

d = 1 のときは (1 − d) が 0 になるので、目標値は報酬 r だけになります。

練習問題3

次の経験について、DQNの損失の値を選んでください。

  • 報酬:r = 1
  • 割引率:γ = 0.9
  • ターゲットネットワークの次の状態での Q 値:行動 a_1 が 5、行動 a_2 が 8
  • メインネットワークの今の Q 値:Q(s, a; \theta) = 6
  • ア:2.2
  • イ:9.0
  • ウ:0.25
  • エ:4.84

練習問題3の解答と解説

正解はエです。

計算例1と同じ数値です。目標値は 1 + 0.9 × 8 = 8.2、ズレは 8.2 − 6 = 2.2、その2乗は 4.84 です。

  • アの2.2は、ズレを2乗し忘れた値です。
  • イの9.0は、割引率を掛け忘れた値です。目標値が 1 + 8 = 9 になり、ズレは 3、その2乗が 9 になります。
  • ウの0.25は、max ではなく小さい方の Q 値 5 を使った値です。目標値が 1 + 0.9 × 5 = 5.5 になり、ズレは -0.5、その2乗が 0.25 になります。

練習問題4

報酬が 4 で、次の状態が終端状態である経験を取り出しました。メインネットワークの今の Q 値が 6 のとき、DQNの損失の値を求めてください。

練習問題4の解答と解説

答えは4です。

次の状態が終端状態なので、目標値は報酬だけで y = 4 です。ズレは 4 − 6 = -2、その2乗は 4 です。

ズレが負なので、予想の 6 は大きすぎたことになります。重みは、Q 値を小さくする方向に更新されます。

発展:Double DQN

Q 値の過大評価を抑える工夫

前回、Q学習は max を使うため、Q 値を大きく見積もりすぎる(過大評価する)ことがあると説明しました。DQNでも同じ問題が起きます。

Double DQN は、目標値の計算を次のように変えて、過大評価を抑えます。

y = r + \gamma Q(s', \arg\max_{a'} Q(s', a'; \theta); \theta^{-})

目標値の計算を、次の2つの役割に分けています。

  1. 次の状態で、どの行動が一番良いかを選ぶ:メインネットワーク θ を使う(argmax)
  2. 選んだ行動の Q 値を評価する:ターゲットネットワーク \theta^{-} を使う

DQNでは、同じターゲットネットワークで「選ぶ」と「評価する」の両方を行っていました。そのため、たまたま大きく見積もられた Q 値が選ばれ、そのまま目標値に使われてしまいます。Double DQN では、2つのネットワークに役割を分けることで、片方のネットワークの見積もりすぎがそのまま目標値に入ることを防ぎます。

覚え方は「選ぶのは今の自分、評価するのは昔の自分」です。

計算例4:DQNと Double DQN の目標値を比べる

次の状況を考えます。報酬は r = 1、割引率は γ = 0.5 です。

次の状態での行動メインネットワーク θ の Q 値ターゲットネットワーク \theta^{-} の Q 値
a_174
a_256

DQNの目標値は、ターゲットネットワークの Q 値の最大値を使います。

y = 1 + 0.5 × 6 = 4

Double DQN の目標値は、次の手順で計算します。

  1. メインネットワークで一番良い行動を選ぶ:7 と 5 のうち大きいのは a_1
  2. ターゲットネットワークで a_1 の Q 値を評価する:4
  3. y = 1 + 0.5 × 4 = 3

Double DQN の目標値 3 は、DQNの目標値 4 よりも小さくなりました。2つのネットワークの意見が分かれているときに、目標値が大きくなりすぎないことが分かります。

練習問題5

DQNについて、適切でないものを選んでください。

  • ア:経験再生により、連続した経験どうしの相関を弱められる
  • イ:損失を計算するとき、目標値の側にも勾配を流して重みを更新する
  • ウ:終端状態に移った経験では、目標値は報酬 r だけになる
  • エ:ターゲットネットワークの重みは、一定の間隔でコピーして更新する

練習問題5の解答と解説

正解はイです。

DQNでは、目標値の側は定数として扱い、勾配を流しません。勾配を使って更新するのは、予想を出すメインネットワークの重み θ だけです。目標値の側にも勾配を流すと、目標値まで動いてしまい、ターゲットネットワークを使う意味がなくなります。

  • アは正しい説明です。経験はためて、シャッフルして復習します。
  • ウは正しい説明です。終端状態の後には行動がないので、目標値は報酬だけです。
  • エは正しい説明です。動く的には当てにくいので、的はしばらく止めておきます。

DQNのまとめ表

試験直前の確認用に、DQNとその発展形の要点を1つの表にまとめます。

項目内容語呂合わせ
損失関数Q学習のTD誤差の2乗の平均DQNの損失は、Q学習のズレの2乗
目標値の重みターゲットネットワーク \theta^{-}目標は昔の自分、予想は今の自分
ターゲットネットワーク目標値を一定期間固定して学習を安定させる動く的には当てにくい。だから的を止める
経験再生経験の相関を弱め、データを再利用する経験はためて、シャッフルして復習
Double DQN行動の選択と評価を分けて過大評価を抑える選ぶのは今の自分、評価するのは昔の自分

DQNの発展形には、ほかにも、Q 値を状態の価値と行動の有利さに分けて計算する Dueling Network や、TD誤差が大きい経験を優先して取り出す優先度付き経験再生などがあります。どちらもE資格で出題されることがあるので、余裕があれば調べておきましょう。

初学者がつまずきやすい点

つまずきやすい点正しい理解
θ と \theta^{-} の位置を逆にする目標は昔の自分(\theta^{-})、予想は今の自分(θ)
ズレを2乗し忘れるDQNの損失は、Q学習のズレの2乗
目標値の max を書き忘れるDQNはQ学習がもとなので、次の状態での Q 値の最大値を使う
目標値の側にも勾配を流す目標値は定数として扱い、メインネットワークの θ だけを更新する
ターゲットネットワークと経験再生の目的を混同するターゲットネットワークは的を止める、経験再生はシャッフルして復習
DQN と Double DQN の目標値を混同するDouble DQN は、選ぶのは今の自分、評価するのは昔の自分

白紙に書いて確認しよう

記事を読み終えたら、何も見ずに次の5つを紙に書いてみてください。

  1. DQNの損失関数
  2. ミニバッチで計算するときの損失関数
  3. ターゲットネットワークの目的(一言で)
  4. 経験再生の2つの効果
  5. Double DQN の目標値

書き終えたら、θ と \theta^{-} の位置、2乗の付け忘れ、max の付け忘れの3点を確認してください。

まとめ

  • DQNは、Q学習の Q テーブルをニューラルネットワークに置き換えた手法です
  • 損失関数は、Q学習のTD誤差の2乗の平均です。DQNの損失は、Q学習のズレの2乗です
  • 目標値はターゲットネットワーク \theta^{-}、予想はメインネットワーク θ で計算します。目標は昔の自分、予想は今の自分です
  • ターゲットネットワークは、目標値を一定期間固定して学習を安定させます。動く的には当てにくいので、的を止めます
  • 経験再生は、経験の相関を弱め、データを再利用するための工夫です。経験はためて、シャッフルして復習します
  • Double DQN は、行動の選択と評価を2つのネットワークに分けて、過大評価を抑えます

次回は、シリーズ最終回として、Q 値を使わずに方策そのものを直接学習する「方策勾配定理(REINFORCE)」を取り上げます。これまでの価値ベースの手法とは考え方が大きく変わるので、第3回で学んだ方策 π の記号を復習しておいてください。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
海外放浪の末、2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。