问题标签 [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.
deep-learning - 具有可变大小输入序列的 Pytorch Conv3d
我有一组图像(视频)序列,每个图像(视频)的形状为 [D, H, W],其中每个序列(帧数)的 D 可能不同。以下使用 Conv3d 的方式是否合理?即如果我执行以下操作,自动差异是否正常工作?</p>
现在 h_all 具有以下形状 [K, E] 其中 E 是 conv3d 嵌入大小, K = D1+D2+D3.... 是总帧数。
现在,在 h_all 中的每个单独帧上执行一些下游任务。
c++ - 将 CppADCodeGen 与 CMake FetchContent 或 ExternalProject 一起使用
我不擅长 CMake,我找不到关于如何使用它的FetchContent
功能的好的解释。事实上,大多数存储库似乎都需要不同的处理方式,而这种处理方式的规则让我无法理解。
也就是说,这是我的问题。我想使用 CMake 在我的项目中使用CppADCodeGenFetchContent
。这是我的代码:
这是输出和我得到的错误:
有没有人能够在他们的机器上实现上述目标?如果是,他们会愿意分享他们是如何做到的吗?在上面的错误信息中有几个错误,我已经尝试了一些解决方案,但都没有奏效——我不会列出它们,因为它们没有用!
编辑
@dlivshen 当我将我的库与一个更大的项目集成时,由于目标名称冲突,我遇到了更多问题。这是因为我曾经FetchContent
得到Eigen。所以我决定使用 获取它ExternalProject
,为此我将这些行添加到您在解决方案中提出的CMakeLists.txt.in文件中:
然后,为了使用Eigen,我必须添加${CMAKE_BINARY_DIR}/eigen/include/eigen3
到target_include_directories
命令中。这与我使用时FetchContent
只需要添加Eigen3::Eigen
到target_link_libraries
命令形成对比。这种方法是不可能的ExternalProject
:这个陈述正确吗?如果没有,我该如何实现?
c++ - 使用 STAN 数学对 C++ 中的矩阵进行自动微分
我正在尝试使用 stan 数学库进行反向自动微分,我从这个链接得到了例子
上述函数成功计算了函数 f(x)=||xa||^{2} 的梯度。
相反,是否可以计算矩阵值参数的标量函数的梯度?例如 f(x) = trace( x * transpose(x) ) 其中 x 是一个矩阵?我尝试了以下但它给出了错误
r - 将 Deriv 包用于衍生 wrt 向量
我正在探索 autodiff,我想用它Deriv
来计算函数 wrt 对向量的导数。我写的
有没有人有这样做的好方法?
从help(Deriv)
,似乎应该能够让参数成为一个向量
这是向量长度的副作用。例如,在 Deriv(~a+b x, c("a", "b")) 中,结果是 c(a = 1, b = x)。为了避免 a 和 b 分量的长度不同(当 x 是向量时),可以使用可选参数 combine Deriv(~a+b x, c("a", "b"), combine="cbind" ) 这使得 cbind(a = 1, b = x) 产生一个两列矩阵,这可能是这里想要的结果。
我想避免使每个向量分量成为函数的不同参数。
例如numDeriv
上面的例子让我们很容易得到一个导数 wrt 向量x
r - 用“madness”计算偏导数
如此处所述,这些madness
软件包非常适合 R 中的 autodiff 。
我现在想计算一个导数 wrt y 的导数 wrt x。
$\frac{\partial}{\partial x}\frac{\partial}{\partial y}xy$
如何使用madness
?
更新:实际上我猜这是因素..也许只需将两个导数相乘就可以了吗?也许只有当 x 是 y 的函数时,这才会变得困难。
python - 修改后的最小二乘法适合具有独特错误的python,求解矩阵
我有一个要最小化的超定系统,与线性最小二乘非常相似(但不完全相同)。它是这样的形式:
AX = Y
其中 A 需要为 2x3,因为 X 是 3xN 而 Y 是 2xN。
这就是问题所在:这里的未知数是变换矩阵 A,而不是通常最小二乘公式中的 X。(另外,我会提到在这种情况下 X 和 Y 是矩阵,它们通常是经典最小二乘法中的向量)
更复杂的是,我希望这是一个加权最小二乘法,其中对于 Y 中的每个 2x1 向量(Y 是 2xN,这些向量的堆栈),我有一个 2x1 权重向量,它按元素对 Y 中的向量进行加权(像 np.divide(Y[i], np.square(weights[i])))。
我首先尝试在没有权重的情况下解决问题,而我做到了这一点:
AX = Y
XT * AT = YT
X * XT * AT = X * YT
AT = (X * XT)^-1 * X * YT
A = Y * XT * (X * XT)^-1
这导致了这个 Python 函数:
但是我不能明显地看到这真的最小化了问题的成本函数,所以我不确定它是否真的正确,即使没有权重。
我还尝试将成本函数写为总和,并取一个导数并将其设置为 0,这导致了这个 Python 函数:
这两个函数返回一个非常相似的矩阵,但并不完全相同。如果它们都是真正解决问题的方法,那应该是相同的。我要提到的是,被最小化的空间不是非线性的,而且我非常有信心只有一个最小值。
我想我会走一条更强力的路线,并尝试使用一个名为 JAX 的 autodiff 包,它有自己的 minimize() 函数,与 scipy 非常相似(但以梯度下降的方式),只需将成本函数写出来明确地说,即使有权重。权重只是变成了一堆单位矩阵,然后乘以它们的 Y[i]s,如您所见(我将成本函数称为 myLSQ,然后在其上调用了最小化(),因此它相对于梯度下降A):
但是这个东西运行了 20 多分钟,然后返回一个绝对可怕的矩阵,它没有接近于最小化问题。
我为这篇庞大的文章道歉,但这是我的问题。
为什么我的两种(未加权)方法给出的结果略有不同,我如何将权重添加到它们中?
有一个更好的方法吗?如果是这样,它是什么?
我希望对拟合进行加权,但我不想在以后使用它时给 A 矩阵权重(一旦它正确)。我希望能够只做 AX = Y,在 Y 上没有权重。权重只是为了修改拟合。我该怎么做呢?
python - Jax:对向量值参数的索引求导
Jax 是否支持将导数作为向量值变量的索引?考虑这个例子(a
向量/数组在哪里):
我可以将参数编号传递给grad(..)
,但我似乎无法像上面的示例那样传递向量值参数的索引。我尝试传递一个元组的元组,即
但这不起作用。
python - 从计算运算符/矩阵向量积的代码构造(稀疏)NumPy 数组?
在科学计算中,我们经常需要构建计算微分算子的矩阵。编写应用运算符的代码通常比显式构造矩阵更容易。是否有一个库可以接收代码(假设它只使用线性运算)并输出矩阵,理想情况下是稀疏形式?
例子:
计算“a”向量的有限差分. 我现在想要这样的东西
这应该给我矩阵表示:
拥有矩阵非常有用,例如用于计算转置算子或分析稀疏模式。从技术上讲,应该可以使用自动微分工具并提取 op() 的雅可比行列式,但我没有找到任何有效处理整个雅可比行列式的 AD 库,特别是如果它是稀疏的。他们似乎要么每行一次,要么每列一次雅可比行列式,即使只有几百个变量,这也非常慢。
tensorflow - 关于基于等级的计算的自动微分
我是自动微分编程的新手,所以这可能是一个幼稚的问题。以下是我要解决的问题的简化版本。
我有两个输入数组 - 一个A
size的向量和一个shapeN
的矩阵,以及一个size的参数向量。我定义了一个新数组来获得一个新的 size 向量。然后,我获取落在 的上下四分位数中的元素的索引,并使用它们创建一个新数组和。显然这两个确实依赖于,但是有可能区分和wrt吗?B
(N, M)
theta
M
C(theta) = B * theta
N
C
A_low(theta) = A[lower quartile indices of C]
A_high(theta) = A[upper quartile indices of C]
theta
A_low
A_high
theta
到目前为止,我的尝试似乎表明没有——我使用了 autograd、JAX 和 tensorflow 的 python 库,但它们都返回零梯度。(到目前为止,我尝试过的方法包括使用 argsort 或使用 提取相关子数组tf.top_k
。)
我正在寻求帮助的是证明未定义导数(或无法分析计算)的证据,或者如果确实存在,则提供有关如何估计它的建议。我的最终目标是最小化某些功能f(A_low, A_high)
wrt theta
。
tensorflow - 使用 TensorFlow 中的权重计算方向梯度
我想计算 tf 模型权重的梯度,但只在一个方向:
但它返回以下错误:
我认为这是因为操作model.layers[0].set_weights
不是“可微分的”。
我该如何解决?或者,在 TensorFlow 中,我可以通过直接指定权重来计算层的输出,例如y = layer(x, weights=w)
?