问题标签 [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.
netbeans - 在 NetBeans 8 中更改 fortran 编译顺序
我在 CentOS 7 上的 NetBeans 8 中工作,以更改一些旧的 fortran 代码,以使用OpenAD的自动微分替换数值微分。OpenAD 将一个带注释的 fortran 函数作为输入,并生成一个自动微分函数作为输出。该输出功能取决于 OpenAD 提供的一些模块。
在将原始文件添加到 NetBeans 项目、生成 OpenAD 输出函数并将该输出及其依赖项添加到项目后,项目将不会构建。
OAD_active.f90
是 OpenAD 插入和提供的依赖项之一。如果我先编译该文件,然后构建项目(不清理),则构建成功。
如何告诉 NetBeans 在构建过程中尽快编译 OAD_active.f90?
haskell - Numeric.AD - 类型变量逃脱其范围
我正在尝试在 Haskell 中使用自动微分来解决非线性控制问题,但是在让它工作时遇到了一些问题。我基本上有一个cost
功能,应该在给定初始状态的情况下对其进行优化。类型有:
这会导致以下错误消息:
我什至不确定我是否正确理解了错误。是否需要访问的类型ref
和plant
需要访问s
的第一个参数的范围内gradientDescent
?
有可能完成这项工作吗?在寻找解决方案时,我尝试将问题简化为最小示例,发现以下定义会产生类似的错误消息:
这看起来很奇怪,因为optimize = gradientDescent
不会产生任何错误。
c++ - 基于哈密顿力学的物理引擎
我正在尝试实现一个基于汉密尔顿力学的物理引擎。面临几个问题,例如
- 区分 H 函数
- 部分评估 H 函数的偏导数以有效使用龙格-库塔方法
我决定将函数表示为 struct (对表示为 struct的函数的部分评估)。
然而,将 C++ 模板的代码与标准 C++ 代码结合起来是很困难的。此外,评估结构函数似乎比相应的标准函数花费至少 2 倍的时间。
所以我问 Stackoverflow 社区,我应该保持我的方法还是改变它。
编辑
我使用 g++ 并从命令行编译:
g++ -std=c++14 -IC:\Hudba\include Stin.cpp Tma.cpp -LC:\Hudba\lib -lglfw3 -lglew32 -lglu32 -lopengl32 -lkernel32 -luser32 -lgdi32 -lws2_32。
为了部分评估结构函数,我需要向它传递一个在编译时未知的值数组,而使用模板是不可能的。
c - Matlab Coder生成的C代码的自动微分
我有一个 Matlab 函数,我需要 1)加速 2)通过自动微分(AD)生成函数的导数。
我通过使用 Matlab Coder 生成 C 代码和 mex 函数来完成加速部分。现在我正在寻找一个开箱即用(或进行少量代码修改)的 AD 工具,可用于自动生成的 C 代码。那里似乎有很多 C/C++ AD 工具,请参阅C/C++ AD 工具,为此我测试了几个:
- Tapenade:不适用于 Matlab Coder 生成的文件
- ADOL-C:需要将C函数重写为一些特定的数据类型(我想很多工具都有这样的要求)
有没有人有使用 Matlab Coder 生成代码的这些工具的经验?
PS。AD 工具应该可以在 Windows 上运行。
performance - 优化一个产生过多垃圾的列表函数(不是堆栈溢出)
我有那个 Haskell 函数,这导致了我的程序所有分配的 50% 以上,导致 GC 占用了我 60% 的运行时间。我用一个小堆栈 ( -K10K
) 运行,所以没有堆栈溢出,但我可以让这个函数更快,分配更少吗?
这里的目标是计算矩阵与向量的乘积。例如,我不能使用hmatrix
,因为这是使用ad
自动区分包的更大功能的一部分,所以我需要使用Num
. 在运行时,我想使用Numeric.AD
模块意味着我的类型必须是Scalar Double
.
基本上,我们循环遍历矩阵,将累加器相乘和相加,直到到达向量的末尾,存储结果,然后再次继续重新启动向量。我有一个quickcheck
测试验证我得到的结果与 hmatrix 中的矩阵/向量积相同。
我已经尝试过foldl
,foldr
等。我尝试过的任何方法都没有使功能更快(并且有些事情foldr
会导致空间泄漏)。
运行分析告诉我,除了这个函数是花费大部分时间和分配的地方之外,还有很多Cells
被创建的负载,它是包Cells
中的一种数据类型ad
。
运行一个简单的测试:
这在我的机器上告诉我 GC 有 47% 的时间都在忙。
有任何想法吗?
tree - 复杂的树结构导致 GC 无限期暂停
我正在做一些机器学习自学,目前我正在实施反向模式自动微分作为实践。
该程序的工作方式本质上是重载常用表达式,如乘法、加法等,并构建一棵树,其节点随后将在从上到下的反向传递中被调用。这可能是我第一次在 F# 中使用闭包,我非常喜欢它们,但不幸的是,我怀疑它们会阻塞 GC,尽管我不知道如何验证这一点。我宁愿先在这里问,也不愿重新设计算法,所以它不使用它们,因为它们非常方便。
所述树在程序运行期间建立了很多次,我指望垃圾收集器来处理它。
程序的底部是在 XOR 问题上训练 2 层网络的主循环。在循环之前或循环之后调用 GC.Collect() 然后再次运行它会导致它无限期中断。
这是我正在使用的数据结构。我想要一些建议,我的预感是否正确,我应该重新设计算法以不使用闭包或其他东西是否有问题。
它使用了许多功能,如下面的一个。sgemm 是 cuBLAS sgemm 包装器。fl out 和 fr out 是闭包。它们很方便,但 GC 可能会发现清理树具有挑战性。
理想情况下,我会重用树,但因为 AD 可以通过循环和分支传播错误梯度,这不是一个选项,并且程序必须进行大量动态分配,即使它很慢。关于如何有效处理这些树的任何建议?
谢谢。
这是带有完整程序的Github 页面的链接。
编辑:我已将代码转换为不使用闭包,但它仍然在垃圾收集时崩溃。我不确定引擎盖下发生了什么。
Edit2:我终于想到使用调试器,我看到 Alea 库抛出了“System.AccessViolationException”。这可能与我在 sum 模块中报告的早期错误有关。事实上,我之前看到过一两次未对齐的访问,但我的大脑出于某种原因忽略了它。明天我会尝试隔离错误。
Edit3:解决了这个问题。这是由于错误的 Alea reduce 模块造成的,与我使用的闭包或树结构无关。
此外,我已经验证没有理由不使用闭包,因为与显式传递参数相比,它们不涉及任何类型的性能损失。这很好,也很令人惊讶。
automatic-differentiation - 理解高阶自动微分
最近刚刚完成了用于机器学习目的的基本反向模式 AD,我发现自己想了解该领域,但我遇到了高阶方法的难关。
基本的反向广告非常简单易懂,但更高级的材料太抽象,太技术化,我在互联网上找不到任何好的解释(实际上我花了很多时间才实现基本的反向AD甚至存在。)
基本上,我了解如何在微积分的上下文中取二阶导数,但我不明白如何转换反向 AD 图以获得二阶导数。
在像edge_pushing这样的算法中,这些虚线连接是什么意思?
我调查了库 DiffSharp 并且我注意到它使用诸如正反向微分之类的东西来计算 Hessian。运行,通过调试器,我真的看到它实际上在一次运行中混合了正向和反向步骤。该机制背后的原理是什么?
DiffSharp 使用 jacobian-vector 积来计算每个变量的 Hessian,这是一个 R^m -> R^n 映射。这怎么可能从原始图表中得到呢?反向 AD 是一个 R -> R^n 映射,额外的维度从何而来?
最后,嵌套 AD 是如何工作的?
python-2.7 - Theano 在计算梯度方面的效率/智能程度如何?
假设我有一个具有 5 个隐藏层的人工神经网络。暂时忘记神经网络模型的细节,例如偏差、使用的激活函数、数据类型等等......。当然,激活函数是可微的。
通过符号微分,以下计算目标函数相对于层权重的梯度:
这样,为了计算 wrt w1的梯度,必须首先计算 wrt w2、w3、w4 和 w5 的梯度。与计算 wrt w2的梯度类似,必须首先计算 wrt w3、w4 和 w5 的梯度。
但是,我可以使用以下代码计算每个权重矩阵的梯度:
我想知道,这两种方法在性能方面有什么区别吗?Theano 是否足够智能,可以避免使用第二种方法重新计算梯度?智能我的意思是计算 w3_grad,Theano 应该 [preferably] 使用 w_output_grad、w5_grad 和 w4_grad 的预先计算的梯度,而不是再次计算它们。
haskell - Haskell中关于矩阵列表的自动微分(AD)
我试图了解如何Numeric.AD
在 Haskell 中使用(自动微分)。
我定义了一个简单的矩阵类型和一个以数组和两个矩阵作为参数的标量函数。我想使用 AD 来获取评分函数相对于两个矩阵的梯度,但我遇到了编译问题。这是代码
最后一行(sc2 上的 grad)给出以下错误:
我不明白实际看到的类型中的“矩阵矩阵”来自哪里。我正在grad
使用 sc2 的 curried 版本,使其成为 Matrix 列表中的一个函数。
注释掉两条违规行运行没有问题,即第一个梯度有效并且被正确计算(我将 [1,2,3] 作为程序的输入提供):
这两个错误都是一个问题。我想取任何此类sc2
评分函数的梯度,具体取决于在任何给定“点”xin 处评估的矩阵数组。显然,我对 AD 库的理解还不够好。任何帮助,将不胜感激。