簡體   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