- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试定义一个 custom gradient in TensorFlow对于返回非标量的函数。
问题的简化玩具版本是:
import tensorflow as tf
@tf.custom_gradient
def f(x):
y = tf.Variable([x[1], 2.0*x[0]])
def grad(upstream):
dg = tf.Variable([[0.0, 2.0], [1.0, 0.0]])
return dg * upstream # ? no idea here
return y, grad
x = tf.Variable([1.0, 2.0])
with tf.GradientTape() as tape:
y = f(x)
tape.jacobian(y, x)
# tape.gradient(y,x)
我不明白 grad
函数需要返回什么形状。在上面的示例中,tape.gradient
给出了问题的完整雅可比矩阵(我希望从 tape.jacobian
得到)和 tape.jacobian
什么也没给出(尽管我在重新启动内核之前一直收到错误消息)。
这是预期的形状和行为吗?对于向量值或矩阵值函数的导数,自定义梯度应返回什么形状?
最佳答案
我同意这可能会造成混淆。让我尝试扩展 Tensorflow docs 中给出的声明。并在数学和代码之间建立明确的联系。
让我们考虑一个函数
.
它的雅可比矩阵是 n x m 矩阵:
.
给定一个输入向量 x 和一个“上游”向量 u,函数 grad_fn
在 @custom_gradient
函数应返回“向量-雅可比积”vjp,即:
.
请注意,在此公式中,u 是给定的,不依赖于 x。因此,我们可以将vjp改写如下:
.
如果我们定义 ,这可以推广到更高阶的张量作为 a 和 b 的元素乘积之和(即 tf.reduce_sum(a * b)
),这是常规点积对于向量和 Frobenius inner product对于矩阵。然后,grad_fn
的输出应该是一个与 x 形状相同的张量,计算如下:
.
请注意,这实际上是标量值函数 tf.reduce_sum(u * f(x))
的梯度(因此更容易思考和使用)。
在您的特定情况下,您需要采用 u[0]*x[1]+u[1]*2.0*x[0]
相对于 x 的梯度[0],x[1]
,即类似于:
def grad(upstream):
return tf.Variable([2.0*upstream[1], upstream[0]])
这会产生所需的梯度。
不幸的是 jacobian
不能用这个(因为它不能用你的原始代码)因为你的代码有第二个问题:通过使用变量它打破了输出和输入之间的链接(创建变量就像复制/粘贴值一样,不会传播梯度)。您可以按如下方式解决此问题:
@tf.custom_gradient
def f(x):
y = tf.stack([x[1], 2.0*x[0]])
def grad(upstream):
return tf.stack([2.0*upstream[1], upstream[0]])
return y, grad
关于tensorflow - 用 tensorflow custom_gradient 定义 jacobian,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66536946/
我正在使用 scipy.optimize.minimize 进行优化,并尝试使用以下方法:“Newton-CG”、“dogleg”和“trust-ncg”。据我了解,对于这些方法,需要目标函数的雅可比
我正在尝试对任意多个链接的串行链进行逆运动学。 如下paper ,我找到了如何计算雅可比矩阵的示例。 Entry (i, j) = v[j] * (s[i] - p[j]) 地点: v[j] is t
我想知道下面的代码如何才能更快。目前,它似乎慢得不合理,我怀疑我可能错误地使用了 autograd API。我期望的输出是 timeline 的每个元素在 f 的 jacobian 中求值,我确实得到
当使用 lsqcurvefit 执行非线性最小二乘法拟合时,将 Jacobian 作为输出(即 [x,resnorm,residual,exitflag,output,lambda,jacobian]
我正在尝试计算 (x,y)=(0,0) 处的雅可比行列式,但无法这样做。 import sympy as sp from sympy import * import numpy as np x,y=s
我正在尝试定义一个 custom gradient in TensorFlow对于返回非标量的函数。 问题的简化玩具版本是: import tensorflow as tf @tf.custom_gr
我正在寻找通过 Pytorch 获取函数雅可比行列式的最有效方法,到目前为止已提出以下解决方案: # Setup def func(X): return torch.stack((X.pow(
我打算在 MCMC 例程中使用 Boost odeint 库来估计 ODE 模型中的参数。由于这些 ODE 可能是刚性的,我需要能够将雅可比矩阵传递到具有导数的求解器中。我想创建一个类,它具有作为私有
我正在 Dymola(基于 modelica 的商业软件)中运行系统模型。模型是关于强制对流下多孔物质的传热和传质。我提出这个问题的问题是关于模型模拟过程中产生的错误。 使用模型的当前设置,可以在给定
我正在尝试实现显示的示例 here . 但是当运行代码并使用 Debug模式时,没有返回值。我假设我没有使用正确的旋转轴。 额外的 Unity 细节: Joints 变量是一个游戏对象数组(由 4 个
import math from scipy.optimize import fsolve def sigma(s, Bpu): return s - math.sin(s) - mat
我目前正在使用 SciPy.optimize 中的最小化 (BFGS) 函数来校准我的模型。校准后,参数会不时受到轻微扰动,我想重新使用之前校准的 Jacobian 和 IHessian 作为我的初始
在 scipy.optimize.root 的文档中对于 method = lm,以下是 options 关键字的默认值。 options={'col_deriv': 0, 'diag': None,
有没有办法让 scipy.optimize.minimize 在每次迭代时打印估计梯度的值?我想将它与我正在计算的分析梯度值进行比较。 最佳答案 您可以为 scipy.optimize.minimiz
我正在尝试用 Python 制作 Newton - CG 优化。我的函数是 f(x,y) =(1-x)^2 + 2(y-x^2)^2。初始点:x = 3,y = 2。这是我的代码: from scip
我正在尝试使用 OpenGL、Eigen3 和 "Jacobian pseudoinverse" 实现简单的反向运动学测试方法。 系统使用“Jacobian transpose”算法运行良好,但是,一
我试图了解“dogleg”方法在 Python 的 scipy.optimize.minimize 中是如何工作的功能。我正在调整帮助页面底部的示例。 根据注释,dogleg 方法需要 Jacobia
在 R 中,当您仅提供优化问题的目标函数和约束时,是否可以通过分析找到雅可比/海森/稀疏模式? AMPL 可以做到这一点,据我所知,即使是 MATLAB 也可以做到这一点,但我不知道您是否需要 Kni
我是一名优秀的程序员,十分优秀!