1. 程式人生 > >微積分——自動微分

微積分——自動微分

模式 如果 激活 IT 自動 中間 帶來 函數 bubuko

梯度下降法(Gradient Descendent)是機器學習的核心算法之一,自動微分則是梯度下降法的核心;
  梯度下降法用於求損失函數的最優值,前面的文章中我們說過梯度下降是通過計算參數與損失函數的梯度並在梯度的方向不斷叠代求得極值;但是在機器學習、深度學習中很多求導往往是很復雜的,手動使用鏈式法則求導很容易出錯,借助於計算機也只能是硬編碼;
  這時候就需要借助於自動微分了,求導主要有這麽四種:手動微分法數值微分法符號微分法自動微分法,這裏分別說說這幾種求導方法;

手動微分法(Manual Differentiation)
  手動微分法需要我們手動編寫出代價函數激活函數

的求導代碼,硬編碼這些函數的求導方法,如果這些函數後面有調整該函數的求導方法又要重新實現,可以說是又麻煩又容易出錯;
數值微分法(Numerical Differentiation)
  通過使用函數值來估計函數的導數,該方法主要是計算速度慢,精度差等問題;
符號微分法(Symbolic Differentiation)
  符號微分廣泛用在各種數學軟件中如Matlab、Octave等,它通關過使用符號表達式進行求導,符號微分是基於求導法則進行的;

  如表達式:f(x) = 2y + x^2
  表達式樹為:
    技術分享圖片

  通過符號微分法求得:

  技術分享圖片

  符號微分有個缺陷就是得到的導數不一定是最簡的,函數較為復雜時表達式樹會很復雜,可能會出現表達式爆炸

的情況出現;

自動微分法(Autodiff)

  自動微分法介於數值微分符號微分 之間,數值微分是直接代入數值近似求解而符號微分為直接通過表達式樹對表達式進行求解;自動微分先將符號微分用於基本的算子,帶入數值並保存中間結果,後應用於整個函數;自動微分本質上就是圖計算,容易做很多優化所以廣泛應用於各種機器學習深度學習框架中;
  自動微分又分為前向模式(Forward mode Autodiff)反向模式(Reverse-Mode Atuodiff)求導;

前向模式(Forward mode Autodiff)

  前向模式引入二元數(dual number),同時會先將表達式轉換為計算圖然後會依次從下往上計算每一步的導數,由於每步都使用了上一步的導數所以不會導致重復計算不會出現像符號微分一樣的表達式膨脹問題,但由於深度學習的參數比較多

所以前向模式的效率還是有些差;一個前向過程就可以求出其函數值與導數,下面簡單舉個例子:

  二元數:a+b?
  a與b都是實數,?為無窮小的數,且?^2=0,並滿足加分與乘法法則,且還有:
    技術分享圖片

  這樣是要求出f( a+?)就可以得出f(a)與f(a)的導數;
  還是上面的表達式:f(x) = 2y + x^2

    技術分享圖片

  如上圖當x=2,y=3時,我們可以得出:二元數 10+4?,即函數f(x)關於x的偏導數為:4,函數值為10;

反向模式(Reverse mode autodiff)

  反向模式為先通過正向遍歷計算圖求出每個節點的值,然後通過反向遍歷整個圖,計算出每個節點的偏導,其原理為微積分鏈式法則,這裏所說的反向模式其實也就是我們在深度學習中所說的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

微積分——自動微分