概述
最優化問題中很多算法,包括非線性最優化、非線性等式等都需要計算導數。簡單函數可以直接進行人工計算或者編碼實現,對於複雜的情況,需要尋找一些方法進行計算或者近似。本節主要內容包括
1. 常見導數求解方法
2. 有限差分方法
3. 自動微分方法
4. 總結
常見導數求解方法
有限差分方法(Finite Differencing)
根據導數的定義,導數表示函數在給定點x處,給定無限小的涉動後函數值的改動。因此我們可以根據定義,在給定點x處給定一個無限小的抖動,看函數值的變化率,即
自動微分方法
基本思路就是將複雜的函數分解爲基本函數以及基本運算,然後通過構建有向無環圖進行求解。常見函數導數求解方法
另外就是導數運算法則,例如函數加、減、乘除以及鏈式法則的應用。
符號微分法
有限微分近似算法
基礎思想是泰勒定理和Lipschitz連續。介紹如下:
1. 泰勒公式:
2. Lipschitz continuous: 對任意的x和x2
有限微分近似算法主要是基於導數定義,在給定點x處給定一個無限小的改動,看函數的變化。
前向微分
定義:
∂f(x)∂xi≈f(x+ϵei)−f(x)ϵ
對於n維的向量,需要計算量爲(n+1)
方法推導
根據泰勒公式:
假設
可見誤差和無限小的改動相關。
在用計算機解決問題時,需要注意的是計算機浮點數本身就會有誤差,例如對於double類型,該誤差爲u=1.1*10^(-16)。此時
中心微分方法
定義
∂f∂xi≈f(x+ϵei)−f(x−ϵei)2ϵ
對於N維向量,需要進行(2N+1)次運算
方法推導
該方法的基礎就是函數必須能保證二級導數存在並且滿足Lipschitz連續,此時根據泰勒公式
變換後有
代入
兩個等式相減,同時兩端同時除以
可見相比於前向微分,它的誤差變成
應用
雅克比矩陣(Jacobian)
定義,對於函數向量r:
根據有限微分的定義可以擴展到函數向量上
對於某些稀疏的矩陣,可以將不相交的變量進行分類,一次計算可以得到多列。
Hessian矩陣
Hessian矩陣是對稱的,如果按照優先微分的方法得到的Hessian矩陣可能不是對稱的,可以通過對稱位置取平均的方法。
對於很多重要的算法,需要求解的是Hessian和某向量的乘積,根據泰勒公式有
如果需要計算Hessian矩陣本身,則根據
代入
對於稀疏的Hessian矩陣,可以利用Hessian對稱原理得到高效算法。
自動微分方法
根據前面的介紹,自動微分方法的主要思路是將複雜函數分解成簡單函數的簡單運算,然後合成最終的結果。主要有前向模式和後向模式,分別介紹如下。
在進行算法之前,一般需要將複雜函數表示成簡單函數以及運算的有向無環圖,例如:
圖示爲
在實際應用中不需要人工構建該圖。
前向模式
從前向後依次計算各個節點對目標節點的導數,思路是鏈式規則。
例如
如果計算了所有的
後向模式
和前向模式相反,根據節點的孩子節點計算得到該節點的導數,BP算法和圖置信傳播都是利用該思想。
對比
- 對於結果是實數的函數,即
f:Rn→R ,此時後向方式效率更高,對於函數向量,即f:Rn→Rm ,兩者效率差不多 - 對於存儲空間,後向模式需要保存所有的中間導數結果,可以通過一些優化算法進行優化,例如check pointing
總結
通過該小結的學習,可以瞭解到
1. 常見計算導數的方法
2. 有限微分原理和可選方法
3. 自動微分原理和可選方法
4. 應用到計算梯度、雅克比矩陣或者Hessian矩陣,以及稀疏情況下如何優化。