機器學習--基礎--微分

機器學習中用到的微分

背景

機器學習中尤其是深度學習用到的數學基礎首推微分。機器學習中優化問題的解決大多數情況下同微分有關,比如牛頓法,梯度下降法;深度學習中就更不用說了,整個深度學習框架(tensorflow,pytoch等等)的基石,或者說首要處理的問題就是自動微分,pytorch的前身Chainer名字的來源更是微分中的鏈式罰則。可見理解機器學習中的微分有多重要。這篇博客主要來自於鏈接內容。

現有常見微分方式梳理

常見的求解微分的方式有以下幾種,各有各的特點:

  • 手動微分:是指在較爲簡單的函數表達下通過手動推導出微分的形式,然後將具體點代入,比如y=xy=x它的微分我們通過微分定理推得出就是1

  • 數值微分:數值微分是利用微分定義dy=f(dx)dy = f(dx)的形式進行極限推導,注意這裏的推導不是上述的手動推導形式,而是利用微分的定義
    [f(x)f(x+σ)]/(σ) [f(x)-f(x+\sigma)]/(\sigma)
    其中σ\sigma趨近於0

  • 符號微分:利用微分的鏈式法則進行微分求導
    h(x)=g(x)f(x) h(x)=g(x)f(x)
    dh(x)dx=df(x)dxg(x)+dg(x)dxf(x) \frac{dh(x)}{dx}=\frac{df(x)}{dx}g(x)+\frac{dg(x)}{dx}f(x)

  • 自動微分法:現有的廣泛運用於機器學習中的微分方法

這裏羅列了幾種微分方法,各有優缺點。
很明顯第一種方法對操作者的數學能力以及函數的形式有一定的要求,僅僅是較爲簡單的函數可以用這樣的方式進行處理,如果函數非解析或者函數形式過於複雜,採用這種方法就無從計算。第二種方法存在巨大的隱患,真正在計算機領域我們知道會存在截斷誤差與累積誤差,並且一般情況下如下圖所示:
圖片
假設採用的是中心求微分的方式(center difference)
f(x)xi=f(x+hϵ)f(xhϵ)2h+O(h2) \frac{\partial f(x)}{\partial x_i} = \frac{f(x+h\epsilon)-f(x-h\epsilon)}{2h}+O(h^2)
那麼從上面可以看出引入的誤差是非常巨大的。綜合來看,計算機領域採用的微分方式只能是後兩種。
第三種方案,符號微分的方案也並不是非常完美,以下面的示例爲例:
圖片
可以看出,當函數簡單時dfdx\frac{df}{dx}的形式比較簡單,但是從鏈式法則的定義來看,無論如何dfdx\frac{df}{dx}的形式不會比f(x)f(x)簡單,尤其是f(x)f(x)較爲複雜時,比如64x(1x)(12x)2(18x+8x2)264x(1-x)(1-2x)^2(1-8x+8x^2)^2其微分形式更加複雜;這實際上爲計算機的存儲資源開銷帶來巨大挑戰,尤其是當函數形式複雜時,所以符號微分也不是最好的選擇。

自動微分

這裏自動微分與符號微分相關,但是並不如上述那樣作爲一個整體進行求解;自動微分是基於一個有向圖來進行求解,有forward和backward兩種形式。比如對於這樣的一個函數f(x1,x2)=ln(x1)+x1x2sin(x2)f(x_1,x_2)=ln(x_1)+x_1x_2-sin(x_2),自動微分將其拆解爲下面圖的形式:
圖片
這裏每個節點代表一個操作,一個可微分的操作,比如:

  • v1v_{-1}:v1=x1v_{-1}=x_1 賦值操作
  • v0v_{0}:v0=x2v_0=x_2 賦值操作
  • v1v_1:ln(x1)ln(x_1) 在賦值操作後,獲取v1v_{-1}節點信息,並進行對數操作
  • v2v_2:x1×x2x_1\times x_2 在獲取兩個節點信息後,進行乘法操作
  • v3v_3:sin(x2)sin(x_2) 在獲取上一節點信息後,進行正弦操作
  • v4v_4:ln(x1)+x1x2ln(x_1)+x_1x_2 在獲得上兩個節點信息後,進行加和操作
  • v5v_5:ln(x1)+x1x2sin(x2)ln(x_1)+x_1x_2-sin(x_2) 在獲得上兩個節點信息後,進行加和操作
    這樣首先是將一個函數的各種操作進行分解成可微分的子操作。總結,自動微分首先有兩個要點:
  1. 拆分各個計算項
  2. 確保這些計算項可微分

