У меня есть 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, если это поможет.
Итак, мои вопросы:
- Каким образом вы должны нормализоваться?
- Я прочитал это ТАК сообщение , в котором упоминается, что нормализация «не связывается со знаком градиента».Однако, если вознаграждение меньше среднего, оно меняет знак градиента, не так ли?
- (необязательно), почему нормализация вообще работает?