Подробно объясните алгоритм градиента политик.

алгоритм обучение с подкреплением
Подробно объясните алгоритм градиента политик.

Эта статья была впервые опубликована вУокер ИИ

введение

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

1. Монте-Карло

Прежде чем объяснять алгоритм градиента политики (Policy Gradient, называемый PG), вы можете сначала понять алгоритм Монте-Карло, сначала давайте посмотрим на небольшую историю:

В эпоху Наруто, чтобы улучшить свои способности, Наруто, который все еще был под властью ниндзя, взял квест уровня C в Центре квестов ниндзя Конохи.Выполняя квест, он внезапно попал в ловушку иллюзии человека в маске. . Лабиринтоподобная иллюзия (выход - дверь света, что можно понимать как дверь со светом), Наруто не может выбраться, как бы он ни ходил.Хотя выходов в этой иллюзии много, только ближайший выход может пройти через дверь света, чтобы выйти из иллюзии Другое Хотя на выходе есть дверь света, пройти через нее трудно. Возможно, что Наруто также весьма искушен в математике.Он использовал запрещенную технику многотеневых аватаров, которую он научился, чтобы разделить множество аватаров (при условии, что достаточно, не спрашивайте, достаточно ли чакры Наруто, в критические моменты). позаимствовать его у девятихвостого в теле), а затем стал объяснять задание каждому клону:

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

  1. Каждому из вас нужно найти выход, далеко или близко, и каждый шаг на пути должен записывать пройденный вами путь и количество полученной чакры на свитке;
  2. Запишите общее количество чакры, полученной этим путем, и вернитесь к исходной точке исходного пути;
  3. Усредните общее количество наград, полученных каждым из вас, и сообщите мне окончательный результат как значение для текущей отправной точки.
  4. Затем измените начальную точку на начальную точку, которую можно выбрать на следующем шаге, и повторите шаги 1–3.

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

Вышеприведенная история на самом деле похожа на алгоритм Монте-Карло, а именно:

Алгоритм Монте-Карло — это метод, основанный на выборке, с заданной политикойчисло Пи\pi, пусть агент взаимодействует с окружающей средой, и вы получите множество траекторий. Каждая траектория имеет соответствующую доходность.Мы усредняем доходность каждой траектории, чтобы узнать значение соответствующего состояния при определенной стратегии. Это предложение можно разбить, чтобы оно соответствовало приведенной выше истории:

  1. Монте-Карло — метод, основанный на выборке. (В истории достаточно аватаров Наруто)
  2. Должна быть дана стратегиячисло Пи\pi(соответствует тому, что каждый аватар сталкивается с развилкой в ​​истории, это средний выбор)
  3. Агент взаимодействует с окружающей средой и получает множество траекторий. (Соответственно процессу поиска выхода в фантазии для каждого аватара в истории, каждому аватару соответствует траектория)
  4. Каждая траектория имеет соответствующую награду. (соответствует общей награде, полученной каждым клоном в истории)
  5. Значение соответствующего состояния получается путем усреднения результатов каждой траектории. (Соответственно Наруто, общая награда за каждого клона будет усреднена)

2. Алгоритм градиента политики

2.1 Введение

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

Когда мы объединяем глубокое обучение с обучением с подкреплением, политика π представляет собой сеть, которая используетθ\thetaвыражатьчисло Пи\piпараметр. В приведенном выше примере иллюзии входными данными является бифуркация, в которой находится текущий клон.Предполагая, что вы можете идти вверх, вниз и влево, после прохождения сети политик, выходными данными является вероятность того, что можно выбрать три действия. . Затем актор решает, какое действие предпринять, основываясь на этом распределении вероятностей, и действия, предпринимаемые актором, также различаются в зависимости от распределения вероятностей. Проще говоря, сетевые выходные данные политики представляют собой распределение вероятностей, и действующее лицо производит выборку из этого распределения, чтобы решить, какое действие на самом деле предпринять.

По сути, PG — это алгоритм, сочетающий Монте-Карло и нейронную сеть.PG больше не выводит значение Q, как Q-learning и DQN, а напрямую выводит вероятность того, что текущее состояние может выполнять все действия в непрерывном интервале.

