Единый взгляд на то, как мы обучаем моделей

Обучение с подкреплением (RL) может творить удивительные вещи. Совсем недавно ChatGPT был настроен на обратную связь с человеком с помощью PPO, варианта класса алгоритма обучения с подкреплением, называемого Policy Gradient (PG). Понимание RL, особенно градиента политики, может быть нетривиальным, особенно если вам нравится улавливать интуицию, как я. В этом посте я пройдусь по цепочке мыслей, которые действительно помогли мне понять PG, начав с более знакомой среды контролируемого обучения.

TL;DR

  • Мы начнем с разработки простой контролируемой процедуры обучения робота бинарной классификации, награждая его +1 за правильные ответы.
  • Мы сформулируем цель процедуры
  • Мы получим формулу градиентного восхождения для процедуры (которая окажется той же процедурой, что и градиентный спуск с перекрестной энтропией).
  • Мы сравним нашу процедуру с настройками RL и свяжем наш градиентный подъем с градиентом политики.

Кто должен это прочитать?

  • Моя цель — предоставить дружественную и интуитивно понятную помощь для понимания PG. Полезно, если вы имеете общее представление о постановке задач RL и знаете на высоком уровне, что такое PG.
  • Я надеюсь помочь вам лучше понять взаимосвязь между RL с PG и контролируемым ML. Поэтому полезно, если вы знаете, как обучить алгоритм машинного обучения с учителем с функцией потери перекрестной энтропии.

Почему этот пост?

Градиент политики

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

Идея PG кажется простой.

  • Политика, определяющая поведение агента в момент времени t, – это π_θ(a_t|s_t).
  • Это какая-то функция (часто нейронная сеть) с параметром θ.
  • Он принимает информацию о состоянияхs_t и выдает распределение вероятностей действий для совершенияa_t.
  • Затем он получает наградуr(s_t, a_t).
  • Когда у нас есть история многих таких циклов действия и вознаграждения, мы можем обновить параметр θ, чтобы максимизировать ожидаемое вознаграждение, вызванное действиями, сгенерированными из π_θ.

Как мы делаем обновление? Сквозь… градиент! Мы обновляем модель, создающую π_θ, со следующим градиентом

Что-то не так

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

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

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

В чем именно отличие от обучения с учителем? Оказывается, погружение в этот вопрос дает отличный способ понять PG. Кроме того, это хорошее напоминание о характере некоторых знакомых вещей в контролируемом обучении, которым мы занимаемся каждый день.

Давайте создадим кросс-энтропию с нуля

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

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

Давайте обучим классификационного бота!

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

  • Вы даете роботу изображение. Назовем это s. Это изображение взято из генеральной совокупности D_s.

  • Робот даст вам ответ, если он думает, что это изображение собаки (действие a_dog) или изображение кошки (действие a_cat).
  • У робота есть собственный прогноз относительно вероятности того, что изображение является собакой или кошкой: π_θ(a|s) = (a_dog, a_cat). Например, π_θ(a|s) = (0,9, 0,1)означает, что существует вероятность 0,9, что это собака, и 0,1, что это кошка.

  • Но каждый раз робот будет давать вам только твердый ответ. Он говорит либо «это собака» (a_dog), либо «это кошка» (a_cat). Каждый раз, когда он дает вам ответ, ответы (действия) выбираются случайным образом из распределения, созданного π_θ(a|s): >a = (a_dog, a_cat) ~ π_θ(a|s).

  • Затем вы наградите робота (может быть, угостите его?) наградой 1, когда робот ответит правильно. (r(s,a) = 1) нет вознаграждения (0 вознаграждение), если ответ неверен. (r(s,a) = 0)

Именно этот процесс я имел в виду, когда впервые узнал о контролируемом машинном обучении. Вознаграждайте его, когда он правильный. Наказывайте (или просто не награждайте в этом тренировочном процессе, который мы разработали) за то, что это неправильно. Вероятно, самый интуитивный способ тренировать что-либо.

Максимизация цели

