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

使用CUDA以非线性最小二乘法求解方程组,cuda,gpu,linear-algebra,mathematical-optimization,hessian-matrix,Cuda,Gpu,Linear Algebra,Mathematical Optimization,Hessian Matrix,使用CUDA,我想用非线性最小二乘解算器来解方程组。这些方法在一本优秀的小册子中进行了讨论,可以下载 问题中的雅可比矩阵是稀疏的下三角矩阵。有没有一个库可以为CUDA提供这些方法,或者我必须自己从手册中编写这些方法 CUDA库中是否有Gauss-Newton非线性最小二乘解算器、Levenberg-Marquardt或Powell方法解算器(免费或非免费)?目前,任何库中都没有使用CUDA平台使用非线性最小二乘解算器解算方程组的程序。这些算法必须在其他实现稀疏矩阵线性代数的库的帮助下从头开始编写

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

问题中的雅可比矩阵是稀疏的下三角矩阵。有没有一个库可以为CUDA提供这些方法,或者我必须自己从手册中编写这些方法


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

目前,任何库中都没有使用CUDA平台使用非线性最小二乘解算器解算方程组的程序。这些算法必须在其他实现稀疏矩阵线性代数的库的帮助下从头开始编写。此外,正如上面的评论所提到的,库布拉斯图书馆将帮助学习线性代数


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

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

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

其中A是Hessian矩阵

从一个点席开始寻找最小值,牛顿的方法包括强迫< /P>

这意味着

反过来,这意味着要知道黑森曲线的倒数。此外,为了确保功能减少,更新方向

应该是这样的

这意味着

根据上述不等式,Hessian矩阵应该是正定的。不幸的是,Hessian矩阵不一定是确定的正矩阵,特别是远离f的最小值,因此使用Hessian矩阵的逆矩阵,除了计算上的负担外,也可能是有害的,这将程序从最小值进一步推向f值增加的区域。 一般来说,使用拟牛顿法更方便,即Hessian逆函数的近似值,该方法保持确定的正值,并在迭代后更新迭代,使其收敛到Hessian逆函数本身。 拟牛顿法的粗略证明如下。考虑

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

拟牛顿过程的更新规则如下

其中,Hi+1是所述矩阵,近似于Hessian的逆矩阵,并一步一步地更新

更新Hi+1有几个规则,我不打算详细介绍这一点。政府提供了一个非常常见的方案,但在许多情况下,该方案足够有效

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

1) 矢量运算和矩阵运算可通过CUDA推力或cuBLAS有效完成; 2) 控制逻辑可由CPU执行; 3) 线最小化,包括根括号和根发现,可以在CPU上执行,只加快GPU的成本函数和梯度评估

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

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

费玉荣,王宝荣,王文华,“GPU上的并行L-BFGS-B算法”,计算机与图形学,2014年第40卷,第1-9页


此时,可以使用完整的CUDA实现,将采用
linmin
mkbrak
dbrent
的数字配方方法推广到GPU并行情况。该方法实现了Polak-Ribiére的方案,但可以很容易地推广到其他准牛顿优化问题。

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


g2o对CPU的作用就如同g2o对CPU的作用一样。

可能有助于线性化-algebra@adray:谢谢!是否有任何优化过程也可用,可能在另一个库中?谢谢,dreamcrash;libflame很有趣,你是对的;任何实现都是从数学开始的,很高兴看到代码的参考版本可用。@NicholasKinar应该注意,github页面上链接的方法实现了Polak Ribiére的方案,但可以很容易地推广到其他准牛顿优化问题。我已经在对我的回答的编辑中明确说明了这一点。