В предыдущем объяснении метода, основанного на значениях, мы использовали аппроксимацию функции значения, чтобы превратить проблему обновления таблицы Q в проблему подбора функции, и аналогичные состояния получают аналогичные выходные действия, как показано в следующей формуле, путем обновления параметра w чтобы функция f аппроксимировала оптимальное значение Q.

Q(s,a)f(s,a,w)Q(s, a) \approx f(s, a, w)

В алгоритме PG, поскольку стратегия является вероятностной и не может быть непосредственно использована для итерации, мы берем аналогичную идею и преобразовываем ее в функциональную форму, как показано в следующей формуле.На данный момент наша цель состоит в том, чтобы использоватьθ\thetaФункция параметров аппроксимирует политику, обновляя параметрыθ\theta, аппроксимируя оптимальную стратегию.

число Пи(as)число Пиθ(s,a)=P(as,θ)π(a|s)≈πθ(s,a)=P(a|s,θ)

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

2.2 Содержание алгоритма

Прежде всего, мы можем думать об окружающей среде как о функции.Эта функция в начале выдает состояние.Если это состояние является экраном игры, то актер видит экран игры.s1s_{1}Позже выберитеa1a_{1}это действие. окружающая обстановкаa1a_{1}как вход, а затем выплюнутьs2s_{2}, то есть выплюнуть новый игровой экран. Актеры видят новые кадры игрового процесса и совершают новые действия.a2a_{2}. смотреть на окружающую средуa2a_{2}, то выплюнутьs3s_{3}. Этот процесс продолжается до тех пор, пока среда не почувствует, что он должен остановиться.

В игре действующее лицо в конечном итоге завершается непрерывным взаимодействием с окружающей средой.Согласно приведенному выше описанию может быть получена траектория, которая выражается какт\taussгосударство,aaэкспресс действие,s1s_{1},a1a_{1}Указывает, что актер выбирает действие 1, когда находится в состоянии 1, и так далее. как показано в следующей формуле.

т={s1,a1,s2,a2,,st,at}\tau=\left\{s_{1}, a_{1}, s_{2}, a_{2}, \cdots, s_{t}, a_{t}\right\}

Затем предположим, что сетевые параметры политики текущего актора равныθ\theta, мы можем рассчитать вероятность того, что эта траектория произойдет. Это зависит от двух частей: действия среды и действия агента, как показано в следующей формуле, оно представляет собой вероятность траектории после ее создания.

pθ(т)=p(s1)pθ(a1s1)p(s2s1,a1)pθ(a2s2)p(s3s2,a2)=p(s1)t=1Tpθ(atst)p(st+1st,at)\begin{aligned} p_{\theta}(\tau) &=p\left(s_{1}\right) p_{\theta}\left(a_{1} \mid s_{1}\right) p\left(s_{2} \mid s_{1}, a_{1}\right) p_{\theta}\left(a_{2} \mid s_{2}\right) p\left(s_{3} \mid s_{2}, a_{2}\right) \cdots \\ &=p\left(s_{1}\right) \prod_{t=1}^{T} p_{\theta}\left(a_{t} \mid s_{t}\right) p\left(s_{t+1} \mid s_{t}, a_{t}\right) \end{aligned}

Действие среды относится к тому, как выглядят параметры или правила внутри функции среды, оно неуправляемо и прописано заранее.p(st+1st,at)p\left(s_{t+1} \mid s_{t}, a_{t}\right)представляет окружающую среду. Действие агента относится к способности контролировать себя,pθ(atst)p_{\theta}\left(a_{t} \mid s_{t}\right)Представляет агента в заданном состоянииsts_{t}, какие действия предпримет актерata_{t}будет зависеть от параметров актераθ\theta, так что эта часть находится под контролем актера. Поскольку действия акторов различны, для каждой одной и той же траектории она будет иметь разную вероятность появления.

Помимо окружения и актеров, есть еще и функция вознаграждения. дать ему входs1s_{1},a1a_{1}, который говорит вам получитьr1r_{1}. дай этоs2s_{2},a2a_{2}, который говорит вам получитьr2r_{2}. положить всеrrСкладываем все это и получаемR(т)R(\tau), представляющий некоторую траекториют\tauнаграда.

