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

时间:2018-12-04 13:08:24

标签: python tensorflow reinforcement-learning

该问题来自观看以下有关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来输。在提供的代码中,乘以负奖励的交叉熵损失会非常低吗?而且,如果训练操作正在使用优化程序来使损失最小化,那么算法就被训练为损失了吗?

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

1 个答案:

答案 0 :(得分:2)

很好的问题,科里。我还想知道RL中这种流行的损失函数实际上意味着什么。我已经看到了很多实现,但是很多彼此矛盾。据我了解,这意味着:

损失=-log(pi)* A

与基线情况相比,A是优势。在Google的情况下,他们使用的基线为0,因此A =R。在该特定时间乘以该特定操作,因此在您的上述示例中,操作被一个热编码为[1、0、0]。我们将忽略0,而只取1。因此,我们具有上述等式。

如果您凭直觉计算此损失以获得负奖励:

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

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

正确的方法:

但是,我认为,如果我错了,请他人纠正我,您不会直接计算损失。您采用损失的 梯度 。也就是说,您采用-log(pi)* A的导数。

因此,您将:

-(d(pi)/ pi)* A

现在,如果您获得较大的负奖励,它将转化为非常大的损失。

我希望这是有道理的。