问题标签 [autograd]

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 投票
0 回答
39 浏览

python - 张量范数的autograd中的“形状未对齐”

我想使用 autograd 来计算张量范数的梯度,如下所示:

我也尝试了不同的实现(例如使用我自己的规范或使用不同形状的张量)但我总是收到错误

ValueError:形状(100,100)和(10000,100)未对齐:100(dim 1)!= 10000(dim 0)

0 投票
2 回答
1900 浏览

python - Pytorch:输出wrt参数的梯度

我有兴趣找到关于参数(权重和偏差)的神经网络输出的梯度。

更具体地说,假设我有以下神经网络结构 [6,4,3,1]。输入样本大小是 20。我感兴趣的是找到权重(和偏差)的神经网络输出的梯度,如果我没记错的话,在这种情况下是 47。在文献中,这个梯度有时称为 Weight_Jacobian。

我在 Jupyter Notebook 上的 Python 3.6 上使用 Pytorch 0.4.0 版。

我制作的代码是这样的:

从代码中可以明显看出,我使用双曲正切作为非线性。该代码生成长度为 20 的输出向量。现在,我有兴趣在所有权重(全部 47 个)中找到此输出向量的梯度。我在这里阅读了 Pytorch 的文档。例如,我也在 这里看到了类似的问题。但是,我没能找到输出向量 wrt 参数的梯度。如果我使用 Pytorch 函数backward(),它会生成一个错误

我的问题是,有没有办法计算输出向量 wrt 参数的梯度,它基本上可以表示为 20*47 矩阵,因为我的输出向量的大小为 20,参数向量的大小为 47?如果是这样,如何?我的代码有什么问题吗?你可以举任何 X 的例子,只要它的尺寸是 20*6。

0 投票
2 回答
7985 浏览

python - pytorch 中的高阶梯度

我在 pytorch 中实现了以下雅可比函数。除非我犯了一个错误,否则它会计算任何张量 wrt 任何维度输入的雅可比行列式:

最重要的是,我尝试实现一个递归函数来计算 n 阶导数:

我进行了一个简单的测试:

不幸的是,这成功地让我得到了 Hessian ......但没有高阶导数。我知道许多高阶导数应该为 0,但如果 pytorch 可以分析计算它,我更愿意。

一种解决方法是将梯度计算更改为:

这是处理此问题的公认正确方法吗?还是有更好的选择?还是我的问题一开始就完全错误的原因?

0 投票
1 回答
854 浏览

python - 收集输入后,Pytorch autograd 失败并显示“RuntimeError:差分输入无法访问”

Pytorch 版本 0.3.1

编辑:我正在重写这个问题以使其更简单,因为我已经缩小了错误的范围。

我有一些变量:

然后我创建一个表示它们连接的变量:

然后我尝试取导数:

这很好,并按预期返回 1。y 和 z 相同。

然而,

返回一个错误:RuntimeError: distinct input is unreachable

当然,这是有道理的—— w 没有在 . 的声明中明确使用f。但是,我想要一种行为,其中一行代码可以生成类似[1; 1; 1]输出的东西。

假设我想方便地将我的变量批处理在一起,然后一次获取整个 shebang 的梯度,而不是独立处理变量(这会使簿记成为一场噩梦)。有什么办法可以得到我想要的结果吗?

0 投票
0 回答
684 浏览

gradient - Pytorch 二阶导数卡在两个错误之间:缓冲区已释放且变量易失

我有一个损失函数和一个权重矩阵列表,我正在尝试计算二阶导数。这是一个代码片段:

上面的代码有效(实际上二阶导数是在一个单独的函数中调用的,但为了简洁起见,我直接把它放了)。但我对何时使用创建和保留图完全感到困惑。

第一:如果我不做 loss.backward(retain_graph) 我得到错误 A:

RuntimeError:变量元组的元素 0 易失

如果我使用它,但不对一阶导数添加任何“图形”语句,则会收到错误 B:

RuntimeError:试图第二次向后遍历图形,但缓冲区已被释放。第一次向后调用时指定retain_graph=True。

如果我指定retain_graph=True,无论我是否在此处放置create graph 语句,都会得到二阶导数的错误A(即在for 循环中)。

因此,只有上面的代码片段有效,但我需要 loss.backward 和所有 create graph 语句感觉很奇怪。有人可以向我澄清这一点吗?非常感谢提前!!

0 投票
0 回答
223 浏览

python - Autograd 无法正确计算正态 CDF 导数

当谈到 Autograd 时,我完全是个新手,所以我觉得我做的事情可能很明显是错误的。但是,我花了一整天的时间在这上面挣扎。

我正在尝试计算包含正常 cdf 的函数的导数。我在 Autograd 上没有成功,所以我把它分成越来越小的部分,直到我将错误源隔离为 Normal CDF。这是一个最小的工作示例:

我知道优化 CDF 没有意义,我只是这样做是为了从回调中获取输出,如下所示:

由 Autograd 计算的梯度与由正常 PDF 表示的理论导数不匹配。

我执行不正确吗?我觉得这么广泛使用的包装不太可能有这样的洞。如何使用 Autograd(或 Python 中的其他包)来获得输出标量的函数的有效数值导数。

0 投票
1 回答
1389 浏览

python - 更新 Pytorch 变量

首先,我应该提到我使用的是 Torch 版本 0.3.1,但如果有必要,我很乐意升级。

我还在学习,所以如果我在这里误解了什么,请告诉我。

我正在使用变量命令式地构建几个图表。随着时间的推移,数学表达式可能会非常复杂,并且可以使用 autograd 的梯度函数生成图形的某些部分,然后对其进行操作。

我可以创建任何我想要的表达方式。唯一的问题是构建这个图可能非常“慢”——对于相对简单的操作(4x4 矩阵相乘),可能需要几毫秒。

但是,一旦生成了这些图表,我希望我应该能够更快地更新某些变量的值,并评估图表的输出(或任何节点,实际上)。我相信这可能就是这种情况,因为评估应该能够完全在 C 后端进行,这对于速度应该是相当优化的?换句话说,在 python 中构建图形可能会很慢,因为它涉及 python for 循环等,但是重新评估具有静态拓扑的图形应该很快。

这种直觉正确吗?如果是这样,我怎样才能有效地重新分配一个值并重新评估图表?

0 投票
1 回答
655 浏览

python - 减少和一个 numpy 数组的最有效方法(使用 autograd)

我有两个数组:

我想制作:

以最有效的方式。

  • 我的值是通过 autograd 计算的
  • 由于上述几点,在熊猫中进行分组确实效率不高
  • index我必须在相同但不同的值上做数百次
  • len(values)~ 10**7
  • len(set(index))~ 10**6
  • Counter(index).most_common(1)[0][1]~ 1000

我认为一个纯粹的 numpy 解决方案将是最好的。

我尝试预先计算 的简化版本index,然后执行以下操作:

但效率不够。

这是一个最小的代码示例:

0 投票
3 回答
6448 浏览

python - 使用 PyTorch 进行就地操作

我想知道如何处理 PyTorch 中的就地操作。我记得在 autograd 中使用就地操作一直是个问题。

实际上,我很惊讶下面的这段代码可以正常工作,即使我没有测试过,我相信这段代码会在 version 中引发错误0.3.1

基本上我想做的是将张量向量的某个位置设置为某个值,如下所示:

工作示例代码:

输出:

所以很明显在版本中0.4.1。这工作得很好,没有警告或错误。

参考文档中的这篇文章:autograd-mechanics

在 autograd 中支持就地操作是一件困难的事情,我们不鼓励在大多数情况下使用它们。Autograd 积极的缓冲区释放和重用使其非常高效,并且很少有情况下就地操作实际上会显着降低内存使用量。除非您在沉重的内存压力下操作,否则您可能永远不需要使用它们。

但即使它有效,在大多数情况下也不鼓励使用就地操作。


所以我的问题是:

  • 就地操作的使用对性能有多大影响?

  • 在我想将张量的一个元素设置为某个值的情况下,如何使用就地操作?

提前致谢!

0 投票
1 回答
248 浏览

python - 在 Python 中使用 Autograd 包进行渐变

我正在尝试使用package.json 复制这个标准示例Autograd

虽然我能够从这个存储库复制其他示例,但这个特定示例会引发如下错误:

这个相关版本不兼容吗?如果是这样,有什么快速的方法来解决这个问题?

提前致谢,