В определенной игре мы получимRR. Путем настройки параметров внутри актераθ\theta, так чтоRRЧем больше значение , тем лучше, что является целью оптимизации алгоритма PG. Но на самом деле вознаграждение — это не просто скаляр, вознаграждениеRRявляется случайной величиной, потому что действия, которые будет выполнять актор в одном и том же состоянии, случайны. Какое действие предпримет среда при том же наблюдении и какое наблюдение будет сгенерировано, также является случайным, поэтомуRRявляется случайной величиной. Тогда мы можем вычислить, учитывая определенный набор параметровθ\thetaВ случае полученияRθR_{\theta}Каково ожидаемое значение . Ожидаемое значение определяется по формуле ниже.

Rˉθ=тR(т)pθ(т)=Eтpθ(т)[R(т)]\bar{R}_{\theta}=\sum_{\tau} R(\tau) p_{\theta}(\tau)=E_{\tau \sim p_{\theta}(\tau)}[R(\tau)]

Нам нужно исчерпать все возможные траекториит\tau, каждый трект\tauоба имеют вероятность и общее вознаграждениеRR. также может распространяться изpθ(т)p_{\theta}(\tau)образец трассировкит\tau,рассчитатьR(т)R(\tau)Ожидаемая ценность — это ожидаемое вознаграждение. Все, что нам нужно сделать, это максимизировать ожидаемую награду.

Как максимизировать ожидаемое вознаграждение?Поскольку это максимизация, мы можем использовать градиентное восхождение для обновления параметров, чтобы максимизировать ожидаемое вознаграждение. правильноRˉ\bar{R}Возьмите градиент, где толькоpθ(т)p_{\theta}(\tau)это сθ\thetaСвязанный. Полная формула градиента политики показана на рисунке ниже.

Рисунок 1. Формула градиента политики

Среди них кpθ(т)\nabla p_{\theta}(\tau)использоватьf(x)=f(x)logf(x)\nabla f(x)=f(x) \nabla \log f(x),получитьpθ(т)=pθ(т)logpθ(т)\nabla p_{\theta}(\tau)=p_{\theta}(\tau) \nabla \log p_{\theta}(\tau)этоf(x)=f(x)logf(x)\nabla f(x)=f(x) \nabla \log f(x)Вы можете понять это как фиксированное преобразование формулы, просто запомните это.

Как показано в следующей формуле, длят\tauподводить итоги,R(т)R(\tau)иlogpθ(т)\log p_{\theta}(\tau)Эти два используютpθ(т)p_{\theta}(\tau)взвешенный, так как использованиеpθ(т)p_{\theta}(\tau)Взвешенные и их можно записать в желаемом виде. это ты изpθ(т)p_{\theta}(\tau)Выборка из этой раздачит\tauвыходи и считайR(т)R(\tau)ездить наlogpθ(т)\log p_{\theta}(\tau), принять его во всех возможныхт\tauВ общем, это ожидаемое значение.

Rˉθ=тR(т)pθ(т)=тR(т)pθ(т)pθ(т)pθ(т)=тR(т)pθ(т)logpθ(т)=Eтpθ(т)[R(т)logpθ(т)]\begin{aligned} \nabla \bar{R}_{\theta} &=\sum_{\tau} R(\tau) \nabla p_{\theta}(\tau) \\ &=\sum_{\tau} R(\tau) p_{\theta}(\tau) \frac{\nabla p_{\theta}(\tau)}{p_{\theta}(\tau)} \\ &=\sum_{\tau} R(\tau) p_{\theta}(\tau) \nabla \log p_{\theta}(\tau) \\ &=E_{\tau \sim p_{\theta}(\tau)}\left[R(\tau) \nabla \log p_{\theta}(\tau)\right] \end{aligned}

На самом деле нет никакого способа вычислить это ожидаемое значение, поэтому мы используем выборку для выборки.NNРучкат\tau, чтобы вычислить эти значения для каждого штриха, сложите их все, и вы можете получить градиент. Мы можем обновить параметры, а затем мы можем обновить агент, как показано в следующей формуле.

