116
правок
Изменения
Нет описания правки
== Простой policy gradient алгоритм (REINFORCE) ==
Рассмотрим МППР, имеющий терминальное состояние: задача - максимизировать сумму всех выигрышей <tex>R=r_0 + r_1+\cdots+r_T</tex>, где T {{- --}} шаг, на котором произошел переход в терминальное состояние.
Будем использовать букву <tex>\tau</tex> для обозначения некоторого ''сценария'' - последовательности состояний и произведенных в них действий: <tex>\tau = (s_1, a_1, s_2, a_2, ... s_T, a_T)</tex>. Будем обозначать сумму всех выигрышей, полученных в ходе сценария, как <tex>R_{\tau} = \sum_{\tau} {r(s_t, a_t)}</tex>.
:<tex>p_{\theta}(\tau) = p_{\theta}(s_1, a_1, ... s_T, a_T) = p(s_1) \prod_{t=1}^{T} {\pi_{\theta}(a_t|s_t) p(s_{t+1}|s_t, a_t)}</tex>
:<tex>J(\theta) = E_{\tau \sim p_{\theta}(\tau)} \left[ R_{\tau} \right] = \int {p_{\theta}(\tau) R_{\tau} d\tau}</tex>
: <tex>\nabla_{\theta} J(\theta) = \int {\nabla_{\theta}p_{\theta}(\tau) R_{\tau} d\tau} </tex>
: <tex>p_{\theta}(\tau) \nabla_{\theta} \log p_{\theta}(\tau) = p_{\theta}(\tau) \frac{\nabla_{\theta}p_{\theta}(\tau)}{p_{\theta}(\tau)} = \nabla_{\theta}p_{\theta}(\tau)</tex>
[[File:Policy-gradient-reinforce.png|thumb|313px|link=http://rll.berkeley.edu/deeprlcourse/f17docs/lecture_4_policy_gradient.pdf|Схема алгоритма REINFORCE]]
: <tex> \nabla_{\theta} J(\theta) \approx \frac{1}{N} \sum_{i=1}^N { \left( \sum_{t=1}^{T} {\nabla_{\theta} \log \pi_{\theta}(a_t^i|s_t^i)} \right) R_{\tau^i}} = \frac{1}{N} \sum_{i=1}^N { \left( \sum_{t=1}^{T^i} {\nabla_{\theta} \log \pi_{\theta}(a_t^i|s_t^i)} \right) \left( \sum_{t=1}^{T^i} { r(s_t^i, a_t^i) } \right)} </tex>
Осталось понять, как получить несмещенную выборку сценариев <tex>\tau</tex> из вероятностного распределения <tex>p_{\theta}(\tau)</tex>. Однако, это очень просто {{---}} нам всего лишь нужно зафиксировать параметр <tex>\theta</tex> и провзаимодействовать со средой, так как распределение <tex>p_{\theta}(\tau)</tex> задает именно вероятность реализации сценария <tex>\tau</tex> при взаимодействии агента с фиксированной стратегией со средой.
Таким образом, оптимизировать <tex>J(\theta)</tex> можно с помощью следующего простого алгоритма (REINFORCE):
# Посчитать среднее арифметическое <tex>\nabla_{\theta} J(\theta) \leftarrow \frac{1}{N} \sum_{i=1}^N { \left( \sum_{t=1}^{T^i} {\nabla_{\theta} \log \pi_{\theta}(a_t^i|s_t^i)} \right) \left( \sum_{t=1}^{T^i} { r(s_t^i, a_t^i) } \right)}</tex>
# <tex> \theta \leftarrow \theta + \alpha \nabla_{\theta} J(\theta)</tex>
# Если не сошлись к экстремуму, повторить с пункта 1.
=== Интуитивное объяснение принципа работы ===
* Легко обобщается на задачи с большим множеством действий, в том числе на задачи с непрерывным множеством действий.
* По большей части избегает конфликта между exploitation и exploration, так как оптимизирует напрямую стохастическую стратегию <tex>\pi_{\theta}(a|s)</tex>.
* Имеет более сильные гарантии сходимости: если Q-learning гарантированно сходится только для МППР с конечными множествами действий и состояний, то policy gradient, при достаточно точных оценках <tex>>\nabla_{\theta} J(\theta)</tex> (т. е. при достаточно больших выборках сценариев), сходится к локальному оптимуму всегда, в том числе в случае бесконечных множеств действий и состояний, и даже для частично наблюдаемых Марковских процессов принятия решений (POMDP).
Недостатки:
* Очень низкая скорость работы {{-- -}} требуется большое количество вычислений для оценки <tex>\nabla_{\theta} J(\theta)</tex> по методу Монте-Карло, так как:
** для получения всего одного семпла требуется произвести <tex>T</tex> взаимодействий со средой;
** случайная величина <tex>\nabla_{\theta} \log p_{\theta}(\tau) R_{\tau}</tex> имеет большую дисперсию, так как для разных <tex>\tau</tex> значения <tex>R_{\tau}</tex> могут очень сильно различаться, поэтому для точной оценки <tex>\nabla_{\theta} J(\theta) = E_{\tau \sim p_{\theta}(\tau)} \left[ \nabla_{\theta} \log p_{\theta}(\tau) R_{\tau} \right]</tex> требуется много семплов;
: <tex> Var_{\tau \sim p_{\theta}(\tau)} \left[ \nabla_{\theta} \log p_{\theta}(\tau) (R_{\tau} - b) \right] = \underbrace{E_{\tau \sim p_{\theta}(\tau)} \left[ \left( \nabla_{\theta} \log p_{\theta}(\tau) (R_{\tau} - b) \right)^2 \right]}_{\text{depends on } b} - \underbrace{E_{\tau \sim p_{\theta}(\tau)} \left[ \nabla_{\theta} \log p_{\theta}(\tau) (R_{\tau} - b) \right]^2}_{= E \left[ \nabla_{\theta} \log p_{\theta}(\tau) R_{\tau} \right]^2} </tex>
, поэтому, регулируя <tex>b</tex>, можно достичь более низкой дисперсии, а значит, более быстрой сходимости Монте-Карло к истинному значению <tex>\nabla_{\theta} J(\theta)</tex>. Значение <tex>b</tex> называется ''опорным значением''. Способы определения опорных значений будут рассмотрены далее, в рамках рассмотрения алгоритма Actor-Critic.
=== Использование будущего выигрыша вместо полного выигрыша ===
: <tex>\nabla_{\theta} J(\theta) \approx \frac{1}{N} \sum_{i=1}^{N} \sum_{t=1}^{T} {\nabla_{\theta} \log \pi_{\theta}(a_t^i|s_t^i) Q_{\tau_i, t} } </tex>
Здесь <tex>Q_{\tau_i, t}</tex> {{-- -}} это оценка будущего выигрыша из состояния <tex>s_t^i</tex> при условии действия <tex>a_t^i</tex>, которая базируется только на одном сценарии <tex>\tau_i</tex>. Это плохое приближение ожидаемого будущего выигрыша {{--- }} истинный ожидаемый будущий выигрыш выражается формулой
: <tex> Q^{\pi}(s_t, a_t) = \sum_{t'=t}^{T} {E_{\pi_{\theta}} [r(s_{t'}, a_{t'}) | s_t, a_t] } </tex>
: <tex> A^{\pi}(s_t, a_t) = Q^{\pi}(s_t, a_t) - V^{\pi}(s_t) </tex>
Преимущество действия <tex>a_t</tex> в состоянии <tex>s_t</tex> {{-- -}} это величина, характеризующая то, насколько выгоднее в состоянии <tex>s_t</tex> выбрать именно действие <tex>a_t</tex>.
Итого:
: <tex> A^{\pi}(s_t^i, a_t^i) = Q^{\pi}(s_t, a_t) - V^{\pi}(s_t) \approx r(s_t, a_t) + V^{\pi}(s_{t+1}) - V^{\pi}(s_t) </tex>
Теперь нам нужно уметь оценивать <tex>V^{\pi}(s_t) = \sum_{t'=t}^{T} {E_{\pi_{\theta}} [r(s_{t'}, a_{t'}) | s_t] }</tex>. Мы можем делать это, опять же, с помощью метода Монте-Карло {{-- -}} так мы получим несмещенную оценку. Но это будет работать не существенно быстрее, чем обычный policy gradient. Вместо этого заметим, что при фиксированных <tex>s_t</tex> и <tex>a_t</tex> выполняется:
: <tex> V^{\pi}(s_t) = r(s_t, a_t) + V^{\pi}(s_{t+1})</tex>
: <tex> V^{\pi}(s_t) \leftarrow (1 - \beta) V^{\pi}(s_t) + \beta (r(s_t, a_t) + V^{\pi}(s_{t+1})) </tex>
Здесь <tex>\beta</tex> -- это коэффициент обучения (''learning rate'') для функции ценности. Такой пересчет мы можем производить каждый раз, когда агент получает вознаграждение за действие. Так мы получим оценку ценности текущего состояния, не зависящуювы от выбранного сценария развития событий <tex>\tau</tex>, а значит, и оценка функции преимущества не будет зависеть от выбора конкретного сценария. Это сильно снижает дисперсию случайной величины <tex>\nabla_{\theta} \log \pi_{\theta}(a_t^i|s_t^i) A^{\pi}(s_t^i, a_t^i)</tex>, что делает оценку <tex>\nabla_{\theta} J(\theta)</tex> достаточно точной даже в том случае, когда мы используем всего один сценарий для ее подсчета:
: <tex>\nabla_{\theta} J(\theta) \approx \sum_{t=1}^{T} {\nabla_{\theta} \log \pi_{\theta}(a_t|s_t) A^{\pi}(s_t, a_t) }</tex>
На практике же мы можем аппроксимировать <tex>\nabla_{\theta} J(\theta)</tex> на каждом шаге (в онлайне), основываясь на всего одном действии каждый раз. Алгоритм, в итоге, будет следующим: # производим действие <tex>a \sim \pi_{\theta}(a|s)</tex>, переходим в состояние <tex>s'</tex> и получаем вознаграждение <tex>r</tex># <tex>V^{\pi}(s) \leftarrow (1 - \beta) V^{\pi}(s) + \beta (r + V^{\pi}(s'))</tex># <tex>A_{\pi}(s, a) \leftarrow r + V^{\pi}(s') - V^{\pi}(s) </tex># <tex>\nabla_{\theta} J(\theta) \leftarrow \nabla_{\theta} \log \pi_{\theta}(a|s) A^{\pi}(s, a)</tex># <tex>\theta \leftarrow \theta + \alpha \nabla_{\theta} J(\theta)</tex># Если не сошлись к экстремуму, повторить с пункта 1. Такой алгоритм и называется алгоритмом Actor-Critic. Актором здесь называется компонента, которая оптимизирует стратегию <tex>\pi_{\theta}(a|s)</tex>, а критиком {{---}} компонента, которая подсчитывает ценности состояний <tex>V^{\pi}(s)</tex>. Актор определяет дальнейшее действие, а критик оценивает, насколько то или иное действие выгодно. Алгоритм актора-критика считается гибридным, так как актор работает в соответствии с принципом policy gradient, а критик работает аналогично алгоритму Q-routing. === Асинхронный актор-критик === [[File:Async-actor-critic.png|thumb|313px|link=http://rll.berkeley.edu/deeprlcourse/f17docs/lecture_5_actor_critic_pdf.pdf|Иллюстрация работы алгоритма асинхронного актора-критика]] Проблема с обучением с подкреплением в онлайне заключается в том, что данные, поступающие на вход алгоритму обучения, сильно скоррелированы: каждое следующее состояние непосредственно зависит от предпринятых агентом действий. Обучение на сильно скоррелированных данных приводит к переобучению. Таким образом, для того, чтобы успешно обучить стратегию, обобщаемую на большое количество состояний среды, нам все еще необходимо обучаться на эпизодах из различных сценариев. Одним из способов достичь этого является запуск множества агентов параллельно. Все агенты находятся в разных состояниях и выбирают различные конкретные действия согласно стохастической стратегии <tex>\pi_{\theta}(a|s)</tex>, тем самым достигается устранение корреляции между наблюдаемыми данными. Однако, все агенты используют и оптимизируют один и тот же набор параметров <tex>\theta</tex>. Идея алгоритма асинхронного актора-критика заключается в том, чтобы запустить N агентов параллельно, при этом на каждом шаге каждый из агентов рассчитывает обновления для значений <tex>V^{\pi}(s)</tex> и <tex>\theta</tex>. Однако, вместо того, чтобы просто продолжить работу, каждый агент обновляет <tex>V^{\pi}(s)</tex> и <tex>\theta</tex>, общие для всех агентов. Перед обработкой каждого нового эпизода агент копирует текущие глобальные значения параметра <tex>\theta</tex> и использует его, чтобы определить собственную стратегию на этот эпизод. Агенты не ждут, пока остальные агенты завершат обработку своих эпизодов, чтобы обновить глобальные параметры (отсюда ''асинхронный''). Поэтому, пока один из агентов обрабатывает один эпизод, глобальное значение <tex>\theta</tex> может изменяться вследствие действий других агентов. === Реализация асинхронного актора-критика на основе нейронных сетей === == См. также == * [[Обучение с подкреплением]]
== Ссылки ==
* [http://rll.berkeley.edu/deeprlcourse/f17docs/lecture_4_policy_gradient.pdf Policy Gradients. CS 294-112: Deep Reinforcement Learning, Sergey Levine.]