问题标签 [automatic-differentiation]
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.
numpy - 为什么 TensorFlow 和 PyTorch 的特征值分解梯度和解析解不同?
以下代码计算实对称矩阵的特征值分解。然后,计算第一个特征值相对于矩阵的梯度。这样做了 3 次:1) 使用解析公式,2) 使用 TensorFlow,3) 使用 PyTorch。这会产生三种不同的结果。有人可以向我解释这种行为吗?
印刷
三个结果的主对角线相同。TensorFlow 和 PyTorch 的非对角线元素是解析元素的两倍或等于零。
这是预期的行为吗?为什么没有记录?梯度错了吗?
版本信息:TensorFlow 1.14.0、PyTorch 1.0.1
tensorflow - 计算权重的输出梯度
从张量流模型开始,我希望能够检索输出相对于权重的梯度。反向传播旨在计算权重的损失梯度,为了在代码中的某处执行此操作,必须计算权重的输出梯度。
但我想知道如何在 API 级别获得这个雅可比行列式,有什么想法吗?
我知道我们可以访问磁带,但我不确定如何处理它,实际上我不需要整个雅可比行列式我只需要能够计算 J^{*} v 的矩阵向量积,其中 J ^{ } 是给定向量的 jacobian 和 va 的转置。
谢谢,问候。
python - 如何在autograd中逐个元素分配方程
我正在尝试为非线性 PDE 实现基于 autograd 的求解器。与大多数 PDE 一样,我需要能够在输入向量的各个条目中进行操作,但显然这会破坏 autograd。我创建了这个简单的示例来展示我面临的问题:
以下代码有效:
以下代码不起作用:
我在几个地方读过你不能在 autograd 中分配元素。这真的是真的吗。有什么解决方法吗?或者也许另一个图书馆建议?
谢谢!
language-agnostic - 什么是可微分编程?
Swift for Tensorflow项目的 Swift 中添加了对差分编程的原生支持。Julia 与Zygote有相似之处。
究竟什么是可微编程?
- 它有什么作用?维基百科说
这些程序可以在整个过程中有所区别
但是,这是什么意思?
- 一个人将如何使用它(例如一个简单的例子)?
- 以及它与自动微分有何关系(两者似乎很多时候混为一谈)?
python - 使用 Python JAX/Autograd 的向量值函数的雅可比行列式
我有一个将向量映射到向量的函数
我想计算它的雅可比行列式
,
其中雅可比定义为
.
因为我可以使用numpy.linalg.det
, 来计算行列式,所以我只需要雅可比矩阵。我知道numdifftools.Jacobian
,但这使用数值微分,我在自动微分之后。输入Autograd
/ JAX
(我暂时坚持Autograd
,它有一个autograd.jacobian()
方法,但我很乐意使用JAX
,只要我得到我想要的)。如何autograd.jacobian()
正确使用这个函数和向量值函数?
作为一个简单的例子,我们来看看函数
![f(x)=(x_0^2, x_1^2)]( https://chart.googleapis.com/chart?cht=tx&chl=f(x%29%20%3D%20(x_0%5E2% 2C%20x_1%5E2%29 )
具有雅可比行列式
![J_f = diag(2 x_0, 2 x_1)]( https://chart.googleapis.com/chart?cht=tx&chl=J_f%20%3D%20%5Cooperatorname%7Bdiag%7D(2x_0%2C%202x_1% 29 )
导致雅可比行列式
第一种方法给了我正确的值,但形状错误。为什么会.jacobian()
返回这样一个嵌套数组?如果我正确地重塑它,我会得到正确的结果:
但是现在让我们看看这在数组广播中是如何工作的,当我尝试评估多个值的雅可比行列式时x
显然,这两种形状都是错误的,正确的(如我想要的雅可比矩阵)woule be
和shape=(6,2,2)
我需要如何使用autograd.jacobian
(或jax.jacfwd
/ jax.jacrev
)才能使其正确处理多个向量输入?
注意:使用显式循环并手动处理每个点,我得到了正确的结果。但是有没有办法做到这一点?
python - 重复使用 GradientTape 进行多次雅可比计算
我正在尝试计算 TensorFlow 神经网络输出相对于其输入的雅可比行列式。这很容易通过该tf.GradientTape.jacobian
方法实现。TensorFlow 文档中提供的简单示例如下:
如果我只想计算输入张量的单个实例的雅可比行列式,这很好x
。但是,我需要针对x
. 对于非平凡的雅可比计算(例如,对于具有非线性激活函数的深度卷积神经网络),重复重新运行 GradientTape 计算并评估该jacobian
方法是非常昂贵的。我从TensorFlow 文档中知道梯度(以及雅可比行列式)是通过自动微分计算的。我不得不想象在给定的输入下评估网络的分析梯度(通过自动微分计算)有一些内部存储。
我的问题:假设 TensorFlow 构建和存储(至少部分)计算雅可比行列式所需的分析梯度,我是否正确?如果是这样,有没有办法保存这个分析梯度并用新的输入重新评估雅可比矩阵,而不必通过 GradientTape 方法重建它?
“持久的” GradientTape 似乎无法解决这个问题:它只允许针对计算的多个内部参数重复评估单个 GradientTape 实例。
python - Jax 的 JIT 和 Numpy 限制问题
我最近开始尝试有趣的 python 库Jax,其中包含增强的 Numpy 和自动微分器。我想尝试创建的是一个粗略的“可微渲染器”,通过在 python 中编写着色器和损失函数,然后使用 Jax 的 AD 来查找渐变。然后我们应该能够通过在这个损失梯度上运行梯度下降来逆向渲染图像。我用简单的着色器让它工作得很好,但是当我使用布尔表达式时我遇到了问题。这是我的着色器的代码,它生成一个棋盘图案:
这是我的渲染函数,这是 JIT 失败的第一个地方:
我收到的错误信息是:
我猜这是因为您不能在具有布尔值的函数上运行 JIT,其值取决于编译时未确定的内容。但是我怎样才能重写它以使用 JIT 呢?如果没有 JIT,它会非常缓慢。
我的另一个问题是,我能做些什么来加速 Jax 的 Numpy?使用普通 Numpy 渲染我的图像(100x100 像素)需要几毫秒,但使用 Jax 的 Numpy 需要几秒钟!感谢:D
python - pytorch中if-else语句和torch.where有什么区别?
查看代码片段:
输出是tensor([0.])
,但是
输出是None
。
我很困惑,为什么输出torch.where
is tensor([0.])
?
更新
输出是tensor([2., 0.])
。与没有(a[0, 0] * a[0, 1])
任何关系b[1]
,但与 的梯度b[1]
无关。0
None
computer-science - 线性时间内的自动微分向量 - 雅可比积?
我对自动微分的内部工作不熟悉,并且遇到了一些论文和幻灯片,这些论文和幻灯片指出可以使用自动微分在线性时间内计算矢量雅可比积。具体写:
可以计算任何 e in O(N)
。雅可比是N-by-N
。我认为是N^2
,但我不完全理解自动微分如何降低时间复杂度。
visual-studio - 自动更改仅在 Dot Net 中有代码更改的程序集的版本
我正在为我的应用程序创建补丁以向客户部署小的更改。在我的应用程序中,我有 100 个 .CSProject。在 100 个库中,我在类库 A、B、C 中进行了代码更改,并且库 D 正在调用 A、B 和 C 库。那么当我构建我的应用程序时有什么办法吗?它应该只更改有更改的 A、B、C 和 D 库的版本。手动我可以更改,但我需要任何自动方式。