Pythonで学ぶAIの概念

Pythonで学ぶ強化学習:価値反復法とQ学習

強化学習では、エージェントが環境の中で行動し、報酬を受け取ります。各状態や行動がどれだけ良いかを学び、時間を通して最も多くの報酬をもたらす行動を選べるようになります。

やさしい言葉で概念を理解する

強化学習では、エージェントが環境の中で行動し、報酬を受け取ります。各状態や行動がどれだけ良いかを学び、時間を通して最も多くの報酬をもたらす行動を選べるようになります。

エージェントにゴールへの行き方を教えます。価値反復法で状態の価値を計算し、Q学習で試行錯誤から学びます。

重要なポイント

  • 割引率γにより、早くもらえる報酬ほど価値が高くなります。
  • 価値反復法には環境のモデルが必要ですが、Q学習は経験から学びます。
  • Q(s, a)は、状態sで行動aを取ったときに期待される報酬の合計です。
  • エージェントがゴールを見つけるには探索(ここでは20%のランダムな移動)が必要です。

どのような場面で使う?

  • ニューラルネットワークやAIライブラリの内部で何が起きているかを理解する。
  • 対応するチャレンジで実装する前に考え方をつかむ。
  • 機械学習の講座、面接、プロジェクトに備える。

動かして理解する

左の再生を押すと、ゴールから価値がグリッド全体へ広がります。右では、エージェントが試行錯誤で同じ経路を学ぶ様子が見られます。

サンプルコード

コードを実行 →
main.py
import random

# A corridor of 5 cells: start in cell 0, reward +10 for reaching cell 4.
N, GOAL, GAMMA = 5, 4, 0.9

# Value iteration: a cell is worth its reward plus the discounted best neighbour.
values = [0.0] * N
for _ in range(50):
    values = [0.0 if s == GOAL else max((10 if n == GOAL else 0) + GAMMA * values[n]
              for n in (max(0, s - 1), min(N - 1, s + 1))) for s in range(N)]
print("state values:", [round(v, 2) for v in values])

# Q-learning learns the same thing from trial and error.
random.seed(0)
Q = [[0.0, 0.0] for _ in range(N)]   # actions: 0 = left, 1 = right
for episode in range(200):
    s = 0
    while s != GOAL:
        a = random.randrange(2) if random.random() < 0.2 else Q[s].index(max(Q[s]))
        n = max(0, s - 1) if a == 0 else min(N - 1, s + 1)
        reward = 10 if n == GOAL else 0
        target = reward + (0 if n == GOAL else GAMMA * max(Q[n]))
        Q[s][a] += 0.5 * (target - Q[s][a])   # move the estimate toward the target
        s = n
print("best action per cell:", ["right" if q[1] >= q[0] else "left" for q in Q[:GOAL]])
print("Q(0, right):", round(Q[0][1], 2))

期待される出力

state values: [7.29, 8.1, 9.0, 10.0, 0.0]
best action per cell: ['right', 'right', 'right', 'right']
Q(0, right): 7.29

仕組み

価値反復法はベルマン更新を繰り返します。マスの価値は、最良の報酬に次のマスの割り引いた価値を足したもので、ゴールから離れるにつれて10、9、8.1、7.29になります。Q学習はルールを知りません。各ステップの後に見積もりをreward + γ·max Q(next)へ近づけ、常に右へ進むことを学びます。

値を変更し、PythonをインストールせずにCodeUtilityオンラインPythonコンパイラで実行できます。

練習問題

入力値と境界ケースを変更し、より大きなデータでも動作を確認してください。

  1. 入力や重みを変えて、実行前に出力を予想してみましょう。
  2. 途中の値を出力して、計算の各ステップを追いましょう。
  3. 下のリンクのチャレンジを解いて、自分でアイデアを実装しましょう。
Python IDEで実行 →

チャレンジで練習する

このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。

すべてのチャレンジ