深度學(xué)習(xí) - 神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)




上圖中 中間2層黑箱,每個(gè)黑箱是16個(gè)神經(jīng)元,總共4層,這些數(shù)字都是便于新手學(xué)習(xí),實(shí)際操作的時(shí)候都可以調(diào)整的。這種模式是仿照生物學(xué)的神經(jīng)元,第一層的神經(jīng)元可以激活下一層,一層一層傳到。比如這個(gè)圖,第一層784個(gè)神經(jīng)元,輸入了784個(gè)各自的灰度值,那么這層激活值的圖案會(huì)讓下層的激活值產(chǎn)生某種特殊圖案,再讓再下層產(chǎn)生特殊的圖案,最終在輸出層得到某種結(jié)果,而輸出層最亮的神經(jīng)元就代表這個(gè)神經(jīng)網(wǎng)絡(luò)最終的選擇。

這樣一來(lái),我們只需要學(xué)習(xí),哪些部件能組成哪些數(shù)字即可。那么識(shí)別這些小部件,比如識(shí)別圓圈和識(shí)別直線就很難啊。怎么辦?

但網(wǎng)絡(luò)是真的這么做的嗎?通過這種層狀結(jié)構(gòu)最后得出想要的結(jié)果?
更進(jìn)一步的講,若神經(jīng)網(wǎng)絡(luò)真的能識(shí)別這類邊緣和圖案,它們就能很好的應(yīng)用到其他圖像的識(shí)別任務(wù)上來(lái),甚至不光是圖像,比如音頻,都可以拆分成小塊,轉(zhuǎn)化為抽象元素,一層層抽絲剝繭。




所以這個(gè)神經(jīng)元的激活值,實(shí)際上就是對(duì) 加權(quán)和 到底有多“正”的打分。那么這個(gè)加權(quán)和有多 “正” 才表示激活呢? 此時(shí)你要加個(gè) 偏置值 ,保證不能隨意被激發(fā),比如當(dāng)加權(quán)和 大于等于 10 時(shí)候,才能激發(fā)。

那么,我們還可以推算出來(lái),第一層輸入層,一共784個(gè)神經(jīng)元,第二次一共16個(gè)神經(jīng)元,第一層的784個(gè)神經(jīng)元都要對(duì)應(yīng)第二層每一個(gè)神經(jīng)元,那么這個(gè)計(jì)算量:784*16 個(gè)權(quán)重值;以及16個(gè) 偏置值。計(jì)算起來(lái),上述神經(jīng)網(wǎng)絡(luò)需要權(quán)重值: 786*16 + 16*16 + 16*10;偏置值:16+16+10,總數(shù)130000多,相當(dāng)于有130000多個(gè)按鈕需要你去調(diào)節(jié)。所以我們討論機(jī)器如何學(xué)習(xí)的時(shí)候,實(shí)際上是討論如何設(shè)置這一大堆數(shù)字參數(shù),才能讓它正確的解題



我們把每個(gè)神經(jīng)元想象成容器只是便于理解,其實(shí)這是錯(cuò)誤觀點(diǎn)。神經(jīng)元實(shí)際上是一個(gè)函數(shù),它的輸入是上一層所有神經(jīng)元的輸出,而它的輸出是一個(gè)0~1的值,不過這個(gè)函數(shù)非常復(fù)雜,它有13000個(gè) 權(quán)重參數(shù) 和 偏置參數(shù),并不停的用到矩陣乘法和sigmoid映射運(yùn)算,但它終究是個(gè)函數(shù)而已。
深度學(xué)習(xí) - 梯度下降法
我們想要一種算法,你可以給這個(gè)網(wǎng)絡(luò)一大堆訓(xùn)練數(shù)據(jù),其中包括一堆不同的數(shù)字手寫 圖像,以及它們代表哪個(gè)數(shù)字的標(biāo)記,算法會(huì)依據(jù)此調(diào)整130000個(gè)權(quán)重值和偏置值,以提高網(wǎng)絡(luò)對(duì)數(shù)據(jù)訓(xùn)練的表現(xiàn)。
我們希望這種分層結(jié)構(gòu)可以舉一反三,識(shí)別訓(xùn)練數(shù)據(jù)之外的圖像。訓(xùn)練好后,我們會(huì)給它更多的帶標(biāo)記的之前未見過的數(shù)據(jù)作為測(cè)試,你就能看到它對(duì)這些新圖像分類的準(zhǔn)確度。
雖然機(jī)器“學(xué)習(xí)”這個(gè)說法很大膽,但深入了解后,這看起來(lái)不像是科幻場(chǎng)面,而是一道微積分習(xí)題了。
從概念上講,每一個(gè)神經(jīng)元都與上一層所有神經(jīng)元相連,決定其激活值加權(quán)和中的權(quán)重,可以理解為該聯(lián)系的強(qiáng)弱大小,而偏置值則表示了神經(jīng)元是否更容易被激活。
在這一開始,我們會(huì)重置所有的 權(quán)重值和偏置值, 那么可想而知,輸出的結(jié)果有多隨機(jī),所以當(dāng)結(jié)果出來(lái)后,你要告訴系統(tǒng),只有正確的那個(gè)值是接近1,其他應(yīng)該接近0,不然就是錯(cuò)誤的。
然后怎么處理?你可以將每個(gè)垃圾輸出激活值,與你期望的值的差的平方加起來(lái)。