Eтpθ(т)[R(т)logpθ(т)]1Nn=1NR(тn)logpθ(тn)=1Nn=1Nt=1TnR(тn)logpθ(atnstn)\begin{aligned} E_{\tau \sim p_{\theta}(\tau)}\left[R(\tau) \nabla \log p_{\theta}(\tau)\right] & \approx \frac{1}{N} \sum_{n=1}^{N} R\left(\tau^{n}\right) \nabla \log p_{\theta}\left(\tau^{n}\right) \\ &=\frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_{n}} R\left(\tau^{n}\right) \nabla \log p_{\theta}\left(a_{t}^{n} \mid s_{t}^{n}\right) \end{aligned}

logpθ(т)\nabla \log p_{\theta}(\tau)Конкретный процесс расчета показан в следующей формуле

logpθ(т)=(logp(s1)+t=1Tlogpθ(atst)+t=1Tlogp(st+1st,at))=logp(s1)+t=1Tlogpθ(atst)+t=1Tlogp(st+1st,at)=t=1Tlogpθ(atst)=t=1Tlogpθ(atst)\begin{aligned} \nabla \log p_{\theta}(\tau) &=\nabla\left(\log p\left(s_{1}\right)+\sum_{t=1}^{T} \log p_{\theta}\left(a_{t} \mid s_{t}\right)+\sum_{t=1}^{T} \log p\left(s_{t+1} \mid s_{t}, a_{t}\right)\right) \\ &=\nabla \log p\left(s_{1}\right)+\nabla \sum_{t=1}^{T} \log p_{\theta}\left(a_{t} \mid s_{t}\right)+\nabla \sum_{t=1}^{T} \log p\left(s_{t+1} \mid s_{t}, a_{t}\right) \\ &=\nabla \sum_{t=1}^{T} \log p_{\theta}\left(a_{t} \mid s_{t}\right) \\ &=\sum_{t=1}^{T} \nabla \log p_{\theta}\left(a_{t} \mid s_{t}\right) \end{aligned}

Уведомление,p(s1)p\left(s_{1}\right)иp(st+1st,at)p\left(s_{t+1} \mid s_{t}, a_{t}\right)из окружающей среды,

pθ(atst)p_{\theta}\left(a_{t} \mid s_{t}\right)это от агента.p(s1)p\left(s_{1}\right)иp(st+1st,at)p\left(s_{t+1} \mid s_{t}, a_{t}\right)определяется окружающей средой, поэтому сθ\thetaнеактуально, такlogp(s1)=0\nabla \log p\left(s_{1}\right)=0 t=1Tlogp(st+1st,at)=0\nabla \sum_{t=1}^{T} \log p\left(s_{t+1} \mid s_{t}, a_{t}\right)=0

Мы можем интуитивно понять формулу, окончательно выведенную на рисунке 1, то есть в данных, которые мы выбирали, выбирали в определенном состоянии.sts_{t}выполнить действиеata_{t},sts_{t}иata_{t}это на всей траекториит\tauПара состояния и действия в . Предположим, мыsts_{t}воплощать в жизньata_{t}, и наконец нашелт\tauНаграда положительная, увеличим вероятность этого предмета, увеличимsts_{t}воплощать в жизньata_{t}Вероятность. Наоборот, вsts_{t}воплощать в жизньata_{t}приведет кт\tauНаграда становится отрицательной, мы должны уменьшить вероятность этого срока.

Чтобы рассчитать приведенную выше формулу, мы должны сначала собрать большое количествоssиaaпара, но и знать этиssиaaСколько вознаграждения вы получите, когда взаимодействуете с окружающей средой. Конкретно нам нужно взять агента, и его параметрыθ\theta, чтобы взаимодействовать с окружающей средой, после взаимодействия вы получите много игровых рекордов.

Мы можем подставить выборочные данные в формулу градиента и вычислить градиент. То есть каждый из выборочных данныхssиaaБерём пару, вычисляем её логарифмическую вероятность, то есть вычисляем логарифмическую вероятность совершения определённого действия в определённом состоянии, и берём для него градиент, который будет умножаться на вес, а вес есть награда игра. С ними модель будет обновлена.

