機(jī)器學(xué)習(xí)神經(jīng)絡(luò)與深度_第1頁
機(jī)器學(xué)習(xí)神經(jīng)絡(luò)與深度_第2頁
機(jī)器學(xué)習(xí)神經(jīng)絡(luò)與深度_第3頁
機(jī)器學(xué)習(xí)神經(jīng)絡(luò)與深度_第4頁
機(jī)器學(xué)習(xí)神經(jīng)絡(luò)與深度_第5頁
已閱讀5頁,還剩189頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

i S型神經(jīng) 使?交叉熵來對(duì)MNIST數(shù)字進(jìn)?分 取?XiaohuZhu已經(jīng)完成的翻譯來避免重復(fù)的?作。 — man Zhang(正在)從數(shù)據(jù)中?動(dòng)學(xué)習(xí),聽上去很有前途。然?,直到2006年,除了?于?些特殊的問題,我們?nèi)匀徊恢廊绾斡?xùn)練神經(jīng)?絡(luò)去傳統(tǒng)的?法。2006年,被稱為“深度神經(jīng)?絡(luò)”的學(xué)習(xí)技 的洗?單?樣模糊地列出?堆想法。如果你很好理解了核?理念,你就可以很快地理解其他新的推論。?編程語?對(duì)?,把這理解為掌握?種新語?的核?語法、庫和數(shù)據(jù)結(jié)構(gòu)。你可能仍然只是知道”整個(gè)編程語?的??部分許多編程語?有巨?的標(biāo)準(zhǔn)庫但新的庫和數(shù)據(jù)結(jié)構(gòu)可以很快且容易被理解。我?Python(2.7版)寫了代碼,即使你不是?Python編程,努??下也應(yīng)該很容易理解。通料,這樣即使你理解不了有些數(shù)學(xué)細(xì)節(jié),你還是可以跟上。使?數(shù)學(xué)較多的是第?章,其中需這本問題,或者把它們簡單地應(yīng)?在你??的項(xiàng)?上?作。完成再多數(shù)量的問題,也不1?多數(shù)?毫不費(fèi)?就能夠認(rèn)出這些數(shù)字為504192。這么容易反?讓?覺著迷惑了。在?類的每個(gè)腦半球中,有著?個(gè)初級(jí)視覺?層,常稱為V114千萬個(gè)神經(jīng)元及數(shù)百億條神們通常并不能體會(huì)??視覺系統(tǒng)解決問題的。1100個(gè)訓(xùn)練數(shù)字本章實(shí)現(xiàn)?個(gè)可以識(shí)別?寫數(shù)字的神經(jīng)?絡(luò)。這個(gè)程序僅僅74?,不適?特別的神什么是神經(jīng)?絡(luò)??開始,我將解釋?種被稱為“感知器”的??神經(jīng)元。感知器在20世FrankRosenblattWarrenMcCullochWalterPitts早經(jīng)?絡(luò)?作中,主要使?的是?種叫做S型神經(jīng)元的神經(jīng)元模型。我們很快會(huì)講到S型神經(jīng)元。但是要理解為什么S型神經(jīng)元被定義為那樣的?式,值得花點(diǎn)時(shí)間先來理解下感知器。 ?例中的感知器有三個(gè)輸?,x1,x2,x3。通??梢杂谢蚋佥?。Rosenblatt提議?個(gè)簡單的規(guī)則來計(jì)算輸出。他引?權(quán)重,w1,w2,...,表?相應(yīng)輸?對(duì)于輸出重要性的實(shí)數(shù)。神經(jīng)元的輸出,0或者1∑jwjxj?于或者?于?些閾值決定。和權(quán)重?樣,output

ifjifj

wx

≤>

j你可以把這三個(gè)因素對(duì)應(yīng)地??進(jìn)制變量x1,x2和x3來表?。例如,如果天?好,我們把x1=1,如果不好,x1=0。類似地,如果你的男朋友或?朋友同去,x2=1,否則x2=0。x3使?感知器來給這種決策建?數(shù)學(xué)模型。?種?式是給天?權(quán)重選擇為w1=6,其它條件為w2=2w3=2。w1被賦予更?的值,表?天?對(duì)你很重要,?你的男朋友或?朋友陪你,或 件wjxj動(dòng)來簡化。第?個(gè)變動(dòng)是把

jwjxj改寫成點(diǎn)乘

j ≡? ifw·x+b≤ ifw·x+b>

常?的負(fù)數(shù),輸出1則很。很明顯,引?偏置只是我們描述感知器的?個(gè)很?的變動(dòng),但是們有個(gè)兩個(gè)輸?的感知器,每個(gè)權(quán)重為?2,整體的偏置為3。這是我們的感知器:3001,即(?20?2033是正數(shù)。這?我?來顯式地表?乘法。但是輸?11產(chǎn)?輸出0,即(?2)?1+(?2)?1+3=?1是負(fù)數(shù)。如此我算按位求和,x1⊕x2,同時(shí)當(dāng)x1和x2都為1時(shí)進(jìn)位設(shè)為1,即進(jìn)位位正好是按位乘積x1x2:sum:x1⊕carrybit:?23。結(jié)果我們得到這樣的?絡(luò)。注意我已經(jīng)把右下的與??移動(dòng)了?點(diǎn),sum:x1⊕carrybit:如果我們不想允許這種形式,那可以簡單把兩條線合并為到?個(gè)權(quán)重為?4的連接,?不是兩個(gè)絡(luò)看起來像下?描繪的,所有未標(biāo)記的權(quán)重等于?2,所有偏置等于3,標(biāo)記的單個(gè)權(quán)重為?4:sum:x1⊕carrybit:x1sum:x1⊕carrybit:j?的感知器。那么和∑wjxj會(huì)總是為零,并且感知器在b01b≤0時(shí)輸出感知器看作感知器,?是簡單定義為輸出期望值的特殊單元,x1,x2,...。jS:w+output+我們可以引??種稱為S型神經(jīng)元的新的??神經(jīng)元來克服這個(gè)問題。S型神經(jīng)元和感知器, 正如?個(gè)感知器,S型神經(jīng)元有多個(gè)輸?,x1,x2。但是這些輸?可以取0和1中的任意這?σ被稱為S型函數(shù)1,定義為:σ(z)

1+

x1x2w1w2b1 1+ jwjxj?初看上去,S型神經(jīng)元和感知器有很?的差別。如果你不熟悉S型函數(shù)的代數(shù)形式,它看上去晦澀難懂?令??畏。實(shí)際上,感知器和S型神經(jīng)元之間有很多相似的地?,跨過理解上的,S型函數(shù)的代數(shù)形式具有很多技術(shù)細(xì)節(jié)。z≡w·xbe?z≈0?σ(z)≈1z=w·xb很?并且為正,S1,正好和感知器?樣。zw·xbe?z→∞,σ(z0zw·xb是?個(gè)很?的負(fù)數(shù),Sw·xb取中間值時(shí),和σ的代數(shù)形式?是什么?我們?cè)鯓尤ダ斫馑???shí)際上,σ的精確形式不重要——重要的是

Z經(jīng)元?絡(luò)的?使?,記住它是有?的。然?,繼續(xù)使?S型這個(gè)術(shù)語。

step Z如果σ實(shí)際是個(gè)階躍函數(shù),既然輸出會(huì)依賴于w·x+b是正數(shù)還是負(fù)數(shù)2,那么S型神經(jīng)元會(huì)成為?個(gè)感知器。利?實(shí)際的σ函數(shù),我們得到?個(gè),就像上?說明的,平滑的感知器。的變化,即?wj和?b,會(huì)從神經(jīng)元產(chǎn)??個(gè)微?的輸出變化?output。實(shí)際上,微積分告訴我們≈ ≈

