python - 在强化学习中标准化奖励以产生返回

标签 python tensorflow machine-learning reinforcement-learning

问题是关于普通的、非批量强化学习。基本上定义了什么hereSutton's book 。 我的模型训练,(哇哦!)尽管有一个元素让我感到困惑。

背景:

在持续时间有奖励的环境中(例如杆平衡),我们每步奖励(例如)1。在一个episode之后,在将这个1的数组发送到训练步骤之前,我们进行标准折扣和标准化以获得返回:

returns = self.discount_rewards(rewards)
returns = (returns - np.mean(returns)) / (np.std(returns) + 1e-10) // usual normalization

discount_rewards是通常的方法,但是here is gist如果好奇的话。

因此,奖励数组 [1,1,1,1,1,1,1,1,1] 变成返回数组 [1.539, 1.160, 0.777, 0.392, 0.006, -0.382, -0.773, - 1.164,-1.556]。

鉴于基本背景,我可以提出我的问题:

如果强制执行正返回,不鼓励负返回(在优化步骤中),那么无论剧集长度如何,大致前半部分的操作都会受到鼓励,而后半部分则会受到抑制。这是真的吗,还是我误解了什么?

如果它属实,很想了解我做错了什么。

如果它为真,那么我不明白为什么模型会训练,因为即使是表现良好的剧集也会阻止其后半部分的行为。

重申一下,这是非批量学习(因此返回与训练步骤中另一集的返回相关)。每集之后,模型都会进行训练,并且训练得很好:)

希望这是有道理的,并且足够短,让人感觉这是一个适当清晰的问题。

最佳答案

背景

  • 是的,积极奖励优于消极奖励
  • ,从绝对意义上来说,积极的奖励不好
  • ,从绝对意义上来说,负面奖励不错

如果您平等地增加减少所有奖励(好的和坏的),实际上什么都不会改变

优化器尝试最小化损失(最大化奖励),这意味着它只对值之间的增量感兴趣(梯度 ),而不是它们的绝对值或符号。

强化学习

假设您的图表如下所示:

...
logits = tf.nn.softmax(...)
labels = tf.one_hot(q_actions, n_actions)
loss = tf.losses.softmax_cross_entropy(labels, logits, weights=q_rewards)

各个“类别”的损失按权重缩放,在本例中为q_rewards:

loss[i] = -q_rewards[i] * tf.log( tf.nn.softmax( logits[i] ) )

损失是奖励的线性函数,线性变换下梯度保持单调。

奖励标准化

  • 不会干扰渐变的符号
  • 使奖励的梯度更陡远离平均值
  • 使奖励的梯度更浅接近平均值

当智能体表现相当糟糕时,它会收到比好的奖励更多的坏奖励。归一化使得好的奖励的梯度更陡(权重更大),而坏的奖励的梯度更浅(权重更小)。

当代理表现相当好时,情况正好相反。

您的问题

If positive returns are enforced, and negative returns are discouraged (in the optimize step) ...

这不是符号(绝对值),而是增量(相对值)。

... then no matter the length of the episode, roughly the first half of the actions will be encouraged, and the latter half will be discouraged.

如果奖励值更高或更低,则较小的一半具有较陡的梯度(较大的权重),较大的一半具有较浅的梯度(较小的权重)。

If it IS true, then I don't understand why the model trains, since even a good-performing episode will have the latter half of its actions discouraged.

您的损失值实际上预计在某个时刻保持不变。因此,您必须通过运行程序并查看(非标准化)奖励来衡量您的进度。

作为引用,请参阅 Google IO 的示例网络: github.com/GoogleCloudPlatform/tensorflow-without-a-phd/.../tensorflow-rl-pong/...并搜索_rollout_reward

不过,这并不是一件坏事。只是你的损失(或多或少)也被“正常化”了。但无论如何,网络都会通过查看每个训练步骤的梯度来不断改进。

分类问题通常具有“全局”损失,并且随着时间的推移不断下降。一些优化器保留梯度的历史记录以适应学习率(有效地缩放梯度),这意味着在内部,它们也对梯度进行“标准化”,因此不关心我们是否这样做。

如果您想了解有关幕后梯度缩放的更多信息,我建议您查看 ruder.io/optimizing-gradient-descent

To reiterate, this is non-batched learning (so the returns are not relative to returns in another episode in the training step). After each episode, the model trains, and again, it trains well :)

批量越大,奖励分配越稳定,标准化越可靠。您甚至可以标准化多个剧集的奖励。

关于python - 在强化学习中标准化奖励以产生返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49801638/

相关文章:

python - 连接云存储和云功能

python - Pandas 在这里做什么,我的索引 [0] 和 [1] 引用相同的值?

python - XGBoost plot_importance 不显示特征名称

python - 如何保持导入轻量级并且仍然正确键入注释?

tensorflow - 选择tensorflow对象检测API训练超参数

python - 与 CNN 交叉验证

algorithm - KNN 算法中需要归一化

python - 如何在不同步的情况下通过 p4python 读取 depot 的文件夹结构?

Python:为什么 while 循环排除第一个值?

python - 如何在 Keras 的数据上应用(调用)单层?