梯度降低法(Gradient Descendent)是機器學習的核心算法之一,自動微分則是梯度降低法的核心;
梯度降低法用於求損失函數的最優值,前面的文章中咱們說過梯度降低是經過計算參數與損失函數的梯度並在梯度的方向不斷迭代求得極值;可是在機器學習、深度學習中不少求導每每是很複雜的,手動使用鏈式法則求導很容易出錯,藉助於計算機也只能是硬編碼;
這時候就須要藉助於自動微分了,求導主要有這麼四種:手動微分法 、 數值微分法 、 符號微分法 、 自動微分法,這裏分別說說這幾種求導方法;算法
手動微分法(Manual Differentiation)
手動微分法須要咱們手動編寫出代價函數、 激活函數的求導代碼,硬編碼這些函數的求導方法,若是這些函數後面有調整該函數的求導方法又要從新實現,能夠說是又麻煩又容易出錯;
數值微分法(Numerical Differentiation)
經過使用函數值來估計函數的導數,該方法主要是計算速度慢,精度差等問題;
符號微分法(Symbolic Differentiation)
符號微分普遍用在各類數學軟件中如Matlab、Octave等,它通關過使用符號表達式進行求導,符號微分是基於求導法則進行的;框架
如表達式:f(x) = 2y + x^2
表達式樹爲:
機器學習
經過符號微分法求得:函數
符號微分有個缺陷就是獲得的導數不必定是最簡的,函數較爲複雜時表達式樹會很複雜,可能會出現表達式爆炸的狀況出現;性能
自動微分法介於數值微分與 符號微分 之間,數值微分是直接代入數值近似求解而符號微分爲直接經過表達式樹對錶達式進行求解;自動微分先將符號微分用於基本的算子,帶入數值並保存中間結果,後應用於整個函數;自動微分本質上就是圖計算,容易作不少優化因此普遍應用於各類機器學習深度學習框架中;
自動微分又分爲前向模式(Forward mode Autodiff)與 反向模式(Reverse-Mode Atuodiff)求導;學習
前向模式引入二元數(dual number),同時會先將表達式轉換爲計算圖而後會依次從下往上計算每一步的導數,因爲每步都使用了上一步的導數因此不會致使重複計算不會出現像符號微分同樣的表達式膨脹問題,但因爲深度學習的參數比較多因此前向模式的效率仍是有些差;一個前向過程就能夠求出其函數值與導數,下面簡單舉個例子:優化
二元數:a+bꜫ
a與b都是實數,ꜫ爲無窮小的數,且ꜫ^2=0,並知足加分與乘法法則,且還有:
編碼
這樣是要求出f( a+ꜫ)就能夠得出f(a)與f(a)的導數;
仍是上面的表達式:f(x) = 2y + x^2.net
如上圖當x=2,y=3時,咱們能夠得出:二元數 10+4ꜫ,即函數f(x)關於x的偏導數爲:4,函數值爲10;3d
反向模式爲先經過正向遍歷計算圖求出每一個節點的值,而後經過反向遍歷整個圖,計算出每一個節點的偏導,其原理爲微積分鏈式法則,這裏所說的反向模式其實也就是咱們在深度學習中所說的BP算法(反向傳播算法),只須要一個前向傳播、一個反向傳播就能夠求得全部參數的導數,因此性能很高,很是適用於深度學習中的自動求導;
上圖爲通過反向傳播的計算圖,根據鏈式法則:
正如上面所說的,通過一次正向傳播求出全部的節點值後再通過一次反向傳播就求得了全部輸入參數的導數效率很高,並且避免符號微分、數值微分所帶來的問題;目前Tensoflow、MXNet等深度學習框架中也都使用了反向模式實現自動微分只是各類具體算法仍是有很多差別;
文章首發地址:Solinx
http://www.solinx.co/archives/1177
參考資料:
https://blog.csdn.net/aws3217150/article/details/70214422
https://arxiv.org/pdf/1502.05767.pdf