简单易懂的讲解深度学习(入门系列之八)
神經(jīng)網(wǎng)絡(luò)也許是計算機(jī)計算的將來,一個了解它的好方法是用一個它可以解決的難題來說明。假設(shè)給出?500?個字符的代碼段,您知道它們是C,C++,JAVA或Python。現(xiàn)在構(gòu)造一個程序,來識別編寫這段代碼的語言。一種解決方案是構(gòu)造一個能夠?qū)W習(xí)識別這些語言的神經(jīng)網(wǎng)絡(luò)。
這篇分享就討論了神經(jīng)網(wǎng)絡(luò)的基本功能以及構(gòu)造神經(jīng)網(wǎng)絡(luò)的方法,這樣就可以在編碼時應(yīng)用它們了。根據(jù)一個簡化的統(tǒng)計,人腦由百億條神經(jīng)組成?,每條神經(jīng)平均連結(jié)到其它幾千條神經(jīng)。通過這種連結(jié)方式,神經(jīng)可以收發(fā)不同數(shù)量的能量。神經(jīng)的一個非常重要的功能是它們對能量的接受并不是立即作出響應(yīng),而是將它們累加起來,當(dāng)這個累加的總和達(dá)到某個臨界閾值時,它們將它們自己的那部分能量發(fā)送給其它的神經(jīng)。大腦通過調(diào)節(jié)這些連結(jié)的數(shù)目和強(qiáng)度進(jìn)行學(xué)習(xí)。盡管這是個生物行為的簡化描述。但同樣可以充分有力地被看作是神經(jīng)網(wǎng)絡(luò)的模型。
閾值邏輯單元(Threshold?Logic?Unit,?TLU)
理解神經(jīng)網(wǎng)絡(luò)的第一步是從對抽象生物神經(jīng)開始,并把重點(diǎn)放在閾值邏輯單元(TLU)這一特征上。一個TLU?是一個對象,它可以輸入一組加權(quán)系數(shù)的量,對它們進(jìn)行求和,如果這個和達(dá)到或者超過了某個閾值,輸出一個量。讓我們用符號標(biāo)注這些功能。
首先,有輸入值以及它們的權(quán)系數(shù):X1,?X2,?...,?Xn?和W1,?W2,?...,?Wn。接著是求和計算出的Xi*Wi?,產(chǎn)生了激發(fā)層a,換一種方法表示:
a?=?(X1?*?W1)+(X2?*?W2)+...+(Xi?*?Wi)+...+?(Xn?*?Wn)
閾值稱為?theta。最后,輸出結(jié)果y。當(dāng)a?>=theta?時y=1,反之y=0。請注意輸出可以是連續(xù)的,因?yàn)樗部梢杂梢粋€squash?函數(shù)s(或sigma)判定,該函數(shù)的自變量是a,函數(shù)值在0?和1?之間,y=s(a)。
圖?1.?閾值邏輯單元,帶有sigma?函數(shù)(頂部)和cutoff?函數(shù)(底部)
TLU?會分類,假設(shè)一個TLU?有兩個輸入值,它們的權(quán)系數(shù)等于1,theta?值等于1.5。當(dāng)這個TLU?輸入<0,0>、<0,1>、<1,0>?和<1,1>?時,它的輸出分別為0、0、0、1。TLU?將這些輸入分為兩組:0?組和1?組。就像懂得邏輯連接(布爾運(yùn)算AND)的人腦可以類似地將邏輯連接的句子分類那樣,TLU?也懂得一點(diǎn)邏輯連接之類的東西。
TLU?能夠用幾何學(xué)上的解釋來闡明這種現(xiàn)象。它的四種可能輸入對應(yīng)于笛卡爾圖的四個點(diǎn)。從等式X1*W1?+?X2*W2?=?theta,換句話說,也即TLU?轉(zhuǎn)換其分類行為的點(diǎn)開始,它的點(diǎn)都分布在曲線X2?=?-X1?+?1.5?上。這個方程的曲線將4?個可能的輸入分成了兩個對應(yīng)于TLU?分類的區(qū)域。這是TLU?原理中更為普通的實(shí)例。在TLU?有任意數(shù)目的N?個輸入的情況下,一組可能的輸入對應(yīng)于N?維空間中的一個點(diǎn)集。如果這些點(diǎn)可以被超平面———換句話說,對應(yīng)于上面示例中的線的N?維的幾何外形切割,那么就有一組權(quán)系數(shù)和一個閾值來定義其分類剛好與這個切割相匹配的TLU。
TLU?的學(xué)習(xí)原理
既然?TLU?懂得分類,它們就知道素材。神經(jīng)網(wǎng)絡(luò)也可假定為可以學(xué)習(xí)。它們的學(xué)習(xí)機(jī)制是模仿大腦調(diào)節(jié)神經(jīng)連結(jié)的原理。TLU?通過改變它的權(quán)系數(shù)和閾值來學(xué)習(xí)。實(shí)際上,從數(shù)學(xué)的觀點(diǎn)看,權(quán)系數(shù)閾值的特征有點(diǎn)武斷。讓我們回想一下當(dāng)SUM(Xi?*?Wi)?>=?theta?時TLU?在臨界點(diǎn)時輸出的是1?而不是0,這相當(dāng)于說臨界點(diǎn)是出現(xiàn)在SUM(Xi?*?Wi)+?(-1?*?theta)?>=?0?的時候。所以,我們可以把-1?看成一個常量輸入,它的權(quán)系數(shù)theta?在學(xué)習(xí)(或者用技術(shù)術(shù)語,稱為培訓(xùn))的過程中進(jìn)行調(diào)整。這樣,當(dāng)SUM(Xi?*?Wi)+?(-1?*?theta)?>=?0?時,y=1,反之y=0。
? ? ? ? 在訓(xùn)練過程中,神經(jīng)網(wǎng)絡(luò)輸入:一系列需要分類的術(shù)語示例 ;它們的正確分類或者目標(biāo) 。這樣的輸入可以看成一個向量:<X1,?X2,?...,?Xn,?theta,?t>,這里t?是一個目標(biāo)或者正確分類。神經(jīng)網(wǎng)絡(luò)用這些來調(diào)整權(quán)系數(shù),其目的使培訓(xùn)中的目標(biāo)與其分類相匹配。更確切地說,這是有指導(dǎo)的培訓(xùn),與之相反的是無指導(dǎo)的培訓(xùn)。前者是基于帶目標(biāo)的示例,而后者卻只是建立在統(tǒng)計分析的基礎(chǔ)上(請參閱本文隨后的參考資料)。權(quán)系數(shù)的調(diào)整有一個學(xué)習(xí)規(guī)則,一個理想化的學(xué)習(xí)算法如下所示:
清單?1.?理想化的學(xué)習(xí)算法
fully_trained?=?FALSE
DO?UNTIL?(fully_trained):
????fully_trained?=?TRUE
????FOR?EACH?training_vector?=?<X1,?X2,?...,?Xn,?theta,?target>::
???????????????????????????????#?Weights?compared?to?theta
????????a?=?(X1?*?W1)+(X2?*?W2)+...+(Xn?*?Wn)?-?theta
????????y?=?sigma(a)
????????IF?y?!=?target:
????????????fully_trained?=?FALSE
????????FOR?EACH?Wi:
????????MODIFY_WEIGHT(Wi)??????#?According?to?the?training?rule
?
????IF?(fully_trained):
????????BREAK
您或許想知道,“哪些培訓(xùn)規(guī)則?”有很多,不過有一條似乎合理的規(guī)則是基于這樣一種思想,即權(quán)系數(shù)和閾值的調(diào)整應(yīng)該由分式(t?-?y)?確定。這個規(guī)則通過引入alpha?(0?<?alpha?<?1)?完成。我們把a(bǔ)lpha?稱為學(xué)習(xí)率。Wi?中的更改值等于(alpha?*?(t?-?y)*?Xi)。當(dāng)alpha?趨向于0?時,神經(jīng)網(wǎng)絡(luò)的權(quán)系數(shù)的調(diào)整變得保守一點(diǎn);當(dāng)?alpha?趨向于1?時,權(quán)系數(shù)的調(diào)整變得激進(jìn)。一個使用這個規(guī)則的神經(jīng)網(wǎng)絡(luò)稱為感知器,并且這個規(guī)則被稱為?感知器學(xué)習(xí)規(guī)則。
Rosenblatt?于1962?年(請參閱參考資料)下的結(jié)論是,如果N?維空間的點(diǎn)集被超平面切割,那么感知器的培訓(xùn)算法的應(yīng)用將會最終導(dǎo)致權(quán)系數(shù)的分配,從而定義了一個TLU,它的超平面會進(jìn)行需要的分割。當(dāng)然,為了記起Keynes,最終我們都切斷了與外界的聯(lián)系,專心思考。但是在計算時間之外,我們?nèi)詾l臨危險,因?yàn)槲覀冃枰约旱纳窠?jīng)網(wǎng)絡(luò)對可能輸入的空間進(jìn)行不止一次的切割。
文章開始的難題舉例說明了這個,假設(shè)給您?N?個字符的代碼段,您知道是C、C++、Java?或者Python。難的是構(gòu)造一個程序來標(biāo)識編寫這段代碼的語言。用TLU?來實(shí)現(xiàn)需要對可能的輸入空間進(jìn)行不止一次的分割。它需要把空間分成四個區(qū)域。每種語言一個區(qū)域。把神經(jīng)網(wǎng)絡(luò)培訓(xùn)成能實(shí)現(xiàn)兩個切割就可完成這種工作。第一個切割將C/C++?和Java/Python?分開來,另一個將C/Java?和C++/Python?分開。一個能夠完成這些切割的網(wǎng)絡(luò)同樣可以識別源代碼樣本中的語言。但是這需要網(wǎng)絡(luò)有不同結(jié)構(gòu),在描述這個不同之處之前,先來簡單地看一下實(shí)踐方面的考慮。
圖?2.?初步的(不完整的)感知器學(xué)習(xí)模型
考慮到排除取得?N?個字符代碼所需的計算時間,統(tǒng)計從ASCII?碼的32到127的范圍內(nèi)可視ASCII?碼字符出現(xiàn)的頻率,并在這個統(tǒng)計以及關(guān)于代碼語言的目標(biāo)信息的基礎(chǔ)上培訓(xùn)神經(jīng)網(wǎng)絡(luò)。
我們的方法是將字符統(tǒng)計限制到C、C++、Java?和Python?代碼字符庫中最常用的20?個非字母數(shù)字字符。由于關(guān)注浮點(diǎn)運(yùn)算的執(zhí)行,我們打算用一種規(guī)格化因素將這20?字符統(tǒng)計分開來,并以此培訓(xùn)我們的網(wǎng)絡(luò)。顯然,一個結(jié)構(gòu)上的不同是我們的網(wǎng)絡(luò)有20?個輸入節(jié)點(diǎn),但這是很正常的,因?yàn)槲覀兊拿枋鲆呀?jīng)暗示了這種可能性。一個更有意思的區(qū)別是出現(xiàn)了一對中間節(jié)點(diǎn),N1?和N2,以及輸出節(jié)點(diǎn)數(shù)量從兩個變成了四個(O1?到O4)。
我們將訓(xùn)練?N1,當(dāng)它一看到C?或C++,設(shè)置y1=1,看到Java或Python,它將設(shè)置y1=0。同理訓(xùn)練N2,當(dāng)它看到C?或Java,設(shè)置y2=1,看到C++?或Python,設(shè)置y2=0。此外,N1?和N2?將輸出1?或0?給Oi。現(xiàn)在如果N1?看到C?或C++,而且N2?看到C?或者Java,那么難題中的代碼是C。而如果N1?看到C?或C++,N2?看到C++?或Python,那么代碼就是C++。這個模式很顯而易見。所以假設(shè)Oi?已被培訓(xùn)并根據(jù)下面表格的情況輸出1?或0。
映射到輸出(作為布爾函數(shù))的中間節(jié)點(diǎn)。
如果這樣可行的話,我們的網(wǎng)絡(luò)就可以從代碼示例中識別出語言了。這個想法很好。但是在實(shí)踐上卻有些難以置信。不過這種解決方案預(yù)示了?C/C++?和Java/Python?輸入被一個超平面切割了,同樣C/Java?和C++/Python?輸入被另一個切割。這是一個網(wǎng)絡(luò)培訓(xùn)的解決方案,迂回地解決了這個輸入空間的設(shè)想。
關(guān)于?delta?規(guī)則
另一種訓(xùn)練的規(guī)則叫做?delta?規(guī)則。感知器培訓(xùn)規(guī)則是基于這樣一種思路——權(quán)系數(shù)的調(diào)整是由目標(biāo)和輸出的差分方程表達(dá)式?jīng)Q定。而delta?規(guī)則是基于梯度降落這樣一種思路。這個復(fù)雜的數(shù)學(xué)概念可以舉個簡單的例子來表示。從給定的幾點(diǎn)來看,向南的那條路徑比向東那條更陡些。向東就像從懸崖上掉下來,但是向南就是沿著一個略微傾斜的斜坡下來,向西像登一座陡峭的山,而北邊則到了平地,只要慢慢的閑逛就可以了。所以您要尋找的是到達(dá)平地的所有路徑中將陡峭的總和減少到最小的路徑。在權(quán)系數(shù)的調(diào)整中,神經(jīng)網(wǎng)絡(luò)將會找到一種將誤差減少到最小的權(quán)系數(shù)的分配方式。
將我們的網(wǎng)絡(luò)限制為沒有隱藏節(jié)點(diǎn),但是可能會有不止一個的輸出節(jié)點(diǎn),設(shè)?p?是一組培訓(xùn)中的一個元素,t(p,n)?是相應(yīng)的輸出節(jié)點(diǎn)n?的目標(biāo)。但是,設(shè)y(p,n)?由以上提到的squash?函數(shù)s?決定,這里a(p,n)?是與p?相關(guān)的n?的激活函數(shù),或者用(p,n)?=?s(?a(p,n)?)?表示為與p?相關(guān)的節(jié)點(diǎn)n?的squash?過的激活函數(shù)。為網(wǎng)絡(luò)設(shè)定權(quán)系數(shù)(每個Wi),也為每個p?和n?建立t(p,n)?與y(p,n)?的差分,這就意味著為每個p?設(shè)定了網(wǎng)絡(luò)全部的誤差。因此對于每組權(quán)系數(shù)來說有一個平均誤差。但是delta?規(guī)則取決于求平均值方法的精確度以及誤差。我們先不討論細(xì)節(jié)問題,只是說一些與某些p?和n?相關(guān)的誤差:?*?square(?t(p,n)?-?y(p,n)?)(請參閱參考資料)。現(xiàn)在,對于每個Wi,平均誤差定義如下:
清單?2.?查找平均誤差
sum?=?0
FOR?p?=?1?TO?M:?????????#?M?is?number?of?training?vectors
????FOR?n?=?1?TO?N:?????#?N?is?number?of?output?nodes
????????sum?=?sum?+?(1/2?*?(t(p,n)-y(p,n))^2)
average?=?1/M?*?sum
delta?規(guī)則就是依據(jù)這個誤差的定義來定義的。因?yàn)檎`差是依據(jù)那些培訓(xùn)向量來說明的,delta?規(guī)則是一種獲取一個特殊的權(quán)系數(shù)集以及一個特殊的向量的算法。而改變權(quán)系數(shù)將會使神經(jīng)網(wǎng)絡(luò)的誤差最小化。
我們不需要討論支持這個算法的微積分學(xué),只要認(rèn)為任何Wi?發(fā)生的變化都是如下所示就夠了:alpha?*?s'(a(p,n))?*?(t(p,n)?-?y(p,n))?*?X(p,i,n).
X(p,i,n)?是輸入到節(jié)點(diǎn)n?的p?中的第i?個元素,alpha?是已知的學(xué)習(xí)率。最后s'(?a(p,n)?)?是與p?相關(guān)的第n?個節(jié)點(diǎn)激活的squashing?函數(shù)的變化(派生)率,這就是delta?規(guī)則,并且Widrow?和Stearns向我們展示了當(dāng)alpha?非常小的時候,權(quán)系數(shù)向量接近某個將誤差最小化的向量。用于權(quán)系數(shù)調(diào)節(jié)的基于delta?規(guī)則的算法就是如此。
梯度降落(直到誤差小到適當(dāng)?shù)某潭葹橹?#xff09;
step?1:?for?each?training?vector,?p,?find?a(p)
step?2:?for?each?i,?change?Wi?by:
????????????alpha?*?s'(a(p,n))?*?(t(p,n)-y(p,n))?*?X(p,i,n)
這里有一些與感知器算法相區(qū)別的重要不同點(diǎn)。顯然,在權(quán)系數(shù)調(diào)整的公式下有著完全不同的分析。delta?規(guī)則算法總是在權(quán)系數(shù)上調(diào)整,而且這是建立在相對輸出的激活方式上。最后,這不一定適用于存在隱藏節(jié)點(diǎn)的網(wǎng)絡(luò)。
反向傳播
反向傳播這一算法把支持?delta?規(guī)則的分析擴(kuò)展到了帶有隱藏節(jié)點(diǎn)的神經(jīng)網(wǎng)絡(luò)。為了理解這個問題,設(shè)想Bob?給Alice?講了一個故事,然后Alice?又講給了Ted,Ted?檢查了這個事實(shí)真相,發(fā)現(xiàn)這個故事是錯誤的。現(xiàn)在Ted?需要找出哪些錯誤是Bob?造成的而哪些又歸咎于Alice。當(dāng)輸出節(jié)點(diǎn)從隱藏節(jié)點(diǎn)獲得輸入,網(wǎng)絡(luò)發(fā)現(xiàn)出現(xiàn)了誤差,權(quán)系數(shù)的調(diào)整需要一個算法來找出整個誤差是由多少不同的節(jié)點(diǎn)造成的,網(wǎng)絡(luò)需要問,“是誰讓我誤入歧途?到怎樣的程度?如何彌補(bǔ)?”這時,網(wǎng)絡(luò)該怎么做呢?
圖?3:“代碼識別”反向傳播的神經(jīng)網(wǎng)絡(luò)
反向傳播算法同樣來源于梯度降落原理,在權(quán)系數(shù)調(diào)整分析中的唯一不同是涉及到?t(p,n)?與y(p,n)?的差分。通常來說Wi?的改變在于:
alpha?*?s'(a(p,n))?*?d(n)?*?X(p,i,n)
其中?d(n)?是隱藏節(jié)點(diǎn)n?的函數(shù),讓我們來看(1)n?對任何給出的輸出節(jié)點(diǎn)有多大影響;(2)輸出節(jié)點(diǎn)本身對網(wǎng)絡(luò)整體的誤差有多少影響。一方面,n?影響一個輸出節(jié)點(diǎn)越多,n?造成網(wǎng)絡(luò)整體的誤差也越多。另一方面,如果輸出節(jié)點(diǎn)影響網(wǎng)絡(luò)整體的誤差越少,n?對輸出節(jié)點(diǎn)的影響也相應(yīng)減少。這里d(j)?是對網(wǎng)絡(luò)的整體誤差的基值,W(n,j)?是n?對j?造成的影響,d(j)?*?W(n,j)?是這兩種影響的總和。但是n?幾乎總是影響多個輸出節(jié)點(diǎn),也許會影響每一個輸出結(jié)點(diǎn),這樣,d(n)?可以表示為:
SUM(d(j)*W(n,j))
這里?j?是一個從n?獲得輸入的輸出節(jié)點(diǎn),聯(lián)系起來,我們就得到了一個訓(xùn)練規(guī)則,第1?部分:在隱藏節(jié)點(diǎn)n?和輸出節(jié)點(diǎn)j?之間權(quán)系數(shù)改變,如下所示:
alpha?*?s'(a(p,n))*(t(p,n)?-?y(p,n))?*?X(p,n,j)
第?2?部分:在輸入節(jié)點(diǎn)i?和輸出節(jié)點(diǎn)n?之間權(quán)系數(shù)改變,如下所示:
alpha?*?s'(a(p,n))?*?sum(d(j)?*?W(n,j))?*?X(p,i,n)
這里每個從?n?接收輸入的輸出節(jié)點(diǎn)j?都不同。關(guān)于反向傳播算法的基本情況大致如此。將?Wi?初始化為小的隨機(jī)值。使誤差小到適當(dāng)?shù)某潭纫裱牟襟E。
第?1?步:輸入培訓(xùn)向量。
第?2?步:隱藏節(jié)點(diǎn)計算它們的輸出
第?3?步:輸出節(jié)點(diǎn)在第?2?步的基礎(chǔ)上計算它們的輸出。
第?4?步:計算第?3?步所得的結(jié)果和期望值之間的差。
第?5?步:把第?4?步的結(jié)果填入培訓(xùn)規(guī)則的第?1?部分。
第?6?步:對于每個隱藏節(jié)點(diǎn)?n,計算?d(n)。
第?7?步:把第?6?步的結(jié)果填入培訓(xùn)規(guī)則的第?2?部分。
通常把第?1?步到第3?步稱為正向傳播,把第4?步到第7?步稱為反向傳播。反向傳播的名字由此而來。
識別成功
在掌握了反向傳播算法后,可以來看我們的識別源代碼樣本語言的難題。為了解決這個問題,我們提供了?Neil?Schemenauer?的Python?模型bpnn(請參閱參考資料)。用它的模型解決問題真是難以置信的簡單,在我們的類NN2?里定制了一個類NN,不過我們的改變只是調(diào)整了表達(dá)方式和整個過程的輸出,并沒有涉及到算法。基本的代碼如下所示:
清單?3:用bpnn.py?建立一個神經(jīng)網(wǎng)絡(luò)
#?Create?the?network?(number?of?input,?hidden,?and?training?nodes)
net?=?NN2(INPUTS,?HIDDEN,?OUTPUTS)?
#?create?the?training?and?testing?data
trainpat?=?[]??
testpat?=?[]??
for?n?in?xrange(TRAINSIZE+TESTSIZE):??
????#...?add?vectors?to?each?set?
#?train?it?with?some?patterns?
net.train(trainpat,?iterations=ITERATIONS,?N=LEARNRATE,?M=MOMENTUM) ?
#?test?it?
net.test(testpat) ?
#?report?trained?weights?
net.weights()
當(dāng)然我們需要輸入數(shù)據(jù),實(shí)用程序?code2data.py?提供了這個功能。它的界面很直觀:只要將一堆擴(kuò)展名各不相同的文件放到一個子目錄./code?中,然后運(yùn)行這個實(shí)用程序,并列舉那些擴(kuò)展名作為命令選項(xiàng)。例如:
python?code2data.py?py?c?java
您得到的是一堆?STDOUT?上的向量,可以把這些向量輸入到另一個進(jìn)程或者重定向到一個文件,它的輸出如下所示:
清單?4:Code2Data?的輸出
0.15?0.01?0.01?0.04?0.07?0.00?0.00?0.03?0.01?0.00?0.00?0.00?0.05?0.00?>?1?0?0
0.14?0.00?0.00?0.05?0.13?0.00?0.00?0.00?0.02?0.00?0.00?0.00?0.13?0.00?>?1?0?0
[...]
讓我們回憶一下輸入值都是不同特殊字符出現(xiàn)的規(guī)格化數(shù)目,目標(biāo)值(在大于號以后)是?YES/NO,它代表包含這些字符的源代碼文件的類型,不過對于什么是什么來說,并沒有非常明顯的東西。數(shù)字可以是輸入或期望的?任意值,這才是最重要的。
下一步是運(yùn)行實(shí)際的code_recognizer.py?程序。這需要(在STDIN?中)像上面一樣的向量集。這個程序有一個包,它能夠根據(jù)實(shí)際文件推斷出需要多少輸入節(jié)點(diǎn)(計算在內(nèi)的和期望的),選擇隱藏節(jié)點(diǎn)的數(shù)目是一個訣竅。對于源代碼的識別,6?到8?個隱藏節(jié)點(diǎn)似乎工作得很好。如果打算試驗(yàn)網(wǎng)絡(luò)從而發(fā)現(xiàn)對于這些不同的選項(xiàng)它是如何做的,您可以覆蓋命令行中的所有參數(shù),但每一次運(yùn)行還是會耗費(fèi)一些時間。值得注意的是,code_recognizer.py?將它的(大的)測試結(jié)果文件發(fā)送到STDOUT,而將一些友好的消息放在STDERR?里。這樣在大部分時間里,為了安全保管,您將會把STDOUT?定向到一個文件,并監(jiān)視針對進(jìn)程和結(jié)果概要的STDERR。
清單?5:運(yùn)行?code_recognizer.py
>?code2data.py?py?c?java?|?code_recognizer.py?>?test_results.txt?
Total?bytes?of?py-source:?457729?
Total?bytes?of?c-source:?245197?
Total?bytes?of?java-source:?709858?
Input?set:?)?(?_?.?=?;?"?,?'?*?/?{?}?:?-?0?+?1?[?]?
HIDDEN?=?8?
LEARNRATE?=?0.5?
ITERATIONS?=?1000?
TRAINSIZE?=?500?
OUTPUTS?=?3?
MOMENTUM?=?0.1?
ERROR_CUTOFF?=?0.01?
TESTSIZE?=?500?
INPUTS?=?20?
error?->?95.519...?23.696...?19.727...?14.012...?11.058...?9.652...??
8.858...?8.236...?7.637...?7.065...?6.398...?5.413...?4.508...??
3.860...?3.523...?3.258...?3.026...?2.818...?2.631...?2.463...??
2.313...?2.180...?2.065...?1.965...?1.877...?1.798...?1.725...??
[...]?
0.113...?0.110...?0.108...?0.106...?0.104...?0.102...?0.100...??
0.098...?0.096...?0.094...?0.093...?0.091...?0.089...?0.088...??
0.086...?0.085...?0.084...?
Success?rate?against?test?data:?92.60%?
不斷減少誤差是個很好的兆頭,這至少在一段長時間里所獲得的一種進(jìn)步,且最后的結(jié)果必然是深入人心的。就我們的觀點(diǎn)而言,網(wǎng)絡(luò)完成了一項(xiàng)值得尊敬的工作,來識別代碼?—?我們將會樂意傾聽,對于您的數(shù)字向量它是如何做的。
總結(jié)
本文從某種程度上闡述了神經(jīng)網(wǎng)絡(luò)的基礎(chǔ),使您能夠開始在您自己的編碼過程中應(yīng)用它們。我們鼓勵您運(yùn)用在這里學(xué)到的東西,并嘗試編寫您自己的對于這個難題的解決方案。(請參閱于我們的解決方案的參考資料)。
參考資料
我們的代碼識別程序是基于?Neil?Schemenauer?的反向傳播模塊。關(guān)于有指導(dǎo)培訓(xùn)和無指導(dǎo)培訓(xùn)的差異,以及神經(jīng)網(wǎng)絡(luò)的一般介紹。
請參閱由?D.?Michie、D.J.?Spiegelhalter?以及C.C.?Taylor?編輯的Machine?Learning,Neural?and?Statistical?Classification,具體內(nèi)容請參閱第6?章。?
關(guān)于?Rosenblatt?的感知器結(jié)果,請參閱他的Principles?of?Neurodynamics, ?New?York:?Spartan?Books。?
關(guān)于一些?delta?規(guī)則的詳細(xì)信息,請參閱Kevin?Gurney?的著作An?Introduction?to?Neural?Networks?1997,?London:?Routledge。
也可以參閱Neural?Nets?早期的在線版本。?
關(guān)于?delta?規(guī)則的證明,請參閱B.?Widrow?和S.D.?Stearns?的Adaptive?Signal?Processing,?1985,?New?Jersey:?Prentice-Hall。?
關(guān)于包含圖形界面的感知器的執(zhí)行,請參閱?Omri?Weisman?和Ziv?Pollack?撰寫的The?Perceptron?。
總結(jié)
以上是生活随笔為你收集整理的简单易懂的讲解深度学习(入门系列之八)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: oracle 添加表权限不足,oracl
 - 下一篇: 华为 eNSP启动设备AR1失败 错误代