Награды, нормализующие в обучении подкрепления - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть 20 копий среды , которая получает вознаграждение 0,1 при достижении цели и 0 в противном случае.

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

Обычно я нормализуюсь, выполняя:

discounted_rewards = torch.zeros_like(rewards, dtype=torch.float32, device=device)
for t in reversed(range(len(rewards))):
    running_add = rewards[t] + discount * running_add
    discounted_rewards[t] = running_add

mean = discounted_rewards.mean(0, keepdim=True)
std = discounted_rewards.std(0, keepdim=True) + 1e-10
discounted_rewards = (discounted_rewards - mean) / std

Однако, когда я выполнял задание, я нормализовал среднее значение по средам, а не по временным шагам.то есть

mean = discounted_rewards.mean(1, keepdim=True)
std = discounted_rewards.std(1, keepdim=True) + 1e-10
discounted_rewards = (discounted_rewards - mean) / std

, и это, кажется, тренируется быстрее.Использовал PPO, если это поможет.

Итак, мои вопросы:

  1. Каким образом вы должны нормализоваться?
  2. Я прочитал это ТАК сообщение , в котором упоминается, что нормализация «не связывается со знаком градиента».Однако, если вознаграждение меньше среднего, оно меняет знак градиента, не так ли?
  3. (необязательно), почему нормализация вообще работает?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...