简单强化学习算法的损失函数

Loss function for simple Reinforcement Learning algorithm

这个问题来自观看以下关于 TensorFlow 和强化学习的视频,来自 Google I/O 18:https://www.youtube.com/watch?v=t1A3NTttvBA

他们在这里训练了一个非常简单的 RL 算法来玩 Pong 游戏。

在他们使用的幻灯片中,损失是这样定义的(大约@11m 25s):

loss = -R(sampled_actions * log(action_probabilities))

此外,他们还显示了以下代码(大约 @ 20m 26s):

# 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 表示失败作为奖励。在提供的代码中,任何乘以负奖励的交叉熵损失都会非常低?如果训练操作是使用优化器来最小化损失,那么算法被训练成损失?

或者我缺少一些基本知识(可能是因为我的数学技能非常有限)

科里问得好。我也想知道 RL 中这个流行的损失函数究竟意味着什么。我见过它的许多实现,但许多相互矛盾。据我理解,这意味着:

损失 = - log(pi) * A

其中 A 是与基准案例相比的优势。在 Google 的情况下,他们使用基线 0,因此 A = R。这是乘以那个特定时间的特定动作,所以在你上面的例子中,动作被热编码为 [1, 0 , 0].我们将忽略 0,只取 1。因此我们有上面的等式。

如果你凭直觉计算这个损失为负奖励:

损失 = - (-1) * log(P)

但对于任何小于 1 的 P,该值的对数将为负。因此,你有一个负损失,可以解释为 "very good",但实际上没有物理意义。

正确的做法:

不过在我看来,如有错误请大家指正,大家不要直接计算损失。你取损失的梯度。也就是说,您采用 -log(pi)*A.

的导数

因此,您将拥有:

-(d(pi) / pi) * A

现在,如果你有很大的负奖励,就会转化为很大的损失。

我希望这是有道理的。