问题标签 [autodiff]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
688 浏览

tensorflow - tf.gradients 是如何管理复杂函数的?

我正在使用复值神经网络。

对于复值神经网络,通常使用 Wirtinger 演算。然后导数的定义是(考虑到由于刘维尔定理,函数是非全纯的):

写作者

如果您阅读 Akira Hirose 的书《复值神经网络:进展和应用》,第 4 章等式 4.9 定义:

截图来自 2020-03-03 10-38-21

当然,偏导数也是使用 Wirtinger 演算计算的。

这是张量流的情况吗?还是以其他方式定义?我找不到关于该主题的任何好的参考。

0 投票
1 回答
273 浏览

c++ - Ceres Solver:对非线性最小二乘使用平滑近似

我们正在使用 Google ceres 求解器来解决计算机视觉应用程序中出现的优化问题。我们使用AutoDiffCostFunction来评估残差,密集 QR 求解器能够优化函数并找到一个合适的最小值。但我想知道使用 fmax、fmin 和 relu(或残差内的 if/else)等非平滑函数是否被认为是一种不好的做法。

我们的残差包含一些非平滑操作:

另一个在零处不可微的片段:

例如,我们可以用平滑近似替换 fmax:

问题是我们是否应该系统地去除任何不平滑的残差,即使密集的 QR 按预期工作?

0 投票
1 回答
387 浏览

python - 在 PyTorch 中计算输出逐像素梯度范数

我正在寻找一种有效的方法来计算每个样本定义的维度 (bxcxhxw) 的 \hat{x}:

情商

其中 x 是由具有参数 \theta 的模型生成的相同维度的输出,并且

i,j:索引二维输出特征图的高度和宽度

k:索引通道维度

l:索引参数。

我如何使用 x.backward() 完成此操作?有没有一种有效的方法来做到这一点?

如果我做了 x.backward(torch.ones_like(x)),我将计算上述等式中的梯度之和,而不是它们的绝对值之和。

执行此操作的蛮力方法是遍历输出映射中的每个像素并计算 .backward()。但是,那将是非常昂贵的。有没有避免循环的有效方法?

0 投票
0 回答
215 浏览

pytorch - Pytorch:涉及端到端雅可比范数的自定义损失

Pytorch 讨论区的交叉发帖

我想使用修改后的损失函数来训练网络,该损失函数既有典型的分类损失(例nn.CrossEntropyLoss​​如网络,\nabla_x f(x))。

我已经实现了一个可以成功学习的模型nn.CrossEntropyLoss。但是,当我尝试添加第二个损失函数(通过两次向后传递)时,我的训练循环会运行,但模型永远不会学习。此外,如果我计算端到端雅可比行列式,但不将其包含在损失函数中,则模型也永远不会学习。在高层次上,我的代码执行以下操作:

  1. 前向传递以yhat从输入中获取预测类别 ,x
  2. 称呼yhat.backward(torch.ones(appropriate shape), retain_graph=True)
  3. 雅可比范数 =x.grad.data.norm(2)
  4. 设置损失等于分类损失 + 标量系数 * 雅可比范数
  5. loss.backward()

我怀疑我误解了backward()运行两次时的工作原理,但我无法找到任何好的资源来澄清这一点。

产生一个工作示例需要太多,所以我试图提取相关代码:

编辑 1:我将以前的实现换成了.backward()toautograd.grad并且它显然有效!有什么不同?

0 投票
1 回答
352 浏览

tensorflow - 使用带有 SavedModel 的 GradientTape 对输入进行梯度下降

我正在尝试对使用SavedModelAPI 加载的模型进行对抗性攻击。我想针对给定目标的模型损失对输入进行梯度下降。代码有点长,但它是说明问题的最低限度。

我收到以下错误:

我对低级张量流很陌生,我还不太了解它是如何工作的。我相信这个问题与我的推理函数不是真实的有关,@tf.function因为它的类型是tensorflow.python.saved_model.load._WrapperFunction. 但是我怎样才能检索到真正的功能呢?

0 投票
1 回答
60 浏览

regression - 使用 PyTorch 和自分化进行反向传播

我有一个数据集——X由 15 个变量和 64 个观察值和一个列向量——Y代表目标(标签)的 64 个值组成。我尝试Y使用 PyTorch 将参数拟合到二次函数以返回观察值 ( ),但出现错误。我在文章末尾以 json 格式提供了数据集,以实现可重复性。

