【发布时间】:2021-09-15 02:45:29
【问题描述】:
我想知道是否有任何方法可以手动向 pytorch 中的步骤添加渐变,否则使用 autograd。我的损失函数中有一个中间步骤,如果不将数据类型从张量中转换出来,我就无法计算它,所以我没有得到该分量的自动梯度,因此无法正确计算梯度。但是,我可以手动计算梯度。我将如何将其合并到 pytorch 的渐变图中?我发现的所有指南根本不使用 autograd(据我了解)。
我要解决的具体问题是在某个时间间隔内对函数进行规范化。以下示例对高斯总和执行此操作。张量 m 是 [[m1,m2,m3,m4...]] 并表示均值,s 表示标准差,p 表示权重。 p,m 和 s 都是我的模型的输出。我希望低截止和高截止之间的积分为 1,因此我可以通过在较高截止处取 cdf 并在将所有 ps 除以该值之前减去较低截止 cdf 来得到它。然后,我将使用这些新的 p 值(以及 m 和 s 以及一个目标)来计算损失函数的一些值。然后当我调用 loss.backward() 时,我会得到正确的梯度,包括来自归一化因子随着 p、m 和 s 变化而变化的梯度部分。
normFactor=0
for gaussianInd in range(numberGaussians):
normFactor += (spstats.norm.cdf(higherCutoff,m[0][gaussianInd].cpu().detach(),s[0][gaussianInd].cpu().detach()+1e-6)-spstats.norm.cdf(lowerCutoff,m[0][gaussianInd].cpu().detach(),s[0][gaussianInd].cpu().detach()+1e-6))*p[0][gaussianInd]
p=p/normFactor
编辑:添加具体示例
【问题讨论】:
-
“如果不将数据类型转换为张量,我就无法计算”你能显示一些代码吗?
-
我会将它添加到问题中,但我不确定它为什么重要。即使这个特定的例子可以在 pytorch 中完成,我真的很想回答一般问题
-
这个问题目前还不清楚。有几种方法可以“手动为步骤添加渐变”,了解具体问题是什么会很有用。
-
啊,明白了。让我知道上面的小文章是否可以理解,或者我是否需要进一步澄清