这个问题来自于在TensorFlow上观看以下视频和从Google /O 18中强化学习:https://www.youtube.com/watch?v=t1A3NTttvBA
在这里,他们训练一个非常简单的RL算法来玩Pong游戏。
在他们使用的幻灯片中,损失的定义如下(约@11m25s ):
loss = -R(sampled_actions * log(action_probabilities))此外,它们还显示了以下代码(约@20m26s):
# loss
cross_entropies = tf.losses.softmax_cross_entropy(
onehot_labels=tf.one_hot(actions, 3), logits=Ylogits)
loss = tf.reduce_sum(rewards * cross_entropies)
# training operation
optimizer = tf.train.RMSPropOptimizer(learning_rate=0.001, decay=0.99)
train_op = optimizer.minimize(loss)现在我的问题是,他们用+1表示赢,用-1作为奖励。在提供的代码中,任何交叉熵损失乘以负回报都会非常低?如果训练操作是使用优化器来最小化损失,那么算法是否会被训练成失败呢?
或者说,我缺少一些基本的东西(可能是因为我的数学技能非常有限)?
发布于 2018-12-05 18:28:18
问得好科里。我也想知道这个在RL中流行的损失函数到底意味着什么。我已经看到了许多实现,但许多相互矛盾。据我理解,这意味着:
损失=- log(pi) *A
其中A是相对于基线情况的优势。在Google的例子中,他们使用了0的基线,所以A= R,这乘以那个特定时间的特定动作,所以在上面的例子中,动作被编码为1,0,0。我们将忽略0,只取1,因此我们得到了上面的方程。
如果你凭直觉计算这个负报酬的损失:
损失=- (-1) *日志(P)
但如果P小于1,则该值的对数将为负值。因此,你有一个负损失,可以被解释为“非常好”,但真的没有意义。
正确的方式:
但是在我看来,请别人纠正我,如果我错了,你不能直接计算损失。取损失的梯度。也就是说,你取-log(pi)*A的导数。
因此,你应该:
-(d(pi) / pi) *A
现在,如果你有一个巨大的负面回报,它将转化为一个非常大的损失。
我希望这是合理的。
https://stackoverflow.com/questions/53613722
复制相似问题