Для меня разобраться в базовых концепциях Reinforcement Learning оказалось не так просто, особенно сложными оказались функции Беллмана. Эта статья — моя попытка систематизировать материал и объяснить себе (и, возможно, другим), что, откуда и почему берется. Будет здорово, если она поможет кому-то разложить все по полочкам.
¯\_(ツ)_/¯
Полезные ссылки:
Practical RL (ШАД) (самые полезные материалы были тут)
Лекция №15 "Обучение с подкреплением"
Тренировки. Лекция 3: Введение в обучение с подкреплением
Тренировки. Лекция 4: Q-learning, Deep Q-learning
Тренировки. Лекция 5: Современные методы обучения с подкреплением. Advantage actor critic, RLHF
11.1. Обучение с подкреплением
Мой тг канал: Not Magic Neural Networks
Содержание1. Intro
2. Определения
3. Cross-Entropy Method, CEM
4. Markov decision process, MDP
5. Награда (reward) и коэффициент дисконтирования
6. Оценочные функции
6.1. Backup Tree & динамическое программирование
6.2. State-value function и Policy Evaluation
6.3. Policy Improvement и action-value function
6.4. Уравнения оптимальности Беллмана
7. Generalized Policy iteration
На гифке щенок учится через игру: он пробует разные действия, наблюдает за реакцией человека и запоминает, что именно приносит ему вкусняшку. Когда за правильное поведение он получает награду, у него формируется связь между действием и результатом — «сделал правильно → получил вкусняшку». Так шаг за шагом песик осваивает новые команды, учится понимать, чего от него ждут, и радостно повторяет то, что приносит успех.
Такое обучение называется Reinforcement Learning (RL) — обучение методом проб и ошибок. Термин reinforcement ("подкрепление") заимствован из поведенческой психологии и терапии и означает последствия (награду или наказание), которые увеличивают или уменьшают вероятность повторения определённого поведения.
Главное отличие RL от обучения с учителем (supervised learning) состоит в том, что этот подход не требует заранее размеченных данных и не опирается на дифференцируемую функцию потерь.
Опишем более формально рассуждения выше:
Пусть у нас есть агент, который взаимодействует с окружающей средой. В каждый момент времени агент наблюдает состояние среды и, опираясь на эти наблюдения, совершает действие. В результате действия состояние среды изменяется.
Процедуру выбора действия будем называть стратегией (или политикой).
За каждое свое действие агент получает награду (или штраф).
Цель агента – изменить свою политику так, чтобы получить максимальную награду. Процесс взаимодействия агента и среды задается динамикой среды, а серия взаимодействий агента со средой от начального до терминального состояния называется эпизодом.
В примере выше, агентом является сам щенок. Он наблюдает за окружающей средой — своим дрессировщиком — и, следуя своей политике, выбирает, какие действия совершить. Если песик всё сделал правильно, его хвалят и угощают вкусняшкой — это и есть награда. Если же действие оказалось неправильным, награды нет, и песику приходится изменить свою политику, пробуя другие действия. Со временем он учится выбирать такую последовательность действий, которая приносит как можно больше вкусняшек — то есть максимизирует свою суммарную награду.
Reinforcement Learning — обучение методом проб и ошибок.
Agent (агент) — интеллектуальная система (программа, робот, алгоритм), которая принимает решения и совершает действия в некоторой среде с целью достижения определённых целей.
Environment (среда) — всё, с чем взаимодействует агент: внешний мир, в котором происходят события и изменения в ответ на действия агента.
Observation (наблюдение) — информация, которую агент получает от среды в каждый момент времени .
: active (действие агента) — конкретное решение или команда, которую агент выбирает и выполняет в среде с целью повлиять на неё.
: stage (состояние) – описание текущей ситуации, в которой находится агент.
: policy (политика или стратегия поведения агента) — вероятностное распределение действий
при условии состояния
.
: Reward (награда) — цели и желания, закодированные в скалярном сигнале. Награда может быть положительной, отрицательной (штрафом) или нейтральной. Она зависит от текущего состояния среды
, выбранного агентом действия
и следующего состояния среды
.
: return или cumulative reward – просуммированый по времени reward.
: цель агента — максимизировать return с помощью оптимальной политики.
Траектория — цепочка генерируемых в ходе взаимодействия случайных величин
Кросс-энтропийный метод (Cross-Entropy Method, CEM) — это простой алгоритм, который используется для поиска оптимальной политики путем итеративного улучшения выборки решений.
Для простоты будем считать, что количество состояний и действий нашей задачи – конечно. Тогда политикуможно задать с помощью матрицы у которой по строкам — состояния, а по столбцам — действия.
Алгоритм:
Инициализируем политику (случайным или равновероятным образом).
Семплируем сессий с данной политикой.
Выбираем сессий с наибольшей наградой (элиту).
Обновляем политику в соответствии с элитой (повышаем вероятность "правильных" действий, согласно элитным):
Возвращаемся к шагу 2.
Можно рассмотреть выбор действия при условии состояния (политику) как задачу классификации: , где
может быть случайным лесом, логрегрессей или нейронной сетью.
Аналогично, семплируем сессий и выбираем из них
элитных.
Максимизируем правдоподобие элитных сессий:
Отсюда название "метод кросс-энтропии": максимизация правдопобия = минимазация кросс-энтропии.
Из плюсов, кросс-энтропийный метод легко реализовывать и он дает хорошие результаты, устойчив относительно сходимости в локальный оптимум. Однако, этот метод рассматривает среду как «чёрный ящик» – то есть он ничего не знает о том что внутри среды происходит.
Ноутбук потыкать (вторая домашка с тренировок).
Попробуем улучшить его, учитывая внутреннюю структуру среды. Эта структура описывается Марковским свойством.
Чаще всего, после совершения действия агентом, состояние среды будет меняться. Например, при игре в шахматы агент должен учитывать то, что после его хода и хода оппонента позиция на доске изменится.
Нам нужно определить некий процесс, в котором агент последовательно переходит из состояния в состояние в зависимости от своих действий, и в некоторых состояниях получая награды.
Марковский процесс (цепь) — это кортеж , где
— множество состояний,
— матрица переходов (transition matrix), состоящая из вероятностей оказаться в состоянии
, при условии, что среда находилась в состоянии
.
Марковское свойство — это условная независимость от истории, кроме как от текущего состояния и текущего действия, для награды и следующего состояния.
Среда является Марковской, когда награда и следующее состояние
зависят только от текущего состояния среды
.
Марковский процессом принятия решений (MDP) – это кортеж, где
— множество состояний,
— множество действий,
— матрица переходов,
— функция награды,
— коэффициент дисконтирования.
Суммарная награда (cumulative reward) — это сумма всех наград на всех шагах агента:
где — мгновенная награда (immediate reward),
— конец эпизода.
Цель агента — максимизировать кумулятивную награду. То есть, это наше оптимизируемое значение.
Легко заметить, что цели агента и наши собственные цели могут сильно различаться. Более того, правильно задать функцию награды так, чтобы она действительно отражала наши намерения, на практике оказывается совсем непросто.
Например, если агент получает награду за экономию топлива, то он перестаёт двигаться вообще, ведь так он минимизирует расход и получает максимум награды. Если агент получает награду за быстрое прибытие в пункт назначения, то он начинает превышать скорость и нарушать правила, что опасно. Если агент получает награду на каждом шаге за приближение к цели, то его оптимальной политикой будет блуждание по кругу, собирая бесконечную сумму наград, вместо того чтобы прийти к цели и закончить эпизод.
Для того чтобы избежать ситуацию, когда агент накапливает бесконечную сумму наград, используется коэффициент дисконтирования , который показывает, насколько ценными являются будущие награды на текущий момент:
При смотрим на меньшее количество шагов назад, при
получим "жадный алгоритм".
При смотрим на большее количество шагов, при
смотрим на всю историю.
При видим около 100 шагов назад, при
около 20 шагов, при
около 10 шагов.
Важно понимать, что выборне гиперпараметр алгоритма, а часть задачи. Оптимальное поведение агента для разных
может отличаться.
Таким образом, новая цель агента — максимизировать суммарную дисконтированную награду.
Однако, дисконтированная награда лишь отчасти убирает проблему зацикливания, но не решает ее полностью.
Ещё один пример: если агент, играющий в шахматы, получает награду за каждую съеденную фигуру, то оптимальной политикой для него станет стратегия, при которой он старается захватить как можно больше фигур. Однако такая политика не гарантирует победу — агент может съедать много фигур, но в итоге проигрывать партию.
С одной стороны, функция награды должна максимально соответствовать целям, которые мы хотим, чтобы агент достигал. Кажется логичным награждать только за конечный успех — например, за победу. Но в таком случае возникает проблема разреженной награды (sparse rewards): агент получает обратную связь лишь в конце эпизода и не может понять, какие конкретно действия привели к успеху.
Чтобы облегчить обучение, применяют приём под названием reward shaping — формирование награды. Идея заключается в том, чтобы добавить вспомогательную функцию-подсказку , которая помогает агенту двигаться в нужном направлении. Обычно
) получается как разность потенциалов, где
– текущее состояние,
– действие,
– будущее состояние.
— оригинальная награда
— shaping-функция (дополнительная награда), которая зависит от состояний и/или действий.
— potential function, «потенциал» состояния, который показывает, насколько хорошо находиться в этом состоянии.
Таким образом, если агент движется в направлении «лучших» состояний, он получает дополнительную награду. Если идет «назад», получает штраф.
Давайте построим дерево следующей структуры:
— на светлой вершине лежит текущее состояние
— на темных вершинах лежат действия
— после действия, на ребре лежит награда
— оказываемся в новом состоянии (на светлой вершине)
Оптимальной политикой будет путь, содержащий максимальную сумму наград от корня до листа.
Такая задача решается с помощью динамического программирования: идем от листьев к корню дерева и тащим за собой максимальную сумму наград. Но для того чтобы протащить значение будущей награды вверх по дереву, нужно ввести два понятия: функция полезности состояния и функция полезности состояния действия (state-value и action-value functions).
Функции ценности — это функции состояний (или пар состояний-действий), которые оценивают, насколько хорошо агенту находиться в данном состоянии (или насколько хорошо выполнять данное действие в данном состоянии).
Пусть мы хотим понять, насколько хорошее наше текущее состояние .
Цель агента – максимизировать суммарную дисконтированную награду. Тогда пусть "хорошестю текущего состояния " будет ожидаемая суммарная дисконтированная награда, если мы будем следовать нашей политике
.
При этом, путь от текущего состояния до терминального содержит очень много случайностей: начальное состояние, действие из нашей политики, следующее состояние, следующая награда... Эту "хорошесть" называют state-value function.
State-value function — это математическое ожидание суммарной дисконтированной награды
, которую агент получит, находясь в состоянии
и следуя политике
.
Для фиксированной политикимы можем посчитать суммарную дисконтированную награду
честно взяв мат. ожидание:
– текущее состояние,
– следующее состояние.
Стохастичность политики в том что агент может выбирать разные действия с ненулевыми вероятностями.
Стохастичность окружения в том что следующее состояние и награда
могут быть случайными.
— дисконтированное мат. ожидание от будущей награды, параметризованное только будущим действием
, которое можно свернуть в
.
Или так:
Обнаружив рекуррентное соотношение, мы поняли как пересчитать имея
.
(функция качества состояния) — средняя награда, которую получит агент, начиная играть с состояния
при следовании политики
(оценка, насколько хорошо находиться в состоянии
).
Пусть мы имеем следующее дерево и находимся в состоянии (в корне).
Наша политика говорит, что из текущего состояния
выберем действие
с вероятностью
, а действие
c вероятностью
.
Совершив действие награда будет
, совершив действие
, награда будет
.
Действие приведет нас в терминальное состояние с вероятностью
. Действие
приведет нас в состояние
с вероятностью
, а в
с вероятностью
.
Значение функций-состояния в состояниях
и
нам уже известны.
Давайте посчитаем функцию-состояния для нашего текущего состояния
без учета дисконтирования (для корня дерева).
Просто считаем математическое ожидание:
Если мы посчитаем -функцию для каждого состояния
, то сможем понять как нам надо поменять нашу политику
, чтобы она стала оптимальной: нам просто надо идти туда, где награда больше.
Как же можно посчитать -функцию? Рассмотрим два способа: матричный и метод простой итерации.
Посмотрим еще раз на уравнение :
Разделим его на две части:
Проиндексировав все состояния, посмотрим на -функцию как на вектор: каждому состоянию
будет соответствовать свое значение
.
Математическое ожидание награды по действиям и по следующему состоянию обозначим матрицей – вектор средних наград.
Вторую часть запишем в следующем виде: , где
– матрица содержащая вероятности перехода из одного состояния в другое, то есть
– вероятность попасть в состояние
при условии
с учетом текущей политики
.
Тогда уравнение можно записать
.
Значения для,
и
нам известны. Решим матричное уравнение относительно
:
Данное уравнение всегда разрешимо (это гарантирует ), но вычисление обратной матрицы может быть дорого и неустойчиво.
Можно решить уравнение методом простой итерации (fixed-point iteration).
Метод заключается в том что мы будем обновлять оценку до тех пор, пока при подставлении её в правую часть уравнения Беллмана ничего не изменится.
То есть, итеративно для каждого состояния будем пересчитывать
по следующей формуле:
1. Input: policy , discount factor
, small threshold
2. Initialize
3. Repeat:
4. For in
:
5.
6.
7. until
8. output
Этот процесс сходится, потому что оператор Беллмана является сжимающим отображением при.
Посчитав значения -функции хочется понять как именно улучшить политику.
Давайте будем сравнивать разные политики с помощью -функции:
И пусть будет лучшей (оптимальной) политикой.
Мы хотим чтобы чтобы оптимальная политикавела нас в состояния с большими наградами. Однако,
-функция не зависит от действия.
Тогда давайте выбирать то действие, у которого будет максимальна мгновенная награда + дисконтированная функция состояния:
То есть, мы даем себе выбор первого действия в состоянии
.
И для простоты обозначим это новой функцией .
Action-value function — математическое ожидание суммарной дисконтированной награды , если из состояния
мы делаем первое действие
(причем не обязательно соответствующее политике
), а дальше играем следуя политике
.
Проделаем все тоже самое, что и в state-value
Замечаем, что — это
и обнаруживаем, что можно выписать
через
:
(функция качества всех действий из состояния
) – говорит насколько хорошо выбрать действие
в состоянии
, если потом следовать политике
.
Выше мы выписали -функцию через
:
Или так:
Тогда новая политика должна выбирать
:
Более того, улучшение политики через максимизацию -функции приводит к глобально оптимальной политике. Это называется Policy Improvement.
Заметим, что оптимальной политикой будет закончить игру, выбрав действие .
Если мы знаем политику, то можем выписать
-функцию через
:
Заметим, что в точности из формулы выше (где выражали
через
). Получаем:
Подставив в формулу вместо
формулу
получим рекуррентное соотношение для
:
Формулы ,
,
,
называются уравнениями Беллмана для математического ожидания.
Данные уравнения являются ключевым результатом для построения всех последующих RL-алгоритмов.
Если — лучшая (оптимальная) политика.
Оптимальная state-value функция:.
Оптимальная action-value функция : .
В любом конечном MDP существует хотя бы одна оптимальная политика.
Уравнение оптимальности Беллмана для — это то же уравнение Беллмана для мат. ожидания, только с максимумом по действиям (сравниваем действия между собой по будущей награде).
Уравнение оптимальности Беллмана для отличается от уравнения Беллмана для мат. ожидания тем, что мы берем максимум по политике:
Aналогично определим связь между и
:
Policy Iteration — это алгоритм, который ищет оптимальную политику с помощью итеративного чередования двух шагов: оценки политики (policy evaluation) и улучшения политики (policy improvement).
policy = Initialize_policy()
while not optimal:
# оцениваем политику (матрично или итеративно)
v = Evaluate_Policy(policy)
# улучшим политику, взяв действие как argmax
new_policy = imprive_policy(v)
# проверяем, сошлись ли к глобально оптимальной политике
is_optimal = [new_polixy == policy]
policy = new_policy
Подставим конкретные способы оценки и обновления политики:
В качестве оценки политикиEvaluate_Policy(policy)
возьмем метод простой итерации: для всех состояний будем применять уравнение Беллмана к
, пока не сойдемся.
for some iterations:
for s in S:
v(s) = evaluate_policy_in_state(s, policy)
В качестве улучшения политики imprive_policy(v)
возьмём жадное обновление по argmax: для всех состояний будем выбирать действие, которое максимизирует ожидаемое значение награды
.
for s in S:
policy(s) = improve_polic_in_statr(s, v)
На практике можно улучшать политику не во всех состояниях, а в некоторых на каждом шаге. Или, можно оценивать политику только частично (ограничив число итераций), не доводя до сходимости. Тем не менее, даже при таком чередовании частичных шагов оценки и улучшения, алгоритм всё равно гарантированно сойдётся. Такой подход называется обобщённой итерацией по политике (Generalized Policy Iteration, GPI).
Из GPI вытекают два важных частных случая:
Policy Iteration (итерация по политике) — когда оценка политики проводится до сходимости, а затем выполняется полное жадное улучшение политики (его рассмотрели выше).
Value Iteration (итерация по значениям) — когда выполняется всего один шаг оценки (частичное обновление) и сразу жадное улучшение политики.
for 1 iterations:
for s in S:
v(s) = evaluate_policy_in_state(s, policy)
for s in S:
policy(s) = improve_polic_in_statr(s, v)
Выкинем for по iterations и объединим в один цикл по S:
for s in S:
v(s) = evaluate_policy_in_state(s, policy)
policy(s) = improve_policy_in_statr(s, v)
Распишем шаг Policy Evaluation:
Шаг improve policy:
Подставив одну операцию в другую и получим в точности уравнение Беллмана для оптимальных политик:
Данный алгоритм – это метод простой итерации для оптимального уравнения Беллмана. Он будет сходиться, поскольку оптимальные уравнения Беллмана тоже являются операторами сжатия.
1. Initialize, for all
2. For
3.
Ноутбук потыкать (семинар с курса Practical RL). Надеюсь что все верно (• ◡•)
RL(обучение с подкреплением) – обучение методом проб и ошибок.
Главное отличие от обучения с учителем – не требует размеченной выборки и дифференцируемой лосс функции.
Reward (награда) – скалярная величина, которая предоставляет какой-то «сигнал» для обучения (хорошо/плохо). Задача агента – максимизировать сумму наград.
Правильно выбрать функцию награды не так просто: с одной стороны надо награждать агента только за достижение цели, с другой награды не должны быть слишком редкими.
Для задач с бесконечными эпизодами добавили параметр дисконтирования чтобы учитывать лишь часть будущих наград, а не накапливать бесконечную сумму.
State-value function – функция, показывающая насколько в текущем состоянии
все хорошо. С помощью Policy Evaluation оцениваем
для каждого состояния
. Есть два способа: решить СЛАУ (matrix way) или с помощью методы простых итерций (fixed-point iteration).
Action-value function – функция, показывающая насколько хорошо в текущем состоянии
совершить действие
. Policy Improvement помогает выбрать оптимальное действие в состоянии
(политику) как
.
Generalized Policy Iteration – алгоритм поиска оптимальной стратегии путем чередования Policy Evaluation и Policy Improvement. Существует две крайности данного алгоритма: Policy Iteration и Value Iteration.
Policy Iteration – когда Policy Evaluation считается до сходимости.
1. Инициализируем (случайно или равновероятно)
2. For
3. Считаем state-value функцию(методом фиксированной точки)
4. Используемдля подсчета state-action-value функции
5. Ищем новую политику
Value Iteration – когда выполняется всего один шаг Policy Evaluation и сразу Policy Improvement.
1. Инициализируем (или еще чем-то)
2. For
3.
4. Ищем политику как.
Рассуждения выше справедливы для относительно простых задач, где известна матрица переходов из одного состояния в другое при каждом действии. Такие задачи еще называют Model-based RL.
На данный момент готовлю вторую часть про задачи, когда нам не известна модель среды Model-free RL.