プロキシマルポリシーオプティマイゼーション(PPO)
PPO
Deep Reinforcement Learning ClassのUnit 8、Hugging Faceと共に 🤗
⚠️ この記事の新しい更新版はこちらで利用可能です 👉 https://huggingface.co/deep-rl-course/unit1/introduction
この記事はDeep Reinforcement Learning Classの一部です。初心者からエキスパートまでの無料コースです。シラバスはこちらをご確認ください。
⚠️ この記事の新しい更新版はこちらで利用可能です 👉 https://huggingface.co/deep-rl-course/unit1/introduction
この記事はDeep Reinforcement Learning Classの一部です。初心者からエキスパートまでの無料コースです。シラバスはこちらをご確認ください。
- Sentence Transformersモデルのトレーニングと微調整
- TF Servingを使用してKubernetes上に🤗 ViTをデプロイする
- Hugging FaceのTensorFlowの哲学
前のユニットでは、Advantage Actor Critic (A2C)について学びました。これは、価値ベースとポリシーベースの手法を組み合わせたハイブリッドなアーキテクチャであり、以下の方法によりトレーニングを安定させる助けとなります:
- エージェントの振る舞いを制御するアクター(ポリシーベースの手法)。
- 採取されたアクションの良さを測定するクリティック(価値ベースの手法)。
今日は、Proximal Policy Optimization (PPO)について学びます。これは、エージェントのトレーニング安定性を向上させるためのアーキテクチャであり、ポリシーアップデートがあまりにも大きくなりすぎるのを避けます。そのために、現在のポリシーと古いポリシーの差を示す比率を使用し、この比率を特定の範囲 [ 1 − ϵ , 1 + ϵ ] [1 – \epsilon, 1 + \epsilon] [ 1 − ϵ , 1 + ϵ ] にクリップします。
これにより、ポリシーアップデートがあまりにも大きくならず、トレーニングがより安定することが保証されます。
そして、理論の後に、PyTorchを使用してPPOアーキテクチャをスクラッチからコーディングし、CartPole-v1とLunarLander-v2で実装を強固にします。
ワクワクしますか?では、始めましょう!
- PPOの背後にある考え方
- クリップされたサロゲート目的関数の紹介
- 復習: ポリシー目的関数
- 比率関数
- クリップされていない部分のクリップされたサロゲート目的関数
- クリップされた部分のクリップされたサロゲート目的関数
- クリップされたサロゲート目的関数の可視化
- ケース1と2: 比率が範囲内の場合
- ケース3と4: 比率が範囲以下の場合
- ケース5と6: 比率が範囲以上の場合
- PPOエージェントのコーディング
PPOの背後にある考え方
Proximal Policy Optimization (PPO)では、トレーニング時のポリシーの変更を制限することでポリシーのトレーニング安定性を向上させたいと考えています: ポリシーアップデートをあまりにも大きくしないようにしたいのです。
その理由は2つあります:
- トレーニング中のポリシーアップデートが小さいほど、最適な解に収束する可能性が高いという経験的な事実があります。
- ポリシーアップデートの大きなステップは、「崖から落ちる」(悪いポリシーを得る)および回復するために長い時間またはまったく回復することのできない状況になる可能性があるためです。
PPOでは、ポリシーを控えめに更新します 。そのためには、現在のポリシーが前のポリシーと比較してどれだけ変化したかを計測する必要があります。そして、この比率を範囲 [ 1 − ϵ , 1 + ϵ ] [1 – \epsilon, 1 + \epsilon] [ 1 − ϵ , 1 + ϵ ] でクリップし、現在のポリシーが古いポリシーからあまりにも遠くに行くインセンティブを除去します(したがって、「Proximal Policy」の用語です)。
クリップされたサロゲート目的関数の紹介
まとめ:方策目的関数
Reinforceにおいて最適化する目的を思い出してみましょう:
この関数に対して勾配上昇法のステップを取ること(この関数の負の勾配を取ることと同等)によって、報酬が高く、有害な行動を避けるようにエージェントを促すことが目的でした。
しかし、問題点はステップサイズにあります:
- 小さすぎると、トレーニングプロセスが遅すぎるです
- 大きすぎると、トレーニングのばらつきが大きすぎるです
PPOでは、新しい目的関数であるクリップされた代理目的関数を使用して、方策の更新を制約することがアイデアです。これにより、クリップを使用して方策変更を小さな範囲に制約することができます。
この新しい関数は破壊的な大きな重みの更新を回避するために設計されています:
それぞれの部分を学習して、どのように機能するかを理解しましょう。
比率関数
この比率は次のように計算されます:
これは、現在の方策における状態s_tでのアクションa_tの確率を以前の方策での確率で割ったものです。
r_t ( θ )は、現在の方策と古い方策の間の確率比を表しています:
- r_t ( θ ) > 1の場合、アクションa_tは現在の方策でより確率的に起こるです。
- r_t ( θ )は0から1の間の場合、アクションは現在の方策では以前の方策よりも確率的に起こりにくいです。
したがって、この確率比は古い方策と現在の方策の間の差異を簡単に推定する方法です。
クリップされていない部分のクリップされた代理目的関数
この比率は、方策目的関数で使用する対数確率の代わりに使用できます。これにより、新しい目的関数の左側部分が得られます:比率にアドバンテージを掛けること。
ただし、制約がない場合、現在の方策でのアクションが以前の方策よりもはるかに確率的に起こる場合、これにより大きな方策勾配ステップが発生し、過度の方策更新が行われる可能性があります。
クリップされた部分のクリップされた代理目的関数
そのため、この目的関数を制約するために、比率が1から離れた変化を引き起こす変更を罰する必要があります(論文では、比率は0.8から1.2の範囲内でのみ変動できます)。
比率をクリップすることで、現在の方策が以前の方策とあまりにも異ならないようにするために、方策更新があまりにも大きくならないようにします。
これを行うためには、2つの解決策があります:
- TRPO(Trust Region Policy Optimization)は、方策更新を制約するために目的関数外でKLダイバージェンスの制約を使用します。ただし、この方法は実装が複雑で、より多くの計算時間がかかります。
- PPOは、クリップされた代理目的関数によって目的関数内で確率比を直接クリップします。
このクリップされた部分は、rt(theta)が[1 – ϵ, 1 + ϵ]の範囲にクリップされたバージョンです。
クリップされた代理目的関数を使用すると、非クリップとクリップされた2つの確率比率があります([1 – ϵ, 1 + ϵ]の範囲内でクリップされます。ここで、ϵはこのクリップ範囲を定義するためのハイパーパラメータです(論文ではϵ = 0.2)。
次に、クリップされた目的と非クリップされた目的の最小値を取ります。したがって、最終的な目的は非クリップされた目的の下限(悲観的な下限)です。
クリップされた目的と非クリップされた目的の最小値を取ることは、比率とアドバンテージの状況に基づいて、クリップされた目的または非クリップされた目的を選択することを意味します。
クリップされた代理目的の可視化
心配しないでください。今はこれを扱うのが複雑に見えても普通です。しかし、このクリップされた代理目的関数がどのようなものかを見ていき、これによって状況をより良く視覚化することができます。
6つの異なる状況があります。まず、クリップされた目的と非クリップされた目的の最小値を取ることを忘れないでください。
ケース1と2:比率が範囲内にある
状況1と2では、比率が[1 – ϵ, 1 + ϵ]の範囲内にあるため、クリップは適用されません。
状況1では、利点があります:その状態でのすべてのアクションの平均よりも行動が良いです。したがって、現在のポリシーはその状態でそのアクションを取る確率を増やすように促す必要があります。
比率が範囲内にあるため、ポリシーがその状態でそのアクションを取る確率を増やすことができます。
状況2では、利点がありません:その状態でのすべてのアクションの平均よりも行動が悪いです。したがって、現在のポリシーがその状態でそのアクションを取る確率を減らす必要があります。
比率が範囲内にあるため、ポリシーがその状態でそのアクションを取る確率を減らすことができます。
ケース3と4:比率が範囲以下
確率比率が[1 – ϵ]よりも低い場合、その状態でそのアクションを取る確率は、旧ポリシーよりもはるかに低くなります。
状況3のように利点の見積もりが正である場合(A>0)、その状態でそのアクションを取る確率を増やしたいです。
しかし、状況4のように利点の見積もりが負である場合、その状態でそのアクションを取る確率をさらに減らしたくありません。したがって、勾配は0です(フラットライン上にあるため)、重みを更新しません。
ケース5と6:比率が範囲を超えている
確率比が[ 1 + ϵ ] [1 + \epsilon] [ 1 + ϵ ] よりも高い場合、現在の方策でその状態でその行動を取る確率は以前の方策よりもはるかに高いです。
場合5のようにアドバンテージが正である場合、あまり貪欲になりたくありません。すでにその状態でその行動を取る確率が以前の方策よりも高いため、勾配は0になります(フラットな線上にいるため)。したがって、重みを更新しません。
場合6のようにアドバンテージが負である場合、その状態でその行動を取る確率を減らしたいと考えます。
したがって、要点を振り返ると、クリップされていない目的関数部分のみを使用して方策を更新します。最小値がクリップされた目的関数部分の場合、勾配は0になるため、方策の重みを更新しません。
したがって、次の場合にのみ方策を更新します:
- 比率が範囲[ 1 − ϵ , 1 + ϵ ] [1 – \epsilon, 1 + \epsilon] [ 1 − ϵ , 1 + ϵ ]内にある場合
- 比率が範囲外であるが、アドバンテージが範囲に近づく場合
- 比率よりも下であるがアドバンテージが0より大きい場合
- 比率よりも上であるがアドバンテージが0より小さい場合
最小値がクリップされた比率の場合、なぜ勾配が0になるのか疑問に思うかもしれません。比率がクリップされた場合、この場合の導関数は r t ( θ ) ∗ A t r_t(\theta) * A_t r t ( θ ) ∗ A t の導関数ではなく、( 1 − ϵ ) ∗ A t (1 – \epsilon)* A_t ( 1 − ϵ ) ∗ A t または ( 1 + ϵ ) ∗ A t (1 + \epsilon)* A_t ( 1 + ϵ ) ∗ A t の導関数であり、どちらも0になります。
要約すると、このクリップされた代理目的関数により、現在の方策が古い方策との変動範囲が制限されます。確率比が範囲の外に移動するインセンティブがなくなるため、クリップによって勾配が影響を受けます。比率が 1 + ϵ 1 + \epsilon 1 + ϵ よりも大きいか 1 − ϵ 1 – \epsilon 1 − ϵ よりも小さい場合、勾配は0になります。
PPO Actor-Criticスタイルの最終的なクリップされた代理目的関数の損失は、次のようになります。これは、クリップされた代理目的関数、バリューロス関数、エントロピーボーナスの組み合わせです:
かなり複雑でした。表とグラフを見ながらこれらの状況を理解するために時間をかけてください。 なぜこれが意味をなすのかを理解する必要があります。さらに深く理解したい場合は、Daniel Bickによる「Proximal Policy Optimizationの一貫した自己完結型の説明の提供に向けて」、特に3.4節が最適なリソースです。
PPOエージェントをコーディングしましょう
PPOの背後にある理論を学んだので、その動作を理解する最良の方法はゼロから実装することです。
ゼロからアーキテクチャを実装することは、それを理解するための最良の方法であり、良い習慣です。Q-Learningによる価値ベースの手法とReinforceによるポリシーベースの手法の実装は既に行っています。
したがって、コーディングするために、2つのリソースを使用します:
- Costa Huangによるチュートリアル。CostaはCleanRLの製作者であり、研究に適した機能を備えた高品質なシングルファイルのディープ強化学習ライブラリを提供しています。
- チュートリアルに加えて、さらに深く理解するために、13の主要な実装の詳細を読むことができます:https://iclr-blog-track.github.io/2022/03/25/ppo-implementation-details/
そして、その堅牢性をテストするために、2つの異なる古典的な環境でトレーニングします:
- Cartpole-v1
- LunarLander-v2
そして最後に、トレーニングされたモデルをハブにプッシュして、エージェントのプレイを評価したり可視化したりします。
LunarLander-v2は、このコースを始めたときに最初に使用した環境です。当時はその動作の仕組みを知りませんでしたが、今ではゼロからコードを書いてトレーニングすることができます。それはすごいですね 🤩。
via GIPHY
ここからチュートリアルを始めましょう 👉 https://github.com/huggingface/deep-rl-class/blob/main/unit8/unit8.ipynb
この章を終えておめでとうございます!たくさんの情報がありましたね。そしてチュートリアルも終了おめでとうございます 🥳、これはコースの中でも最も難しいものの一つでした。
他の環境でエージェントをトレーニングすることを躊躇しないでください。自分自身で試すことが学ぶ最良の方法です!
最初のユニットからの進歩を考えてみてください。これらの8つのユニットで、深層強化学習の強固な基礎を築きました。おめでとうございます!
しかし、これで終わりではありません。コースの基礎部分が終了したとしても、これは旅の終わりではありません。私たちは新しい要素に取り組んでいます:
- 新しい環境とチュートリアルの追加。
- マルチエージェントに関するセクション(セルフプレイ、協力、競争)。
- オフラインRLと意思決定トランスフォーマーについての別のセクション。
- 論文解説記事。
- 今後もさらに追加予定です。
連絡を保つ最良の方法は、コースに登録することです。こうして私たちはあなたを最新情報で更新します 👉 http://eepurl.com/h1pElX
そして学びたい友達と共有するのを忘れないでください 🤗!
最後に、あなたのフィードバックによって、コースを改善して更新していきたいと思っています。何かあれば、このフォームに記入してください 👉 https://forms.gle/3HgA7bEHwAmmLfwh9
また次回お会いしましょう!
学び続けて、素晴らしい人であり続けましょう 🤗
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles