使用CUDA以非线性最小二乘方式求解方程组

时间:2012-11-07 20:28:08

标签: cuda gpu linear-algebra mathematical-optimization hessian-matrix

使用CUDA,我想用非线性最小二乘求解器求解一个方程组。这些方法在一本优秀的小册子中讨论,可以下载here

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

高斯 - 牛顿非线性最小二乘求解器,Levenberg-Marquardt或Powell的方法求解器是否可用于CUDA库(免费或非免费)?

4 个答案:

答案 0 :(得分:7)

在指出CUDA中准牛顿优化例程的可能简单实现之前,有些关于准牛顿优化器如何工作的话。

考虑 N 实变量 x 的函数 f ,并围绕某个点 xi :

enter image description here

其中 A 是Hessian矩阵。

要找到从 xi 点开始的最小值,Newton的方法包括强制

enter image description here

需要

enter image description here

反过来暗示了解Hessian的逆。此外,为了确保功能减少,更新方向

enter image description here

应该是

enter image description here

暗示

enter image description here

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

enter image description here

enter image description here

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

enter image description here

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

enter image description here

其中 Hi + 1 是提到的矩阵,近似于Hessian的逆矩阵并逐步更新步骤。

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

CUDA实施可以遵循经典Numerical Recipes方法的相同步骤,但考虑到:

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

通过上述方案,可以在设备上保留未知数,梯度和Hessian,而无需在主机之间来回移动它们。

请注意,文献中还提供了一些方法,其中也提出了并行化线路最小化的方法,参见

ÿ。 Fei,G。Rong,B。Wang,W。Wang,“GPU上的并行L-BFGS-B算法”, Computers&图形,第一卷40,2014,pp.1-9。

在此github page处,可以使用完整的CUDA实现,将使用linminmkbrakdbrent的数字食谱方法概括为GPU并行案例。这种方法实现了Polak-Ribiére的方案,但可以很容易地推广到其他准牛顿优化问题。

答案 1 :(得分:1)

另请参阅:libflame包含BLAS和LAPACK库提供的许​​多操作的实现

答案 2 :(得分:0)

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

https://developer.nvidia.com/cusparse

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

答案 3 :(得分:0)

对于那些仍在寻找答案的人来说,这个是稀疏矩阵:OpenOF,“GPU上稀疏非线性最小二乘优化的框架”

GPU是什么g2o到CPU。