в предыдущей статьеОбучение с подкреплением - вывод формулы градиента политикиМы получили градиент политики:
один из нихпредставляет собой сумму всех вознаграждений за i-ю траекторию.
Для этой формулы мы получаем его на основе метода выборки MC. Для траекторий, выбранных с помощью MC, систематическая ошибка отсутствует. Однако из-за выборки вознаграждение, получаемое каждой траекторией, очень нестабильно, что приводит к относительно высокой дисперсии. Есть два способа уменьшить дисперсию: 1. Использовать временную причинность. 2. Введите базовый уровень
1. Уменьшите дисперсию
1. Используйте временную причинность
Использование временной причинности может уменьшить количество ненужных терминов.
Награда за точку в траекторииЭто может быть выражено как:
Затем сложите производные всех точек траектории:
вПредставляет собой сумму вознаграждений, полученных за траекторию после t шагов.
Если вышеприведенная формула сложна для понимания, мы можем понять ее так: все мы знаем, что текущий момент не может повлиять на то, что произошло в прошлом, это временная причинность. Аналогично, для траекториисейчасвременная стратегия не может повлиятьНаграды, заработанные до момента. так в самый разВсе награды после этого складываются, иНаграды, заработанные до момента, не имеют значения. Следовательно, Оценщик градиента политики может быть выражен следующим образом:
Из вышеперечисленных операций мы получаем очень классический алгоритм REINFORCE в Policy Gradient:
Williams (1992). Simple statistical gradient-following algorithms for connectionist reinforcement learning: introduces REINFORCE algorithm
2. Присоединяйтесь к базовой линии
Для выбранной траектории вознаграждениебудет иметь высокую дисперсию, мы можем позволитьВычтите значение (Baseline), которое уменьшает дисперсию, и легко доказать, что добавление Baseline уменьшит дисперсию без изменения общего ожидаемого значения, что сделает процесс обучения более стабильным.
Один из способов — использовать ожидание вознаграждения в качестве исходного уровня, т. е. позволитьВычтите его среднее значение:
Для базовой линии параметр также можно использовать для подгонки, который выражается как, при оптимизации параметров во время оптимизациии.
2. Алгоритм УСИЛЕНИЯ
пример использования кодаCartPole-v1
Дискретная среда, сначала давайте посмотрим на общий поток алгоритма.
1. Общий процесс
Во-первых, мы строим модель сети политик и инициализируем параметры, а затем используйте эту модель для выборки и сбора данных, а затем используйте собранные данные для обновления параметров сети., затем у нас есть новая сеть политик, а затем используем новую сеть политик для взаимодействия со средой для сбора новых данных, обновления сети политик и повторения, пока не будет обучена хорошая модель. Обратите внимание, что данные, собираемые каждый раз, могут быть использованы только один раз и должны быть удалены, поскольку каждое обновлениеПозже сеть политик изменится, поэтому данные, собранные старой сетью, нельзя будет использовать для отслеживания параметров новой сети.
Конкретный процесс выглядит следующим образом: в процессе взаимодействия со средой мы сохраняем соответствующие данные каждого шага для расчетанаграда.
for episode in range(TRAIN_EPISODES):
state = env.reset()
episode_reward = 0
for step in range(MAX_STEPS): # in one episode
if RENDER: env.render()
action = agent.get_action(state)
next_state, reward, done, _ = env.step(action)
agent.store_transition(state, action, reward)
state = next_state
episode_reward += reward
if done:break
agent.learn()
2. Рассчитайте вознаграждение
def _discount_and_norm_rewards(self):
# discount episode rewards
discounted_reward_buffer = np.zeros_like(self.reward_buffer)
running_add = 0
for t in reversed(range(0, len(self.reward_buffer))):
running_add = running_add * self.gamma + self.reward_buffer[t]
discounted_reward_buffer[t] = running_add
# normalize episode rewards
discounted_reward_buffer -= np.mean(discounted_reward_buffer)
discounted_reward_buffer /= np.std(discounted_reward_buffer)
return discounted_reward_buffer
Функция разделена на две части, одна часть вычисляет значение G, а другая часть нормализует значение G. рассчитано здесьdiscounted_reward_buffer
Это награда, которую можно получить за каждый шаг до конца эпизода, что является формулой в формуле. Обратите внимание, что счет идет в обратном порядке от последнего состояния, а награда за каждый шаг добавляется в список. Затем нормализуйте рассчитанные данные списка вознаграждений, и эффект обучения будет лучше.
3. Обновление градиента
Мы знаем, что каждый раз, когда мы собираем данные для обновления параметров сети, то как обновляются параметры сети?
Мы можем думать об этом как о процессе классификации обучения с учителем, как показано на рисунке ниже, для входных данных среды в сеть политик конечный выход сети — это три действия: влево, вправо и огонь. Справа находится этикетка. Функция потерь представляет собой перекрестную энтропию между выходным действием и меткой.Целью минимизации является ее перекрестная энтропия, а затем с новыми параметрами сети увеличить вероятность того, какое действие произойдет, или уменьшить вероятность того, какое действие произойдет.
Каждый шаг данных, которые мы собираемstate, action
, вы можете поставитьstate
В качестве обучающих данных положимaction
Воспринимайте это как ярлык. Затем минимизируйте его кросс-энтропию, как показано в коде ниже. В алгоритме REINFORCE рассчитанная перекрестная энтропия умножается наТо есть в кодеdiscounted_reward
, то есть параметры обновляются в соответствии снастроить, еслиотносительно высока, то вероятность возникновения соответствующего действия будет значительно увеличена.Если это отрицательное число, то вероятность действия будет соответственно уменьшена, что является градиентным спуском с весом. Для этого процессаtensorlayer
встроенная функцияcross_entropy_reward_loss
, вы можете напрямую реализовать описанный выше процесс, см. раздел комментариев к коду.
def learn(self):
discounted_reward = self._discount_and_norm_rewards()
with tf.GradientTape() as tape:
_logits = self.model(np.vstack(self.state_buffer))
neg_log_prob = tf.nn.sparse_softmax_cross_entropy_with_logits(
logits=_logits, labels=np.array(self.action_buffer))
loss = tf.reduce_mean(neg_log_prob * discounted_reward)
# loss = tl.rein.cross_entropy_reward_loss(
# logits=_logits, actions=np.array(self.action_buffer), rewards=discounted_reward)
grad = tape.gradient(loss, self.model.trainable_weights)
self.optimizer.apply_gradients(zip(grad, self.model.trainable_weights))
Для понимания этой части вы можете непосредственно увидетьВидео учителя Ли Хунъи, очень доходчиво объяснил. Полный код REINFORCE:Алгоритм УСИЛЕНИЯ, Я надеюсь, что смогу дать вам звезду по желанию, спасибо, мистер Кангуань. . .
3. Неадекватность REINFORCE
Градиенты политик открывают нам окно для решения проблем обучения с подкреплением, но приведенный выше алгоритм градиента политик Монте-Карло не идеален. Поскольку для получения данных используется выборка MC, нам нужно дождаться конца каждого эпизода, чтобы выполнить итерацию алгоритма.Поскольку MC относительно медленный, можем ли мы использовать TD? Конечно, это возможно, что и представляет собой алгоритм Актера-Критика, который мы представим в следующей статье.