使用CUDA解非线性方程组

使用CUDA,我想用非线性最小二乘法求解一个方程组。 这些方法在一本很好的小册子中进行了讨论,可以在这里下载。

我问题中的雅可比矩阵是稀疏的,下三角形。 有没有CUDA的库可用于这些方法,还是我必须从小册子中自己编写这些方法?

Gauss-Newton非线性最小二乘解法器,Levenberg-Marquardt还是Powell的Method求解器都可以在CUDA库中获得(免费或非免费)?


在指出CUDA中的一个准牛顿优化程序的可能的简单实现之前,先介绍一下准牛顿优化程序是如何工作的。

考虑N个实变量x的函数f,并在某点xi上进行二阶扩张:

其中A是Hessian矩阵。

为了从xi开始找到最小值,牛顿的方法包括强制

这需要

而这又意味着知道Hessian的逆。 此外,为了确保功能减少,更新方向

应该是这样的

这意味着这一点

根据上述不等式,Hessian矩阵应该是肯定的。 不幸的是,Hessian矩阵不一定是正的,特别是远离f的最小值,因此除了计算负担之外,使用Hessian的逆也可能是有害的,推动该过程甚至更远离最小值到增加值的区域f。 一般而言,使用准牛顿法更为方便,即Hessian逆的近似值,它在迭代收敛于Hessian本身的逆之后保持确定的正值并更新迭代。 准牛顿法的粗略理由如下。 考虑

减去两个方程,我们有牛顿过程的更新规则

准牛顿程序的更新规则如下

其中Hi + 1是所提到的矩阵,近似Hessian的逆并且在步骤之后更新步骤。

更新Hi + 1有几条规则,我不会详细讨论这一点。 Broyden-Fletcher-Goldfarb-Shanno提供了一个非常普遍的方法,但是在很多情况下,Polak-Ribiére方案是有效的。

CUDA实现可以遵循经典数值配方方法的相同步骤,但要考虑到:

1)CUDA Thrust或cuBLAS可以有效地完成矢量和矩阵运算; 2)控制逻辑可以由CPU执行; 3)可以在CPU上执行涉及根包围和根结果的线最小化,仅加速GPU的成本函数和梯度评估。

通过上述方案,未知,梯度和Hessian可以保留在设备上,而不需要将它们从主机到设备来回移动。

请注意,文献中还提供了一些方法,其中也尝试了将线最小化并行化,请参阅

Y. Fei,G. Rong,B. Wang,W.Wang,“Parallel L-BFGS-B algorithm on GPU”,Computers&Graphics, 2014年4月40日,第1-9页。

在这个github页面上,提供了一个完整的CUDA实现,将GPU的并行情况下采用linminmkbrakdbrent的Numerical Recipes方法推广。 该方法实现了Polak-Ribiére的方案,但可以很容易地推广到其他准牛顿优化问题。


再看一看:libflame包含BLAS和LAPACK库提供的许​​多操作的实现


在任何使用CUDA平台的非线性最小二乘解算器实现求解方程组的程序库中,目前没有任何程序可用。 这些算法必须从头开始编写,在其他一些使用稀疏矩阵实现线性代数的库的帮助下完成。 另外,正如在上面的评论中提到的,cuBLAS库将帮助线性代数。

https://developer.nvidia.com/cusparse

http://code.google.com/p/cusp-library/

链接地址: http://www.djcxy.com/p/65717.html

上一篇: Using CUDA to solve a system of equations in non

下一篇: Namespace Trouble