實驗一拓展文獻閱讀—反向傳播計算圖上的微積分

 

 

 

 

 

http://colah.github.io/posts/2015-08-Backprop/?spm=a2c4e.11153940.blogcont149583.20.4ab360c05me4Uvgit

Calculus on Computational Graphs: Backpropagation

計算圖上的微積分:反向傳播github

Introduction

反向傳播是使訓練深度模型在計算上易於處理的關鍵算法。對於現代神經網絡,相對於天真的實現,它可使梯度降低訓練的速度提升一千萬倍。這是一個模型須要一週的培訓和20萬年的差別。算法

除了在深度學習中的應用以外,反向傳播是許多其餘領域的強大計算工具,從天氣預報到分析數值穩定性 - 它只是用不一樣的名稱。實際上,該算法在不一樣領域至少被從新發明了幾十次(參見Griewank(2010))。通常的,獨立於應用程序,名稱是「反向模式區分」。編程

從根本上說,它是一種快速計算衍生品的技術。這是一個必不可少的技巧,不只在深度學習中,並且在各類數值計算環境中。網絡

計算圖

計算圖是思考數學表達式的好方法。 例如,考慮表達式e =(a + b)*(b + 1)。 有三個操做:兩個加法和一個乘法。 爲了幫助咱們討論這個問題,讓咱們介紹兩個中間變量c和d,以便每一個函數的輸出都有一個變量。 咱們如今有:框架

爲了建立計算圖,咱們將這些操做以及輸入變量中的每個都放入節點中。 當一個節點的值是另外一個節點的輸入時,箭頭從一個節點到另外一個節點。函數

這些類型的圖表一直出如今計算機科學中,特別是在談論功能程序時。 它們與依賴圖和調用圖的概念密切相關。 它們也是流行的深度學習框架Theano背後的核心抽象。工具

咱們能夠經過將輸入變量設置爲特定值並經過圖形向上計算節點來評估表達式。 例如,設置a = 2且b = 1:post

 

表達式的計算結果爲6。學習

計算圖的導數

若是想要理解計算圖中的導數,關鍵是理解邊緣上的導數。 若是a直接影響c,那麼咱們想知道它如何影響c。 若是a發生了一點變化,c會如何變化? 咱們稱之爲c的偏導數。

要評估此圖中的偏導數,咱們須要求「和法則」和「乘積法則」:

下面,圖表標記了每條邊上的導數。

 

若是咱們想了解非直接鏈接的節點如何相互影響,該怎麼辦? 讓咱們考慮一下如何影響e。 若是咱們以1的速度改變a,則c也以1的速度變化。反過來,c以1的速度變化致使e以2的速度變化。所以,e關於a以1 * 2的速率變化。

通常規則是將從一個節點到另外一個節點的全部可能路徑相加,將路徑的每一個邊緣上的導數相乘。 例如,爲了獲得關於b的e的導數,咱們獲得:

 

這解釋了b如何影響e到c以及它如何經過d影響它。

這種通常的「路徑總和」規則只是思考多變量鏈規則的另外一種方式。

因子分解路徑

僅僅「對路徑求和」的問題在於,很容易在可能路徑的數量上發生組合爆炸。

 

 在上圖中,從X到Y有三條路徑,從Y到Z有另外三條路徑。 若是咱們想經過對全部路徑求和獲得導數∂Z/∂X,咱們須要求和3 * 3 = 9路徑:

上面只有九條路徑,但隨着圖形變得愈來愈複雜,路徑的數量會呈指數增加。

不要只是天真地對路徑求和,而是將它們考慮起來要好得多:

這就是「前向模式差分」和「反向模式差分」的用武之地。它們是經過分解路徑來有效計算總和的算法。 它們不是明確地對全部路徑求和,而是經過在每一個節點處將路徑合併在一塊兒來更有效地計算相同的和。 實際上,兩種算法都只觸摸每一個邊緣一次!

前向模式差分從圖形的輸入開始並向末尾移動。 在每一個節點處,它對全部進入的路徑求和。每一個路徑表明輸入影響該節點的一種方式。 經過將它們相加,咱們獲得節點受輸入影響的總方式,即爲導數。

 

雖然可能沒有從圖形方面考慮它,可是前向模式差分很是相似於在介紹微積分類時隱含學習的內容。

