阅读 136

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_()

文章分类
人工智能
文章标签