Какова наша цель для робота? Мы хотим, чтобы его ответ был правильным как можно чаще. Точнее, мы хотим найти оптимальный параметр θ*, который дает π_θ(a|s),такоечто для всех возможных вхождений s(выборка из распределения совокупности изображений D_s)и a(выборка из распределения с учетом s по модели π_θ(a|s)), мы получаем максимальное среднее вознаграждение, взвешенное по вероятности каждого появления (s,a):

Другими словами, мы максимизируем целевую функцию J(θ), определенную как

Градиент цели

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

Но как нам рассчитать градиент, т. е. производную от J по отношению к θ? Это немного сложно в этом случае, так как

  • Функция, от которой мы хотим получить производную, является ожиданием.
  • Если математическое ожидание не превышает распределения, зависящего от θ, то в силу линейности математического ожидания мы можем просто взять производную от того, что находится внутри ожидания, и оставить ожидание там. Однако в этом случае математическое ожидание превышает (s,a) ~ (D_s, π_θ(a|s)),что зависит от θ. Так что производная не очевидна.
  • Другой способ думать об этом состоит в том, что J(θ) изменяет значение по мере того, как частота изменяется в зависимости от того, как часто мы выбираем (s,a) из распределение частично определяется θ. Мы хотим, чтобы s=dog image и a=a_dog появлялись чаще (аналогичная пара для кота). Как мы можем зафиксировать изменения θв этом направлении, когда мы делаем градиентное восхождение?

Кроме того, в идеале мы хотим, чтобы градиент был в форме

Это потому, что вы обучаете бота на примерах взаимодействия между роботом и вами. Каждая выборка состоит из триплета (s,a,r). Таким образом, мы можем аппроксимировать этот градиент, взяв среднее значение f(θ,s,a,r)с Nвыборками, которые мы собираем (по закону больших чисел, т.е. Градиентное восхождение):

Затем мы можем выполнить градиентное восхождение, выполнив

Теперь давайте найдем f.

Поиск градиента

Напомним, что мы хотим начать с (1), чтобы получить (2) для некоторого f(θ,s,a,r).

Давайте сначала перепишем (1) с определением ожидания:

По сути, это интеграция вознаграждения, взвешенного по вероятности, по всем возможным парам (s,a).

Теперь, какова в точности совместная вероятность P(s,a) появления одной пары (s,a)? Мы можем разложить его на вероятность появления образца изображения (s) и вероятность того, что робот случайным образом выберет действие a.

Поскольку робот случайным образом выбирает действие a из внутренней модели предсказания робота π_θ(a|s), мы имеем

Из всех терминов в скобках только π_θ(a|s)зависит от θ. Все остальные члены постоянны. Таким образом, мы можем переместить операцию градиента внутрь знака интеграла рядом с этим термином и получить

Обратите внимание, что мы также можем написать следующее. Здесь нет ничего большого. Просто умножьте исходную левую часть на 1, записанную в виде дроби, и переставьте члены.

Подставив его обратно, и немного переставив, получаем

P(s)π_θ(a|s) выглядит знакомо. Это P(s,a), которое мы разложили ранее! Возвращаем обратно, имеем

Теперь у нас есть интеграл и P(s,a), мы можем… вписать его обратно в определение ожидания!

Это именно та форма, которую мы хотим получить в (2), где f — члены в скобках!

Возможно, вы задавались вопросом, почему ранее мы переписали градиент π_θ(a|s) в неуклюжей дроби? Идея состояла в том, чтобы создать π_θ(a|s)терм (который мы потеряли ранее, взяв от него производную), чтобы мы могли получить P(s,a) еще раз и превратить интеграцию обратно в ожидание!

Создание перекрестной энтропии

Сейчас волшебное время.

Не верите мне? Работайте справа налево по цепной линейке. ([Необязательно] Побочные мысли: так что, если вы также не понимаете мотивации логарифмического члена в формуле градиента политики, это побочный продукт упрощения неуклюжего уравнения, которое мы получаем, с намерением извлечь π_θ(a |s)термин для преобразования вещей в ожидаемое.)

Таким образом, мы можем немного упростить градиент J(θ) :

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

