问题标签 [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 投票
0 回答
73 浏览

tensorflow - Tensorflow 在哪里存储*实际* Jacobians?

正如这里所讨论的,Tensorflow 的梯度不是真正的雅可比矩阵——Y 对 X 的“梯度”实际上只是sum( Y ) 对X的梯度。同样,当输出不是标量时,Pytorch 根本不显示雅可比行列式。

但是计算肯定需要完整的雅可比行列式(在链式法则的应用中)。

在内部,它存储在哪里?即是否有一些隐藏在 GradientTape 中的对象可以访问?

0 投票
1 回答
365 浏览

c++ - 特征:自动/符号微分

我正在寻找可以与 Eigen 元素一起使用的 cpp auto/symb diff 库。我需要的一个重要特性是导函数(或表达式树)计算一次,然后可以在多个点上进行评估(我用它来优化)。

到目前为止我考虑过的选项:

  1. Eigen 的 autodiff 模块。它不受支持,我不确定它的功能。

  2. autodiff.github.io。没有我需要的功能:需要为每个点重新计算导数。

  3. 卡萨迪。不支持本征。此外,它关于 cpp 的文档很少而且过时(至少对于向量代数而言),而且感觉不鼓励直接从 cpp 使用它。

0 投票
1 回答
770 浏览

python - pytorch 如何计算简单函数的导数?

当我们谈论 pytorch 中的自微分时,我们通常会看到基于张量公式的图形结构,pytorch 将使用链式规则通过跟踪图形树来计算梯度。但是,我想知道叶子节点会发生什么?pytorch 是否使用其解析导数对整个基本函数列表进行硬编码,还是使用数值方法计算梯度?一个简单的例子:

在这个例子中,pytorch 是通过 $$ (x^2)' = 2x = 2 * 1 = 2 $$ 计算导数,还是 pytorch 以类似于 $$ (1.00001^2 - 1^2) / (1.000001 - 1) ~ 2 $$ ?

谢谢!

0 投票
3 回答
30440 浏览

numpy - 为什么我们在 Pytorch 张量上调用 .numpy() 之前调用 .detach()?

已经确定这my_tensor.detach().numpy()是从张量中获取 numpy 数组的正确方法torch

我试图更好地理解为什么。

在刚刚链接的问题的公认答案中,Blupon 指出:

除了实际值定义之外,您还需要将张量转换为不需要梯度的另一个张量。

在他链接到的第一次讨论中,albanD 指出:

这是预期的行为,因为移动到 numpy 会破坏图形,因此不会计算梯度。

如果你实际上不需要梯度,那么你可以显式 .detach() 需要 grad 的 Tensor 得到一个内容相同但不需要 grad 的张量。然后可以将这个其他张量转换为 numpy 数组。

在他链接到的第二次讨论中,apaszke 写道:

变量不能转换为 numpy,因为它们是保存操作历史的张量的包装器,而 numpy 没有这样的对象。您可以使用 .data 属性检索变量持有的张量。然后,这应该可以工作:var.data.numpy()。

我研究了 PyTorch 的自分化库的内部工作原理,但我仍然对这些答案感到困惑。为什么它会破坏图表以移动到 numpy?是因为 numpy 数组上的任何操作都不会在 autodiff 图中被跟踪吗?

什么是变量?它与张量有什么关系?

我觉得这里需要一个彻底的高质量 Stack-Overflow 答案,向尚不了解自分化的 PyTorch 新用户解释其原因。

特别是,我认为通过一个图来说明图表并显示此示例中的断开连接是如何发生的会很有帮助:

0 投票
1 回答
146 浏览

type-conversion - 在 Julia 中绘制 ForwardDiff 的输出

我只想使用该ForwardDiff.jl功能来定义一个函数并绘制它的梯度(使用 评估ForwardDiff.gradient)。它似乎不起作用,因为它的输出ForwardDiff.gradient是这种奇怪Dual的类型,并且不容易转换为所需的类型(在我的情况下,是 Float32s 的一维数组)。

这是我得到的错误:

当我检查 的类型时grad_f(x_values),我得到了这个:

Array{Array{ForwardDiff.Dual{ForwardDiff.Tag{typeof(g),Float32},Float32,12},1},1}

例如,为什么在 ForwardDiff 文档的示例中没有发生这种情况?见这里:https ://github.com/JuliaDiff/ForwardDiff.jl

提前致谢。

编辑:在 Kristoffer Carlsson 的评论之后:我试过这个,但它仍然不起作用。我不明白我在这里尝试的内容与他的建议有何不同:

现在的错误是:

这个错误发生在我打电话的时候∂g∂x(x),无论我是否使用广播版本∂g∂x.(x)。我想这与函数定义有关,但我看不出我定义它的方式与 Kristoffer 的版本有何不同,除了它没有在一行中定义......这太令人困惑了。

这应该可行,因为根据ForwardDiff的文档,您只需要输入的类型是Real- 的子类型并且Float32是 Real 的子类型。

编辑:我现在意识到,在阅读了其他人的评论后,您需要将您的函数限制为足够通用以接受抽象类型的任何输入Real,我并没有从文档中完全收集到。为混乱道歉。

0 投票
0 回答
52 浏览

c++ - 是否可以将 GLM 与非基本类型一起使用?

我有一些使用 glm 进行向量和矩阵数学的函数和数据结构。

现在我想计算关于输入变量的梯度。由于计算相当复杂,我想使用自动微分来验证我的手动梯度计算。

我找到了https://autodiff.github.io/,这正是我所需要的。它的标量变量基于一个struct包含 ashared_ptr到一个表达式。我想使用glm::vec<2, autodiff::Variable<float>, 和类似的矩阵,以及所有有趣的 glm 函数。

我已经开始移植代码,但我遇到了问题。例如glm::dot包含支票

我相信在这种情况下,将支票替换为std::numeric_limits<T>::is_iec559 || GLM_CONFIG_UNRESTRICTED_GENTYPE(以及提出拉取请求)是安全的,但我不确定,我当然也不知道所有其他地方。

在包含 glm 之前,我已经定义了以下内容:

一起使用 glm 和 autodiff 是否现实?

0 投票
0 回答
53 浏览

python-3.x - 哪些类型的操作将/不会插入 Tensorflow 2 中的计算图?

基于这篇文章,我们可以改变tf.variable

b=tf.where(b>=3, 199, b)插入计算图并影响b反向传播的梯度吗?

或更一般的问题:哪些类型的操作将/不会将计算图插入Tensorflow 2

0 投票
1 回答
270 浏览

tensorflow - 使用 tensorflow 梯度带计算 Hessian

感谢您对此问题的关注。

我想计算 tensorflow.keras.Model 的粗麻布矩阵

对于高阶导数,我尝试了嵌套 GradientTape.# 示例图和输入

而且,另一个试验...

为什么我不能计算 g wrt x 的梯度?

0 投票
1 回答
43 浏览

python - 张量流中的自定义渐变 - 无法理解这个例子

我一直在想我即将了解自定义渐变,但后来我测试了这个例子,我就是不知道发生了什么。我希望有人能引导我了解下面到底发生了什么。我认为这本质上是因为我没有具体理解后向函数中的“dy”是什么。

这里的一切都很好,渐变也正如人们所期望的那样。然后,我使用自定义渐变来测试这个示例,考虑到我在 clip_by_norm 中设置了这个巨大的阈值,它(根据我的理解)不可能影响渐变

tf.Tensor(4.0, shape=(), dtype=float32)

但它减少到 4,所以这在某种程度上产生了影响。这究竟是如何导致更小的梯度的?

0 投票
0 回答
106 浏览

julia - 在 Julia 中使用 batched_mul 进行自动微分时非法 DGEMM 参数编号 10

我在使用 Flux / Zygote 时遇到了一个错误,它通过快速谷歌搜索似乎与“CUDA”/“Matrix Product State”相关。可以使用以下代码在 Julia 的最新稳定版本(编写时为 1.5.3)中复制它:

我不确定引擎盖下发生了什么。我只能说“某事”出了问题,但它仍然会吐出看起来有效的结果。它还会在我的应用程序中向控制台发送垃圾邮件,以调整每个批次每个批次 1** On entry to DGEMM parameter number 10 had an illegal value个元素...使打印到控制台成为应用程序的瓶颈。

到底是怎么回事?我该如何解决?是否值得修复,还是我可以忽略它?如果忽略,我怎样才能阻止我的屏幕被这些警告/错误淹没?

编辑

我找到了一种使用OMEinsum的解决方法,它可以完成相同的工作,但不会向控制台发送错误消息:

不确定 OMEinsum 是否是这方面的“最佳”张量库(对张量来说是新手,可用库的数量令人眼花缭乱),但它对我来说是最容易理解的。

我没有将此作为答案,因为从根本上说,该错误batched_mul尚未修复。