Tensorflow 损失策略梯度-强化学习

Tensorflow 损失策略梯度-强化学习,tensorflow,reinforcement-learning,policy-gradient-descent,Tensorflow,Reinforcement Learning,Policy Gradient Descent,我正在使用保单梯度对我的网络进行培训,并将损失定义为: self.loss = -tf.reduce_mean(tf.log(OUTPUT_NN)* self.REWARDS)) self.opt = tf.train.AdamOptimizer(self.lr).minimize(self.loss) 我不明白的是,损失函数有时是正的,有时是负的。我不明白信号中的这个翻转。对我来说,它应该总是负数,因为我在tf前面有负数 例如: Train-> Reward: 0.257782, H

我正在使用保单梯度对我的网络进行培训,并将损失定义为:

self.loss =  -tf.reduce_mean(tf.log(OUTPUT_NN)* self.REWARDS))
self.opt = tf.train.AdamOptimizer(self.lr).minimize(self.loss)
我不明白的是,损失函数有时是正的,有时是负的。我不明白信号中的这个翻转。对我来说,它应该总是负数,因为我在tf前面有负数

例如:

Train-> Reward: 0.257782, Hit Ration: 0.500564, True Positive: 0.433404, True Negative: 0.578182, loss: 6.698527 
Train-> Reward: 0.257782, Hit Ration: 0.500564, True Positive: 0.433404, True Negative: 0.578182, loss: -11.804675
这是可能的,还是我的代码有问题


谢谢。

不用太多细节,您需要计算方程的梯度:

其中是在时间t采取的行动,是在时间t的状态,是折扣奖励还是不折扣给你

所以在时间t,你们知道动作,你们可以表示为一个热编码向量,对吗?现在,如果你看一下你损失的第一项:

这实际上是一个对数似然或交叉熵。所以你的方程应该是这样的:

self.loss = -tf.reduce_mean(tf.multiply(tf.nn.softmax_cross_entropy_with_logits_v2(labels=ONE_HOT_ACTIONS, logits=OUTPUT_NN),REWARDS))
self.opt = tf.train.AdamOptimizer(self.lr).minimize(self.loss)

嗨@asakryukin,谢谢你的回答。我有个问题。当你说时间t的动作时,我知道,你在标签的交叉熵中使用它们。问题是我在训练中没有标签,我没有很好地理解这一点。你能给我解释一下吗?非常感谢。@AlexGomes这些标签是您的一个热编码操作和登录-您网络的输出。假设您有可能的操作左0右1。所以对于一些状态s,您向左走,您的净输出是[0.9,0.1]->交叉熵[[1,0]]和logits[[0.9,0.1]]的标签,谢谢!我得到了它。我在这里试试。还有一个问题。没有交叉熵,还有别的方法吗@asakryukin@AlexGomes不适用于政策梯度。你可以使用Q-学习算法,在那里你不需要它。