KI-Konzepte in Python

Bestärkendes Lernen: Value Iteration und Q-Learning in Python

Beim bestärkenden Lernen handelt ein Agent in einer Umgebung und erhält Belohnungen. Er lernt, wie gut jeder Zustand oder jede Aktion ist, damit er die Aktionen wählen kann, die über die Zeit die meiste Belohnung bringen.

Das Konzept in einfachen Worten

Beim bestärkenden Lernen handelt ein Agent in einer Umgebung und erhält Belohnungen. Er lernt, wie gut jeder Zustand oder jede Aktion ist, damit er die Aktionen wählen kann, die über die Zeit die meiste Belohnung bringen.

Bring einem Agenten bei, ein Ziel zu erreichen: Berechne Zustandswerte mit Value Iteration und lerne sie dann durch Versuch und Irrtum mit Q-Learning.

Die wichtigsten Ideen

  • Der Diskontfaktor γ macht frühere Belohnungen wertvoller.
  • Value Iteration braucht ein Modell der Umgebung; Q-Learning lernt aus Erfahrung.
  • Q(s, a) ist die erwartete Gesamtbelohnung für Aktion a im Zustand s.
  • Erkundung (hier 20 % zufällige Züge) ist nötig, damit der Agent das Ziel entdeckt.

Wann wird dieser Ansatz verwendet?

  • Verstehen, was in neuronalen Netzen und KI-Bibliotheken passiert.
  • Die Idee lernen, bevor du sie in den passenden Challenges umsetzt.
  • Dich auf Kurse zu maschinellem Lernen, Vorstellungsgespräche und Projekte vorbereiten.

Selbst ausprobieren

Klicke links auf Start, um die Werte vom Ziel aus über das Gitter zu verbreiten. Rechts lernt der Agent denselben Weg durch Versuch und Irrtum.

Beispielcode

Code ausführen →
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))

Erwartete Ausgabe

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

So funktioniert es

Value Iteration wiederholt das Bellman-Update, bei dem der Wert eines Feldes die beste Belohnung plus der abgezinste Wert des nächsten Feldes ist; das ergibt 10, 9, 8.1 und 7.29 mit wachsendem Abstand zum Ziel. Q-Learning kennt die Regeln nicht. Nach jedem Schritt bewegt es seine Schätzung in Richtung reward + γ·max Q(next) und lernt, immer nach rechts zu gehen.

Ändere die Werte und führe das Programm im CodeUtility Python Online-Compiler aus, ohne Python lokal zu installieren.

Übungsaufgaben

Verändere Eingaben und Randfälle, bevor du die Lösung mit größeren Datenmengen testest.

  1. Ändere Eingaben oder Gewichte und sage die Ausgabe vor dem Ausführen voraus.
  2. Gib die Zwischenwerte aus, um jeden Rechenschritt zu verfolgen.
  3. Löse die verlinkten Challenges unten, um die Idee selbst umzusetzen.
In der Python-IDE ausführen →

Mit einer Challenge üben

Nutze den Inhalt dieser Lektion, um ein echtes Problem zu lösen. Jede Challenge läuft im Browser, mit sofortigen Tests und einem KI-Review.

Alle Challenges