? j其中求和是在所有權(quán)重wj上進(jìn)?的,??outut/?wj和?otut/?b符號(hào)表?output分別對(duì)于wj和b的偏導(dǎo)數(shù)。如果你對(duì)偏導(dǎo)數(shù)感到不?在,不?驚慌。上?全部?偏導(dǎo)數(shù)的表達(dá)式看上去很復(fù)雜,實(shí)際上它的意思?常簡單(這可是個(gè)好消息:?outut是?個(gè)反映權(quán)重和偏置變化——即?wj和?b—的線性函數(shù)。這?線性使得選擇權(quán)重和偏置的微?變化來達(dá)到輸出的微?變化的運(yùn)算變得容易。所以當(dāng)S型神經(jīng)元有和感知器相同的本質(zhì)的?為時(shí),計(jì)算如何變?nèi)绻麑?duì)σ來說重要的是形狀?不是精確的形式,那為什么要在(3)中給σ使?特定的形式呢?實(shí)際上,在這本書的后?我們會(huì)碰巧考慮到為其它激活函數(shù)f(·)輸出為f(w·x+b)的神經(jīng)元。當(dāng)我們使??個(gè)不同的激活函數(shù),最?的變化是(5)中?于偏導(dǎo)數(shù)的特定值的改變。事實(shí)證明當(dāng)我們后?計(jì)算這些偏導(dǎo)數(shù),?σ會(huì)簡化數(shù)學(xué)計(jì)算,這是因?yàn)橹笖?shù)在求導(dǎo)時(shí)有些可愛的屬性。?論如何,σ在神經(jīng)?絡(luò)的?作中被普遍使?,并且是這本書中我們最常使?的激活函我們應(yīng)該如何解釋?個(gè)S型神經(jīng)元的輸出呢?很明顯,感知器和S型神經(jīng)元之間?個(gè)很?的不同是S01010.173和92實(shí)際上,當(dāng)w·xb0,感知器輸出0,?同時(shí)階躍函數(shù)輸出1。所以嚴(yán)格地說,我們需要修改階躍函數(shù)來符9x,權(quán)w·xb?0。現(xiàn)在?S型神經(jīng)元替換所有?絡(luò)中的感知器,并且把權(quán)重和c0c→∞的極限情況下,S型神經(jīng)元?絡(luò)的?為和感知器?絡(luò)的完全?致。當(dāng)?個(gè)感知器的w·xb=0時(shí)?為什么會(huì)不同?inputinput絡(luò)有時(shí)被稱為多層感知器MLPMLP這個(gè)術(shù)語,因?yàn)槲艺J(rèn)為這會(huì)引=激活狀態(tài)可以刺激其它神經(jīng)元,使其隨后被激活并同樣保持?段有限的時(shí)間。這樣會(huì)導(dǎo)致并且遞歸?絡(luò)能解決?些重要的問題,這些問題如果僅僅?前饋?絡(luò)來解決,則更加。然hiddenlayer0123input (784567892828784282810個(gè)神經(jīng)元。如果第?個(gè)神經(jīng)元激活,即輸出1,那么表明?絡(luò)認(rèn)為09,并計(jì)算出那個(gè)神經(jīng)元有最?的激活值。?如,如果編號(hào)為6的神經(jīng)元激活,那么我們的?絡(luò)會(huì)猜到輸?的數(shù)字是6。其它神經(jīng)元相同。1010個(gè)輸0。當(dāng)然,這不是圖像的轉(zhuǎn)換,或者稍微變形。但?少在這個(gè)例?中我們可以推斷出輸?的數(shù)字是0。10個(gè)輸出?不是4個(gè)。如果我們有4個(gè)輸出,那么第?個(gè)輸出神經(jīng)元將會(huì)盡?去判斷數(shù)字的最?有效些合適的權(quán)重能讓我們僅僅?4個(gè)輸出神經(jīng)元就?。但是這個(gè)啟發(fā)性的?法通常很有效,它會(huì)0.99,得到錯(cuò)誤的輸出的激活值?多是0.01。oldoldoutputhiddennewoutputinputlayer?來學(xué)習(xí)的數(shù)據(jù)集——稱為訓(xùn)練數(shù)據(jù)集。使?MNIST數(shù)據(jù)集,其包含有數(shù)以萬計(jì)的連帶著正確分類器的?寫數(shù)字的掃描圖像。MNIST的名字來源于NIST——與技術(shù)研究所——收集的兩個(gè)數(shù)據(jù)集改進(jìn)后的?集。這是取?MNIST的?些圖像:試表現(xiàn),測(cè)試數(shù)據(jù)取?和原始訓(xùn)練數(shù)據(jù)不同的另外?組250?(盡管仍然分別是??普查xx2828784維的向量。每個(gè)向量中的項(xiàng)?代表圖像中單個(gè)像素的灰度值。我們?y=y(x)表?對(duì)應(yīng)的期望輸出,這?y是?個(gè)10維的向量。例如,如果有?個(gè)特定的畫成6的訓(xùn)練圖像,x,那么y(x)=(0000001000)T則是?絡(luò)的期望輸出。注意這?T是轉(zhuǎn)置操作,把?個(gè)?向量)C(w,b)≡1∑∥y(x)? 2nw表?所有的?絡(luò)中權(quán)重的集合,b是所有的偏置,n是訓(xùn)練輸?數(shù)據(jù)的個(gè)數(shù),a?當(dāng)輸?為x時(shí)輸出的向量,求和則是在總的訓(xùn)練輸?x上進(jìn)?的。當(dāng)然,輸出axw我們把C稱為?次代價(jià)函數(shù);有時(shí)也稱被稱為均?誤差或者M(jìn)SE。觀察?次代價(jià)函數(shù)的形式我們可以看到C(w,b)是?負(fù)的,因?yàn)榍蠛椭械拿?項(xiàng)都是?負(fù)的。此外,代價(jià)函數(shù)C(w,b)C(wb≈0,精確地說,是當(dāng)對(duì)于所有的訓(xùn)練輸?x,y(xa時(shí)。因C(wb0,它就能很好地?作。相反,當(dāng)C(w,b)很?時(shí)就不怎么好了,那意味著對(duì)于?量地輸?,y(x)與輸出a相差很?。因此我們的訓(xùn)練算法的?的,是最?化權(quán)重和偏置的代價(jià)函數(shù)C(w,b)。換句話說,我們想要找到?系列即使已經(jīng)知道我們需要使??個(gè)平滑的代價(jià)函數(shù),你可能仍然想知道為什么我們?cè)?程(6)?些修改。盡管如此,?程(6)中的?次代價(jià)函數(shù)讓我們更好地理解神經(jīng)?絡(luò)中學(xué)習(xí)算法的基重復(fù)?下,我們訓(xùn)練神經(jīng)?絡(luò)的?的是找到能最?化?次代價(jià)函數(shù)C(wb)的權(quán)重和偏置。澀不清的σ函數(shù),神經(jīng)?絡(luò)結(jié)構(gòu)的選擇,MNIST等等。事實(shí)證明我們可以忽略結(jié)構(gòu)中?部分,好了,假設(shè)我們要最?化某些函數(shù),C(v)。它可以是任意的多元實(shí)值函數(shù),v=v1,v2,...。vwb以強(qiáng)調(diào)它可能是任意的函數(shù)——我們現(xiàn)在先不局限于神經(jīng)?絡(luò)的環(huán)境。為了最?化C(v),想象C是?個(gè)只有兩個(gè)變量v1和v2的函數(shù):2C1C0

0v1 只意味著,也許我展?的函數(shù)過于C可能是?個(gè)復(fù)雜的多元函數(shù),看?下就C的極值點(diǎn)。運(yùn)?好的話,C是?個(gè)只有?個(gè)或少數(shù)?個(gè)變量的函數(shù)。但是變量過多的話那就是噩夢(mèng)。?且(確定可以通過有兩個(gè)變量的函數(shù)C來理解神經(jīng)?絡(luò)后,我已經(jīng)兩次提到:“嘿,如果看到這?你可能會(huì)以為我們會(huì)寫下球體的?頓運(yùn)動(dòng)定理,考慮摩擦?、重?等影響。實(shí)際上,我們不打算真的去實(shí)現(xiàn)這個(gè)球體滾落的推導(dǎo)—我們是在設(shè)計(jì)?個(gè)最?化C的算法,?不是在?物理定律做精確的仿真。對(duì)球體的?眼觀察是為了激發(fā)我們的想象?不是束縛我們的思構(gòu)造??的物理定律,能夠?配球體可以如何滾動(dòng),那么會(huì)采取什么樣的運(yùn)動(dòng)學(xué)定律來讓球體能夠總是滾落到?底呢?v1v2?向分別將球體移動(dòng)?個(gè)很?的量,即?v1和?v2時(shí),球體將會(huì)發(fā)?什么情況。微積分告訴我們C將會(huì)有如下變化:?C≈

?v1+?v 我們要尋找?種選擇?v1和?v2的?法使得?C為負(fù);即,我們選擇它們是為了讓球體滾?vv變化的向量,?v≡(?v1?v2)T,T(C

?C,

。我們??C?C

(

?C,

我們?上會(huì)??v和梯度?C來重寫?C的變化。在這之前先澄清?些令?困惑的關(guān)于梯度的事情。當(dāng)?shù)?次碰到?C這個(gè)符號(hào),?們有時(shí)會(huì)想知道怎么去理解?符號(hào)。?究竟是什么意思?事實(shí)上你可以把?C僅僅看做?個(gè)簡單的數(shù)學(xué)記號(hào)——上?定義的向量——這樣就不必寫兩個(gè)符號(hào)了。這樣來看,?僅僅是?個(gè)符號(hào),猶如?中擺動(dòng)的旗幟,告訴你:“嘿,?C是?有了這些定義,?C的表達(dá)式(7)?C≈?C· 這個(gè)表達(dá)式解釋了為什么?C被稱為梯度向量:?Cv的變化關(guān)聯(lián)為C的變化,正如我們期望的?梯度來表?。但是這個(gè)?程真正讓我們興奮的是它讓我們看到了如何選取?v才能讓?v= η是個(gè)很?的正數(shù)(稱為學(xué)習(xí)速率。?程(9)告訴我們?C≈?η?C·?C=?η∥?C∥2。由于∥?C∥2≥0,這保證了?C≤0,即,如果我們按照?程(10)的規(guī)則去改變v,那么C會(huì)?vv→v′=v? 2C1C0

0v1 了使梯度下降能夠正確地運(yùn)?,我們需要選擇?夠?的學(xué)習(xí)速率η使得?程(9)能得到很好的近似。如果不這樣,我們會(huì)以?C>0結(jié)束,這顯然不好。同時(shí),我們也不想η太?,因?yàn)橐??程(9)能保持很好的近似度,但算法?不會(huì)太慢。我們后?會(huì)看這是如何?作的。我已經(jīng)解釋了具有兩個(gè)變量的函數(shù)C的梯度下降。但事實(shí)上,即使C是?個(gè)具有變量Cmv1vmC中?變量的變化?v=(?v1,...,?vm)T,?C將會(huì)變?yōu)椋?C≈?C· 這?的梯度?C

(?C

?C

?v= ?C的(近似)(12保證是負(fù)數(shù)。這給了我們?種?式從梯度中去取得最?值,即使C是任意的多元函數(shù),我們也能重復(fù)運(yùn)?更則v→v′=v? 你可以把這個(gè)更則看做定義梯度下降算法。這給我們提供了?種?式去通過重復(fù)改變v來找到函數(shù)C的最?值。這個(gè)規(guī)則并不總是有效的——有?件事能導(dǎo)致錯(cuò)誤,讓我們?法從梯度下降來求得函數(shù)C的全局最?值,這個(gè)觀點(diǎn)我們會(huì)在后?的章節(jié)中去探討。但在實(shí)踐中,梯?v來讓C盡可能地減?。這相當(dāng)于最?化?C≈?C·?v。我們?先限制步?為?的固定值,即∥?v∥=?,?>0。當(dāng)步?固定時(shí),我們要找到使得C減?最?的下降?向??梢宰C明,使得?C·?v取得最?值的?v為?v=?η?C,這?η=?/∥?C∥是由步?限制∥?v∥=?所決定的。因此,梯度下降法可以被視為?種在C下降最快的?向上做微?變化的?法。CC是?個(gè)?元函數(shù)呢?你能給出偏導(dǎo)?2C/?vj?vk。如果我們有上百萬的變量vj,那須要計(jì)算數(shù)萬億(即百萬次的平?)得?程(6)的代價(jià)取得最?值的權(quán)重wk和偏置bl。為了清楚這是如何?作的,?權(quán)重和偏置代替變量vj。也就是說,現(xiàn)在“位置”變量有兩個(gè)分量組成:wk和bl,?梯度向量?C則有相應(yīng)的分量?C/?wk和?C/?bl。?這些分量來寫梯度下降的更則,我們得到:w→w′=

?Clbl→b′=bl—l

?b

∑問題是什么,我們先回顧(62C=1nxCx≡∥y(x)?a∥的平均值。在實(shí)踐中,為了計(jì)算梯度?C n需要為每個(gè)訓(xùn)練輸?x單獨(dú)地計(jì)算梯度值?Cx,然后求平均值,?C= x?Cx。不幸的是n計(jì)算?Cx,進(jìn)?估算梯度?C。通過計(jì)算少量樣本的平均值我們可以快速得到?個(gè)對(duì)于實(shí)際梯度?C的很好的估算,這有助于加速梯度下降,進(jìn)?加速學(xué)習(xí)過程。更準(zhǔn)確地說,隨機(jī)梯度下降通過隨機(jī)選取?量的m個(gè)訓(xùn)練輸?來?作。這些隨機(jī)的訓(xùn)練輸?標(biāo)記為X1X2Xm,并把它們稱為?個(gè)?批量數(shù)據(jù)(mini-batch)。假設(shè)樣本數(shù)量m?夠?,我們期望?CXj的平均值?致相等于整個(gè)?Cx的平均值,即,∑

x = 1?C≈

w→

η∑

k=wk?

b→

η∑

m bl=blmj

4實(shí)際上,更接近萬億次的?半,因?yàn)?2C/?vj?vk=?2C/?vk?vjXj上進(jìn)?的。然后我們?cè)偬暨x另?隨機(jī)選定的?批量數(shù)據(jù)去訓(xùn)練。直到我們?完了所有的訓(xùn)練輸?,這被稱為完成了?個(gè)訓(xùn)練迭代n時(shí)候忽略1數(shù)據(jù)數(shù)量n情況下特別有效。例如,這可能發(fā)?在有的訓(xùn)練數(shù)據(jù)是實(shí)時(shí)產(chǎn)?的情況下。同樣,?批量數(shù)據(jù)的更則(20)和(21)有時(shí)也會(huì)舍棄前?的1。從概念上這會(huì)有?點(diǎn)區(qū)別,因?yàn)樗葍r(jià)于改變了學(xué)習(xí)速率ηm細(xì)對(duì)?時(shí),需要對(duì)它警惕。n60000MNISTm10,們按照規(guī)則wk→wk′=wk?η?Cx/?wk和bl→b′=lbl?η?Cx/?bl更新我們的權(quán)重和偏價(jià)函數(shù)C是?個(gè)關(guān)于所有權(quán)重和偏置的多元函數(shù),因此在某種意義上來說,就是在?個(gè)?學(xué)家才有的超能??當(dāng)然不是。即使?多數(shù)專業(yè)的數(shù)學(xué)家也不能想象出空間的樣?代數(shù)(?不是圖像)描繪?C來計(jì)算如何變化才能讓C減少。那些思考?維的?內(nèi)?有好吧,現(xiàn)在讓我們寫?個(gè)學(xué)習(xí)如何識(shí)別?寫數(shù)字的程序,使?隨機(jī)梯度下降算法和MNISTMNIST數(shù)據(jù)。如果你是?個(gè)git??,那么你能夠gitgit 測(cè)試圖像。這是官?的MNIST的描述。實(shí)際上,?稍微不同的?法對(duì)數(shù)據(jù)進(jìn)?劃分。我60,000MNIST50,000個(gè)不使?驗(yàn)證數(shù)據(jù),但是在本書的后?會(huì)發(fā)現(xiàn)它對(duì)于解決如何去設(shè)置某些神經(jīng)?絡(luò)中的超MNISTMNIST,并且在神經(jīng)?絡(luò)中使?驗(yàn)證據(jù)集,?不是原始的60,000圖像數(shù)據(jù)集5。除了MNIST數(shù)據(jù),我們還需要?個(gè)叫做Numpy的Python庫,?來做快速線性代數(shù)。如果classdefclassdefinit(self,sizes):self.sizes=sizesself.biases=[np.random.randn(y,1)foryinsizes[1:]]self.weights=[np.random.randn(y,x)forx,yinzip(sizes[:-1],net=Network([2,3, 01的?斯分布。這樣的隨機(jī)初始化給了我們的隨機(jī)梯度下降算法?個(gè)起點(diǎn)。kthjthjkjk索a′=σ(wa+ 5如前所述,MNIST數(shù)據(jù)集是基于5如前所述,MNIST數(shù)據(jù)集是基于與技術(shù))收集的兩個(gè)數(shù)據(jù)集合。為了構(gòu)建MNIST,NIST數(shù)據(jù)集合被YannLeCun,CorinnaCortes和ChristopherJ.C.Burges拆分放??個(gè)更?便的格式。細(xì)節(jié)請(qǐng)看這個(gè)。我的倉庫中的數(shù)據(jù)集是在?種更容易在Python中加載和MNIST數(shù)據(jù)的形式。我從蒙特利爾?學(xué)的LISA機(jī)器學(xué)習(xí)獲得了這個(gè)特殊格式的數(shù)據(jù)()σ(σ向量化)(22S型神經(jīng)元輸出的?程(4)相同。def以分量形式寫出?程(22),并驗(yàn)證它和計(jì)算S型神經(jīng)元輸出的規(guī)則(4)結(jié)果相同。有了這些,很容易寫出從?個(gè)defdefdeffeedforward(self,"""Returntheoutputofthenetworkif"a"isforb,winzip(self.biases,self.weights):a=sigmoid(np.dot(w,a)+b)return算法的SGD?法。代碼如下。其中?些地?看似有?點(diǎn)神秘,我會(huì)在代碼后?逐個(gè)分析。defdefSGD(self,training_data,epochs,mini_batch_size,eta,"""Traintheneuralnetworkusingmini-batchstochasticgradientdescent.The"training_data"isalistoftuples"(x,y)"representingthetraininginputsandthedesiredoutputs.Theothernon-optionalparametersare natory.If"test_data"isprovidedthenthenetworkwillbeevaluatedagainstthetestdataaftereachepoch,andpartialprogressprintedout.Thisisusefulfortrackingprogress,butslowsthingsdownsubstantially."""iftest_data:n_test=len(test_data)n=len(training_data)forjinxrange(epochs):mini_batches=[forkinxrange(0,n,mini_batch_size)]formini_batchinmini_batches:iftest_data:print"Epoch{0}:{1}/print"Epoch{0}training_data是?個(gè)(x,y)元組的列表,表?訓(xùn)練輸?和其對(duì)應(yīng)的期望輸出。變量epochs和ηtest_data,那么程序會(huì)在每個(gè)訓(xùn)練器后評(píng)估?絡(luò),并打印出部分進(jìn)展。(n,)(n,)向量看上去好像是更?然的選擇,但是使??個(gè)(n,1)的ndarray使得修改代碼來?即前饋多個(gè)輸?變得特別容易,并且有的時(shí)候很?便。"""Updatethenetwork'sweightsandbiasesbyapplyinggradientdescent"""Updatethenetwork'sweightsandbiasesbyapplyinggradientdescentusingbackpropagationtoasingleminibatch.The"mini_batch"isalistoftuples"(x,y)",and"eta"isthelearningnabla_b=[np.zeros(b.shape)forbinself.biases]nabla_w=[np.zeros(w.shape)forwinself.weights]forx,yinmini_batch:delta_nabla_b,delta_nabla_w=self.backprop(x,nabla_b=[nb+dnbfornb,dnbinzip(nabla_b,delta_nabla_b)]nabla_w=[nw+dnwfornw,dnwinzip(nabla_w,delta_nabla_w)]self.weights=[w-(eta/len(mini_batch))*nwforw,nwinzip(self.weights,nabla_w)]self.biases=[b-(eta/len(mini_batch))*nbforb,nbinzip(self.biases, delta_nabla_b,delta_nabla_w=self.backprop(x, 這?調(diào)?了?個(gè)稱為反向的算法,?種快速計(jì)算代價(jià)函數(shù)的梯度的?法。因此update_mini_batch的?作僅僅是對(duì)mini_batch中的每?個(gè)訓(xùn)練樣本計(jì)算梯度,然后適當(dāng)?shù)馗聅elf.weights和self.biases。我現(xiàn)在不會(huì)列出self.backprop的代碼。在下章中學(xué)習(xí)反向是怎樣?作的,包括self.backprop的代碼。現(xiàn)在,就假設(shè)它按照我們要求的?作,返回與訓(xùn)練樣本x相關(guān)代價(jià)的適?夠的?檔注釋——所有的繁重?作由self.SGD和self.update_mini_batch完成,對(duì)此我們已經(jīng)有討論過。self.backprop?法利??些額外的函數(shù)來幫助計(jì)算梯度,即sigmoid_prime,它計(jì)算σ函數(shù)的導(dǎo)數(shù),以及self.cost_derivative,這?我不會(huì)對(duì)它過多描述。你能夠通過查看代碼或?但是很多代碼是?來使代碼更容易理解的?檔注釋。實(shí)際上,程序只包含74??空、?注釋的 Amoduletoimplementthestochasticgradientdescentlearningalgorithmforafeedforwardneuralnetwork.Gradientsarecalculatedusingbackpropagation.NotethatIhavefocusedonmakingthecodesimple,easilyreadable,andeasilymodifiable.Itisnotoptimized,andomitsmanydesirablefeatures.#####Standardimport#Third-partyimportnumpyasnp init(self,"""Thelist``sizes``containsthenumberofneuronsintherespectivelayersofthenetwork.Forexample,ifthelistwas[2,3,1]thenitwouldbeathree-layernetwork,withthefirstlayercontaining2neurons,thesecondlayer3neurons,andthethirdlayer1neuron.Thebiasesandweightsforthenetworkareinitializedrandomly,usingaGaussiandistributionwithmean0,andvariance1.Notethatthefirstlayerisassumedtobeaninputlayer,andbyconventionwewon'tsetanybiasesforthoseneurons,sincebiasesareonlyeverusedincomputingtheoutputsfromlaterlayers."""self.num_layers=len(sizes)self.sizes=self.biases=[np.random.randn(y,1)foryinsizes[1:]]self.weights=[np.random.randn(y,x)forx,yinzip(sizes[:-1],deffeedforward(self,"""Returntheoutputofthenetworkif``a``isforb,winzip(self.biases,self.weights):a=sigmoid(np.dot(w,a)+b)returndefSGD(self,training_data,epochs,mini_batch_size,eta,"""Traintheneuralnetworkusingmini-batchstochasticgradientdescent.The``training_data``isalistoftuples``(x,y)``representingthetraininginputsandthedesiredoutputs.Theothernon-optionalparametersare natory.If``test_data``isprovidedthenthenetworkwillbeevaluatedagainstthetestdataaftereachepoch,andpartialprogressprintedout.Thisisusefulfortrackingprogress,butslowsthingsdownsubstantially."""iftest_data:n_test=len(test_data)n=len(training_data)forjinxrange(epochs):mini_batches=[forkinxrange(0,n,mini_batch_size)]formini_batchinmini_batches:iftest_data:print"Epoch{0}:{1}/print"Epoch{0}"""Updatethenetwork'sweightsandbiasesbyapplyinggradientdescentusingbackpropagationtoasingleminibatch.The``mini_batch``isalistoftuples``(x,y)``,and``eta``isthelearningrate."""nabla_b=[np.zeros(b.shape)forbinself.biases]nabla_w=[np.zeros(w.shape)forwinself.weights]forx,yinmini_batch:delta_nabla_b,delta_nabla_w=self.backprop(x,nabla_b=[nb+dnbfornb,dnbinzip(nabla_b,delta_nabla_b)]nabla_w=[nw+dnwfornw,dnwinzip(nabla_w,self.weights=[w-forw,nwinzip(self.weights,nabla_w)]self.biases=[b-(eta/len(mini_batch))*nbforb,nbinzip(self.biases,defbackprop(self,x,"""Returnatuple``(nabla_b,nabla_w)``representingthegradientforthecostfunctionC_x.``nabla_b``and``nabla_w``arelayer-by-layerlistsofnumpyarrays,similarto``self.biases``and``self.weights``."""nabla_b=[np.zeros(b.shape)forbinself.biases]nabla_w=[np.zeros(w.shape)forwinself.weights]#feedforwardactivation=activations=[x]#listtostorealltheactivations,layerbyzs=[]#listtostoreallthezvectors,layerbyforb,winzip(self.biases,self.weights):z=np.dot(w,activation)+bzs.append(z)activation=sigmoid(z)#backwarddelta=self.cost_derivative(activations[-1],y)*\nabla_b[-1]=#Notethatthevariablelintheloopbelowisusedalittle#differentlytothenotationinChapter2ofthebook.Here,#l=1meansthelastlayerofneurons,l=2isthe#second-lastlayer,andsoon.It'sarenumberingof#schemeinthebook,usedheretotakeadvantageofthefact#thatPythoncanusenegativeindicesinlists.forlinxrange(2,self.num_layers):z=zs[-l]sp=delta=np.dot(self.weights[-l+1].transpose(),delta)*spnabla_b[-l]=deltanabla_w[-l]=np.dot(delta,activations[-l-1].transpose())return(nabla_b,nabla_w)defevaluate(self,"""Returnthenumberoftestinputsforwhichtheneuralnetworkoutputsthecorrectresult.Notethattheneuralnetwork'soutputisassumedtobetheindexofwhicheverneuroninthefinallayerhasthehighestactivation."""test_results=[(np.argmax(self.feedforward(x)),y)for(x,y)inreturnsum(int(x==y)for(x,y)in"""Returnthevectorofpartialderivatives\partialC_x\partialafortheoutput####Miscellaneousdef"""Thesigmoiddefdef"""DerivativeofthesigmoidMNIST數(shù)據(jù)。我將?下?所描述的??段輔助程序mnist_loader.py來完成。我們?cè)?個(gè)Pythons中執(zhí)?下?令,>>>>>>import>>>training_data,validation_data,test_data=...當(dāng)然,這也可以以?個(gè)單獨(dú)的Python程序來完成,但是如果你正在照著本書做,在Pythons?執(zhí)?也許是最?便的。在加載完MNIST數(shù)據(jù)之后,設(shè)置?個(gè)有30個(gè)隱藏層神經(jīng)元的Network。我們?cè)趯?dǎo)?如上所列的名為network的Python程序后做,>>>>>>import>>>net=network.Network([784,30,據(jù)??為10,學(xué)習(xí)速率η=3.0,>>>net.SGD(training_data,30,10,3.0, 了?組好的權(quán)重集和偏置集,它能很容易地被移植到?絡(luò)瀏覽器中以Javascript運(yùn)?,或者如次迭代期后,達(dá)到了10,000中選中的9,129個(gè)。?且數(shù)?還在持續(xù)增?,EpochEpoch0:9129/Epoch1:9295/Epoch2:9348/Epoch27:9528/Epoch28:9542/Epoch29:9534/95.42“Epoch28!>>>>>>net=network.Network([784,100,>>>net.SGD(training_data,30,10,3.0,果然,它將結(jié)果提升?96.59%。?少在這種情況下,使?的隱藏神經(jīng)元幫助我們得到的結(jié)果。假如我們選定學(xué)習(xí)速率為η=0.001,>>>>>>net=network.Network([784,100,>>>net.SGD(training_data,30,10,0.001,EpochEpoch0:1139/Epoch1:1136/Epoch2:1135/Epoch27:2101/Epoch28:2123/Epoch29:2142/η=0.01為η=100.0:>>>>>>net=network.Network([784,30,>>>net.SGD(training_data,30,10,100.0,EpochEpoch0:1009/Epoch1:1009/Epoch2:1009/Epoch3:1009/Epoch27:982/Epoch28:982/Epoch29:982/AlibrarytoloadtheMNISTimagedata.Fordetailsofthedatastructuresthatarereturned,seethedocstringsfor``load_data``andAlibrarytoloadtheMNISTimagedata.Fordetailsofthedatastructuresthatarereturned,seethedocstringsfor``load_data``and``load_data_wrapper``.Inpractice,``load_data_wrapper``isthefunctionusuallycalledbyourneuralnetworkcode.####importcPickleimportgzip#Third-partyimportnumpyasdef"""ReturntheMNISTdataasatuplecontainingthetrainingdata,thevalidationdata,andthetestdata.The``training_data``isreturnedasatuplewithtwoentries.Thefirstentrycontainstheactualtrainingimages.Thisisanumpyndarraywith50,000entries.Eachentryis,inturn,anumpyndarraywith784values,representingthe28*28=784pixelsinasingleMNISTimage.Thesecondentryinthe``training_data``tupleisanumpyndarraycontaining50,000entries.Thoseentriesarejustthedigitvalues(0...9)forthecorrespondingimagescontainedinthefirstentryofthetuple.The``validation_data``and``test_data``aresimilar,excepteachcontainsonly10,000images.Thisisanicedataformat,butforuseinneuralnetworksit'shelpfultomodifytheformatofthe``training_data``alittle.That'sdoneinthewrapperfunction``load_data_wrapper()``,seetraining_data,validation_data,test_data=cPickle.load(f)def"""Returnatuplecontaining``(training_data,validation_data,test_data)``.Basedon``load_data``,buttheformatismoreconvenientforuseinourimplementationofneuralnetworks.Inparticular,``training_data``isalistcontaining2-tuples``(x,y)``.``x``isa784-dimensionalnumpy.ndarraycontainingtheinputimage.``y``isa10-dimensionalnumpy.ndarrayrepresentingtheunitvectorcorrespondingtothecorrectdigitfor``x``.``validation_data``and``test_data``arelistscontaining10,0002-tuples``(x,y)``.Ineachcase,``x``isa784-dimensionalnumpy.ndarrycontainingtheinputimage,and``y``isthecorrespondingclassification,i.e.,thedigitvalues(integers)correspondingto``x``.Obviously,thismeanswe'reusingslightlydifferentformatsforthetrainingdataandthevalidation/testdata.Theseformatsturnouttobethemostconvenientforuseinourneuralnetworktr_d,va_d,te_d=training_inputs=[np.reshape(x,(784,1))forxintr_d[0]]training_results=[vectorized_result(y)foryintr_d[1]]training_data=zip(training_inputs,training_results)validation_inputs=[np.reshape(x,(784,1))forxinva_d[0]]validation_data=zip(validation_inputs,va_d[1])test_inputs=[np.reshape(x,(784,1))forxinte_d[0]]test_data=zip(test_inputs,te_d[1])def"""Returna10-dimensionalunitvectorwitha1.0inthejthpositionandzeroeselsewhere.Thisisusedtoconvertadigit(0...9)intoacorrespondingdesiredoutputfromtheneurale=np.zeros((10,1))e[j]=1.0return然是隨機(jī)地猜些數(shù)字。那將有10%的次數(shù)是正確的。?這做得更好! 205050%著名的算法之?,?持向量機(jī),或SVM。如果你不熟悉SVM,不?擔(dān)?,我們不需要去理解SVM如何?作的細(xì)節(jié)。使?scikit-learnPython程序庫,它提供了?個(gè)簡單的Python接?,包裝了?個(gè)?于SVM的快速的,稱為LIBSVM的CSVM表現(xiàn)得?乎和神經(jīng)?絡(luò)?樣好,只是差了?點(diǎn)?已。在后?章節(jié)中我們會(huì)介紹新的技術(shù),讓我們能夠改進(jìn)我們的神經(jīng)?絡(luò)使得它們表現(xiàn)得?SVM更好。找,如果你想知道,可以參考這份AndreasMueller的博客。Mueller展?了通過?些優(yōu)化事實(shí)上,它們可以。?前,精?設(shè)計(jì)的神經(jīng)?絡(luò)勝過任何其它解決MNIST的技術(shù),包括SVM。現(xiàn)在(2013)的是從10,000圖像中正確分類9,979個(gè)。這是由LiWan,MatthewZeiler,SixinZhang,YannLeCun,和RobFergus完成的。在這本書后?看到它們?的我相信你會(huì)同意那些數(shù)字很難辨認(rèn)!考慮到MNIST數(shù)據(jù)集中這樣的圖像,神經(jīng)?絡(luò)能準(zhǔn)確識(shí)別10000幅測(cè)試圖像中除了21幅之外的其它所有圖像,這表現(xiàn)得相當(dāng)卓越。通常,當(dāng)編程MNIST數(shù)字的問題需要?個(gè)復(fù)雜的算法。但是即使是剛才提到的Wan等?的論?中?的神經(jīng)?絡(luò),只涉及到相當(dāng)簡單的算法、和我們?cè)谶@?章中已經(jīng)看到的算復(fù)雜的算法≤簡單的學(xué)習(xí)算法+嗎?中間有?個(gè)??嗎?下?有?個(gè)嘴嗎?上?有頭發(fā)嗎?諸如此類。.SantaCruz),R.Bouwens(LeidenUniversity),andtheHUDF09Team.點(diǎn)擊序號(hào)查看細(xì)節(jié)。inputlayer=?2006年以來,?們已經(jīng)開發(fā)了?系列技術(shù)使深度神經(jīng)?絡(luò)能夠?qū)W習(xí)。這些深度學(xué)習(xí)技術(shù)2反 我們會(huì)解釋計(jì)算這些梯度的快速算法,也就是反向(backpropagation。RonaldWilliams的著名的1986年的論?中才認(rèn)識(shí)到這個(gè)算法的重要性。這篇論?描述了對(duì)?表達(dá)式會(huì)有點(diǎn)復(fù)雜,不過??也包含?種美感,就是每個(gè)元素其實(shí)是擁有?種?然的上的wjlk(l1)thkthlth .layer layer layerwl是從(l?1)th層的第kth個(gè)神經(jīng)元到lth層的第jth便也很?然。奇怪的?點(diǎn)其實(shí)是下標(biāo)j和k的順序。你可能覺得反過來更加合理。但我接下來jallthjth個(gè)神經(jīng)元的激活值。下?的圖清楚地解釋了這樣表?的jlayer layer layer13j有了這些表?,lthjthal就和(l1)thjal=

wlal?1+

jk kj其中求和是在(l?1)th層的所有k個(gè)神經(jīng)元上進(jìn)?的。為了?矩陣的形式重寫這個(gè)表達(dá)式,l都定義?個(gè)wlwllth層神經(jīng)元的權(quán)重,更確切地說,在第jth?第kth列的元素是wljk。類似的,對(duì)每?層l,定義?個(gè)偏置向量,bl。你bljlth層的每個(gè)神經(jīng)元。最后,我們定義激活向量al,其元素是那些激活值al。j最后我們需要引?向量化函數(shù)(如σ)來按照矩陣形式重寫(23)。在上?章,我們其實(shí)已經(jīng)碰到向量化了,其含義就是作?函數(shù)(如σ)到向量v中的每個(gè)元素。我們使?σ(v)表?這種按元素進(jìn)?的函數(shù)作?。所以,σ(v)的每個(gè)元素其實(shí)滿?σ(v)j=σ(vj)。給個(gè)例?,如果f(x)=x2f

f

f al=σ(wlal?1+ 在使??程(25)計(jì)算al的過程中,我們計(jì)算了中間量zl≡wlal?1+bl。這個(gè)量其實(shí)是 jk ?常有?的:我們稱zl為l層神經(jīng)元的帶權(quán)輸?。在本章后?,我們會(huì)充分利?帶權(quán)輸?zl。?程(25)有時(shí)候會(huì)以帶權(quán)輸?的形式寫作al=σ(zl)。同樣要的是zl的每個(gè)元素是zl=∑wlal?1+bl,其實(shí)z jk 反向的?標(biāo)是計(jì)算代價(jià)函數(shù)C分別關(guān)于w和b的偏導(dǎo)數(shù)?C/?w和?C/?b。為了讓反向C=1∑∥y(x)? nx;yy(x是對(duì)應(yīng)的?標(biāo)輸出;L??絡(luò)的層數(shù);aL=aL(x)xn是代價(jià)函數(shù)可以被寫成?個(gè)在每個(gè)訓(xùn)練樣本x上的代價(jià)函數(shù)Cx的均值C=1xCx。這是關(guān)Cx=1||yaL||2。這個(gè)假設(shè)對(duì)書n2需要這個(gè)假設(shè)的原因是反向?qū)嶋H上是對(duì)?個(gè)獨(dú)?的訓(xùn)練樣本計(jì)算了?Cx/?w和?Cx/?b。然后我們通過在所有訓(xùn)練樣本上進(jìn)?平均化獲得?C/?w和?C/?b。實(shí)際上,有了這個(gè)假設(shè),我xCxC。最終我們會(huì)把下12costC=12C=1∥y?aL∥2=1∑(y?a

2 們不把代價(jià)也看作?個(gè)y的函數(shù)。記住,輸?的訓(xùn)練樣本x是固定的,所以輸出y同樣是?個(gè)CaLy僅僅是幫助定義⊙sts⊙t來表?按元素的乘積。所以s⊙t的元素就是(s⊙t)j=sjtj。給個(gè)例?,

1?

2? Hadamard乘積Schur乘積。我們這?取前者。好的矩陣庫通常會(huì)提供Hadamard乘積的快速實(shí)現(xiàn),在實(shí)現(xiàn)反向的時(shí)候?起來很?便。?C/?wl?C/?bl。但是為了計(jì)算這些值,我們?先引??個(gè)中間量,δl,這個(gè)我們稱為 lthjth個(gè)神經(jīng)元上的誤差 和?C/?bl上 neuronj,layer.. .... ..

..C.... ..會(huì)增加很?的變化?zl在神經(jīng)元的帶權(quán)輸?上,使得神經(jīng)元輸出由σ(zl變成σ(zlzl)。這個(gè)變化會(huì)向?絡(luò)后?j層進(jìn) ,最終導(dǎo)致整個(gè)代價(jià)產(chǎn)??C?zl的j變 j j設(shè)

jjj j

相反符號(hào)的?zlj來降jj

δl≡ j j計(jì)算每層的δl的?法,然后將這些誤差和最終我們需要的量?C/?wljk和?C/?blj聯(lián)系起來。 jj

討論的差不多。但是看起來,前?的?讓反向在代數(shù)運(yùn)算上變得?較復(fù)雜。所以我們堅(jiān)持使?δl=?C/?zl作為誤差的度量3。 解決?案:反向基于四個(gè)基本?程。這些?程給我們?種計(jì)算誤差δl和代價(jià)函數(shù)梯度:jδL=?C j jj這是?個(gè)?常?然的表達(dá)式。右式第?個(gè)項(xiàng)?C/?aL表?代價(jià)隨著jth輸出激活值的變化?CjδL就會(huì)很?,這也是我們想要的效果。右式第?項(xiàng)σ′(zL)刻畫了在zL處激活函數(shù)σ變化的速度。jj 注意到在(BP1)中的每個(gè)部分都是很好計(jì)算的。特別地,我們?cè)谟?jì)算?絡(luò)?為時(shí)計(jì)算zjL,這僅僅需要?點(diǎn)點(diǎn)額外?作就可以計(jì)算σ′(zL)。當(dāng)然 j給定了代價(jià)函數(shù),計(jì)算?C/?aLj2C=1∑(ya)2?C/?aLay)2j δL=?aC⊙ j這??aC被定義成?個(gè)向量,其元素是偏導(dǎo)數(shù)?C/?aL。你可以將?aCC關(guān)于輸出)j?(BP1)表?這兩個(gè)?程。舉個(gè)例?,在?次代價(jià)函數(shù)時(shí),我們有?aC=(aL?y),所以δL=(aL?y)⊙ δl+1δlδl=((wl+1)Tδl+1)⊙ 其中(wl+1)T是(l+1)th層權(quán)重矩陣wl+1的轉(zhuǎn)置。這個(gè)看上去有些復(fù)雜,但每?個(gè)元素有很好的解釋。假設(shè)我們知道l+1th層的誤差δl+1。當(dāng)我們應(yīng)?轉(zhuǎn)置的權(quán)重矩陣(wl+1)T,我們可我們進(jìn)?Hadamard乘積運(yùn)算⊙σ′(zl)。這會(huì)讓誤差通過l層的激活函數(shù)反向傳遞回來并給出在第l層的帶權(quán)輸?的誤差δ。jj

= jδl?C/?bl完全?致。這是很好的性質(zhì),因?yàn)?BP1)和(BP2)j jj

?C= ?C= l

,其中δl和al?1?C= 重w,還有兩個(gè)由這個(gè)權(quán)重相連的神經(jīng)元,我們給出?幅圖如下:?C?C=?程(32)的?個(gè)好的結(jié)果就是當(dāng)激活值ain很?,ain≈0,梯度?C/?w也會(huì)趨向很?。這這四 σ′(zl)Sσ(zL01σ j?常平。這時(shí)σ′(zL)≈0。所以如果輸出神經(jīng)元處于或者低激活值(≈0)或者?激活值(≈1)jj(BP2)σ′(zl)。這表?如果神經(jīng)元已經(jīng)接近飽和,δl很可能變?。這就導(dǎo)致任何輸?進(jìn)?個(gè)飽和的神經(jīng)元的權(quán)重學(xué)習(xí)緩慢4。j個(gè)(?S型)σσ′0。這會(huì)防?在原始的S型神經(jīng)元飽和時(shí)學(xué)習(xí)速度下降的情況出現(xiàn)。在本書的后?,我們會(huì)?到這種類型的對(duì)激活函數(shù)的改變。時(shí)時(shí)回顧這四個(gè)?程(BP1)–(BP4可以幫助解釋為何需要有這些嘗試,以及嘗試帶來的影響。4如果wl+1Tδl+1σ′(zl)k .δL=?aC⊙δl=((wl+1)Tδl+1)⊙?C=jj?C= 另?種反向?程的表??式:我已經(jīng)給出了使?Hadamard乘積的反向((BP1(BP2)。如果你對(duì)這種特殊的乘積不熟悉,可能會(huì)有?些困惑。下?還(BP1可以寫成δL= 其中Σ′(zLσ′(zL)j0。注意,這個(gè)矩陣通過?般的矩陣乘法作?在?aC(2)證明(BP2)可以寫成δl=Σ′(zl)(wl+1)T δl=Σ′(zl)(wl+1)T...Σ′(zL?1)(wL)T )(BP1)δL的表達(dá)式。為了證明這個(gè)?程,回憶下定δL= jj∑?CjδLj

k kkthaL只依賴于當(dāng)k=j時(shí)第jth個(gè)神經(jīng)元的輸?權(quán)重zL。所以當(dāng)k?=j時(shí)?aL/?zLk ..

δL

?C

?aL aLσ(zL)σ′(zL) jδL=?C j 這正是分量形式的(BP1) 證明(BP2),它給出了以下?層誤差δl+1的形式表?誤差δl。為此,我們想要以δl+1=?C/?zl+1的形式重寫δl=?C/?zl。我們可以?鏈?zhǔn)椒▌t: δl= j j kk

kjkj

kl k這?最后??我們交換了右邊的兩項(xiàng),并?δl+1k

zl+1k

wl+1al+bl+1 j

wl+1σ(zl)+ j

l+1

σ(zj 這正是以分量形式寫的(BP2)

δljk

wl+1δl+1σ′(zl 和證明?程(BP3)和(BP4)反向算xa1 :對(duì)每個(gè)l=2,3,...,L計(jì)算相應(yīng)的zl=wlal?1+bl和al=δLδL=?aC⊙ :對(duì)每個(gè)l=L?1,L?2,...,2,計(jì)算δl=((wl+1)Tδl+1)⊙輸出:代價(jià)函數(shù)的梯度由 =al?1δl和?C=δl得j j

j個(gè)神經(jīng)元的輸出是f(∑wjxj+b),其中f是和Sj 假設(shè)?線性神經(jīng)元的σ函數(shù)替換為σ(z)=z。重寫反向正如我們上?所講的,反向算法對(duì)?個(gè)訓(xùn)練樣本計(jì)算代價(jià)函數(shù)的梯度,C=Cx。在實(shí)踐m的?批量數(shù)據(jù),下?的算法在這個(gè)?批量 :對(duì)每個(gè)l=2,3,...,L計(jì)算zx,l=wlax,l?1+bl和ax,l=σ(zx,l)δx,Lδx,L=?aCx⊙σ′(zx,L) 誤差:對(duì)每個(gè)l=L?1,L?2,...,2計(jì)算δx,l=((wl+1)Tδx,l+1)⊙σ′(zx,l)梯度下降:對(duì)每個(gè)l=L?1L?22根據(jù)wl→wl?ηm

x

blbl?η∑δx,l 些?法的代碼其實(shí)是我們上?的算法描述的直接。特別地,update_mini_batch?法通過計(jì)算當(dāng)前mini_batch中的訓(xùn)練樣本對(duì)Network的權(quán)重和偏置進(jìn)?了更新:classclass"""Updatethenetwork'sweightsandbiasesbyapplyinggradientdescentusingbackpropagationtoasingleminibatch.The"mini_batch"isalistoftuples"(x,y)",and"eta"isthelearningnabla_b=[np.zeros(b.shape)forbinself.biases]nabla_w=[np.zeros(w.shape)forwinself.weights]forx,yinmini_batch:delta_nabla_b,delta_nabla_w=self.backprop(x,nabla_b=[nb+dnbfornb,dnbinzip(nabla_b,delta_nabla_b)]nabla_w=[nw+dnwfornw,dnwinzip(nabla_w,delta_nabla_w)]self.weights=[w-forw,nwinzip(self.weights,nabla_w)]self.biases=[b-(eta/len(mini_batch))*nbforb,nbinzip(self.biases,backprop?法計(jì)算出了偏導(dǎo)數(shù),?Cx/?bl?Cx/?wl。backprop表中的倒數(shù)第三個(gè)元素。下?backprop的代碼,和?些幫助函數(shù)?起,被?于計(jì)算σ、導(dǎo)數(shù)σ′classclassdefbackprop(self,x,"""Returnatuple"(nabla_b,nabla_w)"representingthegradientforthecostfunctionC_x."nabla_b"and"nabla_w"arelayer-by-layerlistsofnumpyarrays,similarto"self.biases"and"self.weights"."""nabla_b=[np.zeros(b.shape)forbinself.biases]nabla_w=[np.zeros(w.shape)forwinself.weights]#feedforwardactivation=activations=[x]#listtostorealltheactivations,layerbyzs=[]#listtostoreallthezvectors,layerbyforb,winzip(self.biases,self.weights):z=np.dot(w,activation)+bzs.append(z)activation=sigmoid(z)#backwarddelta=self.cost_derivative(activations[-1],y)*\nabla_b[-1]=#Notethatthevariablelintheloopbelowisusedalittle#differentlytothenotationinChapter2ofthebook.Here,#l=1meansthelastlayerofneurons,l=2isthe#second-lastlayer,andsoon.It'sarenumberingof#schemeinthebook,usedheretotakeadvantageofthefact#thatPythoncanusenegativeindicesinlists.forlinxrange(2,self.num_layers):z=zs[-l]sp=delta=np.dot(self.weights[-l+1].transpose(),delta)* nabla_b[-l]nabla_b[-l]=nabla_w[-l]=np.dot(delta,activations[-l-1].transpose())return(nabla_b,nabla_w)"""Returnthevectorofpartialderivatives\partialC_x\partialafortheoutputdef"""Thesigmoiddef"""Derivativeofthesigmoid 的全矩陣?法 我們對(duì)于隨機(jī)梯度下降的實(shí)現(xiàn)是對(duì)?個(gè)?批量數(shù)據(jù)中的訓(xùn)練樣本進(jìn)?遍歷。所以也可以更改反向算法使得它同時(shí)對(duì)?個(gè)?批量數(shù)據(jù)中的所有樣本進(jìn)?梯度計(jì)算。這個(gè)想法其實(shí)就是我們可以??個(gè)矩陣x1x2xm],其中每列就是在?批量數(shù)據(jù)中的向量,?不是單個(gè)的輸?向量,x。我們通過乘權(quán)重矩陣,加上對(duì)應(yīng)的偏置進(jìn)?前向,在所有地?應(yīng)?S型函數(shù)。然后按照類似的過程進(jìn)?反向。請(qǐng)顯式寫出這種?法下的偽代碼。更改network.py來實(shí)現(xiàn)這個(gè)??遍歷要運(yùn)?得更快(在我的筆記本電腦上,在MNIST分類問題上,我相較于上?章的實(shí)現(xiàn)獲得了2倍的速度提升。在實(shí)際應(yīng)?中,所有靠譜的反向的庫都是?了類似的后就退縮了。所以就試著找另外的?式。你決定僅僅把代價(jià)看做權(quán)重的函數(shù)C=C(w)(我們?上會(huì)回到偏置。你給這些權(quán)重w1,w2,...進(jìn)?編號(hào),期望計(jì)算某些權(quán)重wj的偏導(dǎo)數(shù)?C/?wj。

≈C(w+?ej)??

?0ejj個(gè)?向上的單位向量。換句話說,我們可以通過計(jì)算兩個(gè)接近相同的wj值的代價(jià)C來估計(jì)?C/?wj,然后應(yīng)?(46)。同樣?法也可以?來計(jì)算?C/?b。1000000wjC(w?ej?C/?wj。反向聰明的地?就是它確保我們可以同時(shí)計(jì)算所有的偏導(dǎo)數(shù)?C/?wj,僅僅使??次前即使反向看起來要?(46)更加復(fù)雜,但實(shí)際上要更快。1986年?次被眾?接受,并直接導(dǎo)致神經(jīng)?絡(luò)可以處理的問題的擴(kuò)展。這期,?們嘗試極限,尤其是嘗試使?反向來訓(xùn)練深度神經(jīng)?絡(luò)。本書后?,看的變動(dòng)?wjlk:.. .... ..

..C.... ..jj.. .... ..

..C.... .... .... ..

..C.... .... .... ..

..C.... ..所以代價(jià)函數(shù)?C改變和?wljk就按照下? ?C

這給出了?種可能的計(jì)算?C的?法其實(shí)是細(xì)致地追蹤?個(gè) 就能夠計(jì)算?C/?wljk了。我們嘗試?下這個(gè)?法。 導(dǎo)致了在lth層jth神經(jīng)元的激活值的變化?alj。這個(gè)變化jj

?al

?a

jq?al的變化將會(huì)導(dǎo)致下?層(l1)th的所有激活值的變化。我們聚焦到其中?個(gè)激活值上看看影響的情況,不妨設(shè)al+1,jq.. .... ..

..C.... ..

?al+1

j j al+1≈

j j

設(shè)激活值的序列如下al,al+1,...,aL?1,aL,那么結(jié)果的表達(dá)式就是 ?aL ?al+1C .. j m?a/?a?C/?aL。這Cwljk可以m?C

... ?aL?aL?1

jj

)

..

?aL?1

?aqjqj.. ..

mm.. ..

..C.... ..式。讓我們給出關(guān)于這個(gè)觀點(diǎn)應(yīng)?的?些流程建議。?先,你可以推導(dǎo)出(53)中所有單獨(dú) 3我們?多數(shù)?不喜歡被錯(cuò)誤。在開始學(xué)習(xí)彈奏鋼琴不久后,我在?個(gè)聽眾前做了處?錯(cuò)快速地學(xué)習(xí)到正確的東西。你應(yīng)該相信下次我再演奏肯定會(huì)是正確的!相反,在我們的錯(cuò)誤不是很好地定義的時(shí)候,學(xué)習(xí)的過程會(huì)變得更加緩慢。biasbias為了讓這個(gè)例?更明確,我會(huì)?先將權(quán)重和偏置初始化為0.6和0.9。這些就是?般的開始學(xué)習(xí)的選擇,并沒有任何刻意的想法。?開始的神經(jīng)元的輸出是0.82,所以這離我們的?標(biāo)輸=Input:Input:Output:w=b=Input:Input:Output:w=b=Input:Output:w=b=Inp

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論