使用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的并行情况下采用linmin
, mkbrak
和dbrent
的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