kei*_*uld 4 python machine-learning reinforcement-learning tensorflow
问题是关于普通的非批量强化学习。基本上是被定义在这里在萨顿的书。我的模型训练,(呜呜!)虽然有一个元素让我感到困惑。
背景:
在持续时间得到奖励的环境中(如极点平衡),我们每一步有(比如)1 个奖励。在一集之后,在将这个 1 数组发送到训练步骤之前,我们进行标准折扣和标准化以获得回报:
returns = self.discount_rewards(rewards)
returns = (returns - np.mean(returns)) / (np.std(returns) + 1e-10) // usual normalization
Run Code Online (Sandbox Code Playgroud)
折扣奖励是常用的方法,但如果好奇,这里是要点。
所以奖励数组 [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]。
鉴于基本背景,我可以问我的问题:
如果强制执行正回报,不鼓励负回报(在优化步骤中),那么无论情节的长度如何,大约前半部分的行动将被鼓励,后半部分将被阻止。这是真的,还是我误解了什么?
如果它不是真的,很想了解我做错了什么。
如果这是真的,那么我不明白为什么模型会训练,因为即使是表现良好的剧集也会阻止其后半部分的动作。
重申一下,这是非批量学习(因此回报与训练步骤中另一个情节的回报无关)。每一集之后,模型都会训练,而且训练得很好:)
希望这是有道理的,并且足够短,感觉像是一个适当的明确问题。
And*_*bin 11
背景
如果你同等地增加或减少所有的奖励(好的和坏的),什么都不会改变。
该优化试图把损失降到最低(最大化回报),这意味着它的只关心在增量值(之间的梯度),而不是他们的绝对价值或标志。
强化学习
假设您的图表如下所示:
...
logits = tf.nn.softmax(...)
labels = tf.one_hot(q_actions, n_actions)
loss = tf.losses.softmax_cross_entropy(labels, logits, weights=q_rewards)
Run Code Online (Sandbox Code Playgroud)
单个“类”的损失按比例缩放weights,在这种情况下是q_rewards:
loss[i] = -q_rewards[i] * tf.log( tf.nn.softmax( logits[i] ) )
Run Code Online (Sandbox Code Playgroud)
损失是奖励的线性函数,梯度在线性变换下保持单调。
奖励规范化
当代理表现很差时,它收到的坏奖励比好的奖励多得多。归一化使好的奖励(赋予更多权重)的梯度更陡峭,而(赋予更少权重)不良奖励的梯度更小。
当代理表现相当好时,情况正好相反。
你的问题
如果强制执行正回报,并且不鼓励负回报(在优化步骤中)......
它不是符号(绝对值)而是增量(相对值)。
……那么不管情节的长短,大致上前半部分是鼓励的,后半部分是不鼓励的。
如果有更高或更低的奖励值,那么你有一个较小的一半具有更陡峭的梯度(更多的权重)和更大的一半具有更浅的梯度(更少的权重)。
如果这是真的,那么我不明白为什么模型会训练,因为即使是表现良好的剧集也会阻止其后半部分的动作。
您的损失值实际上预计会在某个时候保持不变。因此,您必须通过运行程序并查看(非标准化)奖励来衡量您的进度。
作为参考,请参阅 Google IO 的示例网络:
github.com/GoogleCloudPlatform/tensorflow-without-a-phd/.../tensorflow-rl-pong/...并搜索_rollout_reward
然而,这并不是一件坏事。只是您的损失也(或多或少)“标准化”了。但无论如何,网络都会通过查看每个训练步骤的梯度来不断改进。
分类问题通常有一个“全局”损失,随着时间的推移不断下降。一些优化器保留梯度的历史以适应学习率(有效地缩放梯度),这意味着在内部,它们也有点“标准化”梯度,因此不关心我们是否这样做。
如果您想了解更多有关幕后梯度缩放的信息,我建议您查看ruder.io/optimizing-gradient-descent
重申一下,这是非批量学习(因此回报与训练步骤中另一个情节的回报无关)。每一集之后,模型都会训练,而且训练得很好:)
批量越大,奖励分配越稳定,标准化越可靠。您甚至可以将多个剧集中的奖励标准化。
在我看来,接受的答案是错误的。 我读了它,我认为这是合理的,然后我不再担心梯度归一化并检查了其他东西。直到很久以后我才注意到,正是梯度归一化破坏了我的训练过程。
首先,“奖励标准化不会扰乱梯度的符号”是完全错误的。
returns = (returns - np.mean(returns)) / (np.std(returns) + 1e-10)
Run Code Online (Sandbox Code Playgroud)
显然,如果减去平均值,就会翻转一些迹象。所以是的,奖励标准化确实会影响梯度的符号。
其次,tf.losses.softmax_cross_entropy用日常用语来说,就是衡量人工智能在选择自己的行为时有多少种可能的选择。随机选择 10 个动作中的 1 个?你的交叉熵非常高。总是选择完全相同的项目?你的交叉熵很低,因为如果你在统计上从不采取其他选择,那么其他选择就无关紧要。
与此相符,什么
loss[i] = -q_rewards[i] * tf.log( tf.nn.softmax( logits[i] ) )
Run Code Online (Sandbox Code Playgroud)
实际上是这样的:
如果你的奖励是正的,它将最大限度地减少交叉熵,这意味着它将增加人工智能在未来看到类似情况时再次采取完全相同行动的机会。
如果你的奖励是负的,它将最大化交叉熵,这意味着它会让人工智能在未来看到类似情况时更加随机地选择。
这就是奖励标准化的目的:是的,标准化后,轨迹中的一半项目具有正号,另一半具有负号。你基本上想说的是:多做一些有效的事情,随机尝试一些事情。
这带来了非常可行的建议:如果你的模型表现得太随机,请确保你有足够的积极奖励(标准化后)。如果你的模型总是做同样的事情而不是探索,请确保你有足够的负奖励(标准化后)。
| 归档时间: |
|
| 查看次数: |
6225 次 |
| 最近记录: |