【问题标题】:Adding manual gradient to step将手动渐变添加到步骤
【发布时间】: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 中完成,我真的很想回答一般问题
  • 这个问题目前还不清楚。有几种方法可以“手动为步骤添加渐变”,了解具体问题是什么会很有用。
  • 啊,明白了。让我知道上面的小文章是否可以理解,或者我是否需要进一步澄清

标签: python pytorch


【解决方案1】:

当然,您可以随时修改感兴趣的张量的grad 属性。您的优化器将点击此属性来更新相应的张量。


出于说明目的:

>>> p = nn.Linear(10, 1, bias=False)
>>> p.weight
Parameter containing:
tensor([[ 0.3148, -0.2287,  0.1254, -0.1360,  0.2799, -0.0225, -0.3006, -0.0605,
         -0.2784, -0.2618]], requires_grad=True)

>>> optim = torch.optim.SGD(p.parameters(), lr=.1)

手动修改渐变:

>>> p.weight.grad = torch.rand_like(p.weight)

使用优化器更新:

>>> optim.step()

参数将被更新:

>>> p.weight
Parameter containing:
tensor([[ 0.2514, -0.2555,  0.1026, -0.1881,  0.2529, -0.0497, -0.3750, -0.1489,
         -0.3762, -0.2839]], requires_grad=True)

【讨论】:

  • 我可能是个彻头彻尾的白痴(或者这个问题问得非常糟糕),但我仍然没有完全了解如何将它与更大的产品结合起来。如何将其与 .backward 结合使用?我的问题是 .backward 无法计算过程中 1 步的梯度,所以我想手动将该步放入 .backward 中。我可以简单地通过以某种方式创建具有特定梯度的张量来做到这一点吗?
  • 您的意思是要实现计算的反向传递吗?
  • 我不知道如何形容它,但是是的。在 optim.step() 之前我一直在使用 loss.backward()。我不再能够这样做,因为我现在在损失函数中有一个步骤,其中一个数字被计算为浮点数而不是张量,然后将其乘以一个张量。因此,这一步没有梯度,并且向后返回错误的答案。我想让向后做它通常做的事情,除了我想指定渐变的那一步。这一切都有意义还是我太不清楚了?
  • 好的,我明白你在找什么。你真的有那个层的渐变表达吗?如果您可以用内置/可微分函数替换 spstats.norm.cdf,您是否尝试过研究 PyTorch 函数?如果以上都不是,您能从数学上解释一下您的表达式是如何工作的吗?
  • 我认为可以很容易地为图层编写渐变表达式。我研究了可以用可微函数替换 cdf 的 pytorch 函数,但没有找到合适的(但也许我错过了一些简单的东西)
猜你喜欢
  • 1970-01-01
  • 2018-02-04
  • 2017-12-15
  • 2017-07-22
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多