【发布时间】:2018-01-01 13:22:12
【问题描述】:
在theano中,很容易得到一些变量w.r.t的梯度。给定的损失:
loss = f(x, w)
dl_dw = tt.grad(loss, wrt=w)
我知道 pytorch 采用了不同的范例,您可以在其中执行以下操作:
loss = f(x, w)
loss.backwards()
dl_dw = w.grad
问题是我可能不想在图形中进行完整的反向传播 - 只是沿着到达 w 所需的路径。
如果您不想通过它们进行反向传播,我知道您可以使用 requires_grad=False 定义变量。但是你必须在创建变量时决定(并且 requires_grad=False 属性附加到变量,而不是获取渐变的调用,这看起来很奇怪)。
我的问题是是否有某种方法可以按需反向传播(即只在计算dl_dw 所需的路径上反向传播,就像在theano 中那样)?
【问题讨论】:
-
我认为这会很复杂。请注意,您只能为叶变量设置 requires_grad。因此,即使您对图表中的所有变量都有句柄,您也不能只切换 requires_grad = False 或 True 来仅计算您想要的梯度。另请注意,仅保留叶变量的梯度(如果您想要中间变量的梯度,则需要一个钩子)。如果您对叶变量的梯度感兴趣,您可以标准地设置它们的所有 requires_grad = False,然后在反向传播之前将您感兴趣的设置为 true。
-
我认为您正在寻找register_backward_hook 功能。你可以直接用它修改渐变。