如果我們不看後面具體的做法,那麼僅僅拆分到這一步,實際上就可以針對每一個節點進行求微分,求的方式有上面那三種都可以,因爲拆分到每一個節點上的具體操作都是較爲簡單的;然後按照鏈式法則將其意義集合起來就行。
常見的用來處理自動微分的方法在基於上述有向無環圖時有forward和backward兩種方法。

forward 方法

前向方法,簡單來說就是從自變量x出發進行微分求導。下面就是針對上述問題的前向求導過程
在這裏插入圖片描述
這個過程其實可以通過jacobian 矩陣的形式來進行表述,這裏不再進行贅述。但是forward方法在處理諸如深度神經網絡時往往會帶來更多的計算開銷(當然這裏看不出來,我沒自己寫過forward方法,所以也沒有深入分析過),因而實際運用中最常見的是下面的backward方法

backward方法

回溯法,簡而言之就是從因變量開始反推回去進行的計算,還是以上面的例子爲例:
圖片
實際計算步驟:
圖片
注意上表右邊是從下往上,推到最後。我們這裏分析一下從下往上的步驟:

  1. 在v5 看來:v5=v4v3v5=v4-v3,因此v5v4=1\frac{\partial v_5}{\partial v_4}=1,v5v3=1\frac{\partial v_5}{\partial v_3}=-1
  2. 在v4看來:v4=v1+v2v_4=v_1+v_2,類似的,有兩個偏微分都爲1
  3. 在v3看來v3=sin(v0)v_3 = sin(v_0),則有cos(v0)cos(v_0),將5代入則有0.2836
  4. 在v2看來v1×v0v_{-1}\times v_0兩個部分構成,因此v2v1=v0\frac{\partial v_2}{\partial v_{-1}}=v_0,v2v0=v1\frac{\partial v_2}{\partial v_0}=v_{-1}
  5. 在v1看來,v1v1=1v1\frac{\partial v_1}{\partial v_{-1}}=\frac{1}{v_{-1}}

這樣參照上表從下往上的計算,把上面的項代入對應位置,逐漸求出各個子節點的導數。最終求得dydx1=5.5\frac{dy}{dx_1}=5.5,即yy對於x1x_1的偏微分。

自動微分與機器學習

衆所周知,機器學習中存在大量的基於一階梯度的優化方法,這些方法本身就是直接對上述backward方法的運用,這一點在上述鏈接的文檔中有詳細的統計說明。另外,傳統機器學習中常用的基於二階微分的方法,比如牛頓法,是結合了上述的微分方法計算梯度以及利用了海森矩陣;但是海森矩陣在實際運用中如果直接飲用那麼每一次迭代的計算開銷將會十分巨大,因而實際上使用的還是基於上述一階微分所得出的海森矩陣的數值近似。
自動微分在目前的深度學習中的應用就更加廣泛,可以說整個深度學習的提出就是建立在反向傳播梯度的基礎上,也就是backward計算的基礎之上,這一點在上述鏈接中講述非常詳細。

自動微分與機器視覺

自動微分技術除了在於機器視覺相關的深度學習任務中最基石存在,還影像機器視覺的其他方面。
比如圖形學中,有一派流派基於自動微分建模光線追蹤,設計製作基於微分的渲染器,用於構建計算機生成的三維場景。另外也有在跟蹤領域中,將自動微分技術應用於目標跟蹤,手勢跟蹤等等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章