![](/img/trans.png)
[英]non-linear optimization on the GPU (CUDA) without data transfer latency
[英]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实现,将使用linmin
, mkbrak
和dbrent
的数值食谱方法dbrent
到GPU并行情况。 该方法实现了Polak-Ribiére的方案,但可以轻松地推广到其他拟牛顿优化问题。
还要看一下: libflame包含BLAS和LAPACK库提供的许多操作的实现。
当前在任何库中都没有可用的程序来实现使用CUDA平台使用非线性最小二乘法求解器求解方程组的过程。 这些算法必须从头开始编写,并需要其他一些使用稀疏矩阵实现线性代数的库的帮助。 同样,如上面的评论中所述,cuBLAS库将有助于线性代数。
对于仍在寻找答案的用户,此对象适用于稀疏矩阵:OpenOF,“ GPU上的稀疏非线性最小二乘法优化框架”
对于GPU而言,g2o对CPU而言。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.