見出し画像

Q学習入門

なぜQ学習が必要なのか?

Q学習は、強化学習の一部門であり、無指導学習の一形態です。この手法は、エージェントが環境との相互作用を通じて最適な行動を学習することを可能にします。これは、特に決定を下す必要がある複雑な問題に対して、有効なソリューションを提供します。例えば、自動運転車、ゲームプレイ、資源配分などの領域で活用されています。

Q学習の詳細

Q学習は、ある状態から特定の行動を取ったときの「報酬」の期待値を学習することに焦点を当てています。この学習プロセスは、Q-テーブルと呼ばれる表を通じて行われ、エージェントはこのテーブルを更新しながら最適な行動を見つけ出します。

メリット

  1. モデルフリー: 環境のモデルを事前に知らなくても適用可能。

  2. 柔軟性: 様々な種類の問題に対応可能。

  3. シンプルな実装: 基本的なアルゴリズムは理解しやすく、実装も容易。

デメリット

  1. 大規模な状態空間: 状態や行動の数が多いと計算量が膨大になる。

  2. 遅い収束: 最適な戦略を見つけるまでに時間がかかる場合がある。

  3. 部分的な最適化: 局所的な最適解に陥るリスク。

実プロジェクトでの使用例

  1. 自動運転: 複数のセンサーからの情報を基に最適な運転行動を決定。

  2. ロボット制御: 未知の環境での自律的な動作。

  3. ゲームAI: チェスや囲碁などの戦略ゲームにおける最適な手の決定。

使う場合の注意事項

  • 状態空間の設計: 状態空間が大きすぎると計算が困難になるため、適切な抽象化が必要。

  • 収束の確認: 学習が収束しているか定期的に確認する。

  • 報酬設計: 適切な報酬システムの設計が重要。

このコードでは、簡単なグリッドワールドの環境でエージェントが学習し、目標状態に到達しようとします。コードには、エピソード数の削減、ε減衰、早期終了条件などの最適化が含まれています。

import numpy as np
import random

# 環境設定
n_states = 25  # 状態数 (5x5 グリッド)
n_actions = 4  # 行動数 (上, 下, 左, 右)
goal_state = 24  # 目標状態
alpha = 0.1  # 学習率
gamma = 0.9  # 割引率
epsilon_start = 1.0  # 初期探索率
epsilon_end = 0.01  # 最終探索率
epsilon_decay = 0.995  # 探索率の減衰率
n_episodes = 500  # エピソード数
max_steps = 50  # 各エピソードの最大ステップ数

# Qテーブルの初期化
Q = np.zeros((n_states, n_actions))

# 行動を選択する関数
def choose_action(state, epsilon):
    if random.uniform(0, 1) < epsilon:
        return random.choice(range(n_actions))
    else:
        return np.argmax(Q[state])

# 状態と行動に基づいて次の状態を決定する関数
def get_next_state(state, action):
    row = state // 5
    col = state % 5
    if action == 0:  # 上
        row = max(row - 1, 0)
    elif action == 1:  # 下
        row = min(row + 1, 4)
    elif action == 2:  # 左
        col = max(col - 1, 0)
    elif action == 3:  # 右
        col = min(col + 1, 4)
    return row * 5 + col

# εの値をエピソードごとに減少させる関数
def update_epsilon(epsilon):
    return max(epsilon_end, epsilon_decay * epsilon)

# Q学習アルゴリズム
for episode in range(n_episodes):
    state = random.randint(0, n_states - 1)
    epsilon = update_epsilon(epsilon_start)  # εの更新

    for step in range(max_steps):
        action = choose_action(state, epsilon)
        next_state = get_next_state(state, action)
        reward = 1 if next_state == goal_state else 0
        # Q値の更新
        Q[state, action] = Q[state, action] + alpha * (reward + gamma * np.max(Q[next_state]) - Q[state, action])
        state = next_state
        if state == goal_state:
            break

# 学習したQテーブルの出力
print(Q)

このコードは、Q学習という強化学習のアルゴリズムを用いて、エージェントがグリッドワールド内で目標位置に到達する方法を学習するためのものです。以下に各部分の説明を行います。

環境設定

  • n_states = 25: 25の状態があります。これは5x5のグリッドワールドを意味します。

  • n_actions = 4: エージェントは4つの行動(上、下、左、右)を取ることができます。

  • goal_state = 24: 目標状態はグリッドの25番目の位置です。

  • alpha = 0.1: 学習率。Q値の更新時にどれだけ新しい情報を取り入れるかを決めます。

  • gamma = 0.9: 割引率。将来の報酬を現在の価値にどれだけ割り引くかを表します。

  • epsilon_start, epsilon_end, epsilon_decay: これらはε-greedyアルゴリズムに関連するパラメータです。エージェントがランダムに行動を選ぶ確率(探索)と最適な行動を選ぶ確率(活用)のバランスを取ります。

  • n_episodes = 500: 学習するエピソードの数です。

  • max_steps = 50: 各エピソードの最大ステップ数です。

Qテーブル

  • Q = np.zeros((n_states, n_actions)): Qテーブルは、各状態と行動のペアに対する期待報酬を格納します。初期にはすべての値を0に設定します。

主要関数

  • choose_action(state, epsilon): 現在の状態に基づいて行動を選択します。ε-greedyアルゴリズムにより、ランダムに行動を選ぶか、Qテーブルに基づいて最適な行動を選ぶかを決定します。

  • get_next_state(state, action): 選択した行動に基づいて次の状態を計算します。

  • update_epsilon(epsilon): エピソードが進むにつれてε(探索率)を減少させます。

Q学習アルゴリズム

  • この部分では、指定されたエピソード数とステップ数にわたって学習プロセスが行われます。

  • 各エピソードで、エージェントはランダムな状態から開始し、choose_action 関数を使って行動を選択します。

  • get_next_state 関数で次の状態を計算し、目標状態に到達した場合には報酬を与えます。

  • Qテーブルは、現在のQ値、報酬、最大の将来のQ値を考慮して更新されます。

  • 目標状態に到達するか、最大ステップ数に達するまでこのプロセスを繰り返します。

出力

  • 学習終了後、学習されたQテーブルが出力されます。これにより、各状態でどの行動が最適かがわかります。

import matplotlib.pyplot as plt
import seaborn as sns

# 学習済みのQテーブルを使用して最適な行動を選択
optimal_policy = np.argmax(Q, axis=1)

# グリッドワールドを可視化する関数
def visualize_grid(optimal_policy):
    grid = np.full((5, 5), ' ')
    arrows = {0: '↑', 1: '↓', 2: '←', 3: '→'}
    for state, action in enumerate(optimal_policy):
        if state == goal_state:
            grid[state // 5, state % 5] = 'G'
        else:
            grid[state // 5, state % 5] = arrows[action]
    
    sns.heatmap(np.zeros((5, 5)), annot=grid, cbar=False, cmap="YlGnBu", fmt="")
    plt.title("Optimal Policy Visualization (5x5 Grid)")
    plt.show()

# 可視化の実行
visualize_grid(optimal_policy)


上記の可視化により、5x5グリッドワールドにおけるエージェントの最適な移動経路が示されています。各セルに表示されている矢印は、その状態においてエージェントが取るべき最適な行動(上、下、左、右)を表しています。目標状態は G で表示されています。

この可視化により、学習済みのQテーブルを用いて、エージェントがどのように目標状態に向かって最適な経路を選択するかがわかります。エージェントは、この経路をたどることで最大の報酬を得ることができます。

結論

Q学習は、様々な強化学習問題に対する効果的なアプローチを提供します。適切に実装と調整を行うことで、複雑な決定問題に対して強力なソリューションを提供することができます。

強化学習はこの本がわかりやすい。


この記事が気に入ったらサポートをしてみませんか?