強化学習入門:MDP(マルコフ決定過程)で理解するエージェントの意思決定

強化学習入門:MDP(マルコフ決定過程)で理解するエージェントの意思決定

AIが囲碁の世界チャンピオンを破り、ロボットが転ばずに歩けるようになる——こうした成果を支える技術が強化学習(Reinforcement Learning)です。本記事では、強化学習の基本から、数学的な枠組みであるMDP(マルコフ決定過程)の概念、そしてPythonによる実装まで順を追って解説します。

1. 強化学習とは何か?

強化学習とは、エージェント(Agent)が環境の中で試行錯誤しながら、最適な行動方針を自分で学んでいく機械学習の手法です。

「うまくいった行動を繰り返し、失敗した行動を避ける」という人間の学習プロセスに似た仕組みです。

強化学習の主な登場人物は以下の3つです。

  • エージェント:学習・意思決定を行う主体
  • 環境:エージェントが行動する場
  • 報酬(Reward):行動の結果として環境からエージェントへ与えられる即時報酬(スカラー値)

エージェントは環境から状態を受け取り、行動を選択し、その結果として報酬を受け取ります。この繰り返しを通じて、累積報酬が最大になるような行動方針(ポリシー)を学習します。

2. 強化学習の実用例

強化学習は、さまざまな分野で実用化が進んでいます。

1. ゲームAI

DeepMindが開発したAlphaGoは、囲碁の世界チャンピオンを破った強化学習ベースのAIです。また、OpenAI FiveはDota 2でプロゲーマーチームに勝利しました。

2. ロボット制御

ロボットアームの把持動作や二足歩行ロボットの歩行制御など、複雑な動作の自動習得に強化学習が使われています。

3. 自動運転

車両がブレーキ・加速・ハンドル操作をどのタイミングで行うべきかを、シミュレーション環境で強化学習により学習させています。

4. 推薦システム

NetflixやYouTubeなどの動画推薦においても、ユーザーの視聴行動という報酬をもとに最適な推薦を学習する強化学習が応用されています。

5. 金融・トレーディング

株式市場における売買タイミングの最適化にも、強化学習が研究・活用されています。

3. MDP(マルコフ決定過程)とは?

強化学習の問題を数学的に定式化するための最も基本的な枠組みが**MDP(Markov Decision Process:マルコフ決定過程)**です。

MDPは以下の4つの要素で定義されます。

  • S(状態集合 / State):エージェントが取りうる状態の集合
  • A(行動集合 / Action):エージェントが選択できる行動の集合
  • R(報酬関数 / Reward):状態と行動のペアに対し、即時報酬を返す関数
  • P(遷移確率 / Transition Probability):行動によって状態がどう変化するかの確率

「マルコフ」という名前は、次の状態が現在の状態と行動だけで決まり、過去の履歴に依存しないという「マルコフ性」に由来します。

4. 状態・行動・報酬・状態遷移のサイクル

MDPにおけるエージェントの行動サイクルは次のように表せます。

このサイクルを具体例で考えてみましょう。

例:迷路を解くエージェント

  • 状態(State):現在いるマス目の位置(例:位置0、位置1、位置2 など)
  • 行動(Action):左・右への移動
  • 報酬(Reward):ゴールに到達したら +1、それ以外は 0
  • 遷移(Transition):行動に従って次のマスへ移動

このサイクルを繰り返すことで、エージェントはゴールへの最短経路(最適ポリシー)を学習します。

5. PythonによるMDPの簡単な実装

先にQ学習の核心であるQ値を説明します。Q値とは「ある状態でその行動を選んだとき、将来にわたって得られる報酬の期待総和」のことです。値が高いほど「良い選択」を意味し、学習を通じて徐々に更新されます。

ここでは、シンプルな「1次元グリッド世界」でQ学習(Q-Learning)を実装します。マス0〜4が並んでおり、マス4がゴールです。エージェントは毎回マス0からスタートし、右に進んでゴールを目指します。

なお、GAMMA・ALPHA・EPISODES・EPSILON_ENDなどのパラメータはあくまで一例です。今回のポイントはε-decayの導入で、探索率を序盤の1.0から終盤の0.05へ線形に下げることで、序盤の十分な探索を保証しています。各値を自由に変えて動かしてみると、学習の挙動の違いが見えて面白いと思います。

import numpy as np