如果我有一个示例,我的代码可能是:

您能否提供一个使用我在下面提供的数据以矢量化方式实现所述目标(将参数拟合到数据)的正确实现示例?

数据: X:

0 投票
1 回答
451 浏览

julia - 我可以对不可微分的函数使用自动微分吗?

我正在测试不同求解器在最小化从模拟矩量法导出的目标函数方面的性能。鉴于我的目标函数不可微分,我想知道在这种情况下自动微分是否有效?我尽力阅读了有关此方法的一些介绍,但我无法弄清楚。

我实际上正在尝试在 Julia 中使用 Ipopt+JuMP 进行此测试。以前,我在 Julia 中使用 BlackBoxoptim 对其进行了测试。如果您能提供一些有关 Julia 中不可微函数优化的见解,我也将不胜感激。


似乎我对“不可微分”不清楚。让我给你举个例子。考虑以下目标函数。X 是数据集,B 是将被整合出来的未观察到的随机误差,θ 是参数。但是,A 是离散的,因此不可微分。

0 投票
1 回答
530 浏览

python - tensorflow, custom loss, custom_gradient, temp tf.Variable 导致错误

考虑实现一个需要临时变量实例化的自定义损失函数。如果我们需要实现自定义梯度,TF 期望梯度函数有一个额外的输出,此时梯度的分量应该与损失函数的输入一样多。也就是说,如果我的理解是正确的。任何更正表示赞赏。

链接相关的 github 问题,其中包含一个最小工作示例 (MWE) 和其他调试信息:https ://github.com/tensorflow/tensorflow/issues/31945

从 github 帖子复制粘贴的 MWE 是:

哪个会抛出ValueError: not enough values to unpack....

如果我的理解是正确的,通常对于伴随方法(反向模式 autodiff),前向传递构建表达式树,而对于反向传递,我们评估梯度,梯度函数是值乘以我们函数的偏导数' d 取关于的导数,它可能是一个复合函数。如果需要,我可以发布参考。

因此,对于一个输入变量,我们将对梯度进行一次评估。在这里,TF 期望 2,即使我们只有一个输入变量,因为临时变量在某些情况下是不可避免的。

我的 MWE 伪代码是这样的:

安德烈

0 投票
1 回答
412 浏览

python - 查找函数的梯度:Sympy vs. Jax

我有一个Black_Cox()调用其他函数的函数,如下所示:

我需要使用Black_Cox函数 wrt的导数V。更准确地说,我需要在改变其他参数的数千条路径中评估这个导数,找到导数并在 some 处进行评估V

最好的方法是什么?

  • 我是否应该像在 Mathematica 中那样使用sympy来找到这个导数,然后根据我V的选择进行评估:D[BlackCox[V, 10, 100, 160], V] /. V -> 180,或者

  • 我应该使用jax吗?

如果sympy,你会如何建议我这样做?

jax我了解,我需要执行以下导入:

并在获得渐变之前重新评估我的功能:

如果我仍然需要使用numpy函数的版本,我是否必须为每个函数创建 2 个实例,或者是否有一种优雅的方式来复制函数jax

0 投票
1 回答
362 浏览

pytorch - PyTorch“通过就地操作修改”错误

错误消息表明[torch.cuda.FloatTensor [256, 1, 4, 4]] is at version 2; expected version 1 instead, 并且执行中断d_loss.backward()- 即,对我的鉴别器的反向调用。

更新:好的,我将其追踪到在我的鉴别optimizer.step()器上运行之前发生的生成器。.backward()

更新 2:所以一旦我让模型在 PyTorch 1.5 上运行(通过将 G 的优化器移动到d_loss.backward()调用之后,如上所述),我注意到在训练期间损失突然高得多。我让模型运行了几个 epoch,图像基本上是噪声。所以,出于好奇,我切换回我的 PyTorch 1.4 环境并运行原始版本几个 epoch,图像又好了。这是我正在训练的 ClusterGAN——所以不是标准程序——我想知道为什么这种变化对输出如此有害。另外,如何让模型在 PyTorch 1.5 中运行而不降低性能?大概我必须将优化器更新保持在原来的位置(就在 之后),但是当我们稍后在代码中ge_loss.backward(retain_graph=True)点击时,以某种方式避免了 PyTorch 1.5 报告的错误。d_loss.backward()clone()东西,但我不清楚是什么......?