规范化奖励以在强化学习中生成 Returns
Normalizing Rewards to Generate Returns in reinforcement learning
问题是关于普通的,非批处理强化学习。基本上定义了什么here in Sutton's book。
我的模型训练,(哇哦!)尽管有一个元素让我感到困惑。
背景:
在奖励持续时间的环境中(例如平衡杆),我们每步获得(比如说)1 的奖励。在一集之后,在将这个 1 数组发送到训练步骤之前,我们进行标准折扣和归一化以获得 returns:
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] 变成了 returns [1.539, 1.160, 0.777, 0.392, 0.006, - 0.382,-0.773,-1.164,-1.556]。
鉴于基本背景,我可以提出我的问题:
如果积极的 returns 被强制执行,而消极的 returns 被阻止(在优化步骤中),那么无论剧集的长度如何,大约前半部分的动作都会被鼓励,后半部分会气馁。是真的吗,还是我误会了什么?
如果它 NOT 是真的,很想知道我错了什么。
如果是真,那么我不明白为什么模型会训练,因为即使是一个表现良好的剧集,其后半部分的动作也会受到阻碍。
重申一下,这是非批量学习(因此 returns 而不是 相对于训练步骤中另一集中的 returns。在每一集之后,模型都会训练,并且再次训练得很好:)
希望这是有道理的,并且足够短,让人觉得这是一个非常明确的问题。
背景
- 是,正面奖励优于负面奖励
- 没有,正面奖励不好绝对规模
- 没有,负面奖励在绝对规模上还不错
如果您增加或减少所有奖励(好的和坏的)均等,什么都不会改变 真的。
优化器 试图最小化损失(最大化奖励),这意味着它只对值之间的 delta 感兴趣(梯度),不是它们的绝对值或符号。
强化学习
假设您的图表看起来像这样:
...
logits = tf.nn.softmax(...)
labels = tf.one_hot(q_actions, n_actions)
loss = tf.losses.softmax_cross_entropy(labels, logits, weights=q_rewards)
个人 "classes" 的损失按 weights
计算,在本例中为 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
但这并不是一件坏事。只是你的损失也是(或多或少)"normalized"。但无论如何,网络都会通过查看每个训练步骤的梯度来不断改进。
分类问题通常有一个 "global" 损失,随着时间的推移不断下降。一些优化器保留梯度的历史记录以适应学习率(有效地缩放梯度),这意味着在内部,它们也有点 "normalize" 梯度,因此不关心我们是否这样做。
如果你想了解更多关于幕后渐变缩放的知识,我建议你看看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 :)
批量越大,奖励分布越稳定,归一化就越可靠。您甚至可以将多个剧集中的奖励标准化。
在我看来,接受的答案是错误的。
我读了它,我认为它是合理的,然后我不再担心梯度归一化并检查了其他东西。很久以后我才注意到正是梯度归一化破坏了我的训练过程。
首先,“奖励归一化不会混淆梯度的符号”是完全错误的。
returns = (returns - np.mean(returns)) / (np.std(returns) + 1e-10)
显然,如果减去均值,就会翻转一些符号。所以是的,奖励归一化确实会影响梯度的符号。
其次,tf.losses.softmax_cross_entropy
用日常用语来说,就是衡量 AI 在选择它所做的事情时有多少可能的选择。 Select 10 个动作中有 1 个是随机的?你的交叉熵非常高。总是 select 完全相同的项目?你的交叉熵很低,因为如果你在统计上从不选择其他选择,那么其他选择就无关紧要了。
与此相符,什么
loss[i] = -q_rewards[i] * tf.log( tf.nn.softmax( logits[i] ) )
实际是这样的:
如果你的奖励是正的,它会最小化交叉熵,这意味着它会增加人工智能在未来看到类似情况时再次采取完全相同的行动的机会。
如果你的奖励是负数,它会最大化交叉熵,这意味着它会让 AI 在以后看到类似情况时更随机地选择。
这就是奖励归一化的目的:是的,在归一化之后,你轨迹中的一半项目有正号,另一半有负号。你基本上是在说:做更多这些有效的事情,尝试一些随机的事情。
这会导致非常可行的建议:
如果您的模型表现得太随机,请确保您有足够的积极奖励(标准化后)。
如果你的模型总是做同样的事情而不是探索,请确保你有足够的负奖励(归一化后)。
问题是关于普通的,非批处理强化学习。基本上定义了什么here in Sutton's book。 我的模型训练,(哇哦!)尽管有一个元素让我感到困惑。
背景:
在奖励持续时间的环境中(例如平衡杆),我们每步获得(比如说)1 的奖励。在一集之后,在将这个 1 数组发送到训练步骤之前,我们进行标准折扣和归一化以获得 returns:
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] 变成了 returns [1.539, 1.160, 0.777, 0.392, 0.006, - 0.382,-0.773,-1.164,-1.556]。
鉴于基本背景,我可以提出我的问题:
如果积极的 returns 被强制执行,而消极的 returns 被阻止(在优化步骤中),那么无论剧集的长度如何,大约前半部分的动作都会被鼓励,后半部分会气馁。是真的吗,还是我误会了什么?
如果它 NOT 是真的,很想知道我错了什么。
如果是真,那么我不明白为什么模型会训练,因为即使是一个表现良好的剧集,其后半部分的动作也会受到阻碍。
重申一下,这是非批量学习(因此 returns 而不是 相对于训练步骤中另一集中的 returns。在每一集之后,模型都会训练,并且再次训练得很好:)
希望这是有道理的,并且足够短,让人觉得这是一个非常明确的问题。
背景
- 是,正面奖励优于负面奖励
- 没有,正面奖励不好绝对规模
- 没有,负面奖励在绝对规模上还不错
如果您增加或减少所有奖励(好的和坏的)均等,什么都不会改变 真的。
优化器 试图最小化损失(最大化奖励),这意味着它只对值之间的 delta 感兴趣(梯度),不是它们的绝对值或符号。
强化学习
假设您的图表看起来像这样:
...
logits = tf.nn.softmax(...)
labels = tf.one_hot(q_actions, n_actions)
loss = tf.losses.softmax_cross_entropy(labels, logits, weights=q_rewards)
个人 "classes" 的损失按 weights
计算,在本例中为 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
但这并不是一件坏事。只是你的损失也是(或多或少)"normalized"。但无论如何,网络都会通过查看每个训练步骤的梯度来不断改进。
分类问题通常有一个 "global" 损失,随着时间的推移不断下降。一些优化器保留梯度的历史记录以适应学习率(有效地缩放梯度),这意味着在内部,它们也有点 "normalize" 梯度,因此不关心我们是否这样做。
如果你想了解更多关于幕后渐变缩放的知识,我建议你看看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 :)
批量越大,奖励分布越稳定,归一化就越可靠。您甚至可以将多个剧集中的奖励标准化。
在我看来,接受的答案是错误的。 我读了它,我认为它是合理的,然后我不再担心梯度归一化并检查了其他东西。很久以后我才注意到正是梯度归一化破坏了我的训练过程。
首先,“奖励归一化不会混淆梯度的符号”是完全错误的。
returns = (returns - np.mean(returns)) / (np.std(returns) + 1e-10)
显然,如果减去均值,就会翻转一些符号。所以是的,奖励归一化确实会影响梯度的符号。
其次,tf.losses.softmax_cross_entropy
用日常用语来说,就是衡量 AI 在选择它所做的事情时有多少可能的选择。 Select 10 个动作中有 1 个是随机的?你的交叉熵非常高。总是 select 完全相同的项目?你的交叉熵很低,因为如果你在统计上从不选择其他选择,那么其他选择就无关紧要了。
与此相符,什么
loss[i] = -q_rewards[i] * tf.log( tf.nn.softmax( logits[i] ) )
实际是这样的:
如果你的奖励是正的,它会最小化交叉熵,这意味着它会增加人工智能在未来看到类似情况时再次采取完全相同的行动的机会。
如果你的奖励是负数,它会最大化交叉熵,这意味着它会让 AI 在以后看到类似情况时更随机地选择。
这就是奖励归一化的目的:是的,在归一化之后,你轨迹中的一半项目有正号,另一半有负号。你基本上是在说:做更多这些有效的事情,尝试一些随机的事情。
这会导致非常可行的建议: 如果您的模型表现得太随机,请确保您有足够的积极奖励(标准化后)。 如果你的模型总是做同样的事情而不是探索,请确保你有足够的负奖励(归一化后)。