Обучение с подкреплением и выравнивание

Temporal difference и Q-learning

Учиться, не зная модели и не дожидаясь конца эпизода

Шаг 106 из 117 · ~28 мин

Снять требование модели

Динамическое программирование упиралось в sP(ss,a)\sum_{s'}P(s'\mid s,a). Заменим математическое ожидание выборкой: агент сделал шаг, увидел награду и следующее состояние — этого достаточно.

V(s)V(s)+α[r+γV(s)V(s)]δV(s) \leftarrow V(s) + \alpha\,\underbrace{\big[\htmlData{k=target}{r + \gamma V(s')} - V(s)\big]}_{\htmlData{k=error}{\delta}}

Две вещи здесь новы. Первая: использует собственную оценку V(s)V(s') — это бутстрэппинг, обучение оценки по другой оценке. Вторая: обновление происходит на каждом шаге, не дожидаясь конца эпизода.

Сравним с двумя соседями:

методцельнужна модельждать конца эпизода
динамическое программированиеE[r+γV(s)]\mathbb{E}[r + \gamma V(s')]данет
Монте-Карлонаблюдённый GtG_t целикомнетда
TD(0)r+γV(s)r + \gamma V(s')нетнет

TD берёт лучшее из двух столбцов: выборку вместо ожидания у Монте-Карло, бутстрэппинг вместо полного возврата у динамического программирования.

Почему TD обычно лучше Монте-Карло

Ожидание такое: цель TD смещена (использует несовершенную оценку V(s)V(s')), зато у неё намного меньше дисперсия — она зависит от одного случайного перехода, а не от всей траектории. Монте-Карло несмещён, но собирает шум всего эпизода.

Проверим на классическом случайном блуждании из пяти состояний, где истинные значения известны точно и равны 16,26,,56\frac16, \frac26, \dots, \frac56. Пятьдесят прогонов, α=0.05\alpha = 0.05:

методсредняя RMS-ошибка после 100 эпизодовпосле 1000
TD(0)0.0380.0380.0370.037
Монте-Карло0.1190.1190.1230.123

TD втрое точнее, и разрыв не сокращается с числом эпизодов — при постоянном α\alpha обе оценки выходят на плато, определяемое дисперсией цели. Смещение TD при этом на результат почти не влияет: оно исчезает по мере того, как VV становится точнее, а дисперсия — не исчезает никогда.

Полезная формулировка: TD меняет несмещённость на дисперсию, и обмен обычно выгоден. Урок 080 покажет, что между этими двумя крайностями есть непрерывное семейство.

Q-learning

Чтобы выбирать действия без модели, нужна QQ, а не VV (урок 020). Правило то же, с максимумом внутри:

Q(s,a)Q(s,a)+α[r+γmaxaQ(s,a)Q(s,a)]Q(s,a) \leftarrow Q(s,a) + \alpha\Big[r + \gamma \max_{a'} Q(s',a') - Q(s,a)\Big]

Максимум делает алгоритм off-policy: цель говорит о жадной политике, а данные собираются какой угодно — например ε\varepsilon-жадной. Это разделение полезно: можно исследовать среду случайно и при этом выучивать оптимальную политику.

Сравните с SARSA, где вместо максимума стоит фактически выбранное действие:

Q(s,a)Q(s,a)+α[r+γQ(s,a)Q(s,a)]Q(s,a) \leftarrow Q(s,a) + \alpha\big[r + \gamma Q(s',a') - Q(s,a)\big]

Q-learningSARSA
цельпо жадному действиюпо фактическому
что выучиваетоптимальную политикуценность своей политики
поведение у обрываидёт по краюобходит с запасом

Третья строка — знаменитый пример «cliff walking», и он не курьёз. Если поведение остаётся ε\varepsilon-жадным, SARSA учитывает, что иногда сорвётся, и держится подальше; Q-learning выучивает путь, оптимальный для агента, который никогда не ошибается. Какой ответ правильный, зависит от того, будет ли исследование выключено при использовании.

0.620.730.8610.520.73-10.430.520.620.520.340.520.43

терминал стена

дисконт γ 0.9
проходов 20
цена шага -0.04
горизонт 1/(1−γ)
10
значение старта
0.344
изменение за проход
0.0e+0
проходов до сходимости
7
Виджет считает значения точно, зная модель. Q-learning приходит к этим же числам, никакой модели не имея, — за счёт многих проходов по среде вместо проходов по таблице. Полезно держать эту картинку как ответ, с которым сверяют обучение: если табличный Q-learning сходится к другому, ошибка в реализации, а не в среде.

Точное решение. Именно к нему сходится табличный Q-learning при бесконечном исследовании и убывающем шаге.

Условия сходимости

Табличный Q-learning сходится к QQ^* при двух условиях:

  1. каждая пара (s,a)(s,a) посещается бесконечно часто;
  2. шаги удовлетворяют условиям Роббинса–Монро: αt=\sum\alpha_t = \infty, αt2<\sum\alpha_t^2 < \infty.

Второе условие — то же самое, что в стохастической аппроксимации (блок 5, урок 060): шаги должны убывать, но не слишком быстро. Например αt=1/t\alpha_t = 1/t подходит, αt=1/t2\alpha_t = 1/t^2 — нет (сумма конечна, и алгоритм остановится, не дойдя).

Первое условие практически недостижимо и в этом вся трудность применения: чтобы гарантированно выучить, нужно бесконечно исследовать; чтобы получать награду, нужно использовать выученное. Компромисс называют exploration–exploitation, и универсального решения у него нет — ε\varepsilon-жадность, оптимистичная инициализация, UCB и энтропийные бонусы (урок 120) решают его по-разному.

Итог

  • TD заменяет ожидание выборкой и полный возврат — бутстрэппингом.
  • Обмен «смещение против дисперсии» обычно выгоден: втрое меньшая ошибка на классическом тесте.
  • Q-learning off-policy благодаря максимуму в цели; SARSA on-policy и потому осторожнее.
  • Сходимость требует бесконечного исследования и убывающих по Роббинсу–Монро шагов.
  • Первое условие недостижимо, и отсюда вся проблематика исследования.

Источники

Проверки

0 из 2
  1. Бутстрэппинг и выбор цели

    Отметьте все верные утверждения о TD-обучении.

  2. Один шаг Q-learning и SARSA

    Реализуйте td_step(q_sa, reward, q_next, gamma, alpha), где q_next — список ценностей действий в следующем состоянии, а фактически выбранным там оказалось действие с индексом нуль. Верните [q_target, td_error, updated_q, off_policy_gap]:

    • q_target = r+γmaxaQ(s,a)r + \gamma \max_{a'} Q(s', a') — цель Q-learning;
    • td_error = q_targetQ(s,a)\texttt{q\_target} - Q(s,a);
    • updated_q = Q(s,a)+αtd_errorQ(s,a) + \alpha \cdot \texttt{td\_error};
    • off_policy_gap — разность между ошибкой Q-learning и ошибкой SARSA, где цель второй равна r+γQ(s,aфакт)r + \gamma Q(s', a'_{\text{факт}}), то есть использует q_next[0].

    Последнее число измеряет, насколько цель по жадному действию расходится с целью по фактическому. Оно равно нулю ровно тогда, когда выбранное действие и было жадным.

    функция td_step

    Загрузка редактора…

    Ctrl/⌘ + Enter