问题是关于vanilla,非批量强化学习。基本上是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]。
鉴于基本背景,我可以提出我的问题:
如果强制执行肯定回报,并且不鼓励负回报(在优化步骤中),那么无论事件的长度如何,都会鼓励大致上半部分的行动,而不鼓励后半部分。是真的,还是我误解了什么?
如果 NOT 为真,我很乐意了解我的错误。
如果它 IS 是真的,那么我就不明白为什么这个模型会进行训练,因为即使是一部表现良好的剧集也会让后半部分的行动失望。
重申一下,这是非批量学习(因此相对于训练步骤中另一集中的回报,返回不)。在每一集之后,模型训练,再次,它训练良好:)
希望这是有道理的,并且足够短,感觉像是一个正确的明确问题。
答案 0 :(得分:2)
<强>背景强>
如果您增加或减少所有奖励(好的和坏的),没有任何改变。
优化器会尽量减少损失(最大化奖励),这意味着它只对值之间的 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] ) )
损失是奖励的线性函数,梯度在线性变换下保持单调。
奖励规范化
当代理人的表现相当糟糕时,它会获得比奖励更多的不良奖励。归一化使得梯度更陡峭(更多地重视)良好的奖励,而且较差的(减轻重量)不良奖励。
当代理人表现相当好时,反过来就是另一种方式。
您的问题
如果强制执行正回报,则不鼓励否定回报(在优化步骤中)......
这不是符号(绝对值),而是delta(相对值)。
......那么无论剧集的长度如何,大约会鼓励上半部分行动,而后半部分则会受到劝阻。
如果有更高或更低的奖励值,那么你有一个更小的一半,更陡的梯度(更多的重量)和一个更大的一半,更浅的梯度(更少的重量)。
如果它 IS 是真的,那么我不明白为什么这个模型会训练,因为即使是表现良好的一集也不会让后半部分的行动失望。
实际上,您的损失值预计会在某个时刻保持不变。因此,您必须通过运行程序并查看(未规范化的)奖励来衡量您的进度。
供参考,请参阅Google IO中的示例网络:
github.com/GoogleCloudPlatform/tensorflow-without-a-phd/.../tensorflow-rl-pong/...并搜索_rollout_reward
然而,这不是一件坏事。这只是你的损失(或多或少)“正常化”。但是,通过在每个训练步骤中查看梯度,网络仍在不断改进。
分类问题通常会产生“全局”损失,并且随着时间的推移会不断下降。一些优化器保留梯度的历史以适应学习速率(有效地缩放梯度),这意味着在内部,它们也有点“标准化”梯度,因此如果我们做任何一个也不关心。
如果您想了解有关幕后渐变缩放的更多信息,建议您查看ruder.io/optimizing-gradient-descent
重申一下,这是非批量学习(因此相对于训练步骤中另一集中的回报,返回不)。在每一集之后,模型训练,再次,它训练良好:)
批量大小越大,奖励分配越稳定,规范化越可靠。您甚至可以在多集中规范化奖励。