Чтобы привести его к более привычному виду, переместив знак градиента за пределы суммирования, мы получим

Мы также изменим знак, выполнив

Это звонит в колокол? Давайте сравним это с тем, что мы делаем, когда делаем градиентный спуск при потере перекрестной энтропии.

Напомним, что потеря перекрестной энтропии равна

где y_i – это истинная метка, один горячий вектор (y_i_1, y_i_2), описывающий, является ли изображение кошкой и собакой (либо (0,1), либо (1,0 )). y_hat_i – это прогноз на основе модели, вектора (y_hat_i_1, y_hat_i_2), в котором две записи больше двух единиц.

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

Различия между этим выражением и выражением градиентного подъема, которое мы получили ранее, таковы:

Чтобы выразить отношения словами, это в основном означает: на примере x_i,y_i

  • Модель делает прогноз (y_hat_i_1, y_hat_i_2) с учетом x_i
  • Модель случайно выбирает ответ из прогнозируемого распределения.
  • Мы вознаграждаем ответ 1 с помощью y_i_1, а ответ 2 с y_i_2.
  • Поскольку, когда метка имеет класс 1, y_i_1 = 1, y_i_2 = 0, мы вознаграждаем модель 1, когда модель правильно отвечает 1 и есть награда 0 когда неправильно отвечает 0. Аналогично классу 2.

И это именно то, что мы делали!

Итак, резюмируя,

  • Мыразработали простую обучающуюнастройку, в которой мы вознаграждаем робота 1 баллом, когда он отвечает правильно, и 0 баллом, если он отвечает неправильно.
  • Мы обобщаем то, чего хотим достичь, в виде целевой функции, которая описывает вознаграждение робота, взвешенное по шансам на его ответ.
  • Мы находим процедуру градиентного спуска, чтобы максимизировать эту целевую функцию.
  • И мы получаем… точную процедуру, которую мы используем при обучении модели, сначала вычисляя потери перекрестной энтропии, а затем применяя их обратно!

Возвращаясь к обучению с подкреплением

Теперь давайте вернемся к настройке обучения с подкреплением. В чем разница между RL и настройкой контролируемого ML.

Несколько временных шагов

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

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

Тогда целевая функция становится

Говоря словами, мы максимизируем среднюю сумму вознаграждений всех временных шагов по всей возможной последовательности (траектории) состояний и действий, взвешенных вероятностью каждой траекториипроисхождения, когда действия определяются параметром θ.

Отмечается, что p_θ — это совместное распределение последовательности состояний и действий, когда действия определяются параметром модели агента θ. На каждом временном шаге действие агента определяется π_θ(a_t|s_t), где π_θ — модель, параметризованная θ. p_θ – это абстракция высокого уровня того, насколько вероятно возникновение последовательности состояний и действий, когда агент принимает решение на основе π_θ( то есть p_θявляется заполнителем для теоретически того, как часто агент выбирает траекторию. С другой стороны, π_θ(a|s)является вероятностью того, что агент действие на определенном временном шаге. На самом деле нам нелегко узнать значение p_θ, поэтому позже мы перепишем его с выводом модели π_θ(a|s), который мы действительно знаем ).

Давайте сравним это с целью, которая была у нас ранее:

Основные отличия заключаются в следующем.

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

Сравнение формулы градиента

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

Напомним, что наша цель — найти градиент J(θ) в следующей форме для некоторого f

Когда мы получим пакет выборочной последовательности s_1, a_1, r_1, … s_T, a_T, r_T, мы можем обновить θс помощью стохастического градиентного подъема:

Для простоты обозначим последовательность состояний и с одной переменной τ.

Поэтому мы надеемся максимизировать следующую целевую функцию

Можем проделать аналогичные манипуляции, которые мы проделали:

  • Напишите ожидание от интеграции

  • Взять производную по θдляединственного члена, включающего θ: p_θ(τ)

  • Перепишите градиент p_θ(τ)как произведение p_θ(τ)и чего-то еще, чтобы восстановить форму, определяющую ожидание

Итак, мы получаем

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

