この記事は自作している強化学習フレームワークの解説記事です。
・フレームワークの記事
・GitHub
前:古典強化学習編
理論パート:ここ
実装パート:未定
はじめに
強化学習の記事を書いているといろいろなアイデアは沸いてくるもので…
結構考えがまとまってきたので一度記事に起こします。
ベースとなるアイデアは以前と変わらず探索(Exploration)と活用(Exploitation)の分離です。
まずは離散制御/MDPを想定した環境で最適なアルゴリズムを模索してみました。
※本記事の実装はフレームワーク上でGoDQ-v1として公開しています
※この記事は考え方優先で書いていますので厳密な定義とは違う内容がある点はご了承ください(致命的な点はご指摘いただければと思います)
行動価値 vs 方策
強化学習には大きくDQN系列(行動価値の学習)とPPO系列(方策の学習)があります。
(PPO系列というと怒られそうですが、ナイーブな方策学習手法という意味でのPPOとなります)
(Acrot-Criticですが、Criticは方策を学習する上での補助的な役割という位置づけが多いので方策側としています)
どちらを使うかを以下の2点から考察します。
・学習の安定性
経験によるところも大きいですが、方策の学習は行動価値の学習に比べて安定しない気がします。
これは方策の方が単純に学習しないといけない空間が広いからだと考えています。
方策の学習では以下の状態価値を最大化にする方策を学習します。(ベルマン方程式)
V_{\pi}(s_t) = \color{red}{\sum_{a} \pi(a_t|s_t) \sum_{s} p(s_{t+1}|s_t,a_t)} \Big(r + \gamma V_{\pi}(s_{t+1}) \Big)
一方Q学習ではあるアクションを取った後の行動価値を学習します。
Q_{\pi}(s_t,a_t) = \color{red}{\sum_{s} p(s_{t+1}|s_t,a_t)} \Big(r + \gamma V_{\pi}(s_{t+1}) \Big)
赤が確率による遷移が関わる部分です。
方策の学習では、2段階の確率遷移をした後に、値が最大になるように間接的に学習します。
それに比べ、Q学習では1段階の確率遷移後の値を直接学習します。
行動価値のほうが学習する空間が小さいので学習しやすさがあるかと思います。
・オフポリシー vs オンポリシー
学習したい方策と学習に使うデータの方策が同じ場合をオンポリシー、違う場合をオフポリシーといいます。
オンポリシーは探索と学習を同じ方策にする必要があり、学習する上で制約がかなり多くなります。
探索と活用の分離を考える上で、いろいろなアイデアを試したい場合この制約がかなりやっかいです。
また、分散学習などを考えると…、考えることが多くなりすぎるのでオンポリシーな手法は使わない方向で行きたいと思います。
・オフポリシー/オンポリシーについて
アイシアさんの動画が分かりやすかったので引用します。
オフポリシー/オンポリシーについては明確な定義がないようです。
ざっくり3種類の解釈があります。
- 学習時の方策と最終的に推定したい方策が同じか違うか
- 学習データの方策が、現在の方策と同じか違うか
- 現在の方策で学習データを集めるか(オンポリシー)、違う方策で学習データを集めるか(オフポリシー)
この記事では2番目の考えで、学習時のデータの方策が学習直前のモデルの方策と同じ場合をオンポリシー、違う場合をオフポリシーと言っています。
一応オンポリシー学習の対策は以下があります。
- 学習サイクルの工夫(分散学習では難しいかも)
- 各アルゴリズムで対策
学習サイクルの方法としては以下です。
# オフポリシーな学習ループ(過去のデータも使いまわす)
memory = []
while 学習ループ:
# --- 学習データの収集
state = env.step(action)
memory.append(state)
# --- 学習(過去のデータをランダムに取得)
batches = memory.sample()
train(state)
# オンポリシーな学習ループ(1stepで得たデータをそのまま学習に使う)
while 学習ループ:
# --- 学習データの収集
state = env.step(action)
# --- 学習
train(state)
・DQNの方策の種類
DQNの更新式には3種類の方策が使われています。
コードでコメントを書くと以下です。
reward = batch["reward"] # [3]
next_maxq = max(q_net_target(next_state)) # [2]
target_q = reward + (1-done) * disciount * next_maxq # [3] + [2]
q = q_net(state) # [1]
td_error = q - target_q # [1] - [3]+[2]
# [1] 現方策(max-greedy)
# [2] targetの現方策(max-greedy)
# [3] 古い方策(ε-greedy)
分布シフト問題(オフポリシー問題)
問題の正式名称が調べても分からなかったので仮です。
これは重点サンプリングが扱っている問題の発展系となります。
・前提知識
重点サンプリングについてです。
知っている場合はとばしてください。(昔どっかで書いた内容)
モンテカルロ法で期待値を求める場合を考えます。
この場合、サンプリングした確率分布と期待値の確率分布が異なるとそのままでは求めることができません。
例として、表が出る確率50%(+2)、裏が出る確率50%(+1)のコインを考えます。
期待値は以下です。
$$
0.5 \times 2 + 0.5 \times 1 = 1.5
$$
ここで実際にコインを投げて確かめてみようと思います。
しかしコインがゆがんでおり、表が出る確率は75%、裏は25%でした。
100回投げた結果、表が75回、裏が25回出たとします。
これをそのまま計算したら期待値にはなりません。
$$
\frac{75 \times 2 + 25 \times 1}{100} = 1.75
$$
この場合、重点サンプリングとして、$\frac{実際の確率}{サンプリング時の確率}$を各サンプルに対して掛けてやる必要があります。
今回ですと以下です。
$$
\frac{75 \times 2 \times \frac{0.5}{0.75} + 25 \times 1 \times \frac{0.5}{0.25}}{100} = 1.5
$$
ちゃんと正しい期待値になりましたね。
ベルマン方程式は基本的に期待値を求めて学習します。
オフポリシーではサンプリングしたデータの確率分布(方策)と学習したい確率分布(方策)が異なるのでこの問題が発生します。
更に強化学習ではもう少し深刻で、ステップ毎にこの確率分布のずれが積み重なっていきます。
・発生条件
この問題はnステップ先を見ると発生します。($n>1$)
具体的には以下の時です。
- データ収集時の累積割引報酬和の計算に、2step以上の報酬を含める(MC法やTD(λ)など)
- 学習時に2step以上先の価値を期待値に組み込む(multistepラーニング等)
行動価値の性質上、1ステップだけだと発生しません。
Q_{\pi}(s_t,a_t) = \sum_{s} p(s_{t+1}|s_t,a_t) \Big(r + \gamma \color{red}{\sum_{a} \pi(a_{t+1}|s_{t+1})} Q_{\pi}(s_{t+1},a_{t+1}) \Big)
赤字より右側の次の行動価値は、データ収集時の情報を含まないので分布シフトは発生しません。
しかし展開すると話が変わります。
Q_{\pi}(s_t,a_t) = \sum_{s_{t+1}} p(s_{t+1}|s_t,a_t)
\Bigg(r + \gamma
\color{red}{ \sum_{a}\pi(a_{t+1}|s_{t+1})} \sum_{s} p(s_{t+2}|s_{t+1},a_{t+1})
\Big(r + \gamma \sum_{a} \pi(a_{t+2}|s_{t+2})Q_{\pi}(s_{t+2},a_{t+2})
\Big) \Bigg)
展開後のステップで現方策の遷移(赤色の部分)が入るので、データ収集時に選んだアクションと結果が変わります。
その結果、次の状態の遷移と得られる報酬が(確率分布から見て)違うものになります。
・解決策
DQN系列ではretrace(以前書いた記事)、方策学習ではIMPALAで使われているV-traceで対処されている問題です。
(多分V-traceもこの問題のはず…、ちゃんと調べた時ない…)
行動価値まとめ
具体的な手法は実装に回しますが、以下の方針を立てています。
- 探索時の方策と学習時の方策は分けて考えたいので、行動価値によるオフポリシー学習を採用
- 分布シフト問題を意識したくないので1ステップの学習を基準とする(retraceは実装が複雑になりやすい)
・MDP vs POMDP
部分観測マルコフ決定過程ですが、今回は保留にしています。
一応LSTM+burnin不要のアイデアはあるのですが他の手法との兼ね合いがまとめきれなかったので後回しにし、一旦MDP環境を想定でいきます。
探索
内部報酬
一旦使わなくなったので備忘録に既存手法をまとめておきます。(今後使うかも)
- 内部報酬の種類(Agent57より)
- エピソード記憶(1エピソード内で同じ状態を訪れないようにする)
- 行動による変化のみに着目(ランダムで光る背景などは無視したい)
- Siamese network
- 行動による変化のみに着目(ランダムで光る背景などは無視したい)
- 生涯記憶(学習を通して同じ状態を訪れないようにする)
- RND
- SND
- kakky-hackerさんのコメントよりRND+ベースライン手法
- エピソード記憶(1エピソード内で同じ状態を訪れないようにする)
探索の方策
探索に特化した話はあまり聞かない印象です。
ここら辺はまだ試行錯誤中ですが、ε-greedyがなんだかんだいって強い印象を受けます。
- 候補アイデア
- ε-greedy
- 内部報酬の利用
- 前のアクションを基本使い90%の確率で別アクションにする(Go-Explore)
Go-Explore(save/load)
ある程度空間が広くなるとどうしても必要になる考えだと思っています。
Go-Explore(2020)(過去の記事)で明示されている手法で簡単に言うと、セーブ/ロードありきで遠いエリアまで探索を行おうというものです。
Go-Explore系列の論文をChatGPTに聞いてたところ以下の論文があるようです。
-
Intelligent Go-Explore: Standing on the Shoulders of Giant Foundation Models(2024)
セル関係の評価にLLMを利用して改善 -
Cell-Free Latent Go-Explore(2023)
ダウンサンプリングした画像ではなく、VAE等で圧縮した低次元の潜在空間を使う事でセルを自動生成(距離はユークリッド距離) -
Time-Myopic Go-Explore: Learning A State Representation for the Go-Explore Paradigm(2023)
時間的に近い空間同士をクラスタリングし、時間的な距離でセル同士を表現
Cell-Freeの考え方は確かにと思い、私も低次元への潜在空間を画像のダウンサンプリングの代替とする方針をとっています。
具体的には以下です。
- セル
- 状態を低次元の内部表現に変換し、これをセルとする
- セルには今の状態から再開できるように復元できる情報が入っている
- セルの距離は内部表現のユークリッド距離
- セルの統合条件
- 一定範囲のセルは1つのセルにまとめる
- 同じセルは報酬が多い方を優先
- 報酬が同じなら、スタート地点から遠い距離の方を優先
- セルの選択
- 開始位置から遠いセルを優先的にランクベースで選択
詳細は実装編で。
過大評価問題
初期値の過大評価問題
最近気になって以下の記事を書いた問題です。
初期値の正しくない評価(行動価値)が想像以上学習に悪影響を与えているという内容です。
ここら辺はまだ試行錯誤中ですが、オンライン学習でも過大評価の対処はかなり重要だと感じています。
RNDによる割引率の決定を暫定で採用しています。
パラメータのリセット
SR-SPR(過去記事)の論文にでてきた内容で、ニューラルネットワークの学習が進むと新規タスクに対する学習能力を失うという問題です。
強化学習は新規タスクばかりを学習するのでこの問題の対処は必須レベルだと感じています。
ただ、この問題はまだ研究が進んでいない印象を受けており、原因があまり分かっていません。
一応私の理解だと、ニューラルネットワークの学習が進むと内部パラメータがほぼ固定化してしまい、新しい情報を学習する余地がなくなってしまう問題だと思っています。
SR-SPRではパラメータをリセットする事でこの問題に対処しています。
リセット法を細かく見ると、Shrink(縮小) + Perturb(摂動)から成ります。
$$
\theta \leftarrow \lambda\theta + p
$$
- $\theta$:パラメータ
- $\lambda$:縮小率($0<\lambda<1$)
- $p \sim \mathcal{N}(0, \sigma^2)$:正規分布ノイズ
個人的には新しい情報の学習余地を作るのに重要なのは"縮小"な気がしています。
(というか縮小だけでいいのでは?)
"摂動"は局所解から抜け出すための乱数のイメージが強いです。
自分のニューラルネットワークの学習イメージは以下です。
縮小により過去の学習経験を保持しながら新しい学習余地を作るイメージです。
過大評価とオンライン学習とオフライン学習
私の考えをまとめると、オンライン学習は強化学習における正則化の役割で、この正則化が過大評価を抑えていると考えています。
別の手法で過大評価を抑えればオンライン学習の割合を減らすことができ、リプレイ率(1回のデータ収集に対する学習の回数)が上がります。
リプレイ率はオンライン学習とオフライン学習の割合を示したもので、リプレイ率を無限大にしたものがオフライン学習です。
モデル
内部表現
状態を直接使わずに内部表現に一度変換してから使う手法です。
例えばQ学習なら、状態をよりQ値を学習しやすい内部表現にする事で、学習の効率を上げる事が狙いとなります。
広義に見るとDQNも前半がCNN層になっているので、内部表現を獲得していると見ることもできます。
明示的に論文に書かれている手法は以下です。
- WorldModelシリーズ: VAE(+KLダイバージェンス)
- EfficientZero: SimSiam
- SPR: BYOL
ここら辺は自己教師あり学習の技術が使われているイメージです。
そっち方面はあまり知らないので…、要勉強ですね。
ここについては特にアイデアはないのでSPRの手法を暫定で採用しています。
手の先読み
ここはまだ手を付けれておらず、アイデアのみの紹介となります。
また用語としては、論文では強化学習の未来のステップの事を horizon と表現しているイメージです。
考え方としては大きく2つあります。
- データ収集時に先読みする(MCTS系列)
- 学習時に先読みする(WorldModel系列)
どちらもモデルベースが前提となっており、データ収集時の先読みは分布シフト問題が発生します。(EZ-V2では学習時にも先読みする事で対応)
学習時に先読みをすると方策が同じ(オンポリシー)になるので分布シフトは発生しませんが、学習コストが高くなることが問題となります。
MCTS
推論時にも手を先読みできるのが特徴です。(Planetは遺伝的アルゴリズム等で読んでいましたが…)
なかなか推論時にも精度を向上するという観点はないため、将棋みたいに本番ではじっくり考えてアクションを選ぶなど、本番に合わせたチューニングもできそうなので組み込みたいところです。
拡散モデル
手の先読みで重要なのが次の状態の予測です。
行動価値だけ見ると、確率的な要素はこの次の状態の遷移だけになるのでここの精度が先読み精度に直結します。
個人的に確率分布の予測は拡散モデル以上のものはないのではないか?と思っていたり…。
詳細は以前書いた拡散モデルの記事を見てもらえればと思いますが、SDEの逆拡散過程の予測力が強すぎる印象です。
拡散モデルの予測+MCTSによるシミュレーションでのQ値の精度向上がアイデアとなります。
さいごに
書いていたら長くなったので実装編は分けて次回にしたいと思います。