機(jī)器學(xué)習(xí)之——自動求導(dǎo)
點(diǎn)擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時間送達(dá)
本文轉(zhuǎn)自|機(jī)器學(xué)習(xí)算法工程師
隨機(jī)梯度下降法(SGD)是訓(xùn)練深度學(xué)習(xí)模型最常用的優(yōu)化方法。在前期文章中我們講了梯度是如何計算的,主要采用BP算法,或者說利用鏈?zhǔn)椒▌t。但是深度學(xué)習(xí)模型是復(fù)雜多樣的,你不大可能每次都要自己使用鏈?zhǔn)椒▌t去計算梯度,然后采用硬編程的方式實(shí)現(xiàn)。
而目前的深度學(xué)習(xí)框架其都是實(shí)現(xiàn)了自動求梯度的功能,你只關(guān)注模型架構(gòu)的設(shè)計,而不必關(guān)注模型背后的梯度是如何計算的。不過,我們還是想說一說自動求導(dǎo)是如何實(shí)現(xiàn)的。
這里我們會講幾種常見的方法,包括數(shù)值微分(Numerical
Differentiation),符號微分(Symbolic Differentiation),前向模式(Forward Mode)和反向模式(Reverse Mode)。

?
???????數(shù)值微分方式應(yīng)該是最直接而且簡單的一種自動求導(dǎo)方式。從導(dǎo)數(shù)的定義中,我們可以直觀看到:

???????
當(dāng)h接近0時,導(dǎo)數(shù)是可以近似計算出來的??梢钥吹缴厦娴挠嬎闶綆缀踹m用所有情況,除非該點(diǎn)不可導(dǎo)??墒菙?shù)值微分卻有兩個問題,第一個就是求出的導(dǎo)數(shù)可能不準(zhǔn)確,這畢竟是近似表示,比如要求f(x)=x^2在零點(diǎn)附近的導(dǎo)數(shù),如果h選取不當(dāng),你可能會得到符號相反的結(jié)果,此時誤差就比較大了。第二個問題是對于參數(shù)比較多時,對深度學(xué)習(xí)模型來說,上面的計算是不夠高效的,因?yàn)槊坑嬎阋粋€參數(shù)的導(dǎo)數(shù),你都需要重新計算f(x+h)。但是數(shù)值運(yùn)算有一個特殊的用武之地就是在于可以做梯度檢查(Gradient check),你可以用這種不高效但簡單的方法去檢查其他方法得到的梯度是否正確。
? ? ???

當(dāng)我們將符號表達(dá)式用表達(dá)式樹表示時,可以利用加法規(guī)則和乘法規(guī)則進(jìn)行自動求導(dǎo)。比如我們要求符號表達(dá)式f(x)=2x+x^2,可以展開成如下圖的表達(dá)式樹:

利用求導(dǎo)規(guī)則,可以求出:

基于表達(dá)式樹和求導(dǎo)規(guī)則,我們可以得到最終的導(dǎo)數(shù)。有一點(diǎn)要注意的是,符號微分不一定會得到簡化的導(dǎo)數(shù),因?yàn)橛嬎銠C(jī)可能并不能進(jìn)行智能的簡化。所以,如果表達(dá)式樹結(jié)構(gòu)較復(fù)雜時,得到的導(dǎo)數(shù)表達(dá)式會相當(dāng)復(fù)雜,也許出現(xiàn)表達(dá)式爆炸現(xiàn)象。
? ? ?? 前向模式最簡單明了,其基于的是二元數(shù)(dual numbers)。我們先來講解一下二元數(shù),其基本格式如下所示:

其中a和b都是實(shí)數(shù),而
是無窮小量,你可以認(rèn)為其無限接近0,但是并不等于0,并且
,這是借鑒了微積分中的概念。所以,你可以認(rèn)為
是一個接近5的數(shù)。對于二元數(shù),其滿足簡單的加法和乘法規(guī)則:


對于二元數(shù),其更重要的一個特性是:

這意味著,我們只需要計算出
,就可以得到
以及其對應(yīng)的導(dǎo)數(shù)
。所以,一個前向計算過程可以同時得到函數(shù)值與其導(dǎo)數(shù),這就是前向模式的原理。舉例來說,如果要計算f(x)=2x+x^2在x=2處的函數(shù)值與導(dǎo)數(shù),其計算過程如下所示:

參考資料
1. Automatic Differentiation in Machine Learning: a Survey,
https://arxiv.org/pdf/1502.05767.pdf
2. Hands-On Machine Learning with Scikit-Learn and TensorFlow, Aurélien Géron, 2017.
好消息,小白學(xué)視覺團(tuán)隊(duì)的知識星球開通啦,為了感謝大家的支持與厚愛,團(tuán)隊(duì)決定將價值149元的知識星球現(xiàn)時免費(fèi)加入。各位小伙伴們要抓住機(jī)會哦!

交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

