问题标签 [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.
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 一起使用。
julia - 在 Julia 中使用 ForwardDiff 进行自动微分
我在 Julia 中正确使用 ForwardDiff 包时遇到了一些问题。我设法在以下代码块中隔离了我的问题。
简而言之,我定义了函数:
然后我检查该功能是否有效:
然后我尝试使用以下方法获取渐变:
不幸的是,这失败了,我在屏幕上看到:
错误: MethodError:
convert
has 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
我究竟做错了什么?提前致谢。
arrays - 如何处理数值微分中的边界点?
我对超出所使用语言的数值微分有疑问。假设我有一个包含 n 个点 x 和 f(x) 的数组,并且我想取 f(x) 的一阶导数。每种方法都会消耗点,使导数数组比函数短,那么如何以一种聪明的方式“加长”数组。例如,我想使用五点模具进行衍生,即
其中f(n)
是在第 n 个点评估的函数。所以使用这种方法,f'
数组短了 4 个点。我怎样才能以一种聪明的方式延长这个数组,如果有可能产生类似于这个 5 点模板方法的错误?
android - Viewpager 自动滚动没有处理程序 postdelayed 和 setcurrentitem
我想在不使用 setCurrentItem() 函数的情况下实现自动 viewpager 滚动。因为当我将 setcurrentitem() 与 handler.postdelayed() 一起使用时,它会在设置下一个项目后保持不变。我想要一个像 recyclerview 一样的平滑滚动。用viewpager可以实现吗?
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
代码的库/代码示例?我认为我的用例是一个非常常见的用例。
tensorflow - 在TensorFlow中计算n个数据点和k个簇之间的距离
X
是数据点的矩阵,n
按d
形状。W
是一个聚类点矩阵,k
按d
形状。数据点 和每个簇之间的最小距离i
可以计算如下:
在张量流图的方法中如何计算每个数据点和每个簇之间的距离?想到一个 for 循环,但据我了解,张量流中不存在这样的功能。
haskell - 如何部分应用函数以产生多态 rank-1 类型?
我想将一个函数部分应用于f :: T
一个值x :: [Double]
以获得结果函数f' :: forall a . Floating a => [a] -> a
。应该T
是什么?我想不通。
一个困难是,在内部f
,我需要通过一些数学运算(例如添加列表的每个元素)与(我们称之为)x :: [Double]
的第一个参数相结合。f'
y
我在内部知道这一点,x
并且y
两者都是Double
s,所以我最终使用 type f :: forall a . Floating a => [a] -> (forall b . Floating b => [b] -> b)
,并且每当 type 的值与 type组合时unsafeCoerce
在内部使用(我知道,我知道......)。f
a
b
对更好的类型有任何想法f
吗?
forall a . Floating a => [a] -> a
上下文:在部分应用后,我被迫生成更通用的类型,f
因为我需要使用 Haskell autodiff library 获取结果函数的梯度ad
。该grad
库中的函数要求其输入函数具有该通用类型。
(为什么我需要部分应用目标函数?您可以想象这样的函数将具有内部常量,优化器不应将其视为变化状态向量的一部分。黑客可能是将常量视为状态,只是不更新常数,但在这种情况下,梯度的范数不会在局部最小值处变为零,其他事情可能会出错。)
random - Tensorflow:有效地使用不同的随机样本运行相同的计算图
在 Tensorflow 中,计算图可以依赖于随机变量。在随机变量代表分布中的单个样本的情况下,可能会感兴趣的是用 N 个单独的样本计算数量,例如进行方差较小的样本估计。
有没有办法用不同的随机样本运行相同的图,尽可能多地重用中间计算?
可能的解决方案:
- 在循环内创建图形和随机变量。缺点:制作不依赖于随机变量的数量的冗余副本。
- 使用批次维度扩展随机变量。缺点:有点麻烦。似乎 TF 应该能够自动执行某些操作。
- 也许图形编辑器(在 .contrib 中)可用于制作具有不同噪声的副本,但我不确定这是否比循环更好。
- 理想情况下,应该只有一个操作来重新评估随机变量或将依赖项标记为未实现,从而强制它对新数量进行采样。但这很可能是不可能的。
循环策略示例:
iff(x)
是一个昂贵的函数,我只能假设循环会进行大量冗余计算。
symbolic-math - 符号微分和自动微分的区别?
我似乎无法理解其中的区别。对我来说,看起来两者都只是通过一个表达式并应用链式规则。我错过了什么?
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 存储库,我什么也没得到。
他们是使用不同的名称,还是摆脱了温格特列表?如果是这样,怎么做?