Pythonで学ぶAIの概念

Pythonで学ぶマルコフ連鎖と探索・活用のトレードオフ

AIは不確かな状況で行動しなければならないことがよくあります。マルコフ連鎖はシステムが一定の確率で状態間を移る様子をモデル化し、多腕バンディットは強化学習の核心となる選択を示します。新しいことを試すか、これまで最もうまくいったものを使うかです。

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

AIは不確かな状況で行動しなければならないことがよくあります。マルコフ連鎖はシステムが一定の確率で状態間を移る様子をモデル化し、多腕バンディットは強化学習の核心となる選択を示します。新しいことを試すか、これまで最もうまくいったものを使うかです。

マルコフ連鎖で将来の状態を予測し、epsilon-greedyバンディットで探索と活用のバランスを取ります。

重要なポイント

  • マルコフ連鎖では、次の状態は現在の状態だけで決まります。
  • ある状態から出る遷移確率の合計は常に1です。
  • 探索はより良い選択肢を見つけ、活用は既知の最良の選択肢から報酬を得ます。
  • epsilonがバランスを決め、大きいほど多く探索します。

どのような場面で使う?

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

動かして理解する

天気の遷移確率を変えて、連鎖がどこに落ち着くかを見ましょう。再生を押すと、バンディットがどのマシンの報酬が多いかを学びます。

サンプルコード

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

# Markov chain: tomorrow's weather depends only on today's.
transitions = {"sunny": {"sunny": 0.8, "rainy": 0.2}, "rainy": {"sunny": 0.4, "rainy": 0.6}}
dist = {"sunny": 1.0, "rainy": 0.0}
for day in range(1, 4):
    dist = {s: sum(dist[p] * transitions[p][s] for p in dist) for s in dist}
    print(f"day {day}:", {s: round(v, 3) for s, v in dist.items()})

# Epsilon-greedy bandit: usually pick the best arm so far, sometimes explore.
random.seed(1)
true_payouts = [0.3, 0.7]
counts, totals = [0, 0], [0.0, 0.0]
epsilon = 0.1
for _ in range(500):
    if random.random() < epsilon or 0 in counts:
        arm = random.randrange(2)                                  # explore
    else:
        arm = max(range(2), key=lambda a: totals[a] / counts[a])  # exploit
    reward = 1 if random.random() < true_payouts[arm] else 0
    counts[arm] += 1
    totals[arm] += reward
print("pulls per arm:", counts)
print("estimated payouts:", [round(t / c, 2) for t, c in zip(totals, counts)])

期待される出力

day 1: {'sunny': 0.8, 'rainy': 0.2}
day 2: {'sunny': 0.72, 'rainy': 0.28}
day 3: {'sunny': 0.688, 'rainy': 0.312}
pulls per arm: [25, 475]
estimated payouts: [0.16, 0.7]

仕組み

毎日、新しい確率は前日の確率に遷移確率を掛けたものなので、晴れの確率は3日で1.0から0.688に下がります。バンディットは10%の確率でランダムなアームを選び、それ以外はこれまでの平均が最も良いアームを引きます。すぐに大半の試行を良いほうのアームに使い、その報酬をおよそ0.7と見積もります。

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

練習問題

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

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

チャレンジで練習する

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

すべてのチャレンジ