问题是关于普通的 非批处理 强化学习。 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/