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
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.
- Ändere Eingaben oder Gewichte und sage die Ausgabe vor dem Ausführen voraus.
- Gib die Zwischenwerte aus, um jeden Rechenschritt zu verfolgen.
- Löse die verlinkten Challenges unten, um die Idee selbst umzusetzen.
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.
- Wertiteration Berechne, wie wertvoll jeder Zustand eines Markov-Entscheidungsprozesses ist, indem du wiederholt das Bellman-Optimalitäts-Update anwendest. Mittel
- Q-Learning-Updates Wende das Q-Learning-Update auf einen Strom von Erfahrungen an und sieh zu, wie Belohnungen zu früheren Zuständen zurückfließen. Mittel