????分類數(shù)據(jù)
????數(shù)據(jù)回歸分析
????聚類數(shù)據(jù)
????如何構(gòu)建機(jī)器學(xué)習(xí)問題
雖然還有其他模型酿雪,但是回歸,分類和聚類在機(jī)器學(xué)習(xí)問題上是三種最主要的數(shù)據(jù)評估方式垂券,這三種模式是最常見的花盐,也是這本書的重點(diǎn),下一節(jié)將為你介紹分類菇爪,回歸和聚類算芯。?
分類嘗試確定輸入數(shù)據(jù)所屬哪個(gè)類別,分類通常是一個(gè)監(jiān)督訓(xùn)練操作凳宙,這意味著是用戶向神經(jīng)網(wǎng)絡(luò)提供數(shù)據(jù)和期望的結(jié)果熙揍,對于數(shù)據(jù)分類,期望結(jié)果是確定這個(gè)數(shù)據(jù)類氏涩。
監(jiān)督神經(jīng)網(wǎng)絡(luò)總是訓(xùn)練知道的數(shù)據(jù)届囚,在訓(xùn)練期間,神經(jīng)網(wǎng)絡(luò)評估怎樣更好地分類已知的數(shù)據(jù)是尖,一旦訓(xùn)練完成意系,神經(jīng)網(wǎng)絡(luò)期望將能夠更好地去分類未知的數(shù)據(jù)。
Fisher’sIris?數(shù)據(jù)集是個(gè)分類的例子饺汹,這個(gè)數(shù)據(jù)集包含了Iris花的測量數(shù)據(jù)蛔添,這是一個(gè)最著名的數(shù)據(jù)集,它經(jīng)常用來評估機(jī)器學(xué)習(xí)方法,完整數(shù)據(jù)集可以在以下URL得到:
http://www.heatonresearch.com/wiki/IrisData Set
下面是這個(gè)Iris數(shù)據(jù)集的一小部分例子
上面的數(shù)據(jù)顯示為一個(gè)CSV文件迎瞧,CSV是一種很常見的神經(jīng)網(wǎng)絡(luò)輸入格式夸溶,第一行通常是定義為每個(gè)文件的列,正如你所看見的凶硅,每種花提供了五種信息
? Sepal Length (萼片長度)
? Sepal Width (萼片寬度)
? Petal Length (花瓣長度)
? Petal Width (花瓣寬度)
? Species (種類)
對于分類缝裁,神經(jīng)網(wǎng)絡(luò)要求給萼片和花瓣的長/寬,?神經(jīng)網(wǎng)絡(luò)就能夠識別這個(gè)花所處的物種。
一個(gè)分類屬性通常是一個(gè)非數(shù)字?jǐn)?shù)據(jù)足绅,因此捷绑,類中的成員必須是明確定義的,對于這個(gè)Iris數(shù)據(jù)集编检,這兒有三個(gè)不同的Iris類別胎食,如果一個(gè)神經(jīng)網(wǎng)絡(luò)訓(xùn)練的是這三種Iris類別扰才,那就不能期望它確定識別玫瑰允懂,分類的所有成員必須在訓(xùn)練前已知。
在上一節(jié)衩匣,我們學(xué)習(xí)了怎樣分類數(shù)據(jù)蕾总,通常想要的輸出不是一個(gè)簡單的類,而是一個(gè)數(shù)值琅捏,考慮一下這個(gè)汽車的每加侖英里?(MPG)的計(jì)算生百,提供的數(shù)據(jù),如發(fā)動機(jī)尺寸和汽車重量柄延,這個(gè)汽車也許就能夠計(jì)算出它的MPG蚀浆。
考慮以下五輛汽車數(shù)據(jù)示例:
對于更多的信息,完整的數(shù)據(jù)集可以在這個(gè)網(wǎng)站上找到:
http://www.heatonresearch.com/wiki/MPG_Data_Set
回歸的思想是用車輛的輸入數(shù)據(jù)訓(xùn)練神經(jīng)網(wǎng)絡(luò)搜吧,但是市俊,使用回歸時(shí),網(wǎng)絡(luò)不會生成類滤奈,神經(jīng)網(wǎng)絡(luò)預(yù)計(jì)能提供每加侖汽油的里程數(shù)摆昧。
同樣重要的是要注意,并不是上述文件中的每一個(gè)數(shù)據(jù)都將被使用蜒程,如“汽車名稱”和“原產(chǎn)地”不使用绅你,汽車的名稱與燃油效率無關(guān),因此被排除在外昭躺。同樣忌锯,原產(chǎn)地也不利于這個(gè)方程,原產(chǎn)地是一個(gè)數(shù)值领炫,它指定汽車的地理區(qū)域偶垮。雖然有些地區(qū)確實(shí)注重燃料效率,但這一數(shù)據(jù)范圍太廣,不起作用针史。
另外一個(gè)常用的分析是聚類晶伦,不像前兩個(gè)分析類型,聚類是一個(gè)典型的無監(jiān)督啄枕,前兩節(jié)中的數(shù)據(jù)集可以應(yīng)用于聚類婚陪,不同的是聚類分析將不要求用戶像在Iris數(shù)據(jù)集的情況下提供物種,或者M(jìn)PG數(shù)據(jù)集提供MPG频祝,聚類算法預(yù)計(jì)將數(shù)據(jù)元素放置到與物種或者M(jìn)PG相對應(yīng)的集群中泌参。
對于聚類,這種機(jī)器學(xué)習(xí)方法簡單地查看數(shù)據(jù)常空,并試圖將這些數(shù)據(jù)放入多個(gè)集群中沽一,預(yù)計(jì)的集群數(shù)量必須提前定義,如果集群數(shù)量變化漓糙,集群機(jī)器學(xué)習(xí)方法將需要再次訓(xùn)練铣缠。
聚類和分類非常相似,它的輸出是一個(gè)集群昆禽,這類似于一個(gè)分類蝗蛙,然而,集群不同于回歸醉鳖,因?yàn)樗惶峁┮粋€(gè)數(shù)字捡硅,所以,如果將聚類與MPG數(shù)據(jù)集一起使用盗棵,那輸出將是一個(gè)汽車可以歸入到其中的某個(gè)集群壮韭,也許每個(gè)集群會指定不同級別的車輛燃料效率,也許聚類會把汽車分為幾組纹因,顯示出一些尚未被注意到的關(guān)系喷屋。
1.4構(gòu)建神經(jīng)網(wǎng)絡(luò)
現(xiàn)在已經(jīng)對神經(jīng)網(wǎng)絡(luò)三個(gè)主要模型問題有了了解,是時(shí)候來考察數(shù)據(jù)是怎樣提供給神經(jīng)網(wǎng)絡(luò)的了辐怕,這節(jié)將重點(diǎn)主要是在怎樣構(gòu)造一個(gè)神經(jīng)網(wǎng)絡(luò)接受數(shù)據(jù)項(xiàng)并提供輸出逼蒙,隨后的章節(jié)將詳細(xì)說明數(shù)據(jù)在提供給神經(jīng)網(wǎng)絡(luò)之前如何標(biāo)準(zhǔn)化數(shù)據(jù)。
神經(jīng)網(wǎng)絡(luò)通常是分層的寄疏,至少有一個(gè)輸入和輸出層是牢,也許還有隱藏層,某些神經(jīng)網(wǎng)絡(luò)類型不會再輸入和輸出層之外分解成任何形式層陕截,然而驳棱,這個(gè)輸入層和輸出層將永遠(yuǎn)存在,也許可能被整合在同一層农曲,我們現(xiàn)在將考察輸入層社搅,輸出層和隱藏層驻债。
1.4.1理解輸入層
輸入層是神經(jīng)網(wǎng)絡(luò)的第一層,和其他層一樣形葬,這一層包括了一個(gè)指定數(shù)字的神經(jīng)元合呐,同一層的神經(jīng)元都含有相似的屬性,通常笙以,對于神經(jīng)網(wǎng)絡(luò)將用于分類淌实,回歸或聚類的每個(gè)屬性,輸入層將有一個(gè)神經(jīng)元與之對應(yīng)猖腕。
考慮之前的示例拆祈,Iris數(shù)據(jù)集有四個(gè)輸入神經(jīng)元,這些神經(jīng)元指定花瓣的寬度和長度倘感,萼片的寬度和長度放坏,MPG數(shù)據(jù)集有更多的輸入神經(jīng)元,輸入神經(jīng)元的數(shù)目并不總是直接對應(yīng)于屬性的數(shù)量老玛,而一些屬性的數(shù)量將需要不止一個(gè)神經(jīng)元編碼淤年,這個(gè)編碼過程,稱為標(biāo)準(zhǔn)化逻炊,將在下一章中介紹互亮。
神經(jīng)元的數(shù)量決定了一層的輸入結(jié)構(gòu),對于每個(gè)輸入神經(jīng)元余素,存儲為一個(gè)double值,例如炊昆,以下的數(shù)組能夠被輸入到包含五個(gè)神經(jīng)元的層:
double[]input = new double[5];
這個(gè)輸入到一個(gè)神經(jīng)網(wǎng)絡(luò)總是為一個(gè)double類型的數(shù)組桨吊,重要的是這個(gè)數(shù)組直接對應(yīng)于輸入層神經(jīng)元的數(shù)目,Encog使用MLData接口定義類來持有這些數(shù)組凤巨,上面的數(shù)組能夠簡單的轉(zhuǎn)換為一個(gè)MLData?對象视乐,代碼如下:
MLDatadata = new BasicMLData(input);
?可提供給encog的數(shù)據(jù),是由MLData接口定義任何“array like”數(shù)據(jù)敢茁,輸入必須總是使用MLData對象傳遞給神經(jīng)網(wǎng)絡(luò)內(nèi)部佑淀,BasicMLData類實(shí)現(xiàn)了MLData接口,然而彰檬,BasicMLData類不僅僅是為Encog提供數(shù)據(jù)的唯一方法伸刃,其他實(shí)現(xiàn)了MLData的也可以為Encog提供數(shù)據(jù)。
?BasicMLData類僅僅提供了一個(gè)基于內(nèi)存的數(shù)據(jù)對于神經(jīng)網(wǎng)絡(luò)逢倍,一旦神經(jīng)網(wǎng)絡(luò)處理輸出捧颅,一個(gè)基于MLData類將從神經(jīng)網(wǎng)絡(luò)輸出層返回,輸出層將在下節(jié)討論较雕。
1.4.2?理解輸出層
?輸出層是神經(jīng)網(wǎng)絡(luò)的最后一層碉哑,這層提供了前面那些層處理完的輸出,輸出層的輸出格式非常類似于輸入層提供的數(shù)據(jù),神經(jīng)網(wǎng)絡(luò)的輸出是一個(gè)double數(shù)組扣典。
?神經(jīng)網(wǎng)絡(luò)輸出一個(gè)基于MLData接口的類妆毕,大多數(shù)構(gòu)建的神經(jīng)網(wǎng)絡(luò)返回的輸出類型是一個(gè)BasicMLData,然而贮尖,未來或者第三方神經(jīng)網(wǎng)絡(luò)也許會返回其他實(shí)現(xiàn)了MLData接口的類型设塔。
??神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)接受輸入(一個(gè)double數(shù)組)?和產(chǎn)生一個(gè)輸出(也是一個(gè)double數(shù)組),對于一個(gè)神經(jīng)網(wǎng)絡(luò)擅長的問題远舅,確定怎樣構(gòu)造輸入數(shù)據(jù)和有意義的輸出是兩個(gè)主要的挑戰(zhàn)闰蛔,神經(jīng)網(wǎng)絡(luò)的正真力量來自其模式識別能力,神經(jīng)網(wǎng)絡(luò)應(yīng)該有能力產(chǎn)生想要的輸出即使已經(jīng)發(fā)生了扭曲图柏。
?回歸神經(jīng)網(wǎng)絡(luò)通常產(chǎn)生一個(gè)輸出神經(jīng)元序六,他提供神經(jīng)網(wǎng)絡(luò)產(chǎn)生的數(shù)值,如果相同的神經(jīng)網(wǎng)絡(luò)預(yù)測到兩個(gè)或兩個(gè)以上給定輸入的數(shù)字蚤吹,那多輸出神經(jīng)元可能存在例诀。
?分類產(chǎn)生一個(gè)或多個(gè)輸出神經(jīng)元,這取決于輸出類怎樣編碼的裁着,在這里有幾個(gè)不同的編碼方式繁涂,將在下一章作詳細(xì)的討論。
?聚類的設(shè)置類似二驰,它的輸出神經(jīng)元確定數(shù)據(jù)屬于哪個(gè)集群扔罪。
1.4.3?隱藏層
?????? 在前面的討論中,神經(jīng)網(wǎng)絡(luò)包含了輸入層和輸出時(shí)桶雀,有時(shí)候矿酵,輸出層和輸入層是相同的,但是大多數(shù)通常是兩個(gè)單獨(dú)的層矗积,此外全肮,在輸入層和輸出層之間也許存在其他的層,這層被稱為隱藏層棘捣,隱藏層在輸入層和輸出層之間插入辜腺,隱藏層也可以承擔(dān)更多復(fù)雜的結(jié)構(gòu)。
?????? 隱藏層唯一的目標(biāo)是讓神經(jīng)網(wǎng)絡(luò)更好的為給定的輸入產(chǎn)生預(yù)期的輸出乍恐,神經(jīng)網(wǎng)絡(luò)編程首先涉及到的是定義輸入層和輸出層神經(jīng)元個(gè)數(shù)评疗,一旦確定了如何將編程問題轉(zhuǎn)換為輸入和輸出神經(jīng)元數(shù),那是時(shí)候來定義隱藏層了禁熏。
?????? 隱藏層是一個(gè)非常大的“黑盒子”壤巷,這個(gè)問題是根據(jù)隱藏層和輸出層的神經(jīng)元數(shù)定義的。神經(jīng)網(wǎng)絡(luò)如何產(chǎn)生正確的輸出部分是通過隱藏層執(zhí)行的瞧毙。一旦定義了輸入和輸出層的結(jié)構(gòu)胧华,就必須定義最佳學(xué)習(xí)的隱藏層結(jié)構(gòu)寄症。
?????? 避免創(chuàng)建一個(gè)太簡單或者是太復(fù)雜的隱藏層結(jié)構(gòu)是一個(gè)挑戰(zhàn),太復(fù)雜的隱藏層結(jié)構(gòu)將要花太多時(shí)間去訓(xùn)練矩动,太簡單的隱藏層結(jié)構(gòu)將學(xué)習(xí)不到這個(gè)問題有巧,一個(gè)好的起點(diǎn)是一個(gè)單一的隱藏層神經(jīng)元數(shù)目等于輸入層的兩倍,在根據(jù)這個(gè)網(wǎng)絡(luò)的性能悲没,隱藏層神經(jīng)元的數(shù)量在適當(dāng)增加或者減少篮迎。
?????? 開發(fā)者經(jīng)常想知道該使用多少層隱藏層,一些研究表明示姿,第二個(gè)隱藏層是很少的任意值甜橱,
Encog是一個(gè)很好的方法執(zhí)行一個(gè)實(shí)驗(yàn)和錯誤搜索最優(yōu)的隱藏層配置,更多的信息栈戳,請查看以下的URL:
http://www.heatonresearch.com/wiki/Hidden_Layers
?????? 有一些神經(jīng)網(wǎng)絡(luò)沒有隱藏層岂傲,輸入層直接連接到輸出層,進(jìn)一步子檀,一些神經(jīng)網(wǎng)絡(luò)僅僅只有一個(gè)單一的層镊掖,那些單一的層是自連的,這些連接允許網(wǎng)絡(luò)學(xué)習(xí)褂痰,包含在這些連接亩进,成為突觸,是一個(gè)個(gè)體權(quán)重矩陣缩歪。
1.5使用一個(gè)神經(jīng)網(wǎng)絡(luò)
這一節(jié)將詳細(xì)地怎樣為一個(gè)簡單的問題構(gòu)造一個(gè)神經(jīng)網(wǎng)絡(luò)归薛,設(shè)計(jì)這樣的一個(gè)神經(jīng)網(wǎng)絡(luò),它能夠模擬一個(gè)XOR運(yùn)算操作驶冒,學(xué)習(xí)XOR運(yùn)算是神經(jīng)網(wǎng)絡(luò)示例中的第一個(gè)例子苟翻,就像大多數(shù)的編程語言的第一個(gè)示例是一個(gè)簡單的“Hello World”顯示程序,神經(jīng)網(wǎng)絡(luò)時(shí)常用這個(gè)XOR運(yùn)算符來做示例骗污,學(xué)習(xí)XOR運(yùn)算符是一個(gè)神經(jīng)網(wǎng)絡(luò)中的”Hello World”程序。
1.5.1??? XOR操作和神經(jīng)網(wǎng)絡(luò)
XOR運(yùn)算是一種常見布爾邏輯運(yùn)算符沈条,其他兩個(gè)是AND和OR運(yùn)算符需忿,對于每個(gè)這些邏輯運(yùn)算符,有四種不同的組合蜡歹,AND所有可能的組合如下顯示:
0AND 0 = 0
1AND 0 = 0
0AND 1 = 0
1AND 1 = 0
這應(yīng)該符合你學(xué)習(xí)的計(jì)算機(jī)編程的操作符屋厘,正如它的名字所暗示的,僅僅當(dāng)兩個(gè)輸入都為true的時(shí)候月而,它的運(yùn)算才返回ture汗洒。
OR運(yùn)算符如下:
0OR 0 = 0
1OR 0 = 1
0OR 1 = 1
1 OR 1 = 1
這也應(yīng)該和你在計(jì)算機(jī)編程里學(xué)習(xí)到的OR運(yùn)算符是一致的,當(dāng)輸入兩個(gè)中的其中之一必須為true, OR運(yùn)算才為true.
“異或”(XOR)運(yùn)算符不太經(jīng)常用于計(jì)算機(jī)編程父款,XOR運(yùn)算符的可能組合如下:
0 XOR 0 = 0
1 XOR 0 = 1
0 XOR 1 = 1
1 XOR 1 = 0
正如你看見的溢谤,XOR運(yùn)算僅僅當(dāng)兩個(gè)輸入都不同時(shí)才返回true, 下一節(jié)說明怎樣為XOR運(yùn)算構(gòu)造輸入瞻凤,輸出和隱藏層。
1.5.2??? 為XOR構(gòu)造一個(gè)神經(jīng)網(wǎng)絡(luò)
這里XOR運(yùn)算符是兩個(gè)輸入和一個(gè)輸出世杀,將構(gòu)造相應(yīng)的輸入和輸出結(jié)構(gòu)阀参,給輸入神經(jīng)元喂以下的double值:
上面顯示的這些值對應(yīng)到輸入XOR運(yùn)算符,輸出神經(jīng)元期望的輸出為以下的double值:
這是一種神經(jīng)網(wǎng)絡(luò)能夠構(gòu)造的而一種方式瞻坝,這是一種允許一個(gè)簡單前饋神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)XOR運(yùn)算符的一種方式蛛壳,前饋神經(jīng)網(wǎng)絡(luò),也稱為感知器所刀,是我們將要學(xué)習(xí)的第一個(gè)神經(jīng)網(wǎng)絡(luò)架構(gòu)衙荐。
在這里還有其他的方式將XOR數(shù)據(jù)傳遞給神經(jīng)網(wǎng)絡(luò),在本書后面浮创,有兩個(gè)循環(huán)神經(jīng)網(wǎng)絡(luò)的示例忧吟,探索包括Elman和jordan樣式神經(jīng)網(wǎng)絡(luò),這些方法將XOR數(shù)據(jù)視為一個(gè)長序列蒸矛,基本上連接一起XOR的真值表瀑罗,結(jié)果為一個(gè)長的XOR序列:例如:
這里的換行符僅僅是為了可閱讀,這種神經(jīng)網(wǎng)絡(luò)視XOR為一個(gè)長序列雏掠,通過使用上面的數(shù)據(jù)斩祭,該神經(jīng)網(wǎng)絡(luò)有一個(gè)單一的輸入神經(jīng)元和一個(gè)單一的輸出神經(jīng)元,輸入神經(jīng)元從上面的列表中得到一個(gè)值乡话,輸出神經(jīng)元期望返回這個(gè)值的下一個(gè)值摧玫。
這表明通常有多種方式為一個(gè)神經(jīng)網(wǎng)絡(luò)提供模型數(shù)據(jù),如何為數(shù)據(jù)建模將大大影響神經(jīng)網(wǎng)絡(luò)的成功绑青,如果一個(gè)特定的模式不工作诬像,那應(yīng)該考慮另外一種,下一步就是為前饋神經(jīng)網(wǎng)絡(luò)標(biāo)準(zhǔn)化XOR數(shù)據(jù)闸婴。
因?yàn)閄OR運(yùn)算符有兩個(gè)輸入和一個(gè)輸出坏挠,所以神經(jīng)網(wǎng)絡(luò)也跟隨這種結(jié)構(gòu),此外邪乍,神經(jīng)網(wǎng)絡(luò)有一個(gè)單一的隱藏層有兩個(gè)神經(jīng)元來幫助處理數(shù)據(jù)降狠,兩個(gè)神經(jīng)元的選擇是任意的,經(jīng)常導(dǎo)致實(shí)驗(yàn)和錯誤庇楞,XOR問題是簡單的榜配,兩個(gè)隱藏層神經(jīng)元足以解決它,這個(gè)網(wǎng)絡(luò)的圖入圖1.1所示:
在上面網(wǎng)絡(luò)圖中有四個(gè)不同的神經(jīng)元吕晌,如下說明:
輸入神經(jīng)元:I1, I2
輸出神經(jīng)元:O1
隱藏神經(jīng)元:H1, H2
偏執(zhí)神經(jīng)元:B1, B2
輸入蛋褥,輸出和隱藏神經(jīng)元在前面已經(jīng)討論了,在這個(gè)圖中看到的新的神經(jīng)元是偏執(zhí)神經(jīng)元睛驳,一個(gè)偏執(zhí)神經(jīng)元總是輸出一個(gè)為1的值和從不接受從前面層的輸入烙心。
簡而言之膜廊,偏執(zhí)神經(jīng)元允許神經(jīng)網(wǎng)絡(luò)更有效的學(xué)習(xí)模式,他們類似隱藏層功能弃理,沒有偏執(zhí)神經(jīng)元溃论,很難對一個(gè)輸入值為0的神經(jīng)網(wǎng)絡(luò)產(chǎn)生輸出,與其說這是XOR數(shù)據(jù)的一個(gè)問題痘昌,但它其他數(shù)據(jù)集也有這個(gè)問題钥勋,更多有關(guān)它功能的詳細(xì)介紹,可以訪問以下URL:
http://www.heatonresearch.com/wiki/Bias
現(xiàn)在看看使用來解決XOR運(yùn)算符的神經(jīng)網(wǎng)絡(luò)代碼辆苔,完整的代碼包含在Encog示例中算灸,位置如下:
Org.encog.examples.neural.xor.XORHelloWorld
示例開始創(chuàng)建一個(gè)神經(jīng)網(wǎng)絡(luò)如下圖1.1.,所需的代碼來創(chuàng)建這個(gè)網(wǎng)絡(luò)是相對簡單的:
在上面的代碼中驻啤,一個(gè)BasicNetwork被創(chuàng)建菲驴,三個(gè)層添加到這個(gè)網(wǎng)絡(luò)中,第一層骑冗,為輸入層赊瞬,有兩個(gè)神經(jīng)元,第二層是隱藏層贼涩,也有兩個(gè)神經(jīng)元巧涧,最后為輸入層,有一個(gè)神經(jīng)元遥倦,最后谤绳,調(diào)用finalizeStructure方法通知網(wǎng)絡(luò)沒有層被添加了,調(diào)用reset隨機(jī)初始化這三個(gè)層之間的連接權(quán)重袒哥。
神經(jīng)網(wǎng)絡(luò)總是以隨機(jī)權(quán)重值開始缩筛。一個(gè)訓(xùn)練過程將這些權(quán)重調(diào)整到提供期望輸出的值。由于神經(jīng)網(wǎng)絡(luò)總是以隨機(jī)值開頭堡称,所以同一程序的兩次運(yùn)行會產(chǎn)生非常不同的結(jié)果瞎抛。一些隨機(jī)權(quán)重提供了比其他更好的起點(diǎn)。有時(shí)隨機(jī)權(quán)重相距太遠(yuǎn)却紧,網(wǎng)絡(luò)將無法學(xué)習(xí)婿失。在這種情況下,權(quán)重應(yīng)該再次隨機(jī)化啄寡,進(jìn)程重新啟動。
你也要注意在上面代碼中ActivationSigmoid類哩照,這指定了神經(jīng)網(wǎng)絡(luò)使用sigmoid激活函數(shù)挺物,激活函數(shù)將在第四章中學(xué)習(xí),僅僅隱藏層和輸出層使用激活函數(shù)飘弧,輸出層沒有激活函數(shù)识藤,如果一個(gè)輸入層指定了激活函數(shù)砚著,它將沒有影響。
每一層都指定了一個(gè)boolean 值痴昧,boolean值指定了在這個(gè)層中是否有偏執(zhí)神經(jīng)元稽穆,輸出層,如圖1.1所示赶撰,相對于輸入層和隱藏層沒有偏執(zhí)神經(jīng)元舌镶,這是因?yàn)橐粋€(gè)偏執(zhí)神經(jīng)元僅僅連接到下一層,輸出層是最后一層豪娜,所以在這里不需要有偏執(zhí)神經(jīng)元餐胀,如果一個(gè)輸出層指定了偏執(zhí)神經(jīng)元,他將不起作用瘤载。
這些權(quán)重構(gòu)成了長期記憶的神經(jīng)網(wǎng)絡(luò)否灾,一些神經(jīng)網(wǎng)絡(luò)也包含了上下文層給神經(jīng)網(wǎng)絡(luò)的短期記憶,神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)通過修改這些權(quán)重值鸣奔,這也是真真的Elman和Jordan神經(jīng)網(wǎng)絡(luò)墨技。
現(xiàn)在這個(gè)神經(jīng)網(wǎng)絡(luò)已經(jīng)被創(chuàng)建,現(xiàn)在應(yīng)該訓(xùn)練它挎狸,訓(xùn)練是一個(gè)隨機(jī)權(quán)重被調(diào)整到接近輸出的過程扣汪,訓(xùn)練將在下一節(jié)討論。
1.5.3??? 訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)
訓(xùn)練這個(gè)神經(jīng)網(wǎng)絡(luò)伟叛,構(gòu)造了一個(gè)MLDataSet對象私痹,這個(gè)對象包括了輸入和預(yù)期的輸出,構(gòu)造這個(gè)對象统刮,有兩個(gè)數(shù)組被創(chuàng)建紊遵,第一個(gè)數(shù)據(jù)是XOR運(yùn)算的輸入,第二個(gè)是預(yù)期的輸出侥蒙,這些將對應(yīng)于XOR的可能值暗膜,回顧一下,四種可能值如下所示:
首先鞭衩,為XOR構(gòu)造一個(gè)四個(gè)輸入值的數(shù)組学搜,使用了一個(gè)兩維的double數(shù)組,如下:
同樣的论衍,也構(gòu)造一個(gè)期望輸出的數(shù)組瑞佩,如下:
即使這里僅僅是一個(gè)輸出值,仍然也需要傳遞一個(gè)二維的數(shù)組坯台,如果有多個(gè)輸出神經(jīng)元炬丸,則像數(shù)組額外添加列。
現(xiàn)在構(gòu)造兩個(gè)輸入數(shù)組蜒蕾,必須創(chuàng)建一個(gè)MLDataSet對象訓(xùn)練集稠炬,這個(gè)對象創(chuàng)建如下:
現(xiàn)在訓(xùn)練集已經(jīng)創(chuàng)建焕阿,神經(jīng)網(wǎng)絡(luò)能夠訓(xùn)練,訓(xùn)練程序調(diào)整神經(jīng)網(wǎng)絡(luò)權(quán)重到最好產(chǎn)生期望輸出首启,訓(xùn)練將繼續(xù)更多次的迭代指導(dǎo)錯誤率低于網(wǎng)絡(luò)可接受的程度暮屡,首先,必須創(chuàng)建一個(gè)訓(xùn)練對象毅桃,Encog支持多種不同類型的訓(xùn)練褒纲。
這個(gè)例子使用彈性傳播訓(xùn)練(RPROP),RPROP也許是encog所支持的最好的訓(xùn)練算法,還提供了其他訓(xùn)練技術(shù)疾嗅,并通過一定的訓(xùn)練技術(shù)較好地解決了某些問題外厂,RPROP訓(xùn)練代碼構(gòu)造如下:
所有的訓(xùn)練類實(shí)現(xiàn)了MLTrain接口,RPROP算法通過ResilientPropagation類實(shí)現(xiàn)代承,構(gòu)造如上汁蝶。
一旦構(gòu)造了訓(xùn)練器,就應(yīng)該訓(xùn)練神經(jīng)網(wǎng)絡(luò)了论悴,訓(xùn)練神經(jīng)網(wǎng)絡(luò)調(diào)用的是MLTrain中的iteration方法掖棉,直到錯誤率低于指定的值為止,誤差是神經(jīng)網(wǎng)絡(luò)輸出與期望輸出匹配的程度:
上面的代碼循環(huán)通過更多次的迭代膀估,因?yàn)橐股窠?jīng)網(wǎng)絡(luò)的錯誤率低于1%幔亥,一旦神經(jīng)網(wǎng)絡(luò)訓(xùn)練結(jié)束,他就真正的使用了察纯,下一節(jié)將介紹怎樣使用一個(gè)神經(jīng)網(wǎng)絡(luò)帕棉。
1.5.4??? 執(zhí)行一個(gè)神經(jīng)網(wǎng)絡(luò)
運(yùn)用神經(jīng)網(wǎng)絡(luò)是調(diào)用BasicNetwork類的compute方法,在這里饼记,我們遍歷每個(gè)訓(xùn)練集值香伴,并顯示神經(jīng)網(wǎng)絡(luò)的輸出:
Compute方法接受一個(gè)MLData類和返回另外的MLData對象,返回對象里包含了從神經(jīng)網(wǎng)絡(luò)的輸出具则,向用戶顯示即纲,運(yùn)行這個(gè)程序,每一次迭代的訓(xùn)練結(jié)果博肋,當(dāng)前的錯誤率首先顯示:
第一次迭代的時(shí)候錯誤率為56%低斋,到了107次的時(shí)候下降到了1%以下,因?yàn)樯窠?jīng)網(wǎng)絡(luò)隨機(jī)初始化權(quán)重匪凡,因此有可能每次運(yùn)行這個(gè)程序迭代訓(xùn)練會得到不同的數(shù)值膊畴,此外,盡管最后錯誤率也許不同病游,他也應(yīng)該總是在1%以下結(jié)束巴比。
最終,程序顯示每個(gè)訓(xùn)練項(xiàng)目的結(jié)果如下:
正如你所看見的,這個(gè)網(wǎng)絡(luò)還沒有被訓(xùn)練給出準(zhǔn)確的結(jié)果轻绞,這是正常的,因?yàn)榫W(wǎng)絡(luò)訓(xùn)練為1%的錯誤率佣耐,所以每個(gè)結(jié)果也將存在一般的1%的預(yù)期值政勃。
因?yàn)樯窠?jīng)網(wǎng)絡(luò)被初始化隨機(jī)值,第二次運(yùn)行這個(gè)程序最終的輸出也將有差異:
第二次運(yùn)行輸出輕微的不同兼砖,這是正常的奸远。
這是第一個(gè)Encog示例,在這本書中所有包含的示例能后下載讽挟,怎樣下載這些示例懒叛,更多的信息參考附錄A “安裝Encog”。
Encog是一個(gè)先進(jìn)的機(jī)器學(xué)習(xí)框架耽梅,使用來創(chuàng)建神經(jīng)網(wǎng)絡(luò)薛窥,這章重點(diǎn)在回歸,分類和聚類眼姐,最后诅迷,這章也展示了怎樣創(chuàng)建一個(gè)能夠?qū)W習(xí)XOR操作的Encog應(yīng)用程序。
回歸神經(jīng)網(wǎng)絡(luò)接受輸入和產(chǎn)生一個(gè)數(shù)值型輸出众旗,分類神經(jīng)網(wǎng)絡(luò)接受輸入和預(yù)測輸入屬于哪個(gè)類罢杉,聚類不要求期望輸出,當(dāng)然贡歧,聚類的輸入數(shù)據(jù)和集群輸入情況下盡其所能滩租。
Encog支持機(jī)種不同的層類型,然而利朵,這些層分為三組律想,這取決于它們在神經(jīng)網(wǎng)絡(luò)中的位置,取決它們在神經(jīng)網(wǎng)絡(luò)中的位置哗咆,輸入層從外部接受輸入蜘欲,隱藏層從輸入層接受數(shù)據(jù)作進(jìn)一步的處理,輸出層從輸入或者最后一個(gè)隱層得到數(shù)據(jù)晌柬,并輸出到外部世界姥份。
XOR運(yùn)算符是這章中使用的例子,XOR運(yùn)算符時(shí)常使用作為神經(jīng)網(wǎng)絡(luò)的簡單的“Hello World”應(yīng)用程序年碘,XOR運(yùn)算符提供了一個(gè)非常簡單模式澈歉,大多數(shù)神經(jīng)網(wǎng)絡(luò)能夠簡單學(xué)習(xí),他是重要的知道為一個(gè)神經(jīng)網(wǎng)絡(luò)怎樣構(gòu)造數(shù)據(jù)屿衅,神經(jīng)網(wǎng)絡(luò)接受和返回一個(gè)float型數(shù)組埃难。
最后,這章詳細(xì)說明怎樣發(fā)送數(shù)據(jù)到一個(gè)神經(jīng)網(wǎng)絡(luò),XOR數(shù)據(jù)示例很容易提供給一個(gè)神經(jīng)網(wǎng)絡(luò)涡尘,沒有必要標(biāo)準(zhǔn)化或者編碼忍弛,然而,大多數(shù)真實(shí)世界數(shù)據(jù)將需要標(biāo)準(zhǔn)化考抄,標(biāo)準(zhǔn)化將在下一章介紹细疚。