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

#python #reinforcement-learning #reward

#python #обучение с подкреплением #награда

Вопрос:

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

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

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

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

     def replay(self, batch_size):
        minibatch = random.sample(self.memory, batch_size)

        for state, action, reward, next_state, done in minibatch:
            target = reward
            if not done:
                target = reward   self.gamma * np.amax(self.model.predict(next_state))
            target_f = self.model.predict(state)
            target_f[0][action] = target

            self.model.fit(state, target_f, epochs=1, verbose=0)

        if self.epsilon > self.epsilon_min:
            self.epsilon *= self.epsilon_decay
  

Ответ №1:

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

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

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

Итак, это решается с помощью вознаграждений со скидкой. Цель агента модифицируется таким образом, чтобы максимизировать не сумму вознаграждений, а немедленное вознаграждение плюс 0,9-кратное следующему вознаграждению, плюс 0,9 * 0,9-кратное следующему и т. Д. Таким образом, вознаграждение со скидкой после миллиона временных шагов, при всех практических средствах, не имеет отношения к текущему решению агента. Это не имеет никакого отношения к началу или концу эпизода. Скидка на вознаграждение всегда начинается с текущего состояния.

Эта строка, на которую вы смотрите:

 target = reward   self.gamma * np.amax(self.model.predict(next_state))
  

вычисляет лучшую оценку значения действия. Это стандартная формула учебника (см., Например, «Обучение с подкреплением» Саттона и Барто). Он использует сам предиктор (который все еще обучается) для оценки стоимости (суммы дисконтированных вознаграждений) действий, которые будут позже в будущем, со скидкой на один временной шаг с помощью gamma.

Комментарии:

1. Привет. Спасибо за объяснение. Я действительно хочу понять, что при написании градиента политики, почему мы всегда меняем список вознаграждений, а затем вычисляем дисконтированную сумму вознаграждения. Можете ли вы это объяснить?