Рисунок 2. Алгоритм градиента политики

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

2.3 Навыки

(1) Увеличьте базовый уровень

  • Во многих играх награда всегда положительна или равна нулю. Поскольку сумма вероятностей совершения действия равна 1, когда все вознаграждения положительны, может иметь место нормализация,RR(вес) Чем больше увеличение, тем большеRRМаленький, после нормализации падает. Например, в следующем случае предположим, что в определенном состоянии есть три действия, а именноaa,bb,cc, все награды положительные. По формулеRˉθ\nabla \bar{R}_{\theta}, мы хотим, чтобы вероятности и логарифмические вероятности этих трех действий были высокими, но веса перед нимиRRОно разное, есть большие и маленькие, поэтому вес тяжелый, прибавка чуть больше, вес маленький, прибавка меньше, а так как логарифмическая вероятность есть вероятность, то сумма трех действий должна быть 0, то после завершения возврата После трансформации поднимутся те, кто поднимется больше, а те, кто поднимется меньше, упадут.
Рисунок 3. Добавление базовой линии
  • выборка должна быть ожидаемой для всех возможныхssиaaПары суммируются. Но при обучении отбирается лишь небольшое количество образцов.ssиaaВерно. Некоторые действия никогда не могут быть сэмплированы. Также предположим, что действия, которые могут быть выполнены в определенном состоянии,aa,bb,cc, но вы можете только пробовать действияbbили просто пример действияcc, действие не сэмплируетсяaa. Награды за все действия теперь положительные, по формулеRˉθ\nabla \bar{R}_{\theta}, каждая из его вероятностей должна возрастать. так какaaЕсли он не выбран, если вероятность других действий увеличивается,aaвероятность снижается. ноaaНе обязательно плохой ход, он просто не сэмплирован. Но вероятность упала, что явно проблематично, поэтому мы хотим, чтобы награда не всегда была положительной.

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

Rˉθ1Nn=1Nt=1Tn(R(тn)b)logpθ(atnstn)\nabla \bar{R}_{\theta} \approx \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_{n}}\left(R\left(\tau^{n}\right)-b\right) \nabla \log p_{\theta}\left(a_{t}^{n} \mid s_{t}^{n}\right)

в,bbназывается базовым, за вычетомbbПозже вы можете позволитьR(тn)bR\left(\tau^{n}\right)-bВ этом есть положительные и отрицательные стороны. Таким образом, если общая полученная наградаR(тn)R\left(\tau^{n}\right)больше, чемbbЕсли это так, увеличьте его вероятность. Если это общее вознаграждение меньше, чемbb, даже если он положительный, нехорошо, если положительный очень мал, поэтому вероятность этого пункта необходимо уменьшить.bbобычно ставяттn\tau^{n}Значение ожидаемое, рассчитатьтn\tau^{n}среднее значениеbE[R(т)]b \approx E[R(\tau)]. Во время реальной тренировки,R(тn)R\left(\tau^{n}\right)Оценка записывается и постоянно рассчитываетсяR(тn)R\left(\tau^{n}\right)среднее значениеbb.

(2) Назначьте соответствующие баллы

  • В одной и той же игре или в одном и том же раунде все пары состояние-действие взвешиваются с одинаковым вознаграждением, что несправедливо, поскольку в одной и той же игре некоторые действия могут быть хорошими, а некоторые — плохими. Предположение, что исход всей игры хороший, не означает, что каждое действие правильное, и наоборот. Например, предположим, что игра короткая, вs1s_{1}воплощать в жизньa1a_{1}наградаr1r_{1}5, вs2s_{2}воплощать в жизньa2a_{2}наградаr2r_{2}равно 0, вs3s_{3}воплощать в жизньa3a_{3}наградаr3r_{3}равно -2. Вся игра окончена, и общая награда равна 3. но не означаетs2s_{2}выполнить действиеa2a_{2}хорошо, потому что эта положительная оценка в основном исходит отs1s_{1}казненa1a_{1}, следитьs2s_{2}воплощать в жизньa2a_{2}неважно, может быть, вs2s_{2}воплощать в жизньa2a_{2}Это нехорошо, потому что это заставляет вас войти в следующийs3s_{3},воплощать в жизньs3s_{3}Очки вычитаются, поэтому результат всей игры хороший, это не значит, что каждое действие правильное. Следовательно, при обучении каждая пара состояний и действий будет умножаться на 3.

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

