強化学習(Reinforcement Learning)とは?:ゼロから学ぶ基礎と全体像
(画像はGeminiで作成)
機械学習には大きく分けて「教師あり学習」「教師なし学習」、そして「強化学習(Reinforcement Learning: RL)」の3つがあります。強化学習は、正解データ(ラベル)が与えられるのではなく、エージェントが環境内で意思決定を行い、得られる「報酬(Reward)」を最大化するように試行錯誤を通じて学習するアプローチです。
自転車の乗り方を覚える子供や、犬のしつけをイメージしてみてください。最初はうまくいかなくても、「うまく進めた」「褒められた」という結果(報酬)を手がかりに、徐々に最適な行動を身につけていきます。この記事では、アルゴリズムの解説に入る前に、強化学習の基本的な考え方と専門用語、そしてPythonを使って実際に「環境」を動かしてみるまでの基礎を解説します。
1. 強化学習の基本パイプライン
強化学習の世界は、主に以下の要素で構成される「マルコフ決定過程(MDP)」という枠組みでモデル化されます。
- エージェント(Agent): 環境内で行動を起こし、学習を行う主人公です。
- 環境(Environment): エージェントが相互作用する世界やシミュレーション(ゲームやロボットなど)のことです。
- 状態(State, ): 環境の現在の状況です。
- 行動(Action, ): エージェントが状態に基づいて起こすアクションです。
- 報酬(Reward, ): 行動の結果として環境から与えられるフィードバック(点数やペナルティ)です。
学習のサイクルは以下のようになります。
- エージェントが現在の状態を観察します。
- その状態に基づいて行動を決定します。
- 環境がその行動を受け取り、次の状態と報酬をエージェントに返します。
- エージェントはこの結果をもとに、次からもっと多くの報酬をもらえるように自分の戦略をアップデートします。
2. 絶対に知っておくべき3つのキーワード
強化学習の目的は、長期的に見て最も多くの報酬を得られるような行動ルールを見つけることです。そのために重要な3つの概念を紹介します。
方策(Policy, )
方策とは、エージェントの「行動ルール」や「戦略」のことです。「もし状態Aなら、行動Bをとる」というマッピングを指します。強化学習の最終的な目標は、この「方策」を最適なもの(最も報酬がもらえるルール)にすることです。
割引率(Discount Factor, )
エージェントは、すぐにもらえる目先の報酬だけでなく、将来もらえる報酬も考慮して行動する必要があります。しかし、無限に先の未来を予測することは不可能です。そこで、遠い未来の報酬ほど少し割り引いて評価するために使われるのが 割引率 (0から1の間の値) です。これにより、エージェントは「なるべく早く報酬を得る」ことと「計算の安定性」の両立が可能になります。
探索と利用のトレードオフ(Exploration-Exploitation Trade-off)
強化学習における最大のジレンマです。
- 利用(Exploitation): 今知っている知識の中で、一番良いと思われる行動をとること。
- 探索(Exploration): まだ試していない行動をとり、新しい知識を得ること。
例えば、お気に入りのおいしいレストランに行く(利用)か、まだ行ったことのない新しいレストランを開拓する(探索)か、という状況と同じです。最初から「利用」ばかりしていると、もっと良い選択肢を見逃してしまうため、このバランスを最適に保つことが学習成功の鍵となります。
3. まずはPythonで「環境」を動かしてみよう
アルゴリズム(Q学習など)を実装してエージェントを賢くする前に、まずはPythonで強化学習の「環境」を用意し、エージェントに完全にランダムな行動をとらせてみましょう。 強化学習の標準的な環境を提供するライブラリ gymnasium を使用して、「Cart Pole(倒立振子)」という環境を動かします。
ライブラリのインストール
!pip install gymnasium
ランダムエージェントの実装
以下のコードでは、強化学習環境のデファクトスタンダードである gymnasium ライブラリを使用して「CartPole(倒立振子)」環境を構築し、完全にランダムに行動を選択するエージェントを実行します。 学習を一切行わないランダムエージェントの挙動を通じて、強化学習における基本的な実行サイクル(状態の取得、行動の決定、環境への適用、報酬と次状態の獲得)がPythonでどのようにループ処理として記述されるか、そのマクロな流れを確認してください。
import gymnasium as gym
import matplotlib.pyplot as plt
from matplotlib import animation
from IPython.display import HTML
# 1. 環境の作成(レンダリングモードを 'rgb_array' にして画像配列として取得する)
env = gym.make('CartPole-v1', render_mode='rgb_array')
# 2. 環境の初期化(最初の状態を取得)
state, _ = env.reset()
done = False
total_reward = 0
frames = [] # 動画用のアニメーションフレームを保存するリスト
print("--- ランダムエージェントの実行開始 ---")
# 3. エピソードが終了するまでループ
while not done:
# 現在の環境の描画データを配列として取得し、リストに追加
frames.append(env.render())
# ランダムに行動を1つ選ぶ
action = env.action_space.sample()
# 4. 環境に行動を適用し、結果を受け取る
next_state, reward, terminated, truncated, _ = env.step(action)
# 終了条件の更新
done = terminated or truncated
total_reward += reward
print(f"エピソード終了: 獲得した合計報酬(スコア) = {total_reward}")
# 5. 環境を閉じる
env.close()
# 6. 保存したフレームを使ってアニメーションを作成し、Colab上に表示する
print("アニメーションを生成中...")
fig = plt.figure(figsize=(frames[0].shape[1] / 72.0, frames[0].shape[0] / 72.0), dpi=72)
ax = fig.add_subplot(111)
ax.axis('off') # 軸を非表示にする
patch = ax.imshow(frames[0])
# アニメーション更新用の関数
def animate(i):
patch.set_data(frames[i])
# FuncAnimationで動画を作成
anim = animation.FuncAnimation(plt.gcf(), animate, frames=len(frames), interval=50)
plt.close(fig) # 余分な静止画プロットを防ぐ
# HTMLとしてColabの出力セルにアニメーションを表示
HTML(anim.to_jshtml())
ランダムエージェントを動かすための一連の処理について詳しく解説します。
- ライブラリのインポート: 強化学習シミュレータの gymnasium (旧称 OpenAI Gym の後継)に加え、Google Colab上で描画結果をアニメーションとして可視化するために matplotlib.pyplot、matplotlib.animation、および IPython.display.HTML をインポートしています。
- 環境の構築: gym.make('CartPole-v1', render_mode='rgb_array') で、定番タスク「CartPole-v1」を初期化しています。クラウド環境(Colab等)ではGUIウィンドウをポップアップさせることができないため、ここでは render_mode='rgb_array' を指定して、描画結果を数値配列(画像データ)として取得できるように設定します。
- 環境の初期化とフレーム保存リスト: env.reset() で環境を初期化すると同時に、各ステップでの描画結果(画像)を溜めておくための空リスト frames を用意します。
- 学習ループと描画データの保存: while not done ループ内で、行動を決定する前に env.render() を呼び出しています。これにより現在の環境の状況を画像配列として取得し、frames.append() でリストに保存していきます。
- ランダムな行動選択: env.action_space.sample() を使用して、エージェントがその環境内で選択可能な行動(CartPoleでは「0: カートを左に押す」「1: カートを右に動かす」の2通り)の中から、完全にランダムに1つを決定します。
- 環境のステップ更新とフィードバックの獲得: 決定した行動を env.step(action) に渡し、環境を1ステップ進めます。ここで得られる戻り値は以下の通りです。
- next_state: 行動適用後の新しい状態(カートの位置、速度、ポールの角度、角速度)。
- reward: このステップで得られた報酬。CartPoleではポールが立っている間、1ステップごとに
1が与えられます。 - terminated: ポールが大きく倒れる、またはカートが画面外に出るなどの理由でエピソードが失敗・終了したかどうか。
- truncated: 最大ステップ制限(CartPole-v1では500ステップ)に達して打ち切られたかどうか。
- 終了条件の判定と報酬加算: terminated or truncated によってエピソードの終了判定を更新し、得られた報酬を total_reward に加算します。
- 環境のクリーンアップ: 最後に env.close() を呼び出して環境のリソースを解放します。
- アニメーションの生成とColab表示: 保存した画像フレーム(frames)をもとに、Matplotlibの animation.FuncAnimation を使用してアニメーションを作成します。これを HTML(anim.to_jshtml()) で変換してColabの出力セル上に埋め込むことで、GUI非対応のクラウド環境でも、エージェントの動く様子をインタラクティブなアニメーション動画として再生可能にしています。
Gymnasiumの CartPole-v1 環境では、ポールが地面にバタンと倒れるまでゲームが続くわけではありません。以下のいずれかの条件を満たすと、その時点で「ポールが倒れた(失敗した)」とみなされ、強制終了(terminated = True または done = True)になります。
- ポールの傾きが ±12度 を超えたとき
- カートの位置が中心から ±2.4(画面の端)を超えたとき
±12度というのは、人間の目から見ると「少し傾いたかな?」という程度です。そのため、完全に倒れるずっと前の段階でシミュレーションがストップしてしまいます。
本記事の実装コードでは、Google Colabなどのブラウザ・クラウド環境でもエラーなく動作し、その場でアニメーションを確認できるように、render_mode='rgb_array' と matplotlib を組み合わせた動画再生方式を採用しています。
もし、ご自身のローカルPC(GUIが利用できる環境)で直接ポップアップウィンドウを開いてリアルタイム描画を確認したい場合は、以下のように変更して実行することも可能です。
- 変更点1: 環境作成時に render_mode='human' を指定する。
env = gym.make('CartPole-v1', render_mode='human') - 変更点2: 各ステップでの frames.append(env.render()) や、Matplotlibによるアニメーション生成・再生用のコード(ステップ9の処理)をすべて削除する。
実行結果
--- ランダムエージェントの実行開始 ---
エピソード終了: 獲得した合計報酬(スコア) = 15.0
アニメーションを生成中...
上記のコードを実行すると、カートが左右にランダムに動き、上の図のようにすぐにポールが倒れて終了してしまう様子が確認できます。合計報酬(スコア)も15程度でした(最大スコアは500)。
次のステップへ
このランダムに行動するだけのエージェントを、「過去の経験から学び、ポールを落とさないように賢く動くエージェント」に進化させるのが強化学習アルゴリズムの役割です。
次の記事では、最も基礎的で有名なアルゴリズムである Q学習(Q-Learning) を用いて、このCart Poleを実際に学習させる方法を学びます。
まとめ
本記事では、強化学習(Reinforcement Learning)のコアコンセプトから、専門用語、そしてシミュレーション環境をPythonで実際に動かすまでの一連の流れを学習しました。
本記事を通じて、以下の重要なポイントを理解しました。
- 強化学習の定義: 教師ラベルを必要とせず、エージェントが環境の中で行動と「報酬」を通じた試行錯誤から最適な意思決定ルール(方策)を学習する仕組み。
- MDPの構成要素: エージェント、環境、状態、行動、報酬からなる基本パイプラインの構造と役割。
- 3つの基本概念: 最適なルールを指す「方策(Policy)」、将来の報酬を評価する「割引率(Discount Factor)」、そして新しい行動を開拓する「探索と利用のトレードオフ」の重要性とバランス。
- Gymnasium環境の実装: gymnasium ライブラリを使用したCartPoleの動かし方と、強化学習の基本的な実行ループの記述方法。
ランダムに行動するだけのエージェントでは、すぐにポールが倒れてしまい、高いスコアを獲得することができませんでした。次回の記事では、エージェントが過去の経験から賢い行動ルールを自律的に獲得するアルゴリズムである Q学習(Q-Learning) について詳しく解説します。
本記事の文章・構成の一部に生成AIを使用しています。