PS:翻譯來源:
http://shop.oreilly.com/product/9781939902351.do
欠了5天的翻譯,今天來還債來了 ,? 這是第一篇
////////第一篇///////////
梯度下降和反向傳播
關(guān)于基本的機(jī)器學(xué)習(xí)章節(jié),我們一直沒有解釋我們?cè)谑褂玫膶W(xué)習(xí)算法的工作原理。
梯度下降是一個(gè)能夠找到函數(shù)最小值的算法。注意,我們將學(xué)習(xí)定義為通過一定量的訓(xùn)練步驟,對(duì)模型參數(shù)的改進(jìn)(improving),使得模型的loss值最小化。在這個(gè)概念里,使用梯度下降可以找到loss function(損失函數(shù))的最小值。
如果你不知道梯度下降的話,來了解一下什么是梯度下降。梯度下降是一個(gè)數(shù)學(xué)操作,通常會(huì)使用這個(gè)符號(hào)來表示:

它類似于一個(gè)導(dǎo)數(shù),但適用于輸入向量和輸出一個(gè)值的函數(shù),就像我們的損失函數(shù)一樣。梯度的輸出是一個(gè)偏導(dǎo)數(shù)的向量,輸出的向量的每個(gè)位置的值是每一個(gè)函數(shù)的輸入向量的位置的。(PS:這里大致上是說輸出的元素就是對(duì)輸出的每個(gè)元素做偏導(dǎo))

你可以把偏導(dǎo)數(shù)理解為就好像只接收一個(gè)變量的函數(shù),用常量替換所有其他變量,然后用單變量求導(dǎo)過程去求解。偏導(dǎo)數(shù)是可以測(cè)量函數(shù)的輸出相對(duì)于某一特定輸入變量的變化率。換句話說,就是如果當(dāng)輸入的變量值增加多少輸出的變量值會(huì)增加多少。
在繼續(xù)講解之前,需要提醒: 我們討論 損失函數(shù)的輸出變量是指的模型的權(quán)重而不是數(shù)據(jù)集中的特征輸入。輸入特征智能通過數(shù)據(jù)集合去修改,而不能被優(yōu)化(Those are fixed by our dataset and cannot be optimized.)我們計(jì)算的偏導(dǎo)數(shù)是關(guān)于推理模型中每個(gè)單獨(dú)權(quán)重的。
我們關(guān)心梯度,因?yàn)樗妮敵鱿蛄勘硎緭p失函數(shù)的最大增長(zhǎng)方向。你可以把它當(dāng)成一個(gè)小箭頭,這個(gè)箭頭將在你應(yīng)該移動(dòng)的每一個(gè)點(diǎn)上指出,以增加它的價(jià)值。

假設(shè)上圖中表示的loss function(損失函數(shù))。紅點(diǎn)代表你所在的當(dāng)前權(quán)重值。梯度使用箭頭表示,表示(indicating)您應(yīng)該向右側(cè)去增加損失。而且,箭頭的長(zhǎng)度代表著如果要移動(dòng)的話,大概移動(dòng)多少距離。
現(xiàn)在,如果你按照梯度相反的方向去移動(dòng),loss值也會(huì)和之前做的相反:會(huì)下降。

在這張圖中,如果我們?nèi)ハ喾吹奶荻确较颍ㄋ{(lán)色箭頭指向的方向),我們會(huì)走向loss減小的方向中。
如果我們每次朝著這個(gè)方向(PS藍(lán)色箭頭指向的方向),且再次計(jì)算梯度,然后重復(fù)著這個(gè)過程直到梯度的長(zhǎng)度成為0,我們會(huì)達(dá)到損失函數(shù)的最小值。這是我們的目標(biāo),應(yīng)該如下圖所示:

僅此而已(that is it)我們可以簡(jiǎn)單的定義梯度下降的算法:

注意,我們應(yīng)該添加n是為了放大or縮小梯度。我們把n稱作學(xué)習(xí)率。由于實(shí)際上梯度向量的長(zhǎng)度是可以衡量每個(gè)單元的損失函數(shù)(loss functgion units),卻不能衡量權(quán)重單元(weight units),所以我們有必要在公式中去添加這個(gè)變量。
學(xué)習(xí)率不是模型推斷出的值。它是一個(gè)超參數(shù)(hyperparameter),也可以是手動(dòng)配置到模型設(shè)置中。我們需要找出正確的學(xué)習(xí)率的值。如果它的值太小了,那么需要很多學(xué)習(xí)周期才能找到損失最小值。如果它太大了,算法可能會(huì)簡(jiǎn)單的跳過最小值或者是無法找到最小值,不斷的在跳過最小值。這被稱為超調(diào)(overshooting)。在我們的例子損失函數(shù)圖中,它將如下所示:

實(shí)際上,因?yàn)閾p失函數(shù)有太多的變量了所以我們無法真正的畫出來損失函數(shù)。所以要知道我們被困在超調(diào)中,我們必須看一下計(jì)算出的總損耗的時(shí)間,我們可以通過使用tf.scalar_summary對(duì)損失在Tensorboard中獲得。

PS: This is how a well behaving loss should diminish through time, indicating a good
learning rate這句話可以用在寫作上。
藍(lán)色的線是Tensorbord圖, 紅色的線代表著loss的趨勢(shì)(the tendency line of the loss.)
當(dāng)學(xué)習(xí)率overshooting(超調(diào))的時(shí)候,就會(huì)成為一下的樣子:

如果是出現(xiàn)上圖的樣子, 那么你應(yīng)該調(diào)整學(xué)習(xí)率,讓學(xué)習(xí)足夠小直到不會(huì)出現(xiàn)超調(diào)現(xiàn)象(overshoot),但又要足夠大以使其快速衰減,這樣可以使用更少的周期來實(shí)現(xiàn)更快的學(xué)習(xí)。
除了學(xué)習(xí)率,也有其他的問題會(huì)在算法上影響到梯度下降。損失函數(shù)會(huì)存在局部最優(yōu)解(The presence of local optima is in the loss function)。
回到小示例損失函數(shù)圖中,如果我們的初始權(quán)重靠近損失函數(shù)的右側(cè)“谷”,那么算法將如何工作?

算法會(huì)找到谷底之后停下來,因?yàn)樗鼤?huì)認(rèn)為這個(gè)地方是最優(yōu)值所在的地方。所有最小值的梯度值都為0。這個(gè)算法是沒法區(qū)分自己是否停留在了函數(shù)的最小值上、全局最小值,或局部最小值、在最佳值附近的地方。
在隨機(jī)初始化權(quán)重的時(shí)候,我們盡量的會(huì)避免這些問題。記住,權(quán)重的初始值是人為設(shè)置的。通過使用隨機(jī)的值,我們可以提高從全局最低點(diǎn)開始下降的機(jī)會(huì)。
我們將在后面的章節(jié)中看到,在深層網(wǎng)絡(luò)環(huán)境中本地最小化現(xiàn)象是非常頻繁的。解釋這一點(diǎn)的一個(gè)簡(jiǎn)單的方法是考慮相同的輸入如何可以將許多不同的路徑傳輸?shù)捷敵?,從而產(chǎn)生相同的結(jié)果。幸運(yùn)的是,有文獻(xiàn)顯示,所有這些最低標(biāo)準(zhǔn)在損失方面都是非常相似的,并沒有真正比全局最低。
到目前為止,我們還沒有明確地計(jì)算任何導(dǎo)數(shù)(derivatives),因?yàn)槲覀儧]有必要這樣做。Tensorflow包括的方法tf.gradients可以象征性地計(jì)算指定圖形步長(zhǎng)的梯度,并將其作為張量輸出。甚至不需要手動(dòng)調(diào)用,因?yàn)閠ensorflow也實(shí)現(xiàn)了梯度下降等其他的算法。這就是為什么我們會(huì)給出高級(jí)公式卻不要求大家去深入的了解實(shí)現(xiàn)細(xì)節(jié)和數(shù)學(xué)公式。
我們準(zhǔn)備給出反向傳播的過程。這是在計(jì)算圖中有效的計(jì)算梯度的方法。
假設(shè)(assume)有一個(gè)這樣簡(jiǎn)單的網(wǎng)絡(luò):有一個(gè)輸入和一個(gè)輸出,兩個(gè)擁有單個(gè)神經(jīng)元的隱含層。這兩個(gè)隱含層以及輸出神經(jīng)元都會(huì)使用sigmoids并會(huì)將會(huì)用交叉熵的方式去計(jì)算loss。 網(wǎng)絡(luò)的樣子如下:

將L1定義為第一個(gè)隱含層的輸出,L2是第二個(gè)隱含層的輸出,L3是最后的輸出層:

最后,網(wǎng)絡(luò)的loss將會(huì)是:

為了運(yùn)行梯度下降,我們需要計(jì)算loss的偏導(dǎo)數(shù)以及網(wǎng)絡(luò)中3個(gè)權(quán)重的表達(dá)式。我們從輸出曾的權(quán)重開始,使用鏈?zhǔn)揭?guī)則計(jì)算:

L2在本案例中只是一個(gè)常數(shù)。因?yàn)樘灰蕾嘩3。
為了簡(jiǎn)化表達(dá)式,我們可以這樣的定義:

偏導(dǎo)函數(shù)的結(jié)果表達(dá)式應(yīng)該是:

現(xiàn)在,來計(jì)算第二個(gè)隱含層的權(quán)重W2 :

最后對(duì)w1求導(dǎo)數(shù):

你應(yīng)該注意到這個(gè)模式:每個(gè)層上的導(dǎo)數(shù)是之前的層的輸出之后的層的導(dǎo)數(shù)的乘積。這就是鏈?zhǔn)椒▌t的神奇之處,也是這個(gè)算法的優(yōu)勢(shì)所在。(That’s the magic of the chain rule and what the algorithm takes
advantage of)。
我們會(huì)向前從輸入開始計(jì)算每個(gè)隱含層的輸出以及到輸出的輸入。然后我們又返回開始計(jì)算隱含層的導(dǎo)出,并將結(jié)果傳播出到下一層,這是為了通過再利用都已經(jīng)計(jì)算出的元素少做計(jì)算傳播的結(jié)果。(這里有動(dòng)態(tài)歸化的思想在里面)這就是為什么腳反向傳播。:)
///////////////////Conclusion//////////////
注意我們?nèi)绾螞]有使用S形或交叉熵衍生物的定義。我們可以在一個(gè)網(wǎng)絡(luò)中使用不同的激勵(lì)函數(shù)或者是損失函數(shù),其結(jié)果可能會(huì)是一樣的。
舉個(gè)簡(jiǎn)單的例子,對(duì)擁有成千上百權(quán)重的網(wǎng)絡(luò)計(jì)算損失率的話,使用該算法可以節(jié)省訓(xùn)練時(shí)間的數(shù)量級(jí)。進(jìn)一步說(to close),在Tensorflow中有一些不同的優(yōu)化算法,盡管它們都基于這種計(jì)算梯度的方法。哪個(gè)算法的效果更好,這取決于你你輸入數(shù)據(jù)的形狀和你要解決的問題。
Sigmoid隱含層、softmax輸出層以及基于梯度下降的反向傳播都是構(gòu)建更加復(fù)雜模型的最常見的基本模塊。我們會(huì)在下一個(gè)chapter中講到。
下一期:
Part III.Implementing Advanced Deep
Models in TensorFlow