Обучение с подкреплением — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м (rollbackEdits.php mass rollback)
 
(не показаны 4 промежуточные версии 3 участников)
Строка 18: Строка 18:
  
 
Формально простейшая модель обучения с подкреплением состоит из:
 
Формально простейшая модель обучения с подкреплением состоит из:
* множества состояний окружения (''states'')  <tex>S</tex>
+
* множества состояний окружения (''states'')  <tex>S</tex>;
* множества действий (''actions'') <tex>A</tex>
+
* множества действий (''actions'') <tex>A</tex>;
* множества вещественнозначных скалярных "выигрышей" (''rewards'')
+
* множества вещественнозначных скалярных "выигрышей" (''rewards'').
  
 
В произвольный момент времени <tex>t</tex> агент характеризуется состоянием <tex>s_t \in S</tex> и множеством возможных действий <tex>A(s_t)</tex>.
 
В произвольный момент времени <tex>t</tex> агент характеризуется состоянием <tex>s_t \in S</tex> и множеством возможных действий <tex>A(s_t)</tex>.
Строка 26: Строка 26:
 
Основываясь на таком взаимодействии с окружающей средой, агент, обучающийся с подкреплением, должен выработать стратегию <tex>\pi: S \to A</tex>, которая максимизирует величину <tex>R=r_0 + r_1+\cdots+r_n</tex> в случае МППР, имеющего терминальное состояние, или величину:
 
Основываясь на таком взаимодействии с окружающей средой, агент, обучающийся с подкреплением, должен выработать стратегию <tex>\pi: S \to A</tex>, которая максимизирует величину <tex>R=r_0 + r_1+\cdots+r_n</tex> в случае МППР, имеющего терминальное состояние, или величину:
  
::<tex>R=\sum_t \gamma^t r_t</tex>
+
::<tex>R=\sum_t \gamma^t r_t</tex>,
  
 
для МППР без терминальных состояний (где <tex>0 \leq \gamma \leq 1</tex> {{---}} дисконтирующий множитель для "предстоящего выигрыша").
 
для МППР без терминальных состояний (где <tex>0 \leq \gamma \leq 1</tex> {{---}} дисконтирующий множитель для "предстоящего выигрыша").
Строка 39: Строка 39:
  
 
Игра агента со средой:
 
Игра агента со средой:
* инициализация стратегии <tex>\pi_1(a | s)</tex> и состояния среды <tex>s_1</tex>
+
* инициализация стратегии <tex>\pi_1(a | s)</tex> и состояния среды <tex>s_1</tex>;
* для всех <tex>t = 1 \ldots T</tex>
+
* для всех <tex>t = 1 \ldots T</tex>:
** агент выбирает действие <tex>a_t ∼ \pi_t(a | s_t)</tex>
+
** агент выбирает действие <tex>a_t ∼ \pi_t(a | s_t)</tex>;
** среда генерирует награду <tex>r_{t + 1} ∼ p(r | a_t, s_t)</tex> и новое состояние <tex>s_{t + 1} ∼ p(s | a_t, s_t)</tex>
+
** среда генерирует награду <tex>r_{t + 1} ∼ p(r | a_t, s_t)</tex> и новое состояние <tex>s_{t + 1} ∼ p(s | a_t, s_t)</tex>;
** агент корректирует стратегию <tex>\pi_{t + 1}(a | s)</tex>
+
** агент корректирует стратегию <tex>\pi_{t + 1}(a | s)</tex>.
  
 
Это марковский процесс принятия решений (МППР), если  
 
Это марковский процесс принятия решений (МППР), если  
<tex>P(s_{t+1} = s′, r_{t+1} = r | s_t, a_t, r_t, s_{t−1}, a_{t−1}, r_{t−1}, .. ,s_1, a_1) = P(s_{t+1} = s′,r_{t+1} = r | s_t, a_t)</tex>
+
<tex>P(s_{t+1} = s′, r_{t+1} = r | s_t, a_t, r_t, s_{t−1}, a_{t−1}, r_{t−1}, .. ,s_1, a_1) = P(s_{t+1} = s′,r_{t+1} = r | s_t, a_t)</tex>,
  
 
МППР называется финитным, если <tex>|A| < \infty</tex>, <tex>|S| < \infty</tex>
 
МППР называется финитным, если <tex>|A| < \infty</tex>, <tex>|S| < \infty</tex>
Строка 55: Строка 55:
  
 
Наивный подход к решению этой задачи подразумевает следующие шаги:
 
Наивный подход к решению этой задачи подразумевает следующие шаги:
* опробовать все возможные стратегии
+
* опробовать все возможные стратегии;
* выбрать стратегию с наибольшим ожидаемым выигрышем
+
* выбрать стратегию с наибольшим ожидаемым выигрышем.
  
 
Первая проблема такого подхода заключается в том, что количество доступных стратегий может быть очень велико или бесконечно.
 
Первая проблема такого подхода заключается в том, что количество доступных стратегий может быть очень велико или бесконечно.
Строка 70: Строка 70:
 
либо ожидаемый выигрыш, при принятии решения <tex>a</tex> в состоянии <tex>s</tex> и дальнейшем соблюдении <tex>\pi</tex>,
 
либо ожидаемый выигрыш, при принятии решения <tex>a</tex> в состоянии <tex>s</tex> и дальнейшем соблюдении <tex>\pi</tex>,
  
::<tex>Q(s, a) = E[R|s, \pi, a]</tex>.
+
::<tex>Q(s, a) = E[R|s, \pi, a]</tex>,
  
 
Если для выбора оптимальной стратегии используется функция полезности <tex>Q</tex>, то оптимальные действия всегда можно выбрать как действия, максимизирующие полезность.
 
Если для выбора оптимальной стратегии используется функция полезности <tex>Q</tex>, то оптимальные действия всегда можно выбрать как действия, максимизирующие полезность.
Строка 86: Строка 86:
 
Поэтому построение искомой оценки при <tex>\gamma \in (0, 1)</tex> неочевидно. Однако, можно заметить, что <tex>R</tex> образуют рекурсивное уравнение Беллмана:
 
Поэтому построение искомой оценки при <tex>\gamma \in (0, 1)</tex> неочевидно. Однако, можно заметить, что <tex>R</tex> образуют рекурсивное уравнение Беллмана:
  
