介紹
反向傳播是使訓練深度模型在計算上易于處理的關鍵算法。對于現(xiàn)代神經網絡历涝,相對于天真的實現(xiàn)兰迫,它可以使梯度下降訓練的速度提高一千萬倍。這是一個模型需要一周的培訓和20萬年的差異秧廉。
除了在深度學習中的應用之外伞广,反向傳播是許多其他領域的強大計算工具,從天氣預報到分析數值穩(wěn)定性 - 它只是用不同的名稱疼电。實際上嚼锄,該算法在不同領域至少被重新發(fā)明了幾十次。一般的蔽豺,獨立于應用程序区丑,名稱是“反向模式區(qū)分”。
從根本上說修陡,它是一種快速計算衍生品的技術沧侥。這是一個必不可少的技巧,不僅在深度學習中魄鸦,而且在各種數值計算環(huán)境中宴杀。
計算圖
計算圖是思考數學表達式的好方法。例如拾因,考慮表達式e=(a+b)(b+1)e=(a+b)(b+1)旺罢。有三個操作:兩個加法和一個乘法。為了幫助我們談論這個绢记,讓我們介紹兩個中間變量扁达,cC和dd這樣每個函數的輸出都有一個變量。我們現(xiàn)在有:
c = a + b
d= b + 1
e = c * d
為了創(chuàng)建計算圖庭惜,我們將這些操作以及輸入變量中的每一個都放入節(jié)點中罩驻。當一個節(jié)點的值是另一個節(jié)點的輸入時,箭頭從一個節(jié)點到另一個節(jié)點护赊。
這些類型的圖表一直出現(xiàn)在計算機科學中惠遏,特別是在談論功能程序時砾跃。它們與依賴圖和調用圖的概念密切相關。它們也是流行的深度學習框架Theano背后的核心抽象节吮。
我們可以通過將輸入變量設置為特定值并通過圖形向上計算節(jié)點來評估表達式抽高。例如,讓我們設置a=2一個=2和b=1b=1:
表達式的計算結果為66透绩。
計算圖的導數
如果想要理解計算圖中的導數翘骂,關鍵是理解邊緣上的導數。如果一個一個直接影響cC帚豪,那么我們想知道它是如何影響c的C曲横。如果一個一個改變了一點底洗,c怎么樣C更改腋寨?我們稱之為偏導數的C ^C關于a一個粉寞。
要評估此圖中的偏導數,我們需要求和規(guī)則和產品規(guī)則:
下面诈泼,圖表標記了每條邊上的導數。
如果我們想了解非直接連接的節(jié)點如何相互影響煤禽,該怎么辦铐达?讓我們考慮一下e是受一一個。如果我們改變了一個速度為1檬果,cC也改變在的速度11瓮孙。反過來,cC在的變速11導致e?以2的速度改變2汁汗。所以e以12的速率變化12關于a一個衷畦。
一般規(guī)則是將從一個節(jié)點到另一個節(jié)點的所有可能路徑相加,將路徑的每個邊緣上的導數相乘知牌。例如,獲得e的衍生物?關于bb 我們得到:
這解釋了b如何影響e到c以及它如何通過d影響它角寸。
這種一般的“路徑總和”規(guī)則只是思考多變量鏈規(guī)則的另一種方式。
保理路徑
僅僅“對路徑求和”的問題在于忿墅,很容易在可能路徑的數量上發(fā)生組合爆炸扁藕。
在上圖中,X有三條路徑X到Y.疚脐,以及Y的另外三條路徑到Z亿柑。如果我們想得到導數通過對所有路徑求和,我們需要求和3*3=9路徑:
上面只有九條路徑棍弄,但隨著圖形變得更復雜望薄,路徑的數量會呈指數增長疟游。
不要只是天真地對路徑求和,而是將它們考慮起來要好得多:
這就是“前向模式區(qū)分”和“反向模式區(qū)分”的用武之地痕支。它們是通過分解路徑來有效計算總和的算法颁虐。它們不是明確地對所有路徑求和,而是通過在每個節(jié)點處將路徑合并在一起來更有效地計算相同的和卧须。實際上另绩,兩種算法都只觸摸每個邊緣一次!
前向模式區(qū)分從圖形的輸入開始并向末尾移動花嘶。在每個節(jié)點處笋籽,它對所有進入的路徑求和。每個路徑代表輸入影響該節(jié)點的一種方式椭员。通過將它們相加车海,我們得到節(jié)點受輸入影響的總方式,它是導數拆撼。
雖然您可能沒有從圖形方面考慮它容劳,但是前向模式區(qū)分與您在介紹微積分類時隱含學習要做的非常類似。
另一方面闸度,反向模式區(qū)分從圖形的輸出開始并向開始移動竭贩。在每個節(jié)點處,它合并源自該節(jié)點的所有路徑莺禁。
前向模式區(qū)分跟蹤一個輸入如何影響每個節(jié)點留量。反向模式區(qū)分跟蹤每個節(jié)點如何影響一個輸出。也就是說哟冬,前向模式區(qū)分應用運算符對于每個節(jié)點楼熄,反向模式區(qū)分應用運算符到每個節(jié)點。
計算勝利
此時浩峡,您可能想知道為什么有人會關心逆模式區(qū)分可岂。它看起來像是一種與前進模式做同樣事情的奇怪方式。有一些優(yōu)勢嗎翰灾?
讓我們再考慮一下我們原來的例子:
我們可以使用b的前向模式區(qū)分b起來缕粹。這給了我們關于b的每個節(jié)點的導數b。
我們計算了
如果我們從e進行逆模式區(qū)分怎么辦平斩?e下?這給了我們e的衍生物e 關于每個節(jié)點:
當我說反向模式區(qū)分為我們提供了關于每個節(jié)點的e的導數時咽块,我的確意味著每個節(jié)點绘面。我們得到兩個
對于此圖表晚凿,這只是兩倍加速的因素,但想象一下具有一百萬個輸入和一個輸出的功能塘辅。前向模式的區(qū)分需要我們通過圖表一百萬次來獲得衍生物晃虫。逆向模式差異化可以一舉得到它們!加速百萬分之一是非常好的扣墩!
在訓練神經網絡時哲银,我們考慮成本(描述神經網絡執(zhí)行有多糟糕的值)作為參數的函數(描述網絡行為的數字)。我們想要計算所有參數的成本導數呻惕,用于梯度下降【T穑現(xiàn)在,神經網絡中通常有數百萬甚至數千萬個參數亚脆。因此做院,在神經網絡環(huán)境中稱為反向傳播的反向模式差異給我們帶來了巨大的加速!
(在任何情況下濒持,前向模式區(qū)分更有意義嗎键耕?是的,有柑营!反向模式給出了一個輸出相對于所有輸入的導數屈雄,前向模式給出了所有輸出相對于一個輸入。如果一個具有大量輸出的功能官套,前向模式區(qū)分可以更快酒奶,更快。)
這不是微不足道的嗎奶赔?
當我第一次明白反向傳播是什么時惋嚎,我的反應是:“哦,那只是連鎖規(guī)則站刑!我們怎么花這么長時間才弄明白另伍?“我不是唯一一個有這種反應的人。確實绞旅,如果你問“有沒有一種聰明的方法來計算前饋神經網絡中的導數质况?”答案并不那么困難。
但我認為這比看起來要困難得多玻靡。你看,在反傳播發(fā)明的時候中贝,人們并沒有把注意力集中在我們研究的前饋神經網絡上囤捻。衍生品是培養(yǎng)它們的正確方法,這一點也不明顯邻寿。一旦你意識到你可以快速計算衍生品蝎土,這些只是顯而易見的 存在循環(huán)依賴视哑。
更糟糕的是,在隨意的思想中誊涯,將任何循環(huán)依賴關系都寫下來是很容易的挡毅。用衍生物訓練神經網絡?當然暴构,你只是陷入局部極小跪呈。顯然,計算所有這些衍生物會很昂貴取逾。這只是因為我們知道這種方法有效耗绿,我們不會立即開始列出它可能沒有的原因。
這是后見之明的好處砾隅。一旦你構思了問題误阻,最艱難的工作就已經完成了。
結論
衍生品比你想象的要便宜晴埂。這是從這篇文章中拿走的主要教訓究反。事實上,它們的價格非常便宜儒洛,而我們愚蠢的人類不得不反復重新發(fā)現(xiàn)這一事實精耐。在深度學習中要理解這一點很重要。在其他領域中了解它也是一件非常有用的事情晶丘,如果不是常識黍氮,那就更是如此。
還有其他課程嗎浅浮?我覺得有沫浆。
反向傳播也是理解衍生物如何流經模型的有用透鏡。這對于推理某些模型難以優(yōu)化的原因非常有用滚秩。這方面的典型例子是遞歸神經網絡中逐漸消失的梯度問題专执。
最后,我聲稱有一個廣泛的算法課程可以從這些技術中剔除郁油。反向傳播和前向模式區(qū)分使用一對強大的技巧(線性化和動態(tài)編程)來比計算可能的更有效地計算導數本股。如果您真的了解這些技術,您可以使用它們來有效地計算涉及衍生物的其他幾個有趣的表達式桐腌。
翻譯自克里斯托弗奧拉博客