Rˉθ1Nn=1Nt=1Tn(t'=tTnγt'trt'nb)logpθ(atnstn)\nabla \bar{R}_{\theta} \approx \frac{1}{N} \sum_{n=1}^{N} \sum_{t=1}^{T_{n}}\left(\sum_{t^{\prime}=t}^{T_{n}} \gamma^{t^{\prime}-t} r_{t^{\prime}}^{n}-b\right) \nabla \log p_{\theta}\left(a_{t}^{n} \mid s_{t}^{n}\right)

Делаем скидку на будущие награды, т.к. чем дольше время, тем менее значимо вознаграждение, коэффициент скидкиγ\gamma,γе[0,1]\gamma \in[0,1], обычно устанавливается на 0,9 или 0,99, еслиγ\gamma=0, что означает, что речь идет только о немедленном вознаграждении; еслиγ\gamma=1, что означает, что будущее вознаграждение эквивалентно немедленному вознаграждению.

Например, все поймут. Например, если я дам тебе 100 юаней сейчас или дам тебе эти 100 юаней через 10 лет, что ты выберешь? Конечно, первое. 100 юаней через 10 лет , там это может стоить 10 баксов сегодня. Другими словами, является ли доллар в 1960-х той же стоимостью, что и доллар сегодня?

3. Реализация кода

Случай: Смоделируйте ситуацию, когда лунная лодка приземлится на поверхность Луны. Цель миссии состояла в том, чтобы безопасно посадить лунную лодку на ровную поверхность между двумя желтыми флагами. Тестовая среда: LunarLander-v2

Наблюдения: в этой игровой среде есть восемь наблюдений, а именно горизонтальная координата x, вертикальная координата y, горизонтальная скорость, вертикальная скорость, угол, угловая скорость, нога 1 касается земли, а нога 2 касается земли;

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

Награда: -100 баллов за разбившуюся лодку; 100-140 баллов за успешную посадку лодки между двумя желтыми флагами; -0,3 балла за каждую струю главного двигателя вниз; 100 баллов за каждую окончательную остановку лодки. баллы, по 10 баллов за каждую ногу приземления.

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

Определите структуру сети:

class PolicyNet(nn.Module):
    def __init__(self, n_states_num, n_actions_num, hidden_size):
        super(PolicyNet, self).__init__()
        self.data = []  # 存储轨迹
        # 输入为长度为8的向量 输出为4个动作
        self.net = nn.Sequential(
            # 两个线性层,中间使用Relu激活函数连接,最后连接softmax输出每个动作的概率
            nn.Linear(in_features=n_states_num, out_features=hidden_size, bias=False),
            nn.ReLU(),
            nn.Linear(in_features=hidden_size, out_features=n_actions_num, bias=False),
            nn.Softmax(dim=1)
        )

    def forward(self, inputs):
        # 状态输入s的shape为向量:[8]
        x = self.net(inputs)
        return x

Определите класс PG:

class PolicyGradient():

    def __init__(self, n_states_num, n_actions_num, learning_rate=0.01, reward_decay=0.95 ):
        # 状态数   state是一个8维向量,分别是水平坐标x,垂直坐标y,水平速度,垂直速度,角度,角速度,腿1触地,腿2触地
        self.n_states_num = n_states_num
        # action是4维、离散,即什么都不做,发动左方向引擎,发动主机,发动右方向引擎。
        self.n_actions_num = n_actions_num
        # 学习率
        self.lr = learning_rate
        # gamma
        self.gamma = reward_decay
        # 网络
        self.pi = PolicyNet(n_states_num, n_actions_num, 128)
        # 优化器
        self.optimizer = torch.optim.Adam(self.pi.parameters(), lr=learning_rate)
        # 存储轨迹  存储方式为  (每一次的reward,动作的概率)
        self.data = []
        self.cost_his = []

    # 存储轨迹数据
    def put_data(self, item):
        # 记录r,log_P(a|s)z
        self.data.append(item)

    def train_net(self):
        # 计算梯度并更新策略网络参数。tape为梯度记录器
        R = 0  # 终结状态的初始回报为0
        policy_loss = []
        for r, log_prob in self.data[::-1]:  # 逆序取
            R = r + gamma * R  # 计算每个时间戳上的回报
            # 每个时间戳都计算一次梯度
            loss = -log_prob * R
            policy_loss.append(loss)
        self.optimizer.zero_grad()
        policy_loss = torch.cat(policy_loss).sum()  # 求和
        # print('policy_loss:', policy_loss.item())
        # 反向传播
        policy_loss.backward()
        self.optimizer.step()
        self.cost_his.append(policy_loss.item())
        # print('cost_his:', self.cost_his)
        self.data = []  # 清空轨迹

    # 将状态传入神经网络 根据概率选择动作
    def choose_action(self, state):
        # 将state转化成tensor 并且维度转化为[8]->[1,8]  
        s = torch.Tensor(state).unsqueeze(0)
        prob = self.pi(s)  # 动作分布:[0,1,2,3]
        # 从类别分布中采样1个动作, shape: [1] torch.log(prob), 1
        
        # 作用是创建以参数prob为标准的类别分布,样本是来自“0 … K-1”的整数,其中K是prob参数的长度。也就是说,按照传入的prob中给定的概率,
        # 在相应的位置处进行取样,取样返回的是该位置的整数索引。不是最大的,是按照概率采样的那个,采样到那个就是哪个的索引
        m = torch.distributions.Categorical(prob)  # 生成分布
        action = m.sample()
        return action.item(), m.log_prob(action)
    def plot_cost(self, avage_reward):
        import matplotlib.pyplot as plt
        plt.plot(np.arange(len(avage_reward)), avage_reward)
        plt.ylabel('Reward')
        plt.xlabel('training steps')
        plt.show()

Обучите модель:

   for n_epi in range(1000):

        state = env.reset()  # 回到游戏初始状态,返回s0
        ep_reward = 0
        for t in range(1001):  # CartPole-v1 forced to terminates at 1000 step.
            # 根据状态 传入神经网络 选择动作
            action, log_prob = policyGradient.choose_action2(state)
            # print(action, log_prob)
            # 与环境交互
            s_prime, reward, done, info = env.step(action)
            # s_prime, reward, done, info = env.step(action)
            if n_epi > 1000:
                env.render()
            # 记录动作a和动作产生的奖励r
            policyGradient.put_data((reward, log_prob))
            state = s_prime  # 刷新状态
            ep_reward += reward
            if done:  # 当前episode终止
                break
            # episode终止后,训练一次网络
        running_reward = 0.05 * ep_reward + (1 - 0.05) * running_reward
        avage_reward.append(running_reward)
        # 交互完成后 进行学习
        policyGradient.train_net()
        if n_epi % print_interval == 0:
            print('Episode {}\tLast reward: {:.2f}\tAverage reward: {:.2f}'.format(
                n_epi, ep_reward, running_reward))
        if running_reward > env.spec.reward_threshold:  # 大于游戏的最大阈值时,退出游戏
            print("Solved! Running reward is now {} and "
                  "the last episode runs to {} time steps!".format(running_reward, t))
            torch.save(policyGradient.pi.state_dict(), 'pg.pkl')
            break
    policyGradient.plot_cost(avage_reward)

Наконец, получается кривая вознаграждения, как показано на рисунке ниже, которая стремится к сходимости:

Рисунок 4. График вознаграждения

Окончательный эффект анимации выглядит следующим образом:

7efynA.gif

Рисунок 5. График представления результатов

4. Резюме

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

5. Ссылки

[1] «Подкрепление + обучение: + введение»

[2] blog.CSDN.net/Baidu_41871…

Мы ходячий ИИ, и мы продолжаем двигаться вперед в «ИИ + игра».

Зайдите в официальный аккаунт [walker AI] и ответьте на [Tigers and Dragons], чтобы получить красную обложку конверта ограниченного выпуска. Приходите и обсудите с нами технические вопросы!