# 環境の設定
NUM_STATES = 5       # 状態数(マス0〜4)
NUM_ACTIONS = 2      # 行動数(0:左移動, 1:右移動)
GOAL_STATE = 4       # ゴール状態
GAMMA = 0.9          # 割引率(将来の報酬をどれだけ重視するか)
ALPHA = 0.1          # 学習率
EPSILON_START = 1.0   # 探索率の初期値(序盤は完全ランダム探索)
EPSILON_END = 0.05    # 探索率の最終値(終盤は学習結果を活用)
EPISODES = 500       # 学習エピソード数

# Qテーブルの初期化(状態×行動 → Q値)
Q = np.zeros((NUM_STATES, NUM_ACTIONS))

def get_reward(state):
    return 1.0 if state == GOAL_STATE else 0.0

def step(state, action):
    if action == 0:  # 左移動
        next_state = max(0, state - 1)
    else:            # 右移動
        next_state = min(NUM_STATES - 1, state + 1)
    reward = get_reward(next_state)
    done = (next_state == GOAL_STATE)
    return next_state, reward, done

# Q学習のメインループ
for episode in range(EPISODES):
    state = 0  # スタート位置
    # エピソードが進むにつれ探索率を線形に下げる
    epsilon = EPSILON_END + (EPSILON_START - EPSILON_END) * (1 - episode / EPISODES)

    for _ in range(100):
        # ε-greedy法で行動選択
        if np.random.rand() < epsilon:
            action = np.random.randint(NUM_ACTIONS)  # ランダム探索
        else:
            action = np.argmax(Q[state])             # 最善行動を選択

        next_state, reward, done = step(state, action)

        # Qテーブルの更新(ベルマン方程式)
        Q[state, action] += ALPHA * (
            reward + GAMMA * np.max(Q[next_state]) - Q[state, action]
        )

        state = next_state
        if done:
            break

# 結果の表示
print("学習後のQテーブル:")
print("状態 | 左(Q値) | 右(Q値) | 最適行動")
for s in range(NUM_STATES):
    best = "左" if np.argmax(Q[s]) == 0 else "右"
    print(f"  {s}  |  {Q[s,0]:.3f}  |  {Q[s,1]:.3f}  |    {best}")

6. 実行結果と解説

実行すると以下のような出力が得られます。

結果の読み方

  • 状態0〜3:右移動のQ値が左移動より高くなっています。右に進むほどゴール(状態4)に近づき高い報酬が期待できることを、エージェントが学習した結果です。
  • 状態4(ゴール):ゴール到達後はエピソードが終了するため、左右どちらのQ値も0のままです。Q値が同じ場合、プログラムは先頭のインデックス(=左)を返すため「左」と表示されていますが、ゴール状態での行動に実質的な意味はありません。
  • Q値の大きさ:ゴールから遠いほど値が小さくなっています。割引率(γ=0.9)によって、遠い将来の報酬ほど小さく評価されるためです。

(補足)左移動のQ値がゼロでない理由
Q学習はすべての(状態, 行動)ペアに「その後ゴールへ到達できる見込みの報酬」を割り当てます。左移動しても即座にエピソードは終わらず、その後右へ戻ればゴールに到達できるため、左移動にも将来の価値が生まれます。たとえば状態0で左移動すると壁なので状態0に留まりますが、その後右に進めばゴールに届くため Q[0, 左] = γ × Q[0, 右] = 0.9 × 0.729 ≈ 0.656 となります。これはコードのバグではなく、ペナルティのない環境でQ学習が正しく動いた結果です。右移動のQ値が常に左を上回っているため、最適行動は正しく「右」と学習できています。

このシンプルな例でも、「状態→行動→報酬→次の状態」のサイクルを繰り返すだけで、エージェントが最適な経路を自ら学習できることが確認できます。

まとめ

本記事の内容をまとめます。

  • 強化学習:試行錯誤を通じて最適な行動を学習する手法
  • MDP:状態・行動・報酬・遷移確率で問題を定式化する枠組み
  • Q学習:MDPを解くための代表的なアルゴリズムで、Qテーブルを更新しながら最適ポリシーを習得する

強化学習はまだまだ発展途上の分野であり、より複雑な環境や大規模な問題に対応するために、深層学習と組み合わせた深層強化学習(Deep Reinforcement Learning)なども盛んに研究されています。興味がある方は、ぜひそちらも調べてみてください。

CTA
  • URLをコピーしました!
  • URLをコピーしました!
この記事を書いた人
目次