问题是关于普通的 非批处理 强化学习。 here 中定义的基本上是 Sutton's book
我的模型训练,(呜呜!)虽然有一个元素让我感到困惑。

背景:

在持续时间得到奖励的环境中(例如极点平衡),我们每一步有(比如)1 个奖励。在一集之后,在将这个 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]。

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

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

如果它的 不是 是真的,我很想知道我做错了什么。

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

重申一下,这是非批量学习(因此相对于训练步骤中另一个情节的返回,返回是 而不是 )。每一集之后,模型都会训练,而且训练得很好:)

希望这是有道理的,并且足够短,感觉像是一个适当的明确问题。

最佳答案

背景

  • 是的 ,正奖励比 好 负奖励
  • 没有 ,积极的奖励是 不好 在绝对规模上
  • 没有 ,负奖励是 不错 在绝对规模上

  • 如果您 增加 减少 所有奖励(好的和坏的)均等, 没有真正改变

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

    强化学习

    假设您的图表如下所示:
    ...
    logits = tf.nn.softmax(...)
    labels = tf.one_hot(q_actions, n_actions)
    loss = tf.losses.softmax_cross_entropy(labels, logits, weights=q_rewards)
    

    单个“类”的损失由 weights 缩放,在这种情况下是 q_rewards :
    loss[i] = -q_rewards[i] * tf.log( tf.nn.softmax( logits[i] ) )
    

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

    奖励标准化
  • 不会与梯度
  • 符号 混淆
  • 使梯度 更陡峭 奖励远离平均值
  • 使梯度 变浅 以获得接近均值的奖励

  • 当代理表现很差时,它收到的坏奖励比好的奖励多得多。归一化使好的奖励(赋予更多权重)的梯度更陡峭,而(赋予更少权重)不良奖励的梯度更小。

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

    您的问题



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



    如果有更高或更低的奖励值,那么你有一个较小的一半具有更陡峭的梯度(更多的权重)和更大的一半具有更浅的梯度(更少的权重)。



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

    作为引用,请参阅 Google IO 的示例网络:
    github.com/GoogleCloudPlatform/tensorflow-without-a-phd/.../tensorflow-rl-pong/... 并搜索 _rollout_reward
    然而,这并不是一件坏事。只是您的损失也(或多或少)“标准化”了。但无论如何,网络都会通过查看每个训练步骤的梯度来不断改进。

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

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



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

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

    10-12 19:29