本文主要是介绍Nn criterions don’t compute the gradient w.r.t. targets error「pytorch」 (debug笔记),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Nn criterions don’t compute the gradient w.r.t. targets error
「pytorch」
##一、 缘由及解决方法
把这个pytorch-ddpg|github搬到jupyter notebook上运行时,出现错误Nn criterions don’t compute the gradient w.r.t. targets error
。注:我用的评价准则函数为nn.MSELoss(evalute, target)
。所以给出的错误提示是:在该准则函数不计算目标值(期望值,也称为target , label)的梯度。这说明,当前的程序中target的tensor Variable的属性requires_grad=True(可以打印出来验证一下)。
问题解决方法
:将target的requires_grad属性变为False,也即不需要求梯度。此处不能直接requires_grad=False。正确的做法是在criterions(evalute, target)
之前调用target.detach()
或target.detach_()
函数。这样程序就不会出现这个错误了。
解释:在我遇到问题的程序中,target值是由要更新参数的网络前向计算出来的(例如,Q-learning里的Q值的更新),而不是普通的给定的label(例如,有监督学习的标签值)。此时的target是tensor的Variable,属性requires_grad=True,也即由计算图输出的变量都是需要求梯度的。我们利用detach_()或detach()函数是将target从整个计算图中分离出来。从而使target的属性恢复requires_grad=False。
二、下而是我遇到错误的代码,以及更正,大家可以参考。
- 定位pytorch-ddpg|github,定位到图中红色框中的文件,点击进入该文件页。
- 继续定位如图,图中绿色框中的代码应改为绿色字体的代码。运行程序就没这个错误了。
注:也可以在注释
#critic update
的上一行添加target_q_value.detach_()
来达到将target从计算图中分离出来的目的,同样能解决问题。
三、完整的debug过程
-
1 运行pytorch-ddpg|github的程序,出现这个错误。
-
2 两大搜索引擎,各种搜。发现遇到这个问题的人也不少,我根据问题下面的回答一个个偿试,例如将
requires_grad=False
等 ,发现不能这么硬来,并且会出现另一个错误如下(此时解决方法其实已经在错误中给出来了,但是我愣是没仔细看,还是现在整理时发现的,所以jump to 3):
-
3 因为这个例子是在更新类似Q-learning的Q值函数时出现的,突然记起pytorch经典的例程中就是DQN|pytorch例程。我运行这个程序没有出现任何错误,于是我将pytorch-ddpg|github中的有关部分改成与DQN|pytorch例程一样。但是,发现还是有问题,我仔细查看,发现还是有一点点不一样的。下图中,红框是DQN对应的target,发现后面跟了一个不知道有什么作用的函数。于是我又搜索,找到介绍这个函数的一个博客pytorch: Variable detach 与 detach_|CSDN博客,然后就明白问题的原因了(第一部分的解释已经给出原因)。
##四、 总结
虽然,绕了一步,但是结局是好的——问题解决了。pytorch-ddpg|github是利用DDPG来训练倒立摆,连续的动作,连续的时间。解决错误后,程序就很正常的运行,结果贴一下:
-
刚开始的训练情况
-
1000步的训练情况
最后,希望大家不会有找这个错误解决方法的机会。
补充:此篇遇到pytorch中关键的两个属性:Variable.requries_grad
, Variable.volatile
,以及两个函数Variable.detach()
与Variable.detach_()
这篇关于Nn criterions don’t compute the gradient w.r.t. targets error「pytorch」 (debug笔记)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!