機器學習: 共軛梯度算法(PCG)


今天介紹數值計算和優化方法中非常有效的一種數值解法,共軛梯度法。我們知道,在解大型線性方程組的時候,很少會有一步到位的精確解析解,一般都需要通過迭代來進行逼近,而 PCG 就是這樣一種迭代逼近算法。

我們先從一種特殊的線性方程組的定義開始,比如我們需要解如下的線性方程組:

A x = b

這里的 A ( n × n ) 是對稱,正定矩陣, b ( n × 1 ) 同樣也是已知的列向量,我們需要通過 A b 來求解 x ( n × 1 ) , 這其實是我們熟知的一些線性系統的表達式。

直接求解

首先,我們來看一種直觀的解法,我們定義滿足如下關系的向量為關於 矩陣 A 的共軛向量,

u T A v = 0

因為矩陣 A 是對稱正定矩陣,所以矩陣 A 定義了一個內積空間:

u , v A := A u , v = u , A T v = u , A v = u T A v

基於此,我們可以定義一組向量 P

P = { p 1 , , p n }

其中的向量 p 1 , p 2 , … , p n 都是互為共軛的,那么 P 構成了 R n 空間的一個基,上述方程的解 x 可以表示成 P 中向量的線性組合:

x = i = 1 n α i p i

根據上面的表達式,我們可以得到:

A x = i = 1 n α i A p i p k T A x = i = 1 n α i p k T A p i (Multiply left by  p k T ) p k T b = i = 1 n α i p k , p i A ( A x = b  and  u , v A = u T A v ) p k , b = α k p k , p k A ( u T v = u , v  and  i k : p k , p i A = 0 )

這意味着:

α k = p k , b p k , p k A

所以,如果我們要直接求解的,可以先對矩陣 A 進行特征值分解,求出一系列的共軛向量,然后求出系數,最后可以得到方程的解 x

迭代求解

上面的方法已經說明, x 是一系列共軛向量 p 的線性組合,學過 PCA 的都知道,可以用前面占比高的向量組合進行逼近,而不需要把所有的向量都組合到一起,PCG 也是用到了這種思想,通過仔細的挑選共軛向量 p 來重建方程的解 x

我們先來看下面的一個方程:

f ( x ) = 1 2 x T A x x T b , x R n

對上面的方程求導,我們可以得到:

D 2 f ( x ) = A

D f ( x ) = A x b

可以看到,方程的一階導數就是我們需要解的線性方程組,令一階導數為 0,那么我們需要解的就是這樣一個線性方程組了。

假設我們隨機定義 x 的一個初始向量為 x 0 ,那么我們可以定義第一個共軛向量為 p 0 = b A x 0 , 后續的基向量都是和梯度共軛的,所以稱為共軛梯度法。

下面給出詳細的算法流程:

這里寫圖片描述

而 preconditioned conjugate gradient method 與共軛梯度法的不同之處在於預先定義了一個特殊矩陣 M

這里寫圖片描述

參考來源:wiki 百科

https://en.wikipedia.org/wiki/Conjugate_gradient_method#The_preconditioned_conjugate_gradient_method


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM