1 はじめに
タイム ループは人気のある映画やテレビのテーマであり、その設定は次のようなものがよくあります。つまり、主人公は能動的または受動的に過去に戻ることができます。同時に、主人公はそのような機会を利用して、これまでの経験の不完全な結果を変えることを望んでいます。この目的のために、主人公は結果が変わるように自分の行動を調整します。
タイム ループに関連したいくつかの映画: たとえば、最初のタイム ループ映画である「グラウンドホッグ デイ」は、グラウンドホッグ デー (2 月 2 日) に閉じ込められた男性主人公の物語です。一日の繰り返しの後、彼は常に自分の行動を調整しました。 , そしてついに最愛のヒロインを追い、タイムループから抜け出すことに成功した。
想像してみてください。あなたがタイム ループに陥った主人公の場合、利点を達成し、欠点を回避するにはどのように決定を下すべきでしょうか?
2. タイムトラベルと平行世界
意思決定の方法について議論する前に、まず、特定のタイムトラベル設定の下でのみ、主観的な主導権を発揮して利点を追求し、欠点を回避できることを指摘しなければなりません。
タイムトラベルの設定はタイムパラドックスから始まります。タイムパラドックスとは、時間旅行によって引き起こされる矛盾を指します。タイムパラドックスの例を見てみましょう。貴重な限定版を手に入れようと、オンラインでブラインド ボックスを購入しました。しかし、ブラインドボックスが届いて開けてみると、価値のない普通のモデルばかりで、貴重な限定版はありませんでした。このとき、私はタイムトラベルについて考え、限定版が手に入らないからブラインドボックスを買わないでくださいと過去の自分に言い聞かせることができます。そこで私は過去のアドバイスに従い、結果としてブラインドボックスは買わなかった。これは矛盾につながります。ブラインド ボックスを購入していないのに、ブラインド ボックスを購入した場合に限定版が入手できないことをどうやって知ることができるのでしょうか?ブラインドボックスを買うと限定版が手に入らないことを知らなかったので、過去の自分にどうやって伝えればいいのでしょうか?ここに矛盾があります。
このようなタイムパラドックスについては、いくつかの一般的な説明があります。
-
時間は不可逆です。この説明では、時間次元は非対称で不可逆であるという点で他の空間次元とは異なると考えられています。したがって、タイムトラベルは存在しません。この説明はタイムトラベルの存在を否定するものであり、パラドックスは起こり得ない。
-
運命のパラドックス: 運命のパラドックスはパラドックスではなく、時間のパラドックスの説明です。この説明では、タイムトラベルによって結果が変わることはなく、すべての結果は「あらかじめ定められ」ており、タイムトラベルが考慮された後の総合的な結果であると考えられています。例えばブラインドボックスの場合、ブラインドボックスを買うかどうかはすでにタイムトラベルを考慮した結果です。未来の私が過去の私にブラインドボックスは買うなと言っても、過去の私は頑なにブラインドボックスを買い、ついにブラインドボックスに限定版がないことを知ります。
-
平行宇宙: この説明では、タイムトラベラーが旅行するとき、彼らは元々住んでいた宇宙ではなく、別の宇宙 (「平行宇宙」と呼ばれます) に旅行すると考えられています。元の宇宙での結果は変わらないことが判明し、変化するのは他の平行世界での結果だけです。たとえば、ブラインドボックスの場合、ブラインドボックスを解体した宇宙では、ブラインドボックスを購入してブラインドボックスを解体しましたが、別の宇宙ではブラインドボックスを買わないように自分に言い聞かせました。もう一つの世界では、私はブラインドボックスを購入したり解体したりしませんでした。
タイムパラドックスのさまざまな説明は、さまざまな設定に対応しています。設定が異なれば、できることも異なります。
時間が不可逆な設定では、タイムループが存在しないので、勉強することが何もありません。
運命のパラドックスの設定では、すべては運命であり、すべてはあなたの主観的な取り組みの結果であり、それ以外に異なる結果は存在しません。
並行世界の設定では、現在の宇宙での結果を変えることはできませんが、他の宇宙ではより良い結果が得られるという期待があり、これは議論する価値のある設定です。
3. 強化学習
では、並行世界の設定において、利点を追求し、欠点を回避するには、どのように決定を下すべきでしょうか?学術コミュニティはすでにこの問題に対する完璧な解決策を持っています。それが強化学習です。
強化学習の通常の設定は次のとおりです: システム内にはエージェントと環境が存在します. エージェントは環境を観察し, 行動決定を行うことができます. 環境は行動決定の影響を受けて進化し, 報酬信号が与えられます.エージェントの成功を示します。エージェントは、できるだけ多くの合計報酬シグナルを取得したいと考えています。
エージェントは環境と何度も対話できます。一連のインタラクションの各ラウンドはターンと呼ばれます。エージェントは、環境と交互に対話し、対話中に自身の戦略を学習し、改善することができます。トレーニング ラウンドは 1 つのユニバースで行われると考えることができ、複数のユニバースでのトレーニング結果を通じて、後続のユニバースでの結果を向上させることができます。
強化学習には多くのアルゴリズムがありますが、より単純なアルゴリズムの 1 つであるポリシー勾配アルゴリズムを紹介しましょう。
4. ポリシー勾配アルゴリズム
強化学習のアルゴリズムは数多くありますが、比較的単純なアルゴリズムである Vanilla Policy Gradient (VPG) を紹介します。
ポリシー勾配アルゴリズムは、エージェントの戦略を、 で示されるパラメータを持つ確率分布としてモデル化します。その中で、 は調整可能な政策パラメータであり、その瞬間の環境の状態であり、直接観察できるものは確率分布です。状態を観察した後にエージェントによって選択されるアクションです。ポリシー パラメーターを使用すると、その時点でアクションを実行する確率が決まります。異なる戦略パラメータは異なる戦略に対応します。各ラウンドで得られるラウンド報酬の合計は です。ポリシー勾配アルゴリズムは、ラウンド内の総報酬の期待値を可能な限り大きくするためにポリシー パラメーターを変更します。
政策勾配アルゴリズムは、ラウンドの総報酬の期待値をできるだけ大きくするために、政策パラメータを変更して増加の目的を達成しようとします。このアルゴリズムの手順を次の図に示します。
なぜ金額を増やすとリターン期待が高まるのでしょうか?
政策パラメータが与えられると、国家が行動を起こす確率は次のように考えることができます。この確率値を判定部分の尤度値と呼ぶと、判定部分の対数尤度値となります。この場合、ラウンド全体ですべてのアクションが実行される確率は 、つまり意思決定部分の対数尤度の値は です。
このラウンドの報酬が良好、つまり比較的大きい(たとえば、大きな正の値)場合、将来そのような決定がより頻繁に発生することを期待し、対数尤度の値を増加させたくなるでしょう。このラウンドのリターンの差が比較的小さい場合 (たとえば、絶対値が大きい負の値)、そのような決定が将来再び発生しないことを期待し、対数尤度の値を減らすことを期待します。 。
つまり、それを重み付けと考えることができ、それを増やそうとするとリターン期待値を高める機会が得られます。
もちろん、上記の説明はそれほど厳密な数学的証明ではありません。強化学習の理論によれば、その理論的基礎は政策勾配定理であり、興味のある読者は、定理の内容、証明、説明については「強化学習: 原理と Python の実践」を参照してください。
5. コード例
それでは、コード例を通してポリシー勾配アルゴリズムの使用法を示してみましょう。
簡単にするために、CartPole Balance (CartPole-v0) というシンプルな環境を選択しました。
車のロッドバランスの問題が、1983 年の論文「困難な学習制御問題を解決できるニューロンのような適応要素」で強化学習の達人である Andrew Barto らによって提案されて以来、多くの研究者がこの環境と大規模な研究を行ってきました。強化学習チュートリアルの数 この環境が含まれることで、最も有名な強化学習環境の 1 つになります。
CartPoleのバランス問題(画像出典:https://gym.openai.com/envs/CartPole-v0/)
台車のロッドバランスの問題は図のとおりで、台車は直線スライド上を移動することができます。ポールは一端が車に接続され、もう一端が空中に吊り下げられますが、完全に直立する必要はありません。車の初期位置とロッドの初期角度は一定の範囲内でランダムに選択されます。インテリジェント エージェントは、スライド レールに沿って左右に移動するように車を制御できます。次のいずれかの状況が発生するとラウンドが終了します。
-
ポールの傾斜角度が 12 度を超えています。
-
車は長さ 2.4 ユニット以上移動します。
-
ラウンドのステップ数がラウンドの最大ステップ数に達しました。
1ステップごとに1単位の報酬を獲得。ラウンドはできるだけ長くしたいと考えています。
タスク CartPole-v0 ラウンドの最大ステップ数は 200 です。
この問題では、観測値には車の位置、車の速度、木の棒の角度、木の棒の角速度を表す 4 つの成分があり、その値の範囲は表の通りです。 。アクションは {0,1} から実行されます。これは、それぞれ左側に力を適用し、右側に力を適用することを意味します。
使用法: この環境を使用する場合は、最初に Python ライブラリ Gym をインストールする必要があります。 Gym ライブラリのインストール方法はhttps://github.com/ZhiqingXiao/rl-book/blob/master/zh2023/setup/setupwin.md をご覧ください。
Gym ライブラリをインストールした後、次のコードを使用して環境をインポートできます。
import gymenv = gym.make("CartPole-v0")
エージェントを実装する前に、まずエージェントと環境とのインタラクション機能を実装します。 play_episode() 関数を使用すると、エージェントは 1 ラウンドの間環境と対話できます。この関数には 3 つのパラメータがあります。
-
環境オブジェクト env: Gym.make("CartPole-v0") を通じて直接取得できます。
-
エージェント オブジェクト エージェント: エージェント クラスのオブジェクトであるエージェント クラスをすぐに実装します。このエージェントは、agent.reset(mode)、agent.step(observation、reward、terminated)、agent.close() などのいくつかのメンバーを実装する必要があります。これらのメンバーの実装方法については後ほど紹介します。
-
モードパラメータ mode: 文字列タイプ。「train」と「test」を指定できます。このパラメータはさらに、agent.reset(mode) に渡されます。 「train」の場合、エージェントはトレーニング モードになり、パラメータが更新されます。「test」の場合、エージェントはトレーニング モードになります。
関数内では、まず環境とエージェントを初期化します。その後、環境とエージェントは、ラウンドが終了するか切り捨てられるまで対話を続けます (切り捨てとは、ラウンド内の最大ステップ数に達することを意味します)。次に、ラウンド内のステップ数とラウンド内の合計報酬を返します。
def play_episode(env, agent, mode=None):
# 初始化
observation, _ = env.reset()
reward, terminated, truncated = 0., False, False
agent.reset(mode=mode)
episode_reward, elapsed_steps = 0., 0
# 交互
whileTrue:
action = agent.step(observation, reward, terminated)
if terminated or truncated:
break
observation, reward, terminated, truncated, _ = env.step(action)
episode_reward += reward
elapsed_steps += 1
# 结束
agent.close()
return episode_reward, elapsed_steps
次にエージェントクラス VPGAgent クラスを見てみましょう。
このクラスの実装には PyTorch ライブラリを使用します。 PyTorch が使用される理由は、増加するためにアルゴリズムを更新する必要があり、そのような最適化問題は PyTorch の助けを借りて実現できるためです。 PyTorch を使用して、トレーニング可能な変数である式 (つまり、損失関数) を構築し、オプティマイザーを使用してそれらを最小化できます。
PyTorchベースで実装できるほか、TensorFlowベースでも対応する機能を実装できます。この記事の最後には、PyTorch に基づいたコードと TensorFlow に基づいた 2 つのコード セットへのリンクがあり、どちらかを選択できます。どちらのコード セットも、書籍『強化学習: 原則と Python 実装』に含まれています。
PyTorchをベースにしたVPGAgentクラスの実装を具体的に見てみましょう。そのコンストラクター __init__(self, env) はポリシー関数 self.policy_net を準備します。policy_net は Softmax によってアクティブ化される線形層であり、オプティマイザーを Adam オプティマイザーとして指定します。トレーニング モードの初期化関数 reset(self, mode) は、保存された軌道のリスト self.trajectory を準備して、後続のインタラクション中に軌道を保存しやすくします。インタラクション関数 step(self、observation、reward、terminated) は、観測に基づいてアクションの確率を与え、トレーニング モードの self.trajectory にインタラクション記録を保存します。終了関数 close(self) は、トレーニング モードで学習関数 learn(self) を呼び出します。学習関数 learn(self) は、self.trajectory に格納されたレコードをトレーニングに使用します。まず、状態テンソル state_tensor 、アクション テンソル action_tensor 、およびラウンド報酬テンソル return_tensor が取得されます。次に、状態テンソルとアクション テンソルを使用して対数確率を計算します。対数確率を計算する場合、torch.clamp() 関数を使用して数値範囲を制限し、数値の安定性を向上させます。ラウンド報酬テンソルと対数確率テンソルを使用して損失テンソル loss_tensor を計算し、最後にオプティマイザを使用して損失を削減します。
import torch
import torch.distributions as distributions
import torch.nn as nn
import torch.optim as optim
class VPGAgent:
def __init__(self, env):
self.action_n = env.action_space.n
self.policy_net = nn.Sequential(
nn.Linear(env.observation_space.shape[0], self.action_n, bias=False),
nn.Softmax(1))
self.optimizer = optim.Adam(self.policy_net.parameters(), lr=0.005)
def reset(self, mode=None):
self.mode = mode
if self.mode == 'train':
self.trajectory = []
def step(self, observation, reward, terminated):
state_tensor = torch.as_tensor(observation, dtype=torch.float).unsqueeze(0)
prob_tensor = self.policy_net(state_tensor)
action_tensor = distributions.Categorical(prob_tensor).sample()
action = action_tensor.numpy()[0]
if self.mode == 'train':
self.trajectory += [observation, reward, terminated, action]
return action
def close(self):
if self.mode == 'train':
self.learn()
def learn(self):
state_tensor = torch.as_tensor(self.trajectory[0::4], dtype=torch.float)
action_tensor = torch.as_tensor(self.trajectory[3::4], dtype=torch.long)
return_tensor = torch.as_tensor(sum(self.trajectory[1::4]), dtype=torch.float)
all_pi_tensor = self.policy_net(state_tensor)
pi_tensor = torch.gather(all_pi_tensor, 1, action_tensor.unsqueeze(1)).squeeze(1)
log_pi_tensor = torch.log(torch.clamp(pi_tensor, 1e-6, 1.))
loss_tensor = -(return_tensor * log_pi_tensor).mean()
self.optimizer.zero_grad()
loss_tensor.backward()
self.optimizer.step()
agent = VPGAgent(env)
このようにして私たちはインテリジェントエージェントを実現しました。次に、トレーニングとテストを実行します。完全を期すために、トレーニングおよびテストのコードをここに添付します。トレーニングされたコードは、最新のラウンドからの合計報酬の平均が特定のしきい値を超えるまでラウンドを継続します。テストされたコードは 100 ラウンドの対話を平均するものです。エージェントをトレーニングするために複数ラウンドにわたって環境と対話するためのエージェントのコードは次のとおりです。
import itertools
import numpy as np
episode_rewards = []
for episode in itertools.count():
episode_reward, elapsed_steps = play_episode(env, agent, mode='train')
episode_rewards.append(episode_reward)
logging.info('训练回合 %d: 奖励 = %.2f, 步数 = %d',
episode, episode_reward, elapsed_steps)
if np.mean(episode_rewards[-20:]) > env.spec.reward_threshold:
break
plt.plot(episode_rewards)
`
環境と 100 ラウンド対話してエージェントのパフォーマンスをテストするコードは次のとおりです。
`episode_rewards = []
for episode in range(100):
episode_reward, elapsed_steps = play_episode(env, agent)
episode_rewards.append(episode_reward)
logging.info('测试回合%d:奖励 = %.2f,步数 = %d',
episode, episode_reward, elapsed_steps)
logging.info('平均回合奖励 = %.2f ± %.2f',
np.mean(episode_rewards), np.std(episode_rewards))
完全なコードと実行結果については、以下を参照してください。
-
PyTorch バージョン:
https://zhiqingxiao.github.io/rl-book/en2023/code/CartPole-v0_VPG_torch.html -
TensorFlow バージョン:
https://zhiqingxiao.github.io/rl-book/en2023/code/CartPole-v0_VPG_tf.html
この記事を通じて、タイム ループで考えられるいくつかの設定について学び、並行世界の設定での意思決定を改善するために強化学習を使用できることを学びました。最後に、小さなプログラミング例を通じて、ポリシー勾配アルゴリズムについても学びます。
6. おすすめの読み物とファンの特典
「強化学習: 原則と Python の実践」、ChatGPT、PPO、RLHF の主要テクノロジーを明らかにする、JD.com の公式購入リンクは次のとおりです:https://item.jd.com/13815337.html
理論的には完全:
強化学習の主な理論と一般的なアルゴリズムをカバーし、ChatGPT の技術的なポイントを説明します。
優れた実用性:
各章にはプログラミングの事例があり、深層強化学習アルゴリズムでは TenorFlow と PyTorch の比較実装が提供されます。
豊富なサポート機能:
章ごとに知識ポイントの概要が提供され、章の最後にはさまざまな演習が用意されています。 Gym のソース コード解釈、開発環境セットアップ ガイド、自習を支援する演習の回答などのオンライン リソースもあります。
- 今回は2冊の本をプレゼントします
- 活動期間:2023-11-12まで
- 参加方法: ブロガーをフォローし、この記事の下に「いいね!」、「お気に入り」、コメントを付けます。
- 1部はファン全員に抽選でプレゼント、もう1部はコラムを購入した学生にプレゼントします コラム購入者で書籍がまだ届いていない学生はプライベートメッセージでご連絡ください 先着順 1部のみ利用可能。