【问题标题】:Loss function for simple Reinforcement Learning algorithm简单强化学习算法的损失函数
【发布时间】:2018-12-04 13:08:23
【问题描述】:

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

他们在这里训练了一个非常简单的强化学习算法来玩乒乓球游戏。

在他们使用的幻灯片中,损失是这样定义的(大约 @ 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 表示失败作为奖励。在提供的代码中,任何乘以负奖励的交叉熵损失都会非常低?如果训练操作是使用优化器来最小化损失,那么算法被训练为损失?

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

【问题讨论】:

    标签: python tensorflow reinforcement-learning


    【解决方案1】:

    很好的问题科里。我也想知道 RL 中这种流行的损失函数到底意味着什么。我见过很多它的实现,但很多都是相互矛盾的。根据我的理解,这意味着:

    损失 = - log(pi) * A

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

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

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

    但是对于任何小于 1 的 P,该值的 log 将为负数。因此,您有一个负损失,可以解释为“非常好”,但实际上没有物理意义。

    正确方法:

    但是在我看来,如果我错了还请其他人纠正我,你不直接计算损失。您采用损失的梯度。也就是说,你取 -log(pi)*A 的导数。

    因此,你会:

    -(d(pi) / pi) * A

    现在,如果你有一个很大的负奖励,它会转化为一个非常大的损失。

    我希望这是有道理的。

    【讨论】:

    • 啊,我想我明白了。但这是否意味着我应该使用 log(P) 而不是像在代码中那样计算交叉熵损失?还是两者会达到同样的效果?
    • 嗨科维。在任何机器学习算法中,模型都是通过计算损失梯度来识别最高下降斜率来训练的。所以你使用视频中的交叉熵损失,当你训练模型时,它会评估损失函数的导数,而不是明确地评估损失函数。我没有看视频,但我认为他们有一行代码,比如“optimizer = tf.train.GradientDescentOptimizer”。这条线是要计算什么样的梯度。然后他们会使用“optimizer.minimize(loss)”。这是 2 个命令:“计算渐变”和“应用渐变”
    • 所以在 optimizer.minimize(loss) 中,tensorflow 计算相对于损失函数的梯度,然后通过优化器规定的梯度下降方法将梯度应用于模型的权重。交叉熵损失从未真正明确计算过。
    猜你喜欢
    • 2018-03-22
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    相关资源
    最近更新 更多