Если мы расширим аналогию с перекрестной энтропией, приведенную ранее, сумма вознаграждений будет в основном меткой траектории, а p_θ(τ)насколько вероятно τпроисходитв соответствии с прогнозом модели. Процесс обучения побуждает модель прогнозировать распределения, аналогичные распределению вознаграждений по разным траекториям τ. (На самом деле это математически точное утверждение [поправьте меня, если я ошибаюсь]. Если вы знаете о KL-дивергенции, сравните полученный градиент с KL-дивергенцией).

Мы можем сделать еще несколько манипуляций с условными вероятностями и определением p_θ(τ). Этот процесс хорошо поясняет это видео (около 9:27). Наконец, мы получаем следующее, которое переписывает p_θ(τ)как π_θ(a_t|s_t), значение которого нам действительно известно:

Обратите внимание, что когда T = 1 (один эпизод), это то же самое, что градиент, который мы получили в наших настройках раньше. Другими словами, контролируемое ML — это частный случай RL, когда есть только один эпизод, а вознаграждение не является стохастическим (см. следующий раздел).

Еще одно отличие: оценка вознаграждения

Еще одно различие между RL и контролируемым ML заключается в том, насколько мы можем доверять вознаграждениям. В контролируемом машинном обучении наградой являются наземные метки правды, которые поставляются с образцами изображений. Обычно мы на 100% уверены, что награды правильные, и наш робот будет корректировать свое поведение в соответствии с этими метками.

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

[Необязательно] Побочные мысли: я также подумал, есть ли что-то среднее между контролируемым ML (где ярлыки/вознаграждения надежны на 100 %) и RL (где вознаграждения более случайны). Кажется, когда метки зашумлены (содержит несколько неправильных меток), мы как бы посередине? Так может ли метод псевдомаркировки иметь какой-то оттенок проблемы RL? Дайте мне знать, что вы думаете.

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

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

Это одна из проблем RL, которая все еще является областью исследований. Выполнение некоторых манипуляций с вознаграждениями и варианты градиента политики, такие как TRPO и PPO, предназначены для лучшего решения этой проблемы и стали более широко использоваться, чем ванильный PG.

[Необязательно] Еще одно соображение: сравнение с последовательным контролируемым машинным обучением

Одно из различий между нашей настройкой контролируемого ML и RL заключается в том, что RL часто включает несколько временных шагов. У меня сразу возник вопрос: чем же тогда RL отличается от обучения последовательной модели вроде Transformer или LSTM?

Ответ на этот вопрос определенно зависит от точного плана потерь обучения вашей любимой последовательной модели.

А пока предположим, что вы обучаете модель последовательности f(x_1,x_2,…x_T)предсказыватьy_1, y_2…y_T Например, в задаче машинного перевода x могут быть словами входного английского предложения, а y 's – это слова, выведенные на французском языке (каждое из x_t, y_t – одно векторное представление слова).

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

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

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

Это удаляет много терминов, что значительно уменьшает дисперсию градиентов, что может быть тем, что делает обучение Transformer / LSTM в контролируемых условиях проще, чем алгоритм RL? (в дополнение к нестохастическим вознаграждениям в контролируемой обстановке).

В этом видео представлен метод уменьшения дисперсии PG: измените сумму вознаграждения за все временные шаги в PG на вознаграждение, которое нужно пройти (т. е. сумму от t' = t до t' = T ). Это имеет тот же вкус, что и разница между PG и обучением Transformer / LSTM в контролируемой обстановке. В то время как метод вознаграждения на ходу заставляет агента оценивать каждое состояние по возможным будущим вознаграждениям, можем ли мы сказать, что контролируемое последовательное обучение заставляет модель фокусироваться только на правильности текущего временного шага?

Кроме того, я попытался работать в обратном направлении от этого выражения градиента и найти исходное J(θ), которое дает это выражение градиента, чтобы мы могли более точно интерпретировать цель контролируемого последовательного обучения. Но я застрял на полпути. Дайте мне знать, если у вас есть какие-либо мысли.

Подтверждение

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