接下來(lái),我們就要考慮,手頭幾萬(wàn)個(gè)訓(xùn)練樣本中,代價(jià)的平均值。而我們就用這個(gè)值來(lái)評(píng)價(jià)這個(gè)神經(jīng)網(wǎng)絡(luò)是好是壞。
要記得,網(wǎng)絡(luò)不過是個(gè)函數(shù),有784個(gè)輸入值,即像素灰度,最后輸出的是10個(gè)數(shù),而所有的權(quán)重和偏置值就組成了這個(gè)函數(shù)的參數(shù)。而代價(jià) 函數(shù)函數(shù)還要更抽象一層,這13000個(gè)權(quán)重和偏置值作為它的參數(shù),最后輸出一個(gè)數(shù),來(lái)表示這些權(quán)重和偏置的好壞。而代價(jià)函數(shù)取決網(wǎng)絡(luò)對(duì)于上萬(wàn)個(gè)綜合數(shù)據(jù)的表現(xiàn)。
再仔細(xì)想想,你告訴電腦,這個(gè)代價(jià)值,這個(gè)網(wǎng)絡(luò)不好,沒有用,告訴它怎么改,怎么調(diào)整這些 權(quán)重值和偏置值 才有進(jìn)步。
為了簡(jiǎn)化問題,我們先考慮一個(gè)函數(shù),只有一個(gè)輸入變量,只有一個(gè)輸出值。要怎么找到x值,使得函數(shù)的輸入值最小呢?顯而易見,求導(dǎo)嘛,求導(dǎo)得出斜率,斜率值為0,就找到最小值了。

想象一個(gè)更復(fù)雜的,兩個(gè)輸入一個(gè)輸出的 二元函數(shù):

熟悉多元微積分的人會(huì)清楚,函數(shù)的梯度指出了函數(shù)的最陡增長(zhǎng)方向,即是說,按照梯度值的方向走,函數(shù)的增長(zhǎng)值就越快(具體參考多元微積分知識(shí))。現(xiàn)在我們只需要知道,我們能算出這個(gè)向量,它能指出哪個(gè)方向下山最快,路有多陡就可以了。
你只需要知道,讓函數(shù)最小值的算法,不過是先計(jì)算梯度,然后按照梯度反方向走一小步下山,然后循環(huán)。處理帶130000個(gè)輸入的函數(shù)也是同樣的道理。

計(jì)算梯度的算法是神經(jīng)網(wǎng)絡(luò)的核心,我們叫做反向傳播算法。
當(dāng)我們提到網(wǎng)絡(luò)學(xué)習(xí),實(shí)際上就是讓代價(jià)函數(shù)的值最小。為了達(dá)到此目的,代價(jià)函數(shù)必須是平滑的,這樣我們才能一點(diǎn)點(diǎn)的移動(dòng),最后找到局部最小值。這也解釋了為什么神經(jīng)元的激活值是連續(xù)的。這種按照負(fù)梯度的倍數(shù),不斷調(diào)整函數(shù)輸入值的過程,叫做梯度下降法。

我們回到神經(jīng)網(wǎng)絡(luò)的話題來(lái),神經(jīng)網(wǎng)絡(luò)本身是帶一個(gè)784個(gè)輸入和10個(gè)輸出的函數(shù),由各種加權(quán)和所定義,代價(jià)函數(shù)則是更復(fù)雜一層,把130000多個(gè)權(quán)重和偏置作為輸入,通過訓(xùn)練數(shù)據(jù),得出一個(gè)對(duì)網(wǎng)絡(luò)糟糕程度的評(píng)分,而代價(jià)函數(shù)的梯度,則在此基礎(chǔ)上更復(fù)雜一層,告訴我們?nèi)绾挝⒄{(diào)權(quán)重和偏置的值,才可以讓代價(jià)函數(shù)的結(jié)果改變的最快,也可以理解為,改變了哪些權(quán)重,對(duì)結(jié)果影響最大。
那么,當(dāng)你隨機(jī)初始化權(quán)重和偏置的時(shí)候,并通過梯度下降法調(diào)整了多次參數(shù)之后,神經(jīng)網(wǎng)絡(luò)來(lái)識(shí)別它從未見過的圖像時(shí),表現(xiàn)又會(huì)如何?我們不能強(qiáng)求100%,能做到識(shí)別絕大部分情況就很不錯(cuò)了。

接著上面話題,這個(gè)神經(jīng)網(wǎng)絡(luò),它能夠很好的識(shí)別0-9之間的數(shù)字了,但當(dāng)你給它一個(gè)不屬于0-9的數(shù)字,比如一個(gè)五角星,它也會(huì)自信的把五角星識(shí)別成0-9中的一個(gè)數(shù)。這就是說,這個(gè)網(wǎng)絡(luò),它根本不明白輸出的結(jié)果是什么,它只是照著做而已。究其原因,就是這個(gè)網(wǎng)絡(luò)在很窄的框架里。但是深層次研究隱含層的工作內(nèi)容,你會(huì)發(fā)現(xiàn)它沒有那么智能。
深度學(xué)習(xí) - 反向傳播算法
首先復(fù)習(xí)一下:
所謂的學(xué)習(xí),就是找到一個(gè)合適的權(quán)重和偏置值,使得代價(jià)函數(shù)的值最小。要計(jì)算一個(gè)訓(xùn)練樣本的代價(jià),你需要求出 網(wǎng)絡(luò)的輸出 與 理論期待的輸出 之間每一項(xiàng)差的 平方和,然后對(duì)于成千上萬(wàn)的樣本,都這么算一遍,取平均值,就得到了整個(gè)網(wǎng)絡(luò)的代價(jià)值. 我們要 算的就是代價(jià)函數(shù)的負(fù)梯度,它告訴你如何改變這個(gè)網(wǎng)絡(luò)所 有連線上的權(quán)重和偏置,能讓代價(jià)下降的最快。(這個(gè)負(fù)梯度就能求出最佳的權(quán)重和偏置值)

反向傳播算法,就是來(lái)求這個(gè)梯度的。
我希望大家能夠牢牢記住之前提到的一點(diǎn),想象一個(gè)130000多維度梯度向量過于抽象,換個(gè)思路,梯度向量 每一項(xiàng)大小是在告訴大家,代價(jià)函數(shù)對(duì)每個(gè)參數(shù)有多敏感,越大的參數(shù)對(duì)代價(jià)函數(shù)的影響越大

如上圖,我們第一次輸入一個(gè)2的數(shù)字訓(xùn)練樣本,它會(huì)隨機(jī)給出10個(gè)輸出,這個(gè)輸出對(duì)應(yīng)的激活值不是我們想要的,我們期望我們要的2的激活值提高,其他的降低。
為了增大2對(duì)應(yīng)的激活值,我們有3條路:

- 先看看看如何增加權(quán)重,連接線 前一層最亮神經(jīng)元(最亮就是值最大)的那根線的 權(quán)重,增大它會(huì)迅速增大該激活值(wa相乘嘛),增加權(quán)重,我們一般就找這樣高性價(jià)比的線去增加,使得連接性更強(qiáng)。

- 再看看調(diào)整上一層的激活值。

對(duì)于整個(gè)網(wǎng)絡(luò)全局來(lái)看,以上,只是2這個(gè)最終輸出神經(jīng)元對(duì)于 網(wǎng)絡(luò)的期待,我們還需要把最后一層不需要的神經(jīng)元的激活值給弱化,所以,我們可以把神經(jīng)元2的期待和 別的神經(jīng)元的期待累加起來(lái),作為對(duì)如何改變倒數(shù)第二層神經(jīng)元的指示。

以上只是對(duì)2這個(gè)測(cè)試樣本的訓(xùn)練調(diào)整。


實(shí)際使用中,這種算法下來(lái),計(jì)算量非常大,有更優(yōu)的方法,這里我們只作為學(xué)習(xí)理解。機(jī)器學(xué)習(xí)領(lǐng)域的人,最熟悉的難關(guān),莫過于 獲取 標(biāo)記好的數(shù)據(jù)了。
反向傳播算法 算的是 單個(gè)訓(xùn)練樣板想怎么樣修改 權(quán)重和偏置,不僅僅是說每個(gè)參數(shù)應(yīng)該變大還是變小,還包括了這些變化的比例是多大,才能最快的降低代價(jià)。真正的梯度下降,得對(duì)好幾萬(wàn)個(gè)訓(xùn)練樣板都進(jìn)行這樣的操作,然后對(duì)這些變化取平均值,但算起來(lái)太慢了,所以你可以考慮將樣板分到各個(gè) Minibatch 中,計(jì)算一個(gè) Minibatch 作為梯度下降的一步,計(jì)算每一個(gè) Minibatch,調(diào)整參數(shù)不斷循環(huán),最后你會(huì)收斂到 代價(jià)函數(shù) 的一個(gè)最小值上,此時(shí),你就可以說,你的神經(jīng)網(wǎng)絡(luò)對(duì)付數(shù)據(jù)訓(xùn)練已經(jīng)很不錯(cuò)了??偠灾?,我們實(shí)現(xiàn)反向傳播的每一句代碼,其實(shí)或多或少都對(duì)應(yīng)大家已經(jīng)知道的內(nèi)容。

附錄:反向傳播算法的微積分原理
難度較大,難以理解,暫擱置。