Дисконтированные награды в базовом обучении подкреплению - PullRequest
1 голос
/ 21 апреля 2019

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

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

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

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

    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 голосов
/ 21 апреля 2019

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

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

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

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

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

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

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

...