另外一方面,反向模式差分從圖形的輸出開始並向開始移動。 在每一個節點處,它合併源自該節點的全部路徑。

 

 前向模式差分跟蹤一個輸入如何影響每一個節點。 反向模式差分跟蹤每一個節點如何影響一個輸出。 也就是說,前向模式差分將運算符∂/∂X應用於每一個節點,而反向模式差分將運算符∂Z/∂應用於每一個節點。

計算的收益(成功之處)victories

此時,您可能想知道爲何有人會關心反向模式差分。 它看起來像是一種與前向模式作一樣事情的奇怪方式。 有一些優點嗎?

讓咱們再考慮一下咱們原來的例子:

 

 咱們可使用從b出發的前向模式差分。 關於b的每一個節點的導數以下圖:

咱們計算了∂e/∂b,它是咱們輸出相對於咱們的一個輸入的導數。

若是咱們從e向下進行反向模式差分怎麼辦? 這給了咱們關於每一個節點的e的導數:

反向模式區分爲咱們提供了關於每一個節點的e的導數時,注意是每一個節點。咱們獲得∂e/∂a和∂e/∂b,e相對於兩個輸入的導數。前向模式微分給出了咱們輸出相對於單個輸入的導數,可是反向模式微分給了咱們所有。

對於此圖表,這只是兩倍加速的因子,但想象一下具備一百萬個輸入和一個輸出的功能。前向模式的區分須要咱們經過圖表一百萬次來得到乘積。反向模式微分能夠一舉獲得它們!加速百萬分之一是很是好的!

在訓練神經網絡時,咱們考慮成本(描述神經網絡執行有多糟糕的值)做爲參數的函數(描述網絡行爲的數字)。咱們想要計算全部參數的成本導數,用於梯度降低。如今,神經網絡中一般有數百萬甚至數千萬個參數。所以,在神經網絡環境中稱爲反向傳播的反向模式微分給咱們帶來了巨大的加速!

(在任何狀況下,前向模式區分更有意義嗎?是的,有!反向模式給出了一個輸出相對於全部輸入的導數,前向模式給出了全部輸出相對於一個輸入。若是一個具備大量輸出的功能,前向模式區分能夠更快,更快。)

這不是微不足道的嗎?

當我第一次明白反向傳播是什麼時,個人反應是:「哦,那只是連鎖規則!咱們怎麼花這麼長時間才弄明白?「我不是惟一一個有這種反應的人。確實,若是你問「有沒有一種聰明的方法來計算前饋神經網絡中的導數?」答案並不那麼困難。

但我認爲這比看起來要困可貴多。你看,在反傳播發明的時候,人們並無把注意力集中在咱們研究的前饋神經網絡上。微分是訓練它們的正確方法,這一點也不明顯。一旦你意識到你能夠快速計算微分時,這些只是顯而易見的存在循環依賴。

更糟糕的是,在隨意的思想中,將任何循環依賴關係都寫下來是很容易的。用衍生物訓練神經網絡?固然,你只是陷入局部極小。顯然,計算全部這些微分會很昂貴。這只是由於咱們知道這種方法有效,咱們不會當即開始列出它可能沒有的緣由。

這是後見之明的好處。一旦你構思了問題,最艱難的工做就已經完成了。

結論

微分比你想象的要容易。這是從這篇文章中拿走的主要教訓。事實上,它們的價格很是便宜,而咱們愚蠢的人類不得不反覆從新發現這一事實。在深度學習中要理解這一點很重要。在其餘領域中瞭解它也是一件很是有用的事情,若是不是常識,那就更是如此。

還有其餘課程嗎?我以爲有。

反向傳播也是理解微分如何流經模型的有用透鏡。這對於推理某些模型難以優化的緣由很是有用。這方面的典型例子是遞歸神經網絡中逐漸消失的梯度問題。

最後,我聲稱有一個普遍的算法課程能夠從這些技術中剔除。反向傳播和前向模式區分使用一對強大的技巧(線性化和動態編程)來比計算可能的更有效地計算導數。若是您真的瞭解這些技術,您可使用它們來有效地計算涉及衍生物的其餘幾個有趣的表達式。

這篇文章給出了很是抽象的反向傳播處理方法。我強烈建議閱讀Michael Nielsen關於它的章節進行精彩討論,更具體地關注神經網絡。

相關文章
相關標籤/搜索