




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
i S型神經(jīng) 使?交叉熵來對MNIST數(shù)字進?分 取?XiaohuZhu已經(jīng)完成的翻譯來避免重復的?作。 — man Zhang(正在)從數(shù)據(jù)中?動學習,聽上去很有前途。然?,直到2006年,除了?于?些特殊的問題,我們?nèi)匀徊恢廊绾斡柧毶窠?jīng)?絡去傳統(tǒng)的?法。2006年,被稱為“深度神經(jīng)?絡”的學習技 的洗?單?樣模糊地列出?堆想法。如果你很好理解了核?理念,你就可以很快地理解其他新的推論。?編程語?對?,把這理解為掌握?種新語?的核?語法、庫和數(shù)據(jù)結構。你可能仍然只是知道”整個編程語?的??部分許多編程語?有巨?的標準庫但新的庫和數(shù)據(jù)結構可以很快且容易被理解。我?Python(2.7版)寫了代碼,即使你不是?Python編程,努??下也應該很容易理解。通料,這樣即使你理解不了有些數(shù)學細節(jié),你還是可以跟上。使?數(shù)學較多的是第?章,其中需這本問題,或者把它們簡單地應?在你??的項?上?作。完成再多數(shù)量的問題,也不1?多數(shù)?毫不費?就能夠認出這些數(shù)字為504192。這么容易反?讓?覺著迷惑了。在?類的每個腦半球中,有著?個初級視覺?層,常稱為V114千萬個神經(jīng)元及數(shù)百億條神們通常并不能體會??視覺系統(tǒng)解決問題的。1100個訓練數(shù)字本章實現(xiàn)?個可以識別?寫數(shù)字的神經(jīng)?絡。這個程序僅僅74?,不適?特別的神什么是神經(jīng)?絡??開始,我將解釋?種被稱為“感知器”的??神經(jīng)元。感知器在20世FrankRosenblattWarrenMcCullochWalterPitts早經(jīng)?絡?作中,主要使?的是?種叫做S型神經(jīng)元的神經(jīng)元模型。我們很快會講到S型神經(jīng)元。但是要理解為什么S型神經(jīng)元被定義為那樣的?式,值得花點時間先來理解下感知器。 ?例中的感知器有三個輸?,x1,x2,x3。通??梢杂谢蚋佥?。Rosenblatt提議?個簡單的規(guī)則來計算輸出。他引?權重,w1,w2,...,表?相應輸?對于輸出重要性的實數(shù)。神經(jīng)元的輸出,0或者1∑jwjxj?于或者?于?些閾值決定。和權重?樣,output
ifjifj
wx
≤>
j你可以把這三個因素對應地??進制變量x1,x2和x3來表?。例如,如果天?好,我們把x1=1,如果不好,x1=0。類似地,如果你的男朋友或?朋友同去,x2=1,否則x2=0。x3使?感知器來給這種決策建?數(shù)學模型。?種?式是給天?權重選擇為w1=6,其它條件為w2=2w3=2。w1被賦予更?的值,表?天?對你很重要,?你的男朋友或?朋友陪你,或 件wjxj動來簡化。第?個變動是把
≡
jwjxj改寫成點乘
j ≡? ifw·x+b≤ ifw·x+b>
常?的負數(shù),輸出1則很。很明顯,引?偏置只是我們描述感知器的?個很?的變動,但是們有個兩個輸?的感知器,每個權重為?2,整體的偏置為3。這是我們的感知器:3001,即(?20?2033是正數(shù)。這?我?來顯式地表?乘法。但是輸?11產(chǎn)?輸出0,即(?2)?1+(?2)?1+3=?1是負數(shù)。如此我算按位求和,x1⊕x2,同時當x1和x2都為1時進位設為1,即進位位正好是按位乘積x1x2:sum:x1⊕carrybit:?23。結果我們得到這樣的?絡。注意我已經(jīng)把右下的與??移動了?點,sum:x1⊕carrybit:如果我們不想允許這種形式,那可以簡單把兩條線合并為到?個權重為?4的連接,?不是兩個絡看起來像下?描繪的,所有未標記的權重等于?2,所有偏置等于3,標記的單個權重為?4:sum:x1⊕carrybit:x1sum:x1⊕carrybit:j?的感知器。那么和∑wjxj會總是為零,并且感知器在b01b≤0時輸出感知器看作感知器,?是簡單定義為輸出期望值的特殊單元,x1,x2,...。jS:w+output+我們可以引??種稱為S型神經(jīng)元的新的??神經(jīng)元來克服這個問題。S型神經(jīng)元和感知器, 正如?個感知器,S型神經(jīng)元有多個輸?,x1,x2。但是這些輸?可以取0和1中的任意這?σ被稱為S型函數(shù)1,定義為:σ(z)
1+
x1x2w1w2b1 1+ jwjxj?初看上去,S型神經(jīng)元和感知器有很?的差別。如果你不熟悉S型函數(shù)的代數(shù)形式,它看上去晦澀難懂?令??畏。實際上,感知器和S型神經(jīng)元之間有很多相似的地?,跨過理解上的,S型函數(shù)的代數(shù)形式具有很多技術細節(jié)。z≡w·xbe?z≈0?σ(z)≈1z=w·xb很?并且為正,S1,正好和感知器?樣。zw·xbe?z→∞,σ(z0zw·xb是?個很?的負數(shù),Sw·xb取中間值時,和σ的代數(shù)形式?是什么?我們怎樣去理解它呢?實際上,σ的精確形式不重要——重要的是
Z經(jīng)元?絡的?使?,記住它是有?的。然?,繼續(xù)使?S型這個術語。
step Z如果σ實際是個階躍函數(shù),既然輸出會依賴于w·x+b是正數(shù)還是負數(shù)2,那么S型神經(jīng)元會成為?個感知器。利?實際的σ函數(shù),我們得到?個,就像上?說明的,平滑的感知器。的變化,即?wj和?b,會從神經(jīng)元產(chǎn)??個微?的輸出變化?output。實際上,微積分告訴我們≈ ≈
? j其中求和是在所有權重wj上進?的,??outut/?wj和?otut/?b符號表?output分別對于wj和b的偏導數(shù)。如果你對偏導數(shù)感到不?在,不?驚慌。上?全部?偏導數(shù)的表達式看上去很復雜,實際上它的意思?常簡單(這可是個好消息:?outut是?個反映權重和偏置變化——即?wj和?b—的線性函數(shù)。這?線性使得選擇權重和偏置的微?變化來達到輸出的微?變化的運算變得容易。所以當S型神經(jīng)元有和感知器相同的本質的?為時,計算如何變?nèi)绻麑Ζ襾碚f重要的是形狀?不是精確的形式,那為什么要在(3)中給σ使?特定的形式呢?實際上,在這本書的后?我們會碰巧考慮到為其它激活函數(shù)f(·)輸出為f(w·x+b)的神經(jīng)元。當我們使??個不同的激活函數(shù),最?的變化是(5)中?于偏導數(shù)的特定值的改變。事實證明當我們后?計算這些偏導數(shù),?σ會簡化數(shù)學計算,這是因為指數(shù)在求導時有些可愛的屬性。?論如何,σ在神經(jīng)?絡的?作中被普遍使?,并且是這本書中我們最常使?的激活函我們應該如何解釋?個S型神經(jīng)元的輸出呢?很明顯,感知器和S型神經(jīng)元之間?個很?的不同是S01010.173和92實際上,當w·xb0,感知器輸出0,?同時階躍函數(shù)輸出1。所以嚴格地說,我們需要修改階躍函數(shù)來符9x,權w·xb?0?,F(xiàn)在?S型神經(jīng)元替換所有?絡中的感知器,并且把權重和c0c→∞的極限情況下,S型神經(jīng)元?絡的?為和感知器?絡的完全?致。當?個感知器的w·xb=0時?為什么會不同?inputinput絡有時被稱為多層感知器MLPMLP這個術語,因為我認為這會引=激活狀態(tài)可以刺激其它神經(jīng)元,使其隨后被激活并同樣保持?段有限的時間。這樣會導致并且遞歸?絡能解決?些重要的問題,這些問題如果僅僅?前饋?絡來解決,則更加。然hiddenlayer0123input (784567892828784282810個神經(jīng)元。如果第?個神經(jīng)元激活,即輸出1,那么表明?絡認為09,并計算出那個神經(jīng)元有最?的激活值。?如,如果編號為6的神經(jīng)元激活,那么我們的?絡會猜到輸?的數(shù)字是6。其它神經(jīng)元相同。1010個輸0。當然,這不是圖像的轉換,或者稍微變形。但?少在這個例?中我們可以推斷出輸?的數(shù)字是0。10個輸出?不是4個。如果我們有4個輸出,那么第?個輸出神經(jīng)元將會盡?去判斷數(shù)字的最?有效些合適的權重能讓我們僅僅?4個輸出神經(jīng)元就?。但是這個啟發(fā)性的?法通常很有效,它會0.99,得到錯誤的輸出的激活值?多是0.01。oldoldoutputhiddennewoutputinputlayer?來學習的數(shù)據(jù)集——稱為訓練數(shù)據(jù)集。使?MNIST數(shù)據(jù)集,其包含有數(shù)以萬計的連帶著正確分類器的?寫數(shù)字的掃描圖像。MNIST的名字來源于NIST——與技術研究所——收集的兩個數(shù)據(jù)集改進后的?集。這是取?MNIST的?些圖像:試表現(xiàn),測試數(shù)據(jù)取?和原始訓練數(shù)據(jù)不同的另外?組250?(盡管仍然分別是??普查xx2828784維的向量。每個向量中的項?代表圖像中單個像素的灰度值。我們?y=y(x)表?對應的期望輸出,這?y是?個10維的向量。例如,如果有?個特定的畫成6的訓練圖像,x,那么y(x)=(0000001000)T則是?絡的期望輸出。注意這?T是轉置操作,把?個?向量)C(w,b)≡1∑∥y(x)? 2nw表?所有的?絡中權重的集合,b是所有的偏置,n是訓練輸?數(shù)據(jù)的個數(shù),a?當輸?為x時輸出的向量,求和則是在總的訓練輸?x上進?的。當然,輸出axw我們把C稱為?次代價函數(shù);有時也稱被稱為均?誤差或者MSE。觀察?次代價函數(shù)的形式我們可以看到C(w,b)是?負的,因為求和中的每?項都是?負的。此外,代價函數(shù)C(w,b)C(wb≈0,精確地說,是當對于所有的訓練輸?x,y(xa時。因C(wb0,它就能很好地?作。相反,當C(w,b)很?時就不怎么好了,那意味著對于?量地輸?,y(x)與輸出a相差很?。因此我們的訓練算法的?的,是最?化權重和偏置的代價函數(shù)C(w,b)。換句話說,我們想要找到?系列即使已經(jīng)知道我們需要使??個平滑的代價函數(shù),你可能仍然想知道為什么我們在?程(6)?些修改。盡管如此,?程(6)中的?次代價函數(shù)讓我們更好地理解神經(jīng)?絡中學習算法的基重復?下,我們訓練神經(jīng)?絡的?的是找到能最?化?次代價函數(shù)C(wb)的權重和偏置。澀不清的σ函數(shù),神經(jīng)?絡結構的選擇,MNIST等等。事實證明我們可以忽略結構中?部分,好了,假設我們要最?化某些函數(shù),C(v)。它可以是任意的多元實值函數(shù),v=v1,v2,...。vwb以強調它可能是任意的函數(shù)——我們現(xiàn)在先不局限于神經(jīng)?絡的環(huán)境。為了最?化C(v),想象C是?個只有兩個變量v1和v2的函數(shù):2C1C0
0v1 只意味著,也許我展?的函數(shù)過于C可能是?個復雜的多元函數(shù),看?下就C的極值點。運?好的話,C是?個只有?個或少數(shù)?個變量的函數(shù)。但是變量過多的話那就是噩夢。?且(確定可以通過有兩個變量的函數(shù)C來理解神經(jīng)?絡后,我已經(jīng)兩次提到:“嘿,如果看到這?你可能會以為我們會寫下球體的?頓運動定理,考慮摩擦?、重?等影響。實際上,我們不打算真的去實現(xiàn)這個球體滾落的推導—我們是在設計?個最?化C的算法,?不是在?物理定律做精確的仿真。對球體的?眼觀察是為了激發(fā)我們的想象?不是束縛我們的思構造??的物理定律,能夠?配球體可以如何滾動,那么會采取什么樣的運動學定律來讓球體能夠總是滾落到?底呢?v1v2?向分別將球體移動?個很?的量,即?v1和?v2時,球體將會發(fā)?什么情況。微積分告訴我們C將會有如下變化:?C≈
?v1+?v 我們要尋找?種選擇?v1和?v2的?法使得?C為負;即,我們選擇它們是為了讓球體滾?vv變化的向量,?v≡(?v1?v2)T,T(C
?C,
。我們??C?C
(
?C,
我們?上會??v和梯度?C來重寫?C的變化。在這之前先澄清?些令?困惑的關于梯度的事情。當?shù)?次碰到?C這個符號,?們有時會想知道怎么去理解?符號。?究竟是什么意思?事實上你可以把?C僅僅看做?個簡單的數(shù)學記號——上?定義的向量——這樣就不必寫兩個符號了。這樣來看,?僅僅是?個符號,猶如?中擺動的旗幟,告訴你:“嘿,?C是?有了這些定義,?C的表達式(7)?C≈?C· 這個表達式解釋了為什么?C被稱為梯度向量:?Cv的變化關聯(lián)為C的變化,正如我們期望的?梯度來表?。但是這個?程真正讓我們興奮的是它讓我們看到了如何選取?v才能讓?v= η是個很?的正數(shù)(稱為學習速率。?程(9)告訴我們?C≈?η?C·?C=?η∥?C∥2。由于∥?C∥2≥0,這保證了?C≤0,即,如果我們按照?程(10)的規(guī)則去改變v,那么C會?vv→v′=v? 2C1C0
0v1 了使梯度下降能夠正確地運?,我們需要選擇?夠?的學習速率η使得?程(9)能得到很好的近似。如果不這樣,我們會以?C>0結束,這顯然不好。同時,我們也不想η太?,因為以??程(9)能保持很好的近似度,但算法?不會太慢。我們后?會看這是如何?作的。我已經(jīng)解釋了具有兩個變量的函數(shù)C的梯度下降。但事實上,即使C是?個具有變量Cmv1vmC中?變量的變化?v=(?v1,...,?vm)T,?C將會變?yōu)椋?C≈?C· 這?的梯度?C
(?C
?C
?v= ?C的(近似)(12保證是負數(shù)。這給了我們?種?式從梯度中去取得最?值,即使C是任意的多元函數(shù),我們也能重復運?更則v→v′=v? 你可以把這個更則看做定義梯度下降算法。這給我們提供了?種?式去通過重復改變v來找到函數(shù)C的最?值。這個規(guī)則并不總是有效的——有?件事能導致錯誤,讓我們?法從梯度下降來求得函數(shù)C的全局最?值,這個觀點我們會在后?的章節(jié)中去探討。但在實踐中,梯?v來讓C盡可能地減?。這相當于最?化?C≈?C·?v。我們?先限制步?為?的固定值,即∥?v∥=?,?>0。當步?固定時,我們要找到使得C減?最?的下降?向??梢宰C明,使得?C·?v取得最?值的?v為?v=?η?C,這?η=?/∥?C∥是由步?限制∥?v∥=?所決定的。因此,梯度下降法可以被視為?種在C下降最快的?向上做微?變化的?法。CC是?個?元函數(shù)呢?你能給出偏導?2C/?vj?vk。如果我們有上百萬的變量vj,那須要計算數(shù)萬億(即百萬次的平?)得?程(6)的代價取得最?值的權重wk和偏置bl。為了清楚這是如何?作的,?權重和偏置代替變量vj。也就是說,現(xiàn)在“位置”變量有兩個分量組成:wk和bl,?梯度向量?C則有相應的分量?C/?wk和?C/?bl。?這些分量來寫梯度下降的更則,我們得到:w→w′=
?Clbl→b′=bl—l
?b
∑問題是什么,我們先回顧(62C=1nxCx≡∥y(x)?a∥的平均值。在實踐中,為了計算梯度?C n需要為每個訓練輸?x單獨地計算梯度值?Cx,然后求平均值,?C= x?Cx。不幸的是n計算?Cx,進?估算梯度?C。通過計算少量樣本的平均值我們可以快速得到?個對于實際梯度?C的很好的估算,這有助于加速梯度下降,進?加速學習過程。更準確地說,隨機梯度下降通過隨機選取?量的m個訓練輸?來?作。這些隨機的訓練輸?標記為X1X2Xm,并把它們稱為?個?批量數(shù)據(jù)(mini-batch)。假設樣本數(shù)量m?夠?,我們期望?CXj的平均值?致相等于整個?Cx的平均值,即,∑
x = 1?C≈
w→
η∑
k=wk?
b→
η∑
m bl=blmj
4實際上,更接近萬億次的?半,因為?2C/?vj?vk=?2C/?vk?vjXj上進?的。然后我們再挑選另?隨機選定的?批量數(shù)據(jù)去訓練。直到我們?完了所有的訓練輸?,這被稱為完成了?個訓練迭代n時候忽略1數(shù)據(jù)數(shù)量n情況下特別有效。例如,這可能發(fā)?在有的訓練數(shù)據(jù)是實時產(chǎn)?的情況下。同樣,?批量數(shù)據(jù)的更則(20)和(21)有時也會舍棄前?的1。從概念上這會有?點區(qū)別,因為它等價于改變了學習速率ηm細對?時,需要對它警惕。n60000MNISTm10,們按照規(guī)則wk→wk′=wk?η?Cx/?wk和bl→b′=lbl?η?Cx/?bl更新我們的權重和偏價函數(shù)C是?個關于所有權重和偏置的多元函數(shù),因此在某種意義上來說,就是在?個?學家才有的超能??當然不是。即使?多數(shù)專業(yè)的數(shù)學家也不能想象出空間的樣?代數(shù)(?不是圖像)描繪?C來計算如何變化才能讓C減少。那些思考?維的?內(nèi)?有好吧,現(xiàn)在讓我們寫?個學習如何識別?寫數(shù)字的程序,使?隨機梯度下降算法和MNISTMNIST數(shù)據(jù)。如果你是?個git??,那么你能夠gitgit 測試圖像。這是官?的MNIST的描述。實際上,?稍微不同的?法對數(shù)據(jù)進?劃分。我60,000MNIST50,000個不使?驗證數(shù)據(jù),但是在本書的后?會發(fā)現(xiàn)它對于解決如何去設置某些神經(jīng)?絡中的超MNISTMNIST,并且在神經(jīng)?絡中使?驗證據(jù)集,?不是原始的60,000圖像數(shù)據(jù)集5。除了MNIST數(shù)據(jù),我們還需要?個叫做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的?斯分布。這樣的隨機初始化給了我們的隨機梯度下降算法?個起點。kthjthjkjk索a′=σ(wa+ 5如前所述,MNIST數(shù)據(jù)集是基于5如前所述,MNIST數(shù)據(jù)集是基于與技術)收集的兩個數(shù)據(jù)集合。為了構建MNIST,NIST數(shù)據(jù)集合被YannLeCun,CorinnaCortes和ChristopherJ.C.Burges拆分放??個更?便的格式。細節(jié)請看這個。我的倉庫中的數(shù)據(jù)集是在?種更容易在Python中加載和MNIST數(shù)據(jù)的形式。我從蒙特利爾?學的LISA機器學習獲得了這個特殊格式的數(shù)據(jù)()σ(σ向量化)(22S型神經(jīng)元輸出的?程(4)相同。def以分量形式寫出?程(22),并驗證它和計算S型神經(jīng)元輸出的規(guī)則(4)結果相同。有了這些,很容易寫出從?個defdefdeffeedforward(self,"""Returntheoutputofthenetworkif"a"isforb,winzip(self.biases,self.weights):a=sigmoid(np.dot(w,a)+b)return算法的SGD?法。代碼如下。其中?些地?看似有?點神秘,我會在代碼后?逐個分析。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是?個(x,y)元組的列表,表?訓練輸?和其對應的期望輸出。變量epochs和ηtest_data,那么程序會在每個訓練器后評估?絡,并打印出部分進展。(n,)(n,)向量看上去好像是更?然的選擇,但是使??個(n,1)的ndarray使得修改代碼來?即前饋多個輸?變得特別容易,并且有的時候很?便。"""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, 這?調?了?個稱為反向的算法,?種快速計算代價函數(shù)的梯度的?法。因此update_mini_batch的?作僅僅是對mini_batch中的每?個訓練樣本計算梯度,然后適當?shù)馗聅elf.weights和self.biases。我現(xiàn)在不會列出self.backprop的代碼。在下章中學習反向是怎樣?作的,包括self.backprop的代碼?,F(xiàn)在,就假設它按照我們要求的?作,返回與訓練樣本x相關代價的適?夠的?檔注釋——所有的繁重?作由self.SGD和self.update_mini_batch完成,對此我們已經(jīng)有討論過。self.backprop?法利??些額外的函數(shù)來幫助計算梯度,即sigmoid_prime,它計算σ函數(shù)的導數(shù),以及self.cost_derivative,這?我不會對它過多描述。你能夠通過查看代碼或?但是很多代碼是?來使代碼更容易理解的?檔注釋。實際上,程序只包含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來完成。我們在?個Pythons中執(zhí)?下?令,>>>>>>import>>>training_data,validation_data,test_data=...當然,這也可以以?個單獨的Python程序來完成,但是如果你正在照著本書做,在Pythons?執(zhí)?也許是最?便的。在加載完MNIST數(shù)據(jù)之后,設置?個有30個隱藏層神經(jīng)元的Network。我們在導?如上所列的名為network的Python程序后做,>>>>>>import>>>net=network.Network([784,30,據(jù)??為10,學習速率η=3.0,>>>net.SGD(training_data,30,10,3.0, 了?組好的權重集和偏置集,它能很容易地被移植到?絡瀏覽器中以Javascript運?,或者如次迭代期后,達到了10,000中選中的9,129個。?且數(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,果然,它將結果提升?96.59%。?少在這種情況下,使?的隱藏神經(jīng)元幫助我們得到的結果。假如我們選定學習速率為η=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然是隨機地猜些數(shù)字。那將有10%的次數(shù)是正確的。?這做得更好! 205050%著名的算法之?,?持向量機,或SVM。如果你不熟悉SVM,不?擔?,我們不需要去理解SVM如何?作的細節(jié)。使?scikit-learnPython程序庫,它提供了?個簡單的Python接?,包裝了?個?于SVM的快速的,稱為LIBSVM的CSVM表現(xiàn)得?乎和神經(jīng)?絡?樣好,只是差了?點?已。在后?章節(jié)中我們會介紹新的技術,讓我們能夠改進我們的神經(jīng)?絡使得它們表現(xiàn)得?SVM更好。找,如果你想知道,可以參考這份AndreasMueller的博客。Mueller展?了通過?些優(yōu)化事實上,它們可以。?前,精?設計的神經(jīng)?絡勝過任何其它解決MNIST的技術,包括SVM。現(xiàn)在(2013)的是從10,000圖像中正確分類9,979個。這是由LiWan,MatthewZeiler,SixinZhang,YannLeCun,和RobFergus完成的。在這本書后?看到它們?的我相信你會同意那些數(shù)字很難辨認!考慮到MNIST數(shù)據(jù)集中這樣的圖像,神經(jīng)?絡能準確識別10000幅測試圖像中除了21幅之外的其它所有圖像,這表現(xiàn)得相當卓越。通常,當編程MNIST數(shù)字的問題需要?個復雜的算法。但是即使是剛才提到的Wan等?的論?中?的神經(jīng)?絡,只涉及到相當簡單的算法、和我們在這?章中已經(jīng)看到的算復雜的算法≤簡單的學習算法+嗎?中間有?個??嗎?下?有?個嘴嗎?上?有頭發(fā)嗎?諸如此類。.SantaCruz),R.Bouwens(LeidenUniversity),andtheHUDF09Team.點擊序號查看細節(jié)。inputlayer=?2006年以來,?們已經(jīng)開發(fā)了?系列技術使深度神經(jīng)?絡能夠學習。這些深度學習技術2反 我們會解釋計算這些梯度的快速算法,也就是反向(backpropagation。RonaldWilliams的著名的1986年的論?中才認識到這個算法的重要性。這篇論?描述了對?表達式會有點復雜,不過??也包含?種美感,就是每個元素其實是擁有?種?然的上的wjlk(l1)thkthlth .layer layer layerwl是從(l?1)th層的第kth個神經(jīng)元到lth層的第jth便也很?然。奇怪的?點其實是下標j和k的順序。你可能覺得反過來更加合理。但我接下來jallthjth個神經(jīng)元的激活值。下?的圖清楚地解釋了這樣表?的jlayer layer layer13j有了這些表?,lthjthal就和(l1)thjal=
wlal?1+
jk kj其中求和是在(l?1)th層的所有k個神經(jīng)元上進?的。為了?矩陣的形式重寫這個表達式,l都定義?個wlwllth層神經(jīng)元的權重,更確切地說,在第jth?第kth列的元素是wljk。類似的,對每?層l,定義?個偏置向量,bl。你bljlth層的每個神經(jīng)元。最后,我們定義激活向量al,其元素是那些激活值al。j最后我們需要引?向量化函數(shù)(如σ)來按照矩陣形式重寫(23)。在上?章,我們其實已經(jīng)碰到向量化了,其含義就是作?函數(shù)(如σ)到向量v中的每個元素。我們使?σ(v)表?這種按元素進?的函數(shù)作?。所以,σ(v)的每個元素其實滿?σ(v)j=σ(vj)。給個例?,如果f(x)=x2f
f
f al=σ(wlal?1+ 在使??程(25)計算al的過程中,我們計算了中間量zl≡wlal?1+bl。這個量其實是 jk ?常有?的:我們稱zl為l層神經(jīng)元的帶權輸?。在本章后?,我們會充分利?帶權輸?zl。?程(25)有時候會以帶權輸?的形式寫作al=σ(zl)。同樣要的是zl的每個元素是zl=∑wlal?1+bl,其實z jk 反向的?標是計算代價函數(shù)C分別關于w和b的偏導數(shù)?C/?w和?C/?b。為了讓反向C=1∑∥y(x)? nx;yy(x是對應的?標輸出;L??絡的層數(shù);aL=aL(x)xn是代價函數(shù)可以被寫成?個在每個訓練樣本x上的代價函數(shù)Cx的均值C=1xCx。這是關Cx=1||yaL||2。這個假設對書n2需要這個假設的原因是反向實際上是對?個獨?的訓練樣本計算了?Cx/?w和?Cx/?b。然后我們通過在所有訓練樣本上進?平均化獲得?C/?w和?C/?b。實際上,有了這個假設,我xCxC。最終我們會把下12costC=12C=1∥y?aL∥2=1∑(y?a
2 們不把代價也看作?個y的函數(shù)。記住,輸?的訓練樣本x是固定的,所以輸出y同樣是?個CaLy僅僅是幫助定義⊙sts⊙t來表?按元素的乘積。所以s⊙t的元素就是(s⊙t)j=sjtj。給個例?,
1?
2? Hadamard乘積Schur乘積。我們這?取前者。好的矩陣庫通常會提供Hadamard乘積的快速實現(xiàn),在實現(xiàn)反向的時候?起來很?便。?C/?wl?C/?bl。但是為了計算這些值,我們?先引??個中間量,δl,這個我們稱為 lthjth個神經(jīng)元上的誤差 和?C/?bl上 neuronj,layer.. .... ..
..C.... ..會增加很?的變化?zl在神經(jīng)元的帶權輸?上,使得神經(jīng)元輸出由σ(zl變成σ(zlzl)。這個變化會向?絡后?j層進 ,最終導致整個代價產(chǎn)??C?zl的j變 j j設
jjj j
相反符號的?zlj來降jj
δl≡ j j計算每層的δl的?法,然后將這些誤差和最終我們需要的量?C/?wljk和?C/?blj聯(lián)系起來。 jj
討論的差不多。但是看起來,前?的?讓反向在代數(shù)運算上變得?較復雜。所以我們堅持使?δl=?C/?zl作為誤差的度量3。 解決?案:反向基于四個基本?程。這些?程給我們?種計算誤差δl和代價函數(shù)梯度:jδL=?C j jj這是?個?常?然的表達式。右式第?個項?C/?aL表?代價隨著jth輸出激活值的變化?CjδL就會很?,這也是我們想要的效果。右式第?項σ′(zL)刻畫了在zL處激活函數(shù)σ變化的速度。jj 注意到在(BP1)中的每個部分都是很好計算的。特別地,我們在計算?絡?為時計算zjL,這僅僅需要?點點額外?作就可以計算σ′(zL)。當然 j給定了代價函數(shù),計算?C/?aLj2C=1∑(ya)2?C/?aLay)2j δL=?aC⊙ j這??aC被定義成?個向量,其元素是偏導數(shù)?C/?aL。你可以將?aCC關于輸出)j?(BP1)表?這兩個?程。舉個例?,在?次代價函數(shù)時,我們有?aC=(aL?y),所以δL=(aL?y)⊙ δl+1δlδl=((wl+1)Tδl+1)⊙ 其中(wl+1)T是(l+1)th層權重矩陣wl+1的轉置。這個看上去有些復雜,但每?個元素有很好的解釋。假設我們知道l+1th層的誤差δl+1。當我們應?轉置的權重矩陣(wl+1)T,我們可我們進?Hadamard乘積運算⊙σ′(zl)。這會讓誤差通過l層的激活函數(shù)反向傳遞回來并給出在第l層的帶權輸?的誤差δ。jj
= jδl?C/?bl完全?致。這是很好的性質,因為(BP1)和(BP2)j jj
?C= ?C= l
,其中δl和al?1?C= 重w,還有兩個由這個權重相連的神經(jīng)元,我們給出?幅圖如下:?C?C=?程(32)的?個好的結果就是當激活值ain很?,ain≈0,梯度?C/?w也會趨向很?。這這四 σ′(zl)Sσ(zL01σ j?常平。這時σ′(zL)≈0。所以如果輸出神經(jīng)元處于或者低激活值(≈0)或者?激活值(≈1)jj(BP2)σ′(zl)。這表?如果神經(jīng)元已經(jīng)接近飽和,δl很可能變?。這就導致任何輸?進?個飽和的神經(jīng)元的權重學習緩慢4。j個(?S型)σσ′0。這會防?在原始的S型神經(jīng)元飽和時學習速度下降的情況出現(xiàn)。在本書的后?,我們會?到這種類型的對激活函數(shù)的改變。時時回顧這四個?程(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)。如果你對這種特殊的乘積不熟悉,可能會有?些困惑。下?還(BP1可以寫成δL= 其中Σ′(zLσ′(zL)j0。注意,這個矩陣通過?般的矩陣乘法作?在?aC(2)證明(BP2)可以寫成δl=Σ′(zl)(wl+1)T δl=Σ′(zl)(wl+1)T...Σ′(zL?1)(wL)T )(BP1)δL的表達式。為了證明這個?程,回憶下定δL= jj∑?CjδLj
k kkthaL只依賴于當k=j時第jth個神經(jīng)元的輸?權重zL。所以當k?=j時?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。我們可以?鏈式法則: δl= j j kk
kjkj
kl k這?最后??我們交換了右邊的兩項,并?δ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 :對每個l=2,3,...,L計算相應的zl=wlal?1+bl和al=δLδL=?aC⊙ :對每個l=L?1,L?2,...,2,計算δl=((wl+1)Tδl+1)⊙輸出:代價函數(shù)的梯度由 =al?1δl和?C=δl得j j
j個神經(jīng)元的輸出是f(∑wjxj+b),其中f是和Sj 假設?線性神經(jīng)元的σ函數(shù)替換為σ(z)=z。重寫反向正如我們上?所講的,反向算法對?個訓練樣本計算代價函數(shù)的梯度,C=Cx。在實踐m的?批量數(shù)據(jù),下?的算法在這個?批量 :對每個l=2,3,...,L計算zx,l=wlax,l?1+bl和ax,l=σ(zx,l)δx,Lδx,L=?aCx⊙σ′(zx,L) 誤差:對每個l=L?1,L?2,...,2計算δx,l=((wl+1)Tδx,l+1)⊙σ′(zx,l)梯度下降:對每個l=L?1L?22根據(jù)wl→wl?ηm
x
blbl?η∑δx,l 些?法的代碼其實是我們上?的算法描述的直接。特別地,update_mini_batch?法通過計算當前mini_batch中的訓練樣本對Network的權重和偏置進?了更新: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?法計算出了偏導數(shù),?Cx/?bl?Cx/?wl。backprop表中的倒數(shù)第三個元素。下?backprop的代碼,和?些幫助函數(shù)?起,被?于計算σ、導數(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 的全矩陣?法 我們對于隨機梯度下降的實現(xiàn)是對?個?批量數(shù)據(jù)中的訓練樣本進?遍歷。所以也可以更改反向算法使得它同時對?個?批量數(shù)據(jù)中的所有樣本進?梯度計算。這個想法其實就是我們可以??個矩陣x1x2xm],其中每列就是在?批量數(shù)據(jù)中的向量,?不是單個的輸?向量,x。我們通過乘權重矩陣,加上對應的偏置進?前向,在所有地?應?S型函數(shù)。然后按照類似的過程進?反向。請顯式寫出這種?法下的偽代碼。更改network.py來實現(xiàn)這個??遍歷要運?得更快(在我的筆記本電腦上,在MNIST分類問題上,我相較于上?章的實現(xiàn)獲得了2倍的速度提升。在實際應?中,所有靠譜的反向的庫都是?了類似的后就退縮了。所以就試著找另外的?式。你決定僅僅把代價看做權重的函數(shù)C=C(w)(我們?上會回到偏置。你給這些權重w1,w2,...進?編號,期望計算某些權重wj的偏導數(shù)?C/?wj。
≈C(w+?ej)??
?0ejj個?向上的單位向量。換句話說,我們可以通過計算兩個接近相同的wj值的代價C來估計?C/?wj,然后應?(46)。同樣?法也可以?來計算?C/?b。1000000wjC(w?ej?C/?wj。反向聰明的地?就是它確保我們可以同時計算所有的偏導數(shù)?C/?wj,僅僅使??次前即使反向看起來要?(46)更加復雜,但實際上要更快。1986年?次被眾?接受,并直接導致神經(jīng)?絡可以處理的問題的擴展。這期,?們嘗試極限,尤其是嘗試使?反向來訓練深度神經(jīng)?絡。本書后?,看的變動?wjlk:.. .... ..
..C.... ..jj.. .... ..
..C.... .... .... ..
..C.... .... .... ..
..C.... ..所以代價函數(shù)?C改變和?wljk就按照下? ?C
這給出了?種可能的計算?C的?法其實是細致地追蹤?個 就能夠計算?C/?wljk了。我們嘗試?下這個?法。 導致了在lth層jth神經(jīng)元的激活值的變化?alj。這個變化jj
?al
?a
jq?al的變化將會導致下?層(l1)th的所有激活值的變化。我們聚焦到其中?個激活值上看看影響的情況,不妨設al+1,jq.. .... ..
..C.... ..
?al+1
j j al+1≈
j j
設激活值的序列如下al,al+1,...,aL?1,aL,那么結果的表達式就是 ?aL ?al+1C .. j m?a/?a?C/?aL。這Cwljk可以m?C
... ?aL?aL?1
jj
)
..
?aL?1
?aqjqj.. ..
mm.. ..
..C.... ..式。讓我們給出關于這個觀點應?的?些流程建議。?先,你可以推導出(53)中所有單獨 3我們?多數(shù)?不喜歡被錯誤。在開始學習彈奏鋼琴不久后,我在?個聽眾前做了處?錯快速地學習到正確的東西。你應該相信下次我再演奏肯定會是正確的!相反,在我們的錯誤不是很好地定義的時候,學習的過程會變得更加緩慢。biasbias為了讓這個例?更明確,我會?先將權重和偏置初始化為0.6和0.9。這些就是?般的開始學習的選擇,并沒有任何刻意的想法。?開始的神經(jīng)元的輸出是0.82,所以這離我們的?標輸=Input:Input:Output:w=b=Input:Input:Output:w=b=Input:Output:w=b=Inp
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 培訓學校市場管理制度
- 小梁電氣安裝方案(3篇)
- 水罐彩繪改造方案(3篇)
- 引流接待方案模板(3篇)
- 灌溉水池澆筑方案(3篇)
- 煤礦盡職調查方案(3篇)
- 信息收集考核方案(3篇)
- 內(nèi)部創(chuàng)業(yè)公司管理制度
- 法式住宅改造方案(3篇)
- 商鋪線路鋪設方案(3篇)
- 重癥監(jiān)護病房新生兒皮膚管理指南(2021)解讀
- 財政與金融練習試卷1(共230題)
- 2025年心理健康教育與咨詢考試卷及答案
- 全國縣中頭雁教師崗位計劃人員推表
- 現(xiàn)農(nóng)莊可行性研究報告
- 廢舊金屬代賣合同協(xié)議
- 2025年幼兒教師通識性知識培訓考試題庫(附答案)
- 利潤分配方案范文公司利潤分配方案
- 以科技力量提升心理健康篩查效率與質量
- 老年肺癌護理專家共識2022版
- 財務管理企業(yè)項目投資
評論
0/150
提交評論