
強化学習の基礎について調べたので、まとめてみた
はじめに
最近の記事でもご紹介している通り、私は最近ロボットを色々いじっています。
その中で強化学習についても触れることになり、知識がない状態から色々学んだので、その内容を共有します。
強化学習は、エージェントが試行錯誤を通じて最適な行動を学習していく機械学習の手法です。AIやロボットなど幅広い分野で使われています。これまでの記事で紹介してきたIsaac Labも、強化学習を行うためのツールです。
本記事の対象読者はプログラミングの経験はあるが機械学習は初めてという方です。記事の最後では、Isaac Labで強化学習を実行した際に出力される学習ログの読み方も紹介します。
強化学習とは何か
機械学習の中での位置づけ
機械学習には大きく3つのアプローチがあります。
教師あり学習は、正解ラベル付きのデータから学習する手法です。「この画像は猫」「この画像は犬」という正解データを大量に与えて、モデルに分類を学ばせます。
教師なし学習は、正解ラベルなしでデータの構造やパターンを見つける手法です。クラスタリングや次元削減がこれにあたります。
強化学習は、このどちらとも異なります。学習する主体が環境の中で行動を試し、その結果得られる報酬をもとに、より良い行動を自分で見つけ出します。
なぜロボティクスで強化学習が使われるのか
ロボットに「歩け」と教えたいとき、教師あり学習的なアプローチでは「正しい歩行データ」を大量に用意する必要があります。しかし、あらゆる地形・状況に対応した「正しい歩き方」を人間が定義するのは現実的ではありません。
強化学習であれば、「前に進んだら報酬を与える」「転んだら報酬を減らす」というルールだけを定義すれば、ロボットが自分で試行錯誤して歩き方を獲得します。
ただし、学習には大量の試行錯誤が必要です。現実世界のロボットでこれを行うと、時間もコストもかかり、破損のリスクもあります。そこで活躍するのが、過去の記事で紹介したようなシミュレーションです。Isaac Labでは数千体のロボットをGPU上で並列に走らせることで、この試行錯誤を高速に回すことができます。
強化学習の要素
強化学習には、以下の基本要素が登場します。ロボットの歩行学習を例に説明します。
エージェント(Agent)
学習する主体です。
環境
エージェントが行動する世界です。Isaac Simの物理シミュレーション空間がこれにあたります。地面の形状、重力、摩擦係数などが環境に含まれます。
状態
環境の現在の情報です。ロボット歩行の場合、関節の角度、体の傾き、速度、足が地面に接触しているかどうか、といった情報が状態に含まれます。エージェントはこの状態を見て、次にどう動くかを決めます。
行動(Action)
エージェントの動作です。ロボットの例だと、各関節モーターに送るトルク指令値がこれにあたります。例えば「左膝を10度曲げる」「右足首を5度伸ばす」といった指令の組み合わせです。
報酬(Reward)
行動の結果に対するフィードバックです。数値で表されます。歩行学習であれば、「前進した距離に応じてプラスの報酬」「転倒したらマイナスの報酬」「エネルギー消費が少ないほどプラスの報酬」のように設計します。
この報酬の設計(報酬関数の設計)は強化学習で重要な作業です。報酬の与え方次第で、ロボットがどのような動作を獲得するかが大きく変わります。
学習のループ
これらの要素は、以下のサイクルで繰り返されます。
- エージェントが状態を観測する
- 観測した状態をもとに行動を選択する
- 環境が行動を受け取り、次の状態と報酬を返す
- エージェントが報酬をもとに行動の選び方を改善する
- 1に戻る
このサイクルを膨大な回数繰り返すことで、エージェントはより多くの報酬を得られる行動パターンを獲得していきます。
方策と価値関数
方策(Policy)
方策は、「ある状態のとき、どの行動を選ぶか」を決めるルールです。強化学習の目標は、収益(累積報酬)の期待値を最大化する方策を見つけることです。
Isaac Labでは、方策はニューラルネットワークで表現されます。状態を入力として受け取り、行動を出力します。学習の過程でこのニューラルネットワークのパラメータが更新され、より良い行動を出力するようになっていきます。
方策には大きく2種類があります。
決定的方策(Deterministic Policy)は、同じ状態に対して常に同じ行動を返します。
確率的方策(Stochastic Policy)は、同じ状態に対して行動を確率分布として返します。例えば各関節に送る指令値(トルクや目標角度など)を、平均値と標準偏差をもつ正規分布から毎ステップサンプリングする、という形です。Isaac LabのPPOアルゴリズムは確率的方策を採用しています。
ここで重要になるのが行動の標準偏差です。標準偏差が大きいと、エージェントの行動にバラつきが大きくなります。つまり、いろいろな行動を試す「探索」が活発に行われます。一方、標準偏差が小さいと行動が安定し、既に良いとわかっている行動を「活用」する傾向が強まります。
この探索と活用のバランスは強化学習の重要な課題です。探索ばかりだと良い行動に収束しませんし、活用ばかりだと局所的な最適解に留まってしまう可能性があります。学習が進むにつれて標準偏差は傾向として小さくなることが多く、探索から活用に移行していきます。ただし必ずしも単調に減少するわけではなく、タスクや設定によって動きは変わります。
価値関数(Value Function)
価値関数は、「ある状態がどれくらい良いか」を数値で見積もる関数です。正確には、ある状態から方策に従って行動し続けたときに得られる収益の期待値を表します。
「今ロボットがこの姿勢でいるとき、ここから先どれだけの報酬が期待できるか」を予測する関数です。まっすぐ立っている状態は「ここから先たくさん歩けそう」なので価値が高く、大きく傾いている状態は「すぐ転びそう」なので価値が低い、といった具合です。
なぜ価値関数が必要かというと、報酬は「今この瞬間」の評価にすぎないからです。本当に知りたいのは「この先の累積でどれだけ報酬が得られるか」です。目先の報酬が高くても、その後すぐ転んでしまう行動は良くありません。価値関数は、この「長期的な見通し」を推定します。
エピソードとステップ
ステップ
エージェントが1回「状態を観測→行動を選択→次の状態と報酬を受け取る」というサイクルを実行することを1ステップと呼びます。シミュレーションの1制御ステップに相当します。
エピソード
1回の試行の開始から終了までをエピソードと呼びます。歩行学習の場合、「ロボットが立ち上がってから転倒するまで」が1エピソードです。転倒するか、一定のステップ数に達すると、ロボットの姿勢がリセットされて次のエピソードが始まります。
エピソード長(episode length)は、ロボットがどれだけ長く動き続けられたかを示します。学習が進むと転びにくくなるため、エピソード長は長くなります。
収益と割引率
エージェントの目標は、目先の1ステップの報酬ではなく、エピソード全体で得られる報酬の累積を最大化することです。この累積報酬を収益と呼びます。
ただし、収益を計算する際、未来の報酬は割引率γ(ガンマ)で割り引いて計算します。γは0から1の間の値で、通常0.99程度に設定されます。
収益は以下のように計算されます。
G = r₀ + γ·r₁ + γ²·r₂ + γ³·r₃ + ...
r₀が今のステップの報酬、r₁が次のステップの報酬です。γが0.99の場合、100ステップ先の報酬は現在の約0.37倍の価値として扱われます。
なぜ割引するかというと、近い未来の報酬の方が確実であり、遠い未来の報酬は不確実だからです。また、エピソードが終了しないタスクの場合、割引率がないと収益が発散してしまう(無限に大きくなる)可能性があるという数学的な理由もあります。
方策勾配法とPPO
方策勾配法
方策(ニューラルネットワーク)を少しずつ書き換えて、「うまくいった行動はもっとやるように、ダメだった行動はやらないように」育てていきます。これが方策勾配法(Policy Gradient)の基本的な考え方です。
PPO(Proximal Policy Optimization)
Isaac Labは rsl_rl・skrl・RL-Games・Stable-Baselines3 といった複数のRLライブラリをサポートしており、いずれもPPOに対応しています。本記事では rsl_rl を使った場合を前提に話を進めます。
PPO(Proximal Policy Optimization)は方策勾配法の一種で、2017年にOpenAIが発表しました。ロボティクスの強化学習で広く使われているアルゴリズムの一つです。
PPOが広く使われる理由は、学習の安定性にあります。
方策勾配法をそのまま実装すると、「方策の更新幅が大きすぎると性能が急激に崩壊する」という問題があります。
せっかくうまく歩けるようになったのに、1回の更新で方策が大きく変わりすぎて、全く歩けなくなってしまうようなケースです。
PPOはこの問題を、方策の更新幅を制限することで解決します。具体的には、更新前後の方策の比率(確率比)を計算し、その比率が一定範囲を超えた場合にクリップします。これにより、1回の更新で方策が急激に変わることを防ぎ、安定して少しずつ改善していくことが可能になります。
RolloutフェーズとLearningフェーズ
PPOの学習は、2つのフェーズが交互に繰り返されます。
Rolloutフェーズ(データ収集)では、現在の方策を使ってエージェントを環境内で行動させ、経験データを集めます。「この状態でこの行動をとったら、こういう報酬が得られて、こういう次の状態になった」というデータの集合です。Isaac Labで数千体のロボットが並列に行動させたりすると、短い時間で大量のデータが集まります。
**Learningフェーズ(方策の更新)**では、収集したデータを使って方策と価値関数のパラメータを更新します。集めたデータをエポック数分繰り返し使って更新します。
この2フェーズが1イテレーション(iteration)です。
PPOの目的関数を構成する3つの項
Learningフェーズでは、ニューラルネットワークの重みを更新するために目的関数を計算し、これを最大化するようにパラメータを調整します。PPOの目的関数は Surrogate Objective、Value Loss、Entropy Bonus の3つで構成されます。それぞれ詳しく見ていきます。
Surrogate Objective(代理目的関数)
方策の改善に使われる目的関数で、PPOの中核をなすものです。
この目的関数は、以下の2つの要素を使って計算されます。
- 確率比: ある行動が更新後の方策で選ばれる確率と、更新前の方策で選ばれる確率の比
- アドバンテージ: ある行動が「平均的な行動と比べてどれだけ良かったか」を示す値。価値関数を使って推定される
確率比とアドバンテージを掛け合わせたものが代理目的関数の基本形です。アドバンテージが正の行動(良い行動)は確率を上げ、負の行動(悪い行動)は確率を下げる方向に方策を更新します。PPOではこの確率比をクリップすることで、更新幅が大きくなりすぎるのを防いでいます。
Value Loss
価値関数の予測がどれだけ外れていたかを表す損失です。「この状態からこれくらいの報酬が得られそう」という予測値と、実際の経験から計算した目標値とのズレです。
価値関数が正確であるほど、方策の更新に使うアドバンテージの推定も正確になるため、学習全体の安定性に寄与します。学習初期は予測が不正確なのでValue Lossは大きく、学習が進むにつれて減少傾向になるのが一般的です。
Entropy Bonus(エントロピーボーナス)
方策のエントロピー(行動選択のランダム性)に関する項です。
エントロピーが高いほど方策がばらついた行動を選ぶため、探索が活発になります。エントロピーが低いと行動が一つのパターンに固まり、探索が停滞します。
PPOではこのエントロピーを目的関数に加算することで、学習初期にエージェントが一つの行動パターンに早く固まってしまうのを抑えます。局所最適に陥るリスクを減らす効果があります。
ちなみに、Isaac Labが使っているrsl_rlの実装では、ログの Mean entropy loss は損失ではなくエントロピー値そのものが出力されます。大きいほど探索が活発で、学習が進むと徐々に下がっていきます。
Isaac Labでの強化学習ログの例
Isaac Lab で強化学習ライブラリrsl_rlを使って学習を実行すると、1イテレーションごとに以下のような学習ログが標準出力に表示されます。
ここまでの知識を踏まえて、見てみましょう。
Learning iteration 475/50000
Total steps: 46792704
Steps per second: 150673
Collection time: 0.603s
Learning time: 0.050s
Mean value loss: 10.2920
Mean surrogate loss: -0.0048
Mean entropy loss: 16.4826
Mean reward: 408.07
Mean episode length: 74.00
Mean action std: 1.00
--------------------------------------------------
Iteration time: 0.65s
Time elapsed: 00:05:10
ETA: 08:56:31
各行の意味は以下の通りです。
| 項目 | 意味 |
|---|---|
| Learning iteration 475/50000 | RolloutとLearningの1サイクルを475回完了。全50000回中 |
| Total steps | 全エージェントが実行したステップの累計。4679万ステップ分の経験データが蓄積されている |
| Steps per second | 1秒あたりに処理されるステップ数。GPU並列化による高速シミュレーションの性能指標 |
| Collection time | Rolloutフェーズ(データ収集)にかかった時間 |
| Learning time | Learningフェーズ(方策と価値関数の更新)にかかった時間 |
| Mean value loss | 価値関数の予測と実際の収益の誤差。学習が進むにつれて減少傾向になるのが望ましい |
| Mean surrogate loss | 代理目的関数に対応する損失。アドバンテージが正の行動が多いと、最適化の計算上、負の値で表示されます |
| Mean entropy loss | 方策のエントロピー値。値が大きいほど探索が活発。学習が進むと徐々に減少する |
| Mean reward | 直近最大100件の終了エピソードの累積報酬の平均(全履歴の平均ではない点に注意)。学習の進捗を最も直感的に示す指標。この値が増加していれば、ロボットがより良い動作を獲得していると判断できる |
| Mean episode length | 平均エピソード長。ロボットが転倒せずに動き続けたステップ数の平均。学習が進むと長くなる傾向 |
| Mean action std | 行動の標準偏差。方策のランダムさを示す。大きいと探索が活発、小さいと行動が安定 |
| Iteration time | 1イテレーションにかかった時間 |
| Time elapsed | 学習開始からの経過時間 |
| ETA | 残りイテレーションにかかると見込まれる時間(Estimated Time of Arrival) |
学習の進み具合を判断するポイント
ログを時系列で見たとき、以下のような傾向が確認できれば学習は順調に進んでいるといえます。
Mean rewardが増加傾向: 最も重要な指標です。ロボットがより多くの報酬を得られる行動を獲得していることを示します。ただし、一直線に上がるわけではないので、短期的な上下動は正常です。
Mean episode lengthが増加傾向: ロボットがより長く動き続けられるようになっていることを意味します。歩行学習であれば、転倒しにくくなっていることを示します。
Mean value lossが減少傾向: 価値関数の予測精度が向上していることを示します。ただし、環境やタスクが複雑な場合は完全にゼロにはなりません。
Mean action stdが緩やかに減少: 方策が徐々に安定していることを示します。急激に下がりすぎると、探索が不十分なまま一つの行動パターンに固定されてしまっている(局所最適に陥っている)可能性があります。
一方、以下のような兆候が見られたら注意が必要です。
- Mean rewardが頭打ちまたは下降: 報酬関数の設計やハイパーパラメータの見直しが必要かもしれません
- Mean action stdが0に近づく: 探索が完全に停止し、局所最適に陥っている可能性があります
- Value lossが急増: 価値関数の推定が不安定になっており、学習全体に悪影響を及ぼす可能性があります










