Обучение с подкреплением: value iteration и Q-learning на Python
В обучении с подкреплением агент действует в среде и получает награды. Он узнаёт, насколько хорошо каждое состояние или действие, чтобы выбирать действия, приносящие больше всего награды со временем.
Суть простыми словами
В обучении с подкреплением агент действует в среде и получает награды. Он узнаёт, насколько хорошо каждое состояние или действие, чтобы выбирать действия, приносящие больше всего награды со временем.
Научите агента добираться до цели: вычислите ценности состояний методом value iteration, а затем выучите их методом проб и ошибок с Q-learning.
Главные идеи
- Коэффициент дисконтирования γ делает более ранние награды ценнее.
- Value iteration требует модели среды; Q-learning учится на опыте.
- Q(s, a) - ожидаемая суммарная награда за действие a в состоянии s.
- Исследование (здесь 20% случайных ходов) нужно, чтобы агент нашёл цель.
Когда это использовать?
- Понять, что происходит внутри нейронных сетей и библиотек ИИ.
- Разобраться в идее до того, как реализовать её в соответствующих задачах.
- Подготовиться к курсам по машинному обучению, собеседованиям и проектам.
Посмотрите в действии
Нажмите Запуск слева, чтобы распространить ценности от цели по всей сетке. Справа агент методом проб и ошибок выучивает тот же путь.
Пример кода
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
Как это работает
Value iteration повторяет обновление Беллмана, где ценность клетки - это лучшая награда плюс дисконтированная ценность следующей клетки; по мере удаления от цели получается 10, 9, 8.1 и 7.29. Q-learning не знает правил. После каждого шага он сдвигает оценку к reward + γ·max Q(next) и учится всегда идти вправо.
Измените значения и запустите программу в онлайн-компиляторе Python CodeUtility без локальной установки Python.
Практические задания
Изменяйте входные данные и проверяйте граничные случаи перед работой с большими наборами.
- Измените входные данные или веса и предскажите результат до запуска.
- Выводите промежуточные значения, чтобы проследить каждый шаг вычислений.
- Решите задачи по ссылкам ниже, чтобы самостоятельно реализовать идею.
Попрактикуйтесь на задаче
Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.
- Итерация по ценностям Вычислите ценность каждого состояния марковского процесса принятия решений, многократно применяя оптимальное обновление Беллмана. Средне
- Обновления Q-learning Примените обновление Q-learning к потоку опыта и посмотрите, как награды распространяются назад к предыдущим состояниям. Средне