问题标签 [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.

0 投票
0 回答
1369 浏览

python - 如何创建与 NumPy ufuncs 兼容的类数组类?

我正在尝试使用行为类似于 NumPy 数组的类来实现自动微分。没有子类numpy.ndarray,但包含两个数组属性。一个用于值,一个用于雅可比矩阵。每个操作都被重载以对值和雅可比进行操作。但是,我无法让 NumPy ufunc(例如,np.log)在我的自定义“数组”上工作。

我创建了以下最小示例来说明问题。Two应该是 NumPy 数组的抗辐射版本,它计算所有内容两次,并确保结果相等。

它必须支持索引、元素对数和长度。就像一个正常的ndarray. 元素级对数在调用 using 时工作正常x.cos(),但在调用 using 时会出现意想不到的结果np.cos(x)

正如预期的那样,索引从两个属性返回相关元素:

使用以下方法调用时,逐元素对数工作得很好x.cos()

但是,np.log(x)没有按预期工作。它意识到对象是有长度的,所以它提取每一项并对每一项取对数,然后返回一个由两个对象组成的数组(dtype=object)。

如果Two没有长度方法,它工作得很好:

如何创建满足要求的类(getitem、log、len)?我研究了 subclassing ndarray,但这似乎比它的价值更复杂。

另外,我在 NumPy 源代码中找不到 x.__len__访问的位置,所以我也对此感兴趣。

编辑:我将 miniconda2 与 Python 2.7.11 和 NumPy 1.11.0 一起使用。

0 投票
1 回答
632 浏览

julia - 在 Julia 中使用 ForwardDiff 进行自动微分

我在 Julia 中正确使用 ForwardDiff 包时遇到了一些问题。我设法在以下代码块中隔离了我的问题。

简而言之,我定义了函数:

然后我检查该功能是否有效:

然后我尝试使用以下方法获取渐变:

不幸的是,这失败了,我在屏幕上看到:

错误: MethodError: converthas no method matching convert(::Type{Float64}, ::ForwardDiff.Dual{2,Float64}) 这可能是由于调用构造函数 Float64(...) 引起的,因为类型构造函数回退转换方法。最接近的候选者是:
call{T<:AbstractFloat}(::Type{T<:AbstractFloat}, ::Real, ::RoundingMode{T}) call{T}(::Type{T}, ::Any)
convert (::Type{Float64}, ::Int8) ... 可能无:10 匿名无:1

我究竟做错了什么?提前致谢。

0 投票
1 回答
406 浏览

arrays - 如何处理数值微分中的边界点?

我对超出所使用语言的数值微分有疑问。假设我有一个包含 n 个点 x 和 f(x) 的数组,并且我想取 f(x) 的一阶导数。每种方法都会消耗点,使导数数组比函数短,那么如何以一种聪明的方式“加长”数组。例如,我想使用五点模具进行衍生,即

其中f(n)是在第 n 个点评估的函数。所以使用这种方法,f'数组短了 4 个点。我怎样才能以一种聪明的方式延长这个数组,如果有可能产生类似于这个 5 点模板方法的错误?

0 投票
1 回答
300 浏览

android - Viewpager 自动滚动没有处理程序 postdelayed 和 setcurrentitem

我想在不使用 setCurrentItem() 函数的情况下实现自动 viewpager 滚动。因为当我将 setcurrentitem() 与 handler.postdelayed() 一起使用时,它会在设置下一个项目后保持不变。我想要一个像 recyclerview 一样的平滑滚动。用viewpager可以实现吗?

0 投票
1 回答
151 浏览

haskell - 最小 Numeric.AD 示例无法编译

我正在尝试从 Numeric.AD 编译以下最小示例:

我遇到了这个错误:

关于为什么会发生这种情况的任何线索?通过查看前面的示例,我了解到这是“扁平化”grad的类型:

grad :: (Traversable f, Num a) => (forall s. Reifies s Tape => f (Reverse s a) -> Reverse s a) -> f a -> f a

但我实际上需要在我的代码中做这样的事情。事实上,这是不会编译的最小示例。我想做的更复杂的事情是这样的:

这是一个稍微复杂的版本,带有可以编译的类型签名。

但是,我不知道如何在代码中使用第一个版本 ,grad2因为我不知道如何处理Reverse s a. 第二个版本 ,grad2'具有正确的类型,因为我使用内部构造函数Lift来创建 a Reverse s a,但我一定不了解内部结构(特别是参数s)是如何工作的,因为输出梯度全为 0。使用其他构造函数Reverse(此处未显示)也会产生错误的渐变。

或者,是否有人们使用过ad代码的库/代码示例?我认为我的用例是一个非常常见的用例。

0 投票
1 回答
594 浏览

tensorflow - 在TensorFlow中计算n个数据点和k个簇之间的距离

X是数据点的矩阵,nd形状。W是一个聚类点矩阵,kd形状。数据点 和每个簇之间的最小距离i可以计算如下:

在张量流图的方法中如何计算每个数据点和每个簇之间的距离?想到一个 for 循环,但据我了解,张量流中不存在这样的功能。

0 投票
0 回答
84 浏览

haskell - 如何部分应用函数以产生多态 rank-1 类型?

我想将一个函数部分应用于f :: T一个值x :: [Double]以获得结果函数f' :: forall a . Floating a => [a] -> a。应该T是什么?我想不通。

一个困难是,在内部f,我需要通过一些数学运算(例如添加列表的每个元素)与(我们称之为)x :: [Double]的第一个参数相结合。f'y

我在内部知道这一点,x并且y两者都是Doubles,所以我最终使用 type f :: forall a . Floating a => [a] -> (forall b . Floating b => [b] -> b),并且每当 type 的值与 type组合时unsafeCoerce在内部使用(我知道,我知道......)。fab

对更好的类型有任何想法f吗?

forall a . Floating a => [a] -> a上下文:在部分应用后,我被迫生成更通用的类型,f因为我需要使用 Haskell autodiff library 获取结果函数的梯度ad。该grad库中的函数要求其输入函数具有该通用类型。

(为什么我需要部分应用目标函数?您可以想象这样的函数将具有内部常量,优化器不应将其视为变化状态向量的一部分。黑客可能是将常量视为状态,只是不更新​​常数,但在这种情况下,梯度的范数不会在局部最小值处变为零,其他事情可能会出错。)

0 投票
0 回答
124 浏览

random - Tensorflow:有效地使用不同的随机样本运行相同的计算图

在 Tensorflow 中,计算图可以依赖于随机变量。在随机变量代表分布中的单个样本的情况下,可能会感兴趣的是用 N 个单独的样本计算数量,例如进行方差较小的样本估计。

有没有办法用不同的随机样本运行相同的图,尽可能多地重用中间计算?

可能的解决方案:

  • 在循环内创建图形和随机变量。缺点:制作不依赖于随机变量的数量的冗余副本。
  • 使用批次维度扩展随机变量。缺点:有点麻烦。似乎 TF 应该能够自动执行某些操作。
  • 也许图形编辑器(在 .contrib 中)可用于制作具有不同噪声的副本,但我不确定这是否比循环更好。
  • 理想情况下,应该只有一个操作来重新评估随机变量或将依赖项标记为未实现,从而强制它对新数量进行采样。但这很可能是不可能的。

循环策略示例:

iff(x)是一个昂贵的函数,我只能假设循环会进行大量冗余计算。

0 投票
3 回答
10771 浏览

symbolic-math - 符号微分和自动微分的区别?

我似乎无法理解其中的区别。对我来说,看起来两者都只是通过一个表达式并应用链式规则。我错过了什么?

0 投票
3 回答
1738 浏览

tensorflow - TensorFlow 中的温格特列表在哪里?

TensorFlow 使用反向模式自动微分(反向模式 AD),如https://github.com/tensorflow/tensorflow/issues/675所示。

反向模式 AD 需要一个称为 Wengert 列表的数据结构 - 请参阅https://en.wikipedia.org/wiki/Automatic_differentiation#Reverse_accumulation

但是,使用关键字“Wengert List”搜索 TensorFlow 存储库,我什么也没得到。

他们是使用不同的名称,还是摆脱了温格特列表?如果是这样,怎么做?