繁体   English   中英

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

[英]Using CUDA to solve a system of equations in non-linear least squares fashion

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

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

CUDA 库(免费或非免费)中是否提供 Gauss-Newton 非线性最小二乘求解器、Levenberg-Marquardt 或 Powell 方法求解器?

在指出可能的,简单的在CUDA中实现拟牛顿优化例程之前,先说一下拟牛顿优化器的工作原理。

考虑一个由N个实变量x构成的函数f ,并围绕某个点xi进行二阶展开:

在此处输入图片说明

其中A是Hessian矩阵。

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

在此处输入图片说明

这需要

在此处输入图片说明

反过来,这意味着知道黑森州的逆。 此外,为确保功能降低,更新方向

在此处输入图片说明

应该是这样的

在此处输入图片说明

这意味着

在此处输入图片说明

根据上述不等式,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,“ GPU上的并行L-BFGS-B算法”,《 计算机与图形》 ,第1卷。 40,2014,pp.1-9。

在此github页面上 ,可以使用完整的CUDA实现,将使用linminmkbrakdbrent的数值食谱方法dbrent到GPU并行情况。 该方法实现了Polak-Ribiére的方案,但可以轻松地推广到其他拟牛顿优化问题。

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

Nvidia 发布了一个可以做到这一点的函数,称为csrlsvqr ,它在小矩阵上表现良好。 不幸的是,对于大型稀疏矩阵,结果(根据我的经验)一直很差。 它无法收敛于解决方案。

为了解决这个问题,我编写了自己的工具LSQR-CUDA

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

https://developer.nvidia.com/cusparse

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

对于仍在寻找答案的用户,此对象适用于稀疏矩阵:OpenOF,“ GPU上的稀疏非线性最小二乘法优化框架”

对于GPU而言,g2o对CPU而言。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM