OK-深度學(xué)習(xí)

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

深度學(xué)習(xí)經(jīng)典題目:數(shù)字識(shí)別
神經(jīng)元,我們把它理解為裝有0~1之間數(shù)字的容器
對(duì)于這么一個(gè)28*28像素的圖片,每個(gè)像素的灰度從0~1,0為黑色,1為白色,我們把里面的數(shù)字叫做 激活值,激活值越高,像素越亮,這784個(gè)神經(jīng)元就組成了第一層網(wǎng)絡(luò)
現(xiàn)在,我們可以看到這總共4層網(wǎng)絡(luò),第一層我們知道了,中間2層暫時(shí)不知道,就當(dāng)成 黑箱,最后一排,輸出的也是0~1,最后哪個(gè)激活值最高,就是想要的結(jié)果

上圖中 中間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ò)最終的選擇。

那么除了開頭的輸入層和最后的輸出層,中間2層到底干嘛?如圖,數(shù)字9可以看成一個(gè)圓和一個(gè)直線,而8可以看成2個(gè)圓,層與層之間就是判斷和匹配,最終得出這個(gè)圖像是哪個(gè)數(shù)字

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

我們可以再拆分,再想,這個(gè)神經(jīng)網(wǎng)絡(luò)第二層就能根據(jù)這些更小的部件識(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)元和第一層所有神經(jīng)元之間的連線賦予權(quán)重,這些權(quán)重不過是數(shù)字,
然后,我們拿起第一層所有的激活值乘以對(duì)應(yīng)的權(quán)重,算出它們的加權(quán)和
這些w1w2...等權(quán)重,可以用一個(gè)圖表示,圖中綠色為正值,紅色為負(fù)值,黑色接近于0,右邊是實(shí)際圖,我們就可以在右邊圖對(duì)應(yīng)的權(quán)重位置,盡量設(shè)置正值,其他區(qū)域設(shè)置負(fù)值,這樣,這塊的激活值就是更亮,就會(huì)被選擇出來(lái)
邏輯斯蒂曲線,無(wú)窮小時(shí)趨于0,無(wú)窮大時(shí)趨于1。我們計(jì)算出來(lái)的 激活值 要控制在0~1之間

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

如圖示意,我們給它加一個(gè)偏置值10

那么,我們還可以推算出來(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ù),才能讓它正確的解題

這樣矩陣的結(jié)果就等同于上方的公式,即下一列第一個(gè)神經(jīng)元的加權(quán)和,然后依次往下矩陣乘,就能依次算出下一列的各個(gè)神經(jīng)元
線性代數(shù),矩陣,是學(xué)習(xí)這塊的必備基礎(chǔ)
再簡(jiǎn)化,清晰明了多了

我們把每個(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)。

將每個(gè)垃圾的輸出激活值與你期望的值的差的平方相加起來(lái),我們稱之為訓(xùn)練 單個(gè)樣本的代價(jià),如果分類比較準(zhǔn),這個(gè)值越??;如果分類稀泥糊涂,這個(gè)值就會(huì)偏大

接下來(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è)圖的函數(shù),就比較復(fù)雜了,但是實(shí)際 對(duì)于130000多個(gè)權(quán)重和偏置值的函數(shù),就更復(fù)雜了,那怎么辦?我們?cè)購(gòu)?fù)雜模型一點(diǎn),這個(gè)圖函數(shù)是一個(gè)一元輸入但是相對(duì)復(fù)雜的函數(shù),一個(gè)靈活的技巧,先隨意輸入一個(gè)值,觀察它的斜率,這樣就可能找到它局部的最小值,但只是局部

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


如圖,想象2個(gè)輸入x,y,那么代價(jià)函數(shù)就是紅色的曲面,一個(gè)x和y對(duì)應(yīng)曲面上的一個(gè)點(diǎn),也就是2個(gè)輸入對(duì)應(yīng)一個(gè)輸出。如果把紅色曲面想象成山坡,我們就在找哪個(gè)是最深的山谷,即輸出值最小的點(diǎn),這個(gè)點(diǎn)對(duì)應(yīng)代價(jià)函數(shù)的值,越小識(shí)別越精準(zhǔn)

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

我們可以把130000個(gè)權(quán)重和偏置值組成一個(gè)列向量,那么代價(jià)函數(shù)的負(fù)梯度也不過是個(gè)向量,負(fù)梯度指出了如何修改這些參數(shù),使代價(jià)函數(shù)的值下降的最快,那么對(duì)于我們特別設(shè)計(jì)的代價(jià)函數(shù),這 意味著輸入訓(xùn)練集的每一份樣本輸出,都更接近期待的真實(shí)結(jié)果。要注意這個(gè)代價(jià)函數(shù)取的是整個(gè)訓(xùn)練集的平均值,所以最小化的意思是 對(duì)所有的樣本得到的總體結(jié)果都會(huì)更好一些

計(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ù)輸入值的過程,叫做梯度下降法

插一句,我們來(lái)探討梯度向量,比如這個(gè)二元方程的俯視圖(C的結(jié)果是一個(gè)山坡一樣的面圖,省略了不畫了,自己要能形象理解),當(dāng)xy都為1時(shí),C的值為(3 1) 那么,從(1 1)到(31)這兩個(gè)點(diǎn)的向量方向,為梯度變換最大方向。同樣,我們可以理解,3/2 和1/2,證明x對(duì)C的影響是y的3倍。從這延伸能說明什么?說明對(duì)于一個(gè)神經(jīng)網(wǎng)絡(luò),有許多權(quán)重和偏置,我們可以改變其中對(duì)結(jié)果影響大的權(quán)重和偏置,就能最快達(dá)到改變結(jié)果,并不是瞎改

我們回到神經(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ò)了。

前面,我們提到,神經(jīng)網(wǎng)絡(luò)真是識(shí)別一些短邊,圓,然后最后得出這個(gè)數(shù)字嗎?NO、NO!NO!?。∑鋵?shí)網(wǎng)絡(luò)自己也不知道啥,只有它自己知道,下一層網(wǎng)絡(luò)的激活值是什么個(gè)怪圖案,反正最終結(jié)果對(duì)了就行了

接著上面話題,這個(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)重和偏置值)

求代價(jià)值

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

那我們輸入一個(gè)訓(xùn)練樣本,對(duì)權(quán)重和偏置會(huì)造成什么影響?我們隨便拿這個(gè)“2”的圖像舉例

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

為了增大2對(duì)應(yīng)的激活值,我們有3條路:

為了增加2對(duì)應(yīng)的激活值,3個(gè)方式:我們可以增大偏置;增大權(quán)重;調(diào)整上一層的激活值
  • 先看看看如何增加權(quán)重,連接線 前一層最亮神經(jīng)元(最亮就是值最大)的那根線的 權(quán)重,增大它會(huì)迅速增大該激活值(wa相乘嘛),增加權(quán)重,我們一般就找這樣高性價(jià)比的線去增加,使得連接性更強(qiáng)。
箭頭處幾個(gè)最亮的神經(jīng)元,調(diào)整它們和2的連線的權(quán)重,能迅速使2的激活值增大,也就是這幾個(gè)最亮的神經(jīng)元和2的關(guān)聯(lián)度就更高更活躍
  • 再看看調(diào)整上一層的激活值。
對(duì)于上一層的激活值,我們讓亮的更亮,讓暗的更暗,那么2這個(gè)神經(jīng)元的激活值就更大,就能更強(qiáng)烈的被激發(fā)

對(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)元的指示。

各種期待累加起來(lái),這其實(shí)就是在實(shí)現(xiàn)“反向傳播”的理念了,這些累加起來(lái),就得到了對(duì)倒數(shù)第二層網(wǎng)絡(luò)的改變量,有了這些,就可以重復(fù)這個(gè)過程,直至改變整個(gè)網(wǎng)絡(luò)

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

除了上面的2,我們還可以對(duì)其他數(shù)字的樣本進(jìn)行大量的反復(fù)訓(xùn)練,對(duì)其他樣本進(jìn)行反向傳播,記錄每個(gè)樣本想怎么樣修改權(quán)重和偏置,得出各自的參數(shù),再進(jìn)行平均。這些得到的平均后的值的大小,不嚴(yán)格的說,就是代價(jià)函數(shù)的負(fù)梯度(平均值和負(fù)梯度還有一個(gè)倍數(shù)關(guān)系,所以不嚴(yán)格的說)
不嚴(yán)格的說,終于求出了代價(jià)函數(shù)的負(fù)梯度,通過不斷的訓(xùn)練,就是讓梯度下降

實(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)容。


附錄:反向傳播算法的微積分原理

難度較大,難以理解,暫擱置。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者。

友情鏈接更多精彩內(nèi)容