::<tex>E[R|s_t]=r_t + \gamma E[R|s_{t+1}]</tex>.
+
::<tex>E[R|s_t]=r_t + \gamma E[R|s_{t+1}]</tex>,
  
Подставляя имеющиеся оценки, <tex>V</tex>, и применяя метод градиентного спуска с квадратичной функцией ошибок, мы приходим к алгоритму [http://en.wikipedia.org/wiki/Temporal_difference_learning обучения с временными воздействиями] (''temporal difference (TD) learning'').
+
Подставляя имеющиеся оценки <tex>V</tex> и применяя метод градиентного спуска с квадратичной функцией ошибок, мы приходим к алгоритму [http://en.wikipedia.org/wiki/Temporal_difference_learning обучения с временными воздействиями] (''temporal difference (TD) learning'').
 
В простейшем случае и состояния, и действия дискретны и можно придерживаться табличных оценок для каждого состояния.
 
В простейшем случае и состояния, и действия дискретны и можно придерживаться табличных оценок для каждого состояния.
  
Строка 99: Строка 99:
 
=== Формулировка ===
 
=== Формулировка ===
  
<tex>A</tex> {{---}} множество возможных ''действий'' (ручек автомата)
+
<tex>A</tex> {{---}} множество возможных ''действий'' (ручек автомата),
  
<tex>p_a(r)</tex> {{---}} неизвестное распределение ''награды'' <tex>r \in R</tex> <tex>\forall a \in A</tex>
+
<tex>p_a(r)</tex> {{---}} неизвестное распределение ''награды'' <tex>r \in R</tex> <tex>\forall a \in A</tex>,
  
<tex>\pi_t(a)</tex> {{---}} ''стратегия'' агента в момент <tex>t</tex> <tex>\forall a \in A</tex>
+
<tex>\pi_t(a)</tex> {{---}} ''стратегия'' агента в момент <tex>t</tex> <tex>\forall a \in A</tex>.
  
 
Игра агента со средой:
 
Игра агента со средой:
* инициализация стратегии <tex>\pi_1(a)</tex>
+
* инициализация стратегии <tex>\pi_1(a)</tex>;
* для всех <tex>t = 1 \ldots T</tex>
+
* для всех <tex>t = 1 \ldots T</tex>:
** агент выбирает действие (ручку) <tex>a_t ∼ \pi_t(a)</tex>
+
** агент выбирает действие (ручку) <tex>a_t ∼ \pi_t(a)</tex>;
** среда генерирует награду <tex>r_t ∼ p_{a_t}(r)</tex>
+
** среда генерирует награду <tex>r_t ∼ p_{a_t}(r)</tex>;
** агент корректирует стратегию <tex>\pi_{t+1}(a)</tex>
+
** агент корректирует стратегию <tex>\pi_{t+1}(a)</tex>.
  
<tex>Q_t(a) = \frac{\sum^{t}_{i=1}{r_i[a_i = a]}}{\sum^{t}_{i=1}{[a_i = a]}} \rightarrow max </tex> {{---}} средняя награда в <i>t</i> играх <br />
+
<tex>Q_t(a) = \frac{\sum^{t}_{i=1}{r_i[a_i = a]}}{\sum^{t}_{i=1}{[a_i = a]}} \rightarrow max </tex> {{---}} средняя награда в <i>t</i> играх <br />,
<tex>Q^∗(a) = \lim \limits_{t \rightarrow \infty} Q_t(a) \rightarrow max </tex> {{---}} ценность действия <tex>a</tex>
+
<tex>Q^∗(a) = \lim \limits_{t \rightarrow \infty} Q_t(a) \rightarrow max </tex> {{---}} ценность действия <tex>a</tex>.
  
 
У нас есть автомат {{---}} <tex>N</tex>-рукий бандит, на каждом шаге мы выбираем за какую из <tex>N</tex> ручек автомата дернуть,
 
У нас есть автомат {{---}} <tex>N</tex>-рукий бандит, на каждом шаге мы выбираем за какую из <tex>N</tex> ручек автомата дернуть,
Строка 126: Строка 126:
 
Проблема в том, что распределения неизвестны, однако можно оценить математическое ожидание некоторой случайной величины <tex>\xi</tex> c неизвестным распределением. Для <tex>K</tex> экспериментов <tex>\xi_k</tex>, оценка математического ожидания это среднее арифметическое результатов экспериментов:
 
Проблема в том, что распределения неизвестны, однако можно оценить математическое ожидание некоторой случайной величины <tex>\xi</tex> c неизвестным распределением. Для <tex>K</tex> экспериментов <tex>\xi_k</tex>, оценка математического ожидания это среднее арифметическое результатов экспериментов:
  
<tex>E(\xi) = \frac{1}{K} \sum_{k=1}^{K}{\xi_k} </tex>
+
<tex>E(\xi) = \frac{1}{K} \sum_{k=1}^{K}{\xi_k} </tex>,
  
 
Задача является модельной для понимания конфликта между ''exploitation''-''exploration''.
 
Задача является модельной для понимания конфликта между ''exploitation''-''exploration''.
Строка 134: Строка 134:
 
==== Жадная (''greedy'') стратегия ====
 
==== Жадная (''greedy'') стратегия ====
  
* <tex>P_a = 0</tex> <tex>\forall a \in \{1 \ldots N\} </tex> {{---}} сколько раз было выбрано действие <tex>a</tex>
+
* <tex>P_a = 0</tex> <tex>\forall a \in \{1 \ldots N\} </tex> {{---}} сколько раз было выбрано действие <tex>a</tex>,
  
* <tex>Q_a = 0</tex> <tex>\forall a \in \{1 \ldots N\}</tex> {{---}} текущая оценка математического ожидания награды для действия <tex>a</tex>
+
* <tex>Q_a = 0</tex> <tex>\forall a \in \{1 \ldots N\}</tex> {{---}} текущая оценка математического ожидания награды для действия <tex>a</tex>.
  
 
На каждом шаге <tex>t</tex>
 
На каждом шаге <tex>t</tex>
 
* Выбираем действие с максимальной оценкой математического ожидания:
 
* Выбираем действие с максимальной оценкой математического ожидания:
  
:<tex>a_t = argmax_{a \in A} Q_a </tex>
+
:<tex>a_t = argmax_{a \in A} Q_a </tex>,
  
* Выполняем действие <tex>a_t</tex> и получаем награду <tex>R(a_t)</tex>
+
* Выполняем действие <tex>a_t</tex> и получаем награду <tex>R(a_t)</tex>;
  
 
* Обновляем оценку математического ожидания для действия <tex>a_t</tex>:
 
* Обновляем оценку математического ожидания для действия <tex>a_t</tex>:
  
:<tex>P_{a_t} = P_{a_t} + 1</tex>
+
:<tex>P_{a_t} = P_{a_t} + 1</tex>,
  
:<tex>Q_{a_t} = Q_{a_t} + \frac{1}{P_{a_t}} (R(a_t) − Q_{a_t})</tex>
+
:<tex>Q_{a_t} = Q_{a_t} + \frac{1}{P_{a_t}} (R(a_t) − Q_{a_t})</tex>.
  
 
В чем проблема?
 
В чем проблема?
Строка 162: Строка 162:
 
[[File:Eps-greedy.png|thumb|313px|link=https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html|Пример. Награда для стратегии с различными <tex>\epsilon</tex>]]
 
[[File:Eps-greedy.png|thumb|313px|link=https://vbystricky.github.io/2017/01/rl_multi_arms_bandits.html|Пример. Награда для стратегии с различными <tex>\epsilon</tex>]]
  
Введем параметр <tex>\epsilon \in (0,1)</tex>
+
Введем параметр <tex>\epsilon \in (0,1)</tex>.
  
 
На каждом шаге <tex>t</tex>
 
На каждом шаге <tex>t</tex>
  
* Получим значение <tex>\alpha</tex> {{---}} случайной величины равномерно распределенной на отрезке <tex>(0, 1)</tex>
+
* Получим значение <tex>\alpha</tex> {{---}} случайной величины равномерно распределенной на отрезке <tex>(0, 1)</tex>;
* Если <tex>\alpha \in (0, \epsilon)</tex>, то выберем действие <tex>a_t \in A</tex> случайно и равновероятно, иначе как в жадной стратегии выберем действие с максимальной оценкой математического ожидания:
+
* Если <tex>\alpha \in (0, \epsilon)</tex>, то выберем действие <tex>a_t \in A</tex> случайно и равновероятно, иначе как в жадной стратегии выберем действие с максимальной оценкой математического ожидания;
* Обновляем оценки так же как в жадной стратегии
+
* Обновляем оценки так же как в жадной стратегии.
  
 
Если <tex>\epsilon = 0</tex>, то это обычная жадная стратегия. Однако если <tex>\epsilon > 0</tex>, то в отличии от жадной стратегии на каждом шаге с вероятностью <tex>\epsilon</tex> присходит "исследование" случайных действий.
 
Если <tex>\epsilon = 0</tex>, то это обычная жадная стратегия. Однако если <tex>\epsilon > 0</tex>, то в отличии от жадной стратегии на каждом шаге с вероятностью <tex>\epsilon</tex> присходит "исследование" случайных действий.
Строка 176: Строка 176:
 
Основная идея алгоритма ''softmax'' {{---}} уменьшение потерь при исследовании за счёт более редкого выбора действий, которые небольшую награду в прошлом. Чтобы этого добиться для каждого действия вычисляется весовой коэффициент на базе которого происходит выбор действия. Чем больше <tex>Q_t(a)</tex>, тем больше вероятность выбора <tex>a</tex>:
 
Основная идея алгоритма ''softmax'' {{---}} уменьшение потерь при исследовании за счёт более редкого выбора действий, которые небольшую награду в прошлом. Чтобы этого добиться для каждого действия вычисляется весовой коэффициент на базе которого происходит выбор действия. Чем больше <tex>Q_t(a)</tex>, тем больше вероятность выбора <tex>a</tex>:
  
<tex>\pi_{t+1}(a) = \frac{exp(Q_t(a) / \tau)}{\sum\limits_{b \in A} {exp(Q_t(b) / \tau)}}</tex>
+
<tex>\pi_{t+1}(a) = \frac{exp(Q_t(a) / \tau)}{\sum\limits_{b \in A} {exp(Q_t(b) / \tau)}}</tex>,
  
 
<tex>\tau \in (0, \infty)</tex> {{---}} параметр, с помощью которого можно настраивать поведение алгоритма.
 
<tex>\tau \in (0, \infty)</tex> {{---}} параметр, с помощью которого можно настраивать поведение алгоритма.
Строка 196: Строка 196:
 
Также как ''softmax'' в UCB при выборе действия используется весовой коэффициент, который представляет собой верхнюю границу доверительного интервала (upper confidence bound) значения выигрыша:
 
Также как ''softmax'' в UCB при выборе действия используется весовой коэффициент, который представляет собой верхнюю границу доверительного интервала (upper confidence bound) значения выигрыша:
  
<tex>\pi_{t+1}(a) = Q_t(a) + b_a</tex>
+
<tex>\pi_{t+1}(a) = Q_t(a) + b_a</tex>,
  
 
<tex>b_a = \sqrt{\frac{2 \ln{\sum_a P_a}}{P_a}} </tex> {{---}} бонусное значение, которые показывает, насколько недоисследовано действие по сравнению с остальными.
 
<tex>b_a = \sqrt{\frac{2 \ln{\sum_a P_a}}{P_a}} </tex> {{---}} бонусное значение, которые показывает, насколько недоисследовано действие по сравнению с остальными.
Строка 212: Строка 212:
 
Таким образом, алгоритм это функция качества от состояния и действия:
 
Таким образом, алгоритм это функция качества от состояния и действия:
  
:<tex>Q: S \times A \to \mathbb{R}</tex>
+
:<tex>Q: S \times A \to \mathbb{R}</tex>,
  
 
Перед обучением <tex>Q</tex> инициализируется случайными значениями. После этого в каждый момент времени <tex>t</tex> агент выбирает действие <tex>a_t</tex>, получает награду <tex>r_t</tex>, переходит в новое состояние <tex>s_{t+1}</tex>, которое может зависеть от предыдущего состояния <tex>s_t</tex> и выбранного действия, и обновляет функцию <tex>Q</tex>. Обновление функции использует взвешенное среднее между старым и новым значениями:
 
Перед обучением <tex>Q</tex> инициализируется случайными значениями. После этого в каждый момент времени <tex>t</tex> агент выбирает действие <tex>a_t</tex>, получает награду <tex>r_t</tex>, переходит в новое состояние <tex>s_{t+1}</tex>, которое может зависеть от предыдущего состояния <tex>s_t</tex> и выбранного действия, и обновляет функцию <tex>Q</tex>. Обновление функции использует взвешенное среднее между старым и новым значениями:
Строка 226: Строка 226:
 
[[File:Q-Learning.png|thumb|313px|link=https://en.wikipedia.org/wiki/Q-learning|Процесс Q-обучения]]
 
[[File:Q-Learning.png|thumb|313px|link=https://en.wikipedia.org/wiki/Q-learning|Процесс Q-обучения]]
  
* <tex>S</tex> — множество состояний
+
* <tex>S</tex> — множество состояний,
* <tex>A</tex> — множество действий
+
* <tex>A</tex> — множество действий,
* <tex>R = S \times A \rightarrow \mathbb{R}</tex> {{---}} функция награды
+
* <tex>R = S \times A \rightarrow \mathbb{R}</tex> {{---}} функция награды,
* <tex>T = S \times A \rightarrow S</tex> {{---}} функция перехода
+
* <tex>T = S \times A \rightarrow S</tex> {{---}} функция перехода,
* <tex>\alpha \in [0, 1]</tex> {{---}} learning rate (обычно 0.1), чем он выше, тем сильнее агент доверяет новой информации
+
* <tex>\alpha \in [0, 1]</tex> {{---}} learning rate (обычно 0.1), чем он выше, тем сильнее агент доверяет новой информации,
* <tex>\gamma \in [0, 1]</tex> {{---}} discounting factor, чем он меньше, тем меньше агент задумывается о выгоде от будущих своих действий
+
* <tex>\gamma \in [0, 1]</tex> {{---}} discounting factor, чем он меньше, тем меньше агент задумывается о выгоде от будущих своих действий.
  
 
  '''fun''' Q-learning(<tex>S, A, R, T, \alpha, \gamma</tex>):
 
  '''fun''' Q-learning(<tex>S, A, R, T, \alpha, \gamma</tex>):
Строка 247: Строка 247:
 
           s = s'
 
           s = s'
 
     return Q
 
     return Q
 
== Policy gradient и алгоритм Actor-Critic ==
 
 
В алгоритме Q-learning агент обучает функцию полезности действия <tex>Q_{\theta}(s, a)</tex>. Стратегия агента <tex>\pi_{\theta}(a|s)</tex> определяется согласно текущим значениям <tex>Q(s, a)</tex>, с использованием жадного, <tex>\varepsilon</tex>-жадного или softmax подхода. Однако, существуют методы, которые позволяют оптимизировать стратегию <tex>\pi_{\theta}(s|a)</tex> напрямую. Такие алгоритмы относятся к классу алгоритмов ''policy gradient''.
 
 
=== Простой 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(s_{t+1}|s_{t}, a_{t})</tex> и распределением начальных состояний <tex>p(s_1)</tex>, и поведения агента, которое определяется его стохастической стратегией <tex>\pi_{\theta}(a_t|s_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)</tex>:
 
 
: <tex>\nabla_{\theta} J(\theta) = \int {\nabla_{\theta}p_{\theta}(\tau) R_{\tau} d\tau} </tex>
 
 
Считать градиент <tex>\nabla_{\theta}p_{\theta}(\tau)</tex> непосредственно сложно, потому что что <tex>p_{\theta}(\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>
 
 
, мы можем заменить <tex>\nabla_{\theta}p_{\theta}(\tau)</tex> на <tex>p_{\theta}(\tau) \nabla_{\theta} \log p_{\theta}(\tau)</tex>:
 
 
: <tex>\nabla_{\theta} J(\theta) = \int {p_{\theta}(\tau) \nabla_{\theta} \log p_{\theta}(\tau) R_{\tau} d\tau} = E_{\tau \sim p_{\theta}(\tau)} \left[ \nabla_{\theta} \log p_{\theta}(\tau) R_{\tau} \right]</tex>
 
 
Рассмотрим <tex>\log p_{\theta}(\tau)</tex>:
 
 
:  <tex> \log p_{\theta}(\tau) = \log \left( p(s_1) \prod_{t=1}^{T} {\pi_{\theta}(a_t|s_t) p(s_{t+1}|s_t, a_t)} \right) = \log p(s_1) + \sum_{t=1}^{T} {\left( \log \pi_{\theta}(a_t|s_t) + \log p(s_{t+1}|s_t, a_t) \right)} </tex>
 
 
Тогда:
 
 
: <tex> \nabla_{\theta} \log p_{\theta}(\tau) = \underbrace{\nabla_{\theta} \log p(s_1)}_{=0} + \sum_{t=1}^{T} {\left( \nabla_{\theta} \log \pi_{\theta}(a_t|s_t) + \underbrace{\nabla_{\theta} \log p(s_{t+1}|s_t, a_t)}_{=0} \right)} = \sum_{t=1}^{T} {\nabla_{\theta} \log \pi_{\theta}(a_t|s_t)} </tex>
 
 
Подставляя в определение <tex>\nabla_{\theta} J(\theta)</tex>:
 
 
: <tex> \nabla_{\theta} J(\theta) = E_{\tau \sim p_{\theta}(\tau)} \left[ \left( \sum_{t=1}^{T} {\nabla_{\theta} \log \pi_{\theta}(a_t|s_t)} \right) R_{\tau} \right] </tex>
 
 
[[File:Policy-gradient-reinforce.png|thumb|313px|link=http://rll.berkeley.edu/deeprlcourse/f17docs/lecture_4_policy_gradient.pdf|Схема алгоритма REINFORCE]]
 
 
Как мы можем подсчитать это матожидание? С помощью семплирования (метод Монте-Карло). Если у нас есть N уже известных сценариев <tex>\tau^i = (s_1^i, a_1^i, ... s_{T^i}^i, a_{T^i}^i)</tex>, то мы можем приблизить матожидание функции от сценария средним арифметическим этой функции по всему множеству сценариев:
 
 
: <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>J(\theta)</tex> можно с помощью следующего простого алгоритма (REINFORCE):
 
 
# Прогнать N сценариев <tex>\tau_i</tex> со стратегией <tex>\pi_{\theta}(a|s)</tex>
 
# Посчитать среднее арифметическое <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>
 
 
=== Интуитивное объяснение принципа работы ===
 
 
[[File:Policy-gradient-trajectories.png|thumb|313px|link=http://rll.berkeley.edu/deeprlcourse/f17docs/lecture_4_policy_gradient.pdf|Иллюстрация выбора наилучшего сценария]]
 
 
<tex>p_{\theta}(\tau)</tex> - это вероятность того, что будет реализован сценарий <tex>\tau</tex> при условии параметров модели <tex>\theta</tex>, т. е. функция ''правдоподобия''. Нам хочется увеличить правдоподобие "хороших" сценариев (обладающих высоким <tex>R_{\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>R_{\tau}</tex>.
 
 
=== Преимущества и недостатки policy gradient по сравнению с Q-learning ===
 
 
Преимущества:
 
 
* Легко обобщается на задачи с большим множеством действий, в том числе на задачи с непрерывным множеством действий.
 
* По большей части избегает конфликта между 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> требуется много семплов;
 
** cемплы, собранные для предыдущих значений <tex>\theta</tex>, никак не переиспользуются на следующем шаге, семплирование нужно делать заново на каждом шаге градиентного спуска.
 
* В случае конечных МППР Q-learning сходится к глобальному оптимуму, тогда как policy gradient может застрять в локальном.
 
 
Далее мы рассмотрим способы улучшения скорости работы алгоритма.
 
 
=== Усовершенствования алгоритма ===
 
 
==== Опорные значения ====
 
 
Заметим, что если <tex>b</tex> - константа относительно <tex>\tau</tex>, то
 
 
: <tex>E_{\tau \sim p_{\theta}(\tau)} \left[ \nabla_{\theta} \log p_{\theta}(\tau) (R_{\tau} - b) \right] = E_{\tau \sim p_{\theta}(\tau)} \left[ \nabla_{\theta} \log p_{\theta}(\tau) R_{\tau} \right] </tex>
 
 
, так как
 
 
: <tex>E_{\tau \sim p_{\theta}(\tau)} \left[ \nabla_{\theta} \log p_{\theta}(\tau) b \right] = \int {p_{\theta}(\tau) \nabla_{\theta} \log p_{\theta}(\tau) b d\tau} = \int {\nabla_{\theta} p_{\theta}(\tau) b d\tau} = b \nabla_{\theta} \int {p_{\theta}(\tau) d\tau} = b \nabla_{\theta} 1 = 0</tex>
 
 
Таким образом, изменение <tex>R_{\tau}</tex> на константу не меняет оценку <tex>\nabla_{\theta} J(\theta)</tex>. Однако ''дисперсия'' <tex> Var_{\tau \sim p_{\theta}(\tau)} \left[ \nabla_{\theta} \log p_{\theta}(\tau) (R_{\tau} - b) \right]</tex> зависит от <tex>b</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> называется ''опорным значением''. Способы определения опорных значений будут рассмотрены далее.
 
 
==== Использование будущего выигрыша вместо полного выигрыша ====
 
 
Рассмотрим еще раз выражение для градиента полного выигрыша:
 
 
: <tex> \nabla_{\theta} J(\theta) = E_{\tau \sim p_{\theta}(\tau)} \left[ \left( \sum_{t=1}^{T} {\nabla_{\theta} \log \pi_{\theta}(a_t|s_t)} \right) R_{\tau} \right] = E_{\tau \sim p_{\theta}(\tau)} \left[ \sum_{t=1}^{T} {\nabla_{\theta} \log \pi_{\theta}(a_t|s_t)} \left( \sum_{t=1}^{T} {r(s_t, a_t)} \right) \right]</tex>
 
 
Так как в момент времени <tex>t</tex> от действия <tex>a_t</tex> зависят только <tex>r(s_{t'}, a_{t'})</tex> для <tex> t' \leq t</tex>, это выражение можно переписать как
 
 
: <tex> \nabla_{\theta} J(\theta) \approx E_{\tau \sim p_{\theta}(\tau)} \left[ \sum_{t=1}^{T} {\nabla_{\theta} \log \pi_{\theta}(a_t|s_t)} \underbrace{\left( \sum_{t'=t}^{T} {r(s_{t'}, a_{t'})} \right)}_{= Q_{\tau, t}} \right]</tex>
 
 
Величина <tex>Q_{\tau, t}</tex> -- ''будущий выигрыш'' (reward-to-go) на шаге <tex>t</tex> в сценарии <tex>\tau</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>s_t</tex>, которое назовем ''ожидаемой ценностью'' (value) этого состояния. Ожидаемая ценность состояния <tex>s_t</tex> -- это ожидаемый будущий выигрыш при совершении некоторого действия в этом состоянии согласно стратегии <tex>\pi_{\theta}(a|s)</tex>:
 
 
: <tex> V^{\pi}(s_t) = E_{a_t \sim \pi_{\theta}(a_t | s_t)} [Q^{\pi}(s_t, a_t)] = \sum_{t'=t}^{T} {E_{\pi_{\theta}} [r(s_{t'}, a_{t'}) | s_t]}</tex>
 
 
Таким образом, вместо ожидаемого будущего выигрыша при оценке <tex>\nabla_{\theta} J(\theta)</tex> будем использовать функцию ''преимущества'' (advantage):
 
 
: <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> \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) A^{\pi}(s_t^i, a_t^i) } </tex>
 
 
Как достаточно точно и быстро оценить <tex>A^{\pi}(s_t^i, a_t^i)</tex>? Сведем задачу к оценке <tex>V^{\pi}(s_t)</tex>:
 
 
: <tex> Q^{\pi}(s_t, a_t) = r(s_t, a_t) + E_{s_{t+1} \sim p(s_{t+1} | s_t, a_t)} [V^{\pi}(s_{t+1})] \approx r(s_t, a_t) + V^{\pi}(s_{t+1}) </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)</tex> для всех <tex>s</tex>, то мы можем обновлять эту оценку путем, аналогичным алгоритму Q-learning:
 
 
: <tex> V^{\pi}(s_t) \leftarrow (1 - \beta) V^{\pi}(s_t) + \beta (r(s_t, a_t) + V^{\pi}(s_{t+1})) </tex>
 
 
Такой пересчет мы можем производить каждый раз, когда агент получает вознаграждение за действие.
 
  
 
== Ссылки ==
 
== Ссылки ==
Строка 413: Строка 260:
 
* [https://en.wikipedia.org/wiki/Q-learning Q-learning]
 
* [https://en.wikipedia.org/wiki/Q-learning Q-learning]
 
* [https://medium.freecodecamp.org/an-introduction-to-q-learning-reinforcement-learning-14ac0b4493cc An introduction to Q-Learning: reinforcement learning]
 
* [https://medium.freecodecamp.org/an-introduction-to-q-learning-reinforcement-learning-14ac0b4493cc An introduction to Q-Learning: reinforcement learning]
* [http://rll.berkeley.edu/deeprlcourse/f17docs/lecture_4_policy_gradient.pdf Policy Gradients. CS 294-112: Deep Reinforcement Learning, Sergey Levine.]
 
* [http://rail.eecs.berkeley.edu/deeprlcourse-fa17/f17docs/lecture_5_actor_critic_pdf.pdf Actor-Critic Algorithms. CS 294-112: Deep Reinforcement Learning, Sergey Levine.]
 
  
 
[[Категория: Машинное обучение]]
 
[[Категория: Машинное обучение]]
 
[[Категория: Обучение с подкреплением]]
 
[[Категория: Обучение с подкреплением]]

Текущая версия на 19:13, 4 сентября 2022

Определение:
Обучение с подкреплением (англ. reinforcement learning) — способ машинного обучения, при котором система обучается, взаимодействуя с некоторой средой.


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

В обучении с подкреплением существует агент (agent) взаимодействует с окружающей средой (environment), предпринимая действия (actions). Окружающая среда дает награду (reward) за эти действия, а агент продолжает их предпринимать.

Алгоритмы с частичным обучением пытаются найти стратегию, приписывающую состояниям (states) окружающей среды действия, одно из которых может выбрать агент в этих состояниях.

Среда обычно формулируется как марковский процесс принятия решений (МППР) с конечным множеством состояний, и в этом смысле алгоритмы обучения с подкреплением тесно связаны с динамическим программированием. Вероятности выигрышей и перехода состояний в МППР обычно являются величинами случайными, но стационарными в рамках задачи.

При обучении с подкреплением, в отличии от обучения с учителем, не предоставляются верные пары "входные данные-ответ", а принятие субоптимальнх решений (дающих локальный экстремум) не ограничивается явно. Обучение с подкреплением пытается найти компромисс между исследованием неизученных областей и применением имеющихся знаний (exploration vs exploitation). Баланс изучения-применения при обучении с подкреплением исследуется в задаче о многоруком бандите.

Формально простейшая модель обучения с подкреплением состоит из:

  • множества состояний окружения (states) [math]S[/math];
  • множества действий (actions) [math]A[/math];
  • множества вещественнозначных скалярных "выигрышей" (rewards).

В произвольный момент времени [math]t[/math] агент характеризуется состоянием [math]s_t \in S[/math] и множеством возможных действий [math]A(s_t)[/math]. Выбирая действие [math]a \in A(s_t)[/math], он переходит в состояние [math]s_{t+1}[/math] и получает выигрыш [math]r_t[/math]. Основываясь на таком взаимодействии с окружающей средой, агент, обучающийся с подкреплением, должен выработать стратегию [math]\pi: S \to A[/math], которая максимизирует величину [math]R=r_0 + r_1+\cdots+r_n[/math] в случае МППР, имеющего терминальное состояние, или величину:

[math]R=\sum_t \gamma^t r_t[/math],

для МППР без терминальных состояний (где [math]0 \leq \gamma \leq 1[/math] — дисконтирующий множитель для "предстоящего выигрыша").

Таким образом, обучение с подкреплением особенно хорошо подходит для решения задач, связанных с выбором между долгосрочной и краткосрочной выгодой.

Постановка задачи обучения с подкреплением

Взаимодействие агента со средой

[math]S[/math] — множество состояний среды

Игра агента со средой:

  • инициализация стратегии [math]\pi_1(a | s)[/math] и состояния среды [math]s_1[/math];
  • для всех [math]t = 1 \ldots T[/math]:
    • агент выбирает действие [math]a_t ∼ \pi_t(a | s_t)[/math];
    • среда генерирует награду [math]r_{t + 1} ∼ p(r | a_t, s_t)[/math] и новое состояние [math]s_{t + 1} ∼ p(s | a_t, s_t)[/math];
    • агент корректирует стратегию [math]\pi_{t + 1}(a | s)[/math].

Это марковский процесс принятия решений (МППР), если [math]P(s_{t+1} = s′, r_{t+1} = r | s_t, a_t, r_t, s_{t−1}, a_{t−1}, r_{t−1}, .. ,s_1, a_1) = P(s_{t+1} = s′,r_{t+1} = r | s_t, a_t)[/math],

МППР называется финитным, если [math]|A| \lt \infty[/math], [math]|S| \lt \infty[/math]

Алгоритмы

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

Наивный подход к решению этой задачи подразумевает следующие шаги:

  • опробовать все возможные стратегии;
  • выбрать стратегию с наибольшим ожидаемым выигрышем.

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

Подход с использованием функции полезности использует множество оценок ожидаемого выигрыша только для одной стратегии [math]\pi[/math] (либо текущей, либо оптимальной). При этом пытаются оценить либо ожидаемый выигрыш, начиная с состояния [math]s[/math], при дальнейшем следовании стратегии [math]\pi[/math],

[math]V(s) = E[R|s, \pi][/math],

либо ожидаемый выигрыш, при принятии решения [math]a[/math] в состоянии [math]s[/math] и дальнейшем соблюдении [math]\pi[/math],

[math]Q(s, a) = E[R|s, \pi, a][/math],

Если для выбора оптимальной стратегии используется функция полезности [math]Q[/math], то оптимальные действия всегда можно выбрать как действия, максимизирующие полезность.

Если же мы пользуемся функцией [math]V[/math], необходимо либо иметь модель окружения в виде вероятностей [math]P(s'|s, a)[/math], что позволяет построить функцию полезности вида

[math]Q(s, a) = \sum_{s'}V(s')P(s'|s, a)[/math],

либо применить т.н. метод исполнитель-критик, в котором модель делится на две части: критик, оценивающий полезность состояния [math]V[/math], и исполнитель, выбирающий подходящее действие в каждом состоянии.

Имея фиксированную стратегию [math]\pi[/math], оценить [math]E[R|\cdot][/math] при [math]\gamma = 1[/math] можно просто усреднив непосредственные выигрыши. Наиболее очевидный способ оценки при [math]\gamma \in (0, 1)[/math] — усреднить суммарный выигрыш после каждого состояния. Однако для этого требуется, чтобы МППР достиг терминального состояния (завершился).

Поэтому построение искомой оценки при [math]\gamma \in (0, 1)[/math] неочевидно. Однако, можно заметить, что [math]R[/math] образуют рекурсивное уравнение Беллмана:

[math]E[R|s_t]=r_t + \gamma E[R|s_{t+1}][/math],

Подставляя имеющиеся оценки [math]V[/math] и применяя метод градиентного спуска с квадратичной функцией ошибок, мы приходим к алгоритму обучения с временными воздействиями (temporal difference (TD) learning). В простейшем случае и состояния, и действия дискретны и можно придерживаться табличных оценок для каждого состояния.

Другие похожие методы: Адаптивный эвристический критик (Adaptive Heuristic Critic, AHC), SARSA и Q-обучение (Q-learning).

Задача о многоруком бандите (The multi-armed bandit problem)

Многорукий бандит

Формулировка

[math]A[/math] — множество возможных действий (ручек автомата),

[math]p_a(r)[/math] — неизвестное распределение награды [math]r \in R[/math] [math]\forall a \in A[/math],

[math]\pi_t(a)[/math]стратегия агента в момент [math]t[/math] [math]\forall a \in A[/math].

Игра агента со средой:

  • инициализация стратегии [math]\pi_1(a)[/math];
  • для всех [math]t = 1 \ldots T[/math]:
    • агент выбирает действие (ручку) [math]a_t ∼ \pi_t(a)[/math];
    • среда генерирует награду [math]r_t ∼ p_{a_t}(r)[/math];
    • агент корректирует стратегию [math]\pi_{t+1}(a)[/math].

[math]Q_t(a) = \frac{\sum^{t}_{i=1}{r_i[a_i = a]}}{\sum^{t}_{i=1}{[a_i = a]}} \rightarrow max [/math] — средняя награда в t играх
, [math]Q^∗(a) = \lim \limits_{t \rightarrow \infty} Q_t(a) \rightarrow max [/math] — ценность действия [math]a[/math].

У нас есть автомат — [math]N[/math]-рукий бандит, на каждом шаге мы выбираем за какую из [math]N[/math] ручек автомата дернуть, т.е. множество действий [math]A = {1,2 \ldots ,N}[/math].

Выбор действия [math]a_t[/math] на шаге [math]t[/math] влечет награду [math]R(a_t)[/math] при этом [math]R(a)[/math] [math]\forall a \in A[/math] есть случайная величина, распределение которой неизвестно.

Состояние среды у нас от шага к шагу не меняется, а значит множество состояний [math]S[/math] тривиально, ни на что не влияет, поэтому его можно проигнорировать.

Для простоты будем полагать, что каждому действию соответствует некоторое распределение, которое не меняется со временем. Если бы мы знали эти распределения, то очевидная стратегия заключалась бы в том, чтобы подсчитать математическое ожидание для каждого из распределений, выбрать действие с максимальным математическим ожиданием и теперь совершать это действие на каждом шаге.

Проблема в том, что распределения неизвестны, однако можно оценить математическое ожидание некоторой случайной величины [math]\xi[/math] c неизвестным распределением. Для [math]K[/math] экспериментов [math]\xi_k[/math], оценка математического ожидания это среднее арифметическое результатов экспериментов:

[math]E(\xi) = \frac{1}{K} \sum_{k=1}^{K}{\xi_k} [/math],

Задача является модельной для понимания конфликта между exploitation-exploration.

Жадные и [math]\epsilon[/math]-жадные стратегии (greedy & [math]\epsilon[/math]-greedy)

Жадная (greedy) стратегия

  • [math]P_a = 0[/math] [math]\forall a \in \{1 \ldots N\} [/math] — сколько раз было выбрано действие [math]a[/math],
  • [math]Q_a = 0[/math] [math]\forall a \in \{1 \ldots N\}[/math] — текущая оценка математического ожидания награды для действия [math]a[/math].

На каждом шаге [math]t[/math]

  • Выбираем действие с максимальной оценкой математического ожидания:
[math]a_t = argmax_{a \in A} Q_a [/math],
  • Выполняем действие [math]a_t[/math] и получаем награду [math]R(a_t)[/math];
  • Обновляем оценку математического ожидания для действия [math]a_t[/math]:
[math]P_{a_t} = P_{a_t} + 1[/math],
[math]Q_{a_t} = Q_{a_t} + \frac{1}{P_{a_t}} (R(a_t) − Q_{a_t})[/math].

В чем проблема?

Пусть у нас есть "двурукий" бандит. Первая ручка всегда выдаёт награду равную 1, вторая всегда выдаёт 2. Действуя согласно жадной стратегии мы дёрнем в начале первую ручку, так как в начале оценки математических ожиданий равны нулю, увеличим её оценку до [math]Q_1 = 1[/math]. В дальнейшем всегда будем выбирать первую ручку, а значит на каждом шаге будем получать на 1 меньше, чем могли бы.

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

[math]\epsilon[/math]-жадная ([math]\epsilon[/math]-greedy) стратегия

Пример. Награда для стратегии с различными [math]\epsilon[/math]

Введем параметр [math]\epsilon \in (0,1)[/math].

На каждом шаге [math]t[/math]

  • Получим значение [math]\alpha[/math] — случайной величины равномерно распределенной на отрезке [math](0, 1)[/math];
  • Если [math]\alpha \in (0, \epsilon)[/math], то выберем действие [math]a_t \in A[/math] случайно и равновероятно, иначе как в жадной стратегии выберем действие с максимальной оценкой математического ожидания;
  • Обновляем оценки так же как в жадной стратегии.

Если [math]\epsilon = 0[/math], то это обычная жадная стратегия. Однако если [math]\epsilon \gt 0[/math], то в отличии от жадной стратегии на каждом шаге с вероятностью [math]\epsilon[/math] присходит "исследование" случайных действий.

Стратегия Softmax

Основная идея алгоритма softmax — уменьшение потерь при исследовании за счёт более редкого выбора действий, которые небольшую награду в прошлом. Чтобы этого добиться для каждого действия вычисляется весовой коэффициент на базе которого происходит выбор действия. Чем больше [math]Q_t(a)[/math], тем больше вероятность выбора [math]a[/math]:

[math]\pi_{t+1}(a) = \frac{exp(Q_t(a) / \tau)}{\sum\limits_{b \in A} {exp(Q_t(b) / \tau)}}[/math],

[math]\tau \in (0, \infty)[/math] — параметр, с помощью которого можно настраивать поведение алгоритма.

При [math]\tau \rightarrow \infty[/math] стратегия стремится к равномерной, то есть softmax будет меньше зависеть от значения выигрыша и выбирать действия более равномерно (exploration).

При [math]\tau \rightarrow 0[/math] стратегия стремится к жадной, то есть алгоритм будет больше ориентироваться на известный средний выигрыш действий (exploitation).

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

Эвристика: параметр [math]\tau[/math] имеет смысл уменьшать со временем.

Метод UCB (upper confidence bound)

Предыдущие алгоритмы при принятии решения используют данные о среднем выигрыше. Проблема в том, что если действие даёт награду с какой-то вероятностью, то данные от наблюдений получаются шумные и мы можем неправильно определять самое выгодное действие.

Алгоритм верхнего доверительного интервала (upper confidence bound или UCB) — семейство алгоритмов, которые пытаются решить эту проблему, используя при выборе данные не только о среднем выигрыше, но и о том, насколько можно доверять значениям выигрыша.

Также как softmax в UCB при выборе действия используется весовой коэффициент, который представляет собой верхнюю границу доверительного интервала (upper confidence bound) значения выигрыша:

[math]\pi_{t+1}(a) = Q_t(a) + b_a[/math],

[math]b_a = \sqrt{\frac{2 \ln{\sum_a P_a}}{P_a}} [/math] — бонусное значение, которые показывает, насколько недоисследовано действие по сравнению с остальными.

Доказательство здесь

В отличие от предыдущих алгоритмов UCB не использует в своей работе ни случайные числа для выбора действия, ни параметры, которыми можно влиять на его работу. В начале работы алгоритма каждое из действий выбирается по одному разу (для того чтобы можно было вычислить размер бонуса для всех действий). После этого в каждый момент времени выбирается действие с максимальным значением весового коэффициента.

Несмотря на это отсутствие случайности результаты работы этого алгоритма выглядят довольно шумно по сравнению с остальными. Это происходит из-за того, что данный алгоритм сравнительно часто выбирает недоисследованные действия.

Q-learning

На основе получаемого от среды вознаграждения агент формирует функцию полезности [math]Q[/math], что впоследствии дает ему возможность уже не случайно выбирать стратегию поведения, а учитывать опыт предыдущего взаимодействия со средой. Одно из преимуществ [math]Q[/math]-обучения — то, что оно в состоянии сравнить ожидаемую полезность доступных действий, не формируя модели окружающей среды. Применяется для ситуаций, которые можно представить в виде МППР.

Таким образом, алгоритм это функция качества от состояния и действия:

[math]Q: S \times A \to \mathbb{R}[/math],

Перед обучением [math]Q[/math] инициализируется случайными значениями. После этого в каждый момент времени [math]t[/math] агент выбирает действие [math]a_t[/math], получает награду [math]r_t[/math], переходит в новое состояние [math]s_{t+1}[/math], которое может зависеть от предыдущего состояния [math]s_t[/math] и выбранного действия, и обновляет функцию [math]Q[/math]. Обновление функции использует взвешенное среднее между старым и новым значениями:

[math]Q^{new}(s_{t},a_{t}) \leftarrow (1-\alpha) \cdot \underbrace{Q(s_{t},a_{t})}_{\text{old value}} + \underbrace{\alpha}_{\text{learning rate}} \cdot \overbrace{\bigg( \underbrace{r_{t}}_{\text{reward}} + \underbrace{\gamma}_{\text{discount factor}} \cdot \underbrace{\max_{a}Q(s_{t+1}, a)}_{\text{estimate of optimal future value}} \bigg) }^{\text{learned value}} [/math],

где [math]r_{t}[/math] это награда, полученная при переходе из состояния [math]s_{t}[/math] в состояние [math]s_{t+1}[/math], и [math]\alpha[/math] это скорость обучения ([math]0 \lt \alpha \le 1[/math]).

Алгоритм заканчивается, когда агент переходит в терминальное состояние [math]s_{t+1}[/math].

Aлгоритм Q-learning

Процесс Q-обучения
  • [math]S[/math] — множество состояний,
  • [math]A[/math] — множество действий,
  • [math]R = S \times A \rightarrow \mathbb{R}[/math] — функция награды,
  • [math]T = S \times A \rightarrow S[/math] — функция перехода,
  • [math]\alpha \in [0, 1][/math] — learning rate (обычно 0.1), чем он выше, тем сильнее агент доверяет новой информации,
  • [math]\gamma \in [0, 1][/math] — discounting factor, чем он меньше, тем меньше агент задумывается о выгоде от будущих своих действий.
fun Q-learning([math]S, A, R, T, \alpha, \gamma[/math]):
   for [math] s \in S[/math]:
       for [math] a \in A[/math]:
            Q(s, a) = rand()
   while Q is not converged:
       s = [math] \forall s \in S[/math]
       while s is not terminal:
          [math]\pi(s) = argmax_{a}{Q(s, a)}[/math]
          a = [math]\pi(s)[/math]
          r = R(s, a)
          s' = T(s, a)
          [math]Q(s', a) = (1 - \alpha) Q(s', a) + \alpha (r + \gamma \max\limits_{a'}{Q(s', a')})[/math]
          s = s'
   return Q

Ссылки