人工智能編程論文
很少有程序員不對這里或者那里所包含的人工智能編程所吸引,然而,許多對AI感興趣的程序員很快就因其中包含的算法的復(fù)雜性而退卻。以下是學(xué)習(xí)啦小編精心整理的人工智能編程論文的相關(guān)資料,希望對你有幫助!
人工智能編程論文篇一
用Java開源項(xiàng)目JOONE實(shí)現(xiàn)人工智能編程
很少有程序員不對這里或者那里所包含的人工智能編程所吸引,然而,許多對AI感興趣的程序員很快就因其中包含的算法的復(fù)雜性而退卻。在本文中,我們將討論一個(gè)能大大簡化這種復(fù)雜性的Java開源工程。
Java面向?qū)ο蟮纳窠?jīng)網(wǎng)絡(luò)(JOONE)是一開源工程,它提供給Java程序員一個(gè)高適應(yīng)性的神經(jīng)網(wǎng)絡(luò)。該JOONE工程源代碼由LGPL所保護(hù)。簡言之,這意味著源代碼是可自由使用的而且你不需要支付版稅就可以使用JOONE。JOONE可以從http://joone.sourceforge.net/處下載。
JOONE能允許你輕易地從一個(gè)Java程序中創(chuàng)建神經(jīng)網(wǎng)絡(luò)。JOONE支持許多特征,如多線程和分布式處理。這意味著JOONE能利用多處理機(jī)計(jì)算機(jī)和多臺計(jì)算機(jī)的優(yōu)勢來進(jìn)行分布式處理。
神經(jīng)網(wǎng)絡(luò)
JOONE用Java實(shí)現(xiàn)了一個(gè)人工神經(jīng)網(wǎng)絡(luò)。一個(gè)人工神經(jīng)網(wǎng)絡(luò)試圖仿效生物學(xué)神經(jīng)網(wǎng)絡(luò)的功能--神經(jīng)網(wǎng)絡(luò)組成今天在地球上幾乎所有高等生命的大腦形式。神經(jīng)網(wǎng)絡(luò)由神經(jīng)原組成。
從圖1中你可以看出,神經(jīng)原由一個(gè)內(nèi)核細(xì)胞和幾個(gè)長長的稱為觸角的連接器組成。神經(jīng)原之間依靠這些觸角進(jìn)行連接。無論是生物學(xué)的還是人工的神經(jīng)網(wǎng)絡(luò),都通過觸角把信號從一個(gè)神經(jīng)原傳遞到另一個(gè)神經(jīng)原來工作。
使用JOONE
在這篇文章中,你將看到一個(gè)簡單的怎樣使用JOONE的實(shí)例。神經(jīng)網(wǎng)絡(luò)題目涉及廣泛并覆蓋許多不同的應(yīng)用領(lǐng)域。在本文中,我們將展示給你怎樣使用JOONE來解決一個(gè)很簡單的模式識別問題。模式識別是神經(jīng)網(wǎng)絡(luò)中的最普遍的應(yīng)用之一。
模式識別提供給神經(jīng)網(wǎng)絡(luò)一種模式,判斷是否該神經(jīng)網(wǎng)絡(luò)能夠識別出該模式。這種模式應(yīng)該能夠在某種程度上被扭曲而該神經(jīng)網(wǎng)絡(luò)仍然能夠識別它。這很像人類識別東西(如一個(gè)交通標(biāo)志)的能力。人類應(yīng)該能夠識別在下雨天,晴天或者晚上的交通標(biāo)志。即使這些圖像看上去可能相當(dāng)不同,但人類的大腦仍能夠判斷出它們是一樣的圖像。
當(dāng)進(jìn)行JOONE編程時(shí),你一般要使用兩種類型的對象。你要使用神經(jīng)原層對象,用于描述一層的一個(gè)或多個(gè)的具有相似特征的神經(jīng)原。神經(jīng)網(wǎng)絡(luò)經(jīng)常有一層或兩層神經(jīng)元。這些神經(jīng)元層通過觸角聯(lián)系在一起。這些觸角把這種待識別的模式,從一個(gè)神經(jīng)元層傳輸?shù)搅硪粋€(gè)神經(jīng)元層。
觸角不僅把這種模式從一個(gè)神經(jīng)元層傳輸?shù)搅硪粋€(gè)神經(jīng)元層。觸角還將生成一些指向這種模式的元素的斜線。這些斜線將導(dǎo)致這種模式的某些元素在被傳輸?shù)较乱粋€(gè)神經(jīng)元層時(shí)不如通過其它方式傳遞更有效些。這些斜線通常稱為權(quán)重,它們形成神經(jīng)網(wǎng)絡(luò)的存儲系統(tǒng)。通過調(diào)整存儲在觸角中的這些權(quán)重,可以更改神經(jīng)網(wǎng)絡(luò)的行為。
觸角在JOONE中還承擔(dān)著另外一個(gè)角色。在JOONE中,可以把觸角看作是數(shù)據(jù)導(dǎo)管。正如觸角把模式從一個(gè)神經(jīng)元層傳輸?shù)搅硪粋€(gè)神經(jīng)元層,指定版本的觸角用于把模式傳入和傳出神經(jīng)網(wǎng)絡(luò)。下面將給你展示一個(gè)簡單的單層的神經(jīng)網(wǎng)絡(luò)是怎樣被構(gòu)建并進(jìn)行模式識別的。
訓(xùn)練神經(jīng)網(wǎng)絡(luò)
為實(shí)現(xiàn)本文的目的,我們將指導(dǎo)JOONE去識別一個(gè)很簡單的模式。在這種模式中,我們將考察一個(gè)二進(jìn)制的布爾操作,例如XOR。這個(gè)XOR操作的真值表列舉如下:
X Y X XOR Y
0 0 0
0 1 1
1 0 1
1 1 0
正如你從上表中看到的,XOR運(yùn)算的結(jié)果是只有當(dāng)X和Y具有不同值時(shí),結(jié)果才為真(1)。其它情況下,XOR運(yùn)算結(jié)果均為假(0)。默認(rèn)地,JOONE從存儲在你的系統(tǒng)中的文本文件中取得輸入。這些文本文件通過使用一種稱為FileInputSynapse的特殊觸角來讀取。為了訓(xùn)練XOR運(yùn)算問題,你必須建立一個(gè)輸入文件-該文件包含上面顯示的數(shù)據(jù)。該文件顯示在列表1中。
列表1:為解決XOR問題的輸入文件的內(nèi)容
0.0;0.0;0.0
0.0;1.0;1.0
1.0;0.0;1.0
1.0;1.0;0.0
我們現(xiàn)在分析一個(gè)簡單的程序,它指導(dǎo)JOONE來識別XOR運(yùn)算并產(chǎn)生正確的結(jié)果。我們現(xiàn)在分析訓(xùn)練該神經(jīng)網(wǎng)絡(luò)必須被處理的過程。訓(xùn)練過程包括把XOR問題提交給神經(jīng)網(wǎng)絡(luò),然后觀察結(jié)果。如果這個(gè)結(jié)果不是所預(yù)期的,該訓(xùn)練算法將調(diào)整存儲在觸角中的重量。在神經(jīng)網(wǎng)絡(luò)的實(shí)際輸出和預(yù)料的輸出之間的差距稱為誤差。訓(xùn)練將繼續(xù)到誤差小于一個(gè)可接受值為止。這個(gè)級別通常是一個(gè)百分?jǐn)?shù),如10%。我們現(xiàn)在分析必須用于訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)的代碼。
訓(xùn)練過程通過建立神經(jīng)網(wǎng)絡(luò)開始,同時(shí)也必須創(chuàng)建隱蔽的輸入層和輸出層。
// 首先,創(chuàng)造這三個(gè)層
input = new SigmoidLayer();
hidden = new SigmoidLayer();
output = new SigmoidLayer();
每個(gè)層被使用JOONE對象SigmoidLayer創(chuàng)建。Sigmoidlayer基于自然對數(shù)生成一個(gè)輸出。JOONE還包含另外的層,而不是你可能選擇使用的S形的層類型。
下一步,每一層被賦于一個(gè)名字。這些名字將有助于后面在調(diào)試期間識別該層。
input.setLayerName("input");
hidden.setLayerName("hidden");
output.setLayerName("output");
現(xiàn)在必須定義每個(gè)層。我們將指定在每一層中的"行"號。該"行"號對應(yīng)于這一層中的神經(jīng)原的數(shù)目。
input.setRows(2);
hidden.setRows(3);
output.setRows(1);
從上面的代碼看出,輸入層有兩個(gè)神經(jīng)原,隱蔽層有三個(gè)隱蔽神經(jīng)原,輸出層包含一個(gè)神經(jīng)原。這對于神經(jīng)網(wǎng)絡(luò)包含兩個(gè)輸入神經(jīng)原和一個(gè)輸出神經(jīng)原是具有重要意義的,因?yàn)閄OR運(yùn)算符接收兩個(gè)參數(shù)而產(chǎn)生一個(gè)結(jié)果。
為使用該神經(jīng)原層,我們也必須創(chuàng)建觸角。在本例中,我們要使用多個(gè)觸角。這些觸角用下面的代碼實(shí)現(xiàn)。
// 輸入-> 隱蔽的連接。
FullSynapse synapse_IH = new FullSynapse();
// 隱蔽-> 輸出連接。
FullSynapse synapse_HO = new FullSynapse();
就象神經(jīng)原層的情況一樣,觸角也可能命名以有助于程序的調(diào)試。下面的代碼命名新建的觸角。
synapse_IH.setName("IH");
synapse_HO.setName("HO");
最后,我們必須把觸角聯(lián)接到適當(dāng)神經(jīng)原層。下面的代碼實(shí)現(xiàn)這一點(diǎn)。
// 聯(lián)接輸入層到隱蔽層
input.addOutputSynapse(synapse_IH);
hidden.addInputSynapse(synapse_IH);
// 聯(lián)接隱蔽層到輸出層
hidden.addOutputSynapse(synapse_HO);
output.addInputSynapse(synapse_HO);
現(xiàn)在既然神經(jīng)網(wǎng)絡(luò)已被創(chuàng)建,我們必須創(chuàng)建一個(gè)用于調(diào)節(jié)該神經(jīng)網(wǎng)絡(luò)的監(jiān)視器對象。下面的代碼創(chuàng)建監(jiān)視器對象。
//創(chuàng)建監(jiān)視器對象并且設(shè)置學(xué)習(xí)參數(shù)
monitor = new Monitor();
monitor.setLearningRate(0.8);
monitor.setMomentum(0.3);
學(xué)習(xí)速度和動(dòng)力作為參數(shù)以用于指定訓(xùn)練的產(chǎn)生方式。JOONE利用backpropagation學(xué)習(xí)算法。要更多了解關(guān)于學(xué)習(xí)速度或者動(dòng)力的信息,你應(yīng)該參考backpropagation算法。
這個(gè)監(jiān)視器對象應(yīng)該被賦值給每一個(gè)神經(jīng)原層。下面的代碼實(shí)現(xiàn)這一點(diǎn)。
input.setMonitor(monitor);
hidden.setMonitor(monitor);
output.setMonitor(monitor);
就象許多Java對象本身一樣,JOONE監(jiān)視器允許聽者可以添加到它上面去。隨著訓(xùn)練的進(jìn)行,JOONE將通知聽者有關(guān)訓(xùn)練進(jìn)程的信息。在這個(gè)簡單的例子中,我們使用:
monitor.addNeuralNetListener(this);
我們現(xiàn)在必須建立輸入觸角。如前所述,我們將使用一個(gè)FileInputSynapse來讀取一個(gè)磁盤文件。磁盤文件不是JOONE唯一能夠接受的輸入種類。JOONE對于不同的輸入源具有很強(qiáng)的靈活性。為使JOONE能夠接收其它輸入類型,你只需創(chuàng)建一個(gè)新的觸角來接受輸入。在本例中,我們將簡單地使用FileInputSynapse。FileInputSynapse首先被實(shí)例化。
inputStream = new FileInputSynapse();
然后,必須通知FileInputSynapse要使用哪些列。列表1中顯示的文件使用了輸入數(shù)據(jù)的前兩列。下面代碼建立起前兩列用于輸入到神經(jīng)網(wǎng)絡(luò)。
// 前兩列包含輸入值
inputStream.setFirstCol(1);
inputStream.setLastCol(2);
然后,我們必須提供輸入文件的名字,這個(gè)名字直接來源于用戶接口。然后,提供一個(gè)編輯控件用于收集輸入文件的名字。下面代碼為FileInputSynapse設(shè)置文件名。
// 這是包含輸入數(shù)據(jù)的文件名
inputStream.setFileName(inputFile.getText());
如前所述,一個(gè)觸角僅是一個(gè)神經(jīng)原層之間的數(shù)據(jù)導(dǎo)管。FileInputSynapse正是這里的數(shù)據(jù)導(dǎo)管,通過它數(shù)據(jù)進(jìn)入到神經(jīng)網(wǎng)絡(luò)。為了更容易實(shí)現(xiàn)這點(diǎn),我們必須要把FileInputSynapse加到神經(jīng)網(wǎng)絡(luò)的輸入層。這由下面一行實(shí)現(xiàn)。
input.addInputSynapse(inputStream);
現(xiàn)在既然已經(jīng)建立起神經(jīng)網(wǎng)絡(luò),我們必須創(chuàng)建一個(gè)訓(xùn)練員和一個(gè)監(jiān)視器。訓(xùn)練員用于訓(xùn)練該神經(jīng)網(wǎng)絡(luò),因?yàn)樵摫O(jiān)視器通過一個(gè)事先設(shè)置好的訓(xùn)練重復(fù)數(shù)來運(yùn)行這個(gè)神經(jīng)網(wǎng)絡(luò)。對于每一次訓(xùn)練重復(fù),數(shù)據(jù)被提供到神經(jīng)網(wǎng)絡(luò),然后就可以觀察到結(jié)果。該神經(jīng)網(wǎng)絡(luò)的權(quán)重(存儲在穿梭在神經(jīng)原層之間的觸角連接中)將根據(jù)誤差作適當(dāng)調(diào)整。隨著訓(xùn)練的進(jìn)行,誤差級將下降。下列代碼建立訓(xùn)練員并把它依附到監(jiān)視器。
trainer = new TeachingSynapse();
trainer.setMonitor(monitor);
你會記得列表1中提供的輸入文件包含三個(gè)列。到目前為止,我們僅僅使用了第一、二列,它們指定了到神經(jīng)網(wǎng)絡(luò)的輸入。第三列包含當(dāng)提供給神經(jīng)網(wǎng)絡(luò)第一列中的數(shù)字時(shí)的期盼的輸出值。我們必須使得訓(xùn)練員能夠存取該列以便能確定誤差。該錯(cuò)誤是神經(jīng)網(wǎng)絡(luò)的實(shí)際輸出和期盼的輸出之間的差距。下列代碼創(chuàng)建另外一個(gè)FileInputSynapse并作好準(zhǔn)備以讀取與前面相同的輸入文件。
// 設(shè)置包含期望的響應(yīng)值的文件,這由FileInputSynapse來提供
samples = new FileInputSynapse();
samples.setFileName(inputFile.getText());
這時(shí),我們想指向在第三列的FileInputSynapse。下列代碼實(shí)現(xiàn)了這一點(diǎn),然后讓訓(xùn)練員使用這個(gè)FileInputSynapse。
//輸出值在文件中的第三列上
samples.setFirstCol(3);
samples.setLastCol(3);
trainer.setDesired(samples);
最后,訓(xùn)練員被連結(jié)到神經(jīng)網(wǎng)絡(luò)輸出層,這將使訓(xùn)練員接收神經(jīng)網(wǎng)絡(luò)的輸出。
// 連接訓(xùn)練員到網(wǎng)絡(luò)的最后一層
output.addOutputSynapse(trainer);
我們現(xiàn)在已為所有的層準(zhǔn)備好后臺線程,包括訓(xùn)練員。
input.start();
hidden.start();
output.start();
trainer.start();
最后,我們?yōu)橛?xùn)練設(shè)置一些參數(shù)。我們指定在輸入文件中共有四行,而且想訓(xùn)練20,000個(gè)周期,而且還在不段學(xué)習(xí)。如果你設(shè)置學(xué)習(xí)參數(shù)為false,該神經(jīng)網(wǎng)絡(luò)將簡單地處理輸入并不進(jìn)行學(xué)習(xí)。我們將在下一節(jié)討論輸入處理。
monitor.setPatterns(4);
monitor.setTotCicles(20000);
monitor.setLearning(true);
現(xiàn)在我們已經(jīng)為訓(xùn)練過程作好準(zhǔn)備。調(diào)用監(jiān)視器的Go方法將在后臺啟動(dòng)訓(xùn)練過程。
monitor.Go();
神經(jīng)網(wǎng)絡(luò)現(xiàn)在將要被訓(xùn)練20,000個(gè)周期。當(dāng)神經(jīng)網(wǎng)絡(luò)訓(xùn)練完成,誤差層應(yīng)該在一個(gè)合理的低級別上。一般低于10%的誤差級是可接受的。
訓(xùn)練神經(jīng)網(wǎng)絡(luò)
為實(shí)現(xiàn)本文的目的,我們將指導(dǎo)JOONE去識別一個(gè)很簡單的模式。在這種模式中,我們將考察一個(gè)二進(jìn)制的布爾操作,例如XOR。這個(gè)XOR操作的真值表列舉如下:
X Y X XOR Y
0 0 0
0 1 1
1 0 1
1 1 0
正如你從上表中看到的,XOR運(yùn)算的結(jié)果是只有當(dāng)X和Y具有不同值時(shí),結(jié)果才為真(1)。其它情況下,XOR運(yùn)算結(jié)果均為假(0)。默認(rèn)地,JOONE從存儲在你的系統(tǒng)中的文本文件中取得輸入。這些文本文件通過使用一種稱為FileInputSynapse的特殊觸角來讀取。為了訓(xùn)練XOR運(yùn)算問題,你必須建立一個(gè)輸入文件-該文件包含上面顯示的數(shù)據(jù)。該文件顯示在列表1中。
列表1:為解決XOR問題的輸入文件的內(nèi)容
0.0;0.0;0.0
0.0;1.0;1.0
1.0;0.0;1.0
1.0;1.0;0.0
我們現(xiàn)在分析一個(gè)簡單的程序,它指導(dǎo)JOONE來識別XOR運(yùn)算并產(chǎn)生正確的結(jié)果。我們現(xiàn)在分析訓(xùn)練該神經(jīng)網(wǎng)絡(luò)必須被處理的過程。訓(xùn)練過程包括把XOR問題提交給神經(jīng)網(wǎng)絡(luò),然后觀察結(jié)果。如果這個(gè)結(jié)果不是所預(yù)期的,該訓(xùn)練算法將調(diào)整存儲在觸角中的重量。在神經(jīng)網(wǎng)絡(luò)的實(shí)際輸出和預(yù)料的輸出之間的差距稱為誤差。訓(xùn)練將繼續(xù)到誤差小于一個(gè)可接受值為止。這個(gè)級別通常是一個(gè)百分?jǐn)?shù),如10%。我們現(xiàn)在分析必須用于訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò)的代碼。
訓(xùn)練過程通過建立神經(jīng)網(wǎng)絡(luò)開始,同時(shí)也必須創(chuàng)建隱蔽的輸入層和輸出層。
// 首先,創(chuàng)造這三個(gè)層
input = new SigmoidLayer();
hidden = new SigmoidLayer();
output = new SigmoidLayer();
每個(gè)層被使用JOONE對象SigmoidLayer創(chuàng)建。Sigmoidlayer基于自然對數(shù)生成一個(gè)輸出。JOONE還包含另外的層,而不是你可能選擇使用的S形的層類型。
下一步,每一層被賦于一個(gè)名字。這些名字將有助于后面在調(diào)試期間識別該層。
input.setLayerName("input");
hidden.setLayerName("hidden");
output.setLayerName("output");
現(xiàn)在必須定義每個(gè)層。我們將指定在每一層中的"行"號。該"行"號對應(yīng)于這一層中的神經(jīng)原的數(shù)目。
input.setRows(2);
hidden.setRows(3);
output.setRows(1);
從上面的代碼看出,輸入層有兩個(gè)神經(jīng)原,隱蔽層有三個(gè)隱蔽神經(jīng)原,輸出層包含一個(gè)神經(jīng)原。這對于神經(jīng)網(wǎng)絡(luò)包含兩個(gè)輸入神經(jīng)原和一個(gè)輸出神經(jīng)原是具有重要意義的,因?yàn)閄OR運(yùn)算符接收兩個(gè)參數(shù)而產(chǎn)生一個(gè)結(jié)果。
為使用該神經(jīng)原層,我們也必須創(chuàng)建觸角。在本例中,我們要使用多個(gè)觸角。這些觸角用下面的代碼實(shí)現(xiàn)。
// 輸入-> 隱蔽的連接。
FullSynapse synapse_IH = new FullSynapse();
// 隱蔽-> 輸出連接。
FullSynapse synapse_HO = new FullSynapse();
就象神經(jīng)原層的情況一樣,觸角也可能命名以有助于程序的調(diào)試。下面的代碼命名新建的觸角。
synapse_IH.setName("IH");
synapse_HO.setName("HO");
最后,我們必須把觸角聯(lián)接到適當(dāng)神經(jīng)原層。下面的代碼實(shí)現(xiàn)這一點(diǎn)。
// 聯(lián)接輸入層到隱蔽層
input.addOutputSynapse(synapse_IH);
hidden.addInputSynapse(synapse_IH);
// 聯(lián)接隱蔽層到輸出層
hidden.addOutputSynapse(synapse_HO);
output.addInputSynapse(synapse_HO);
現(xiàn)在既然神經(jīng)網(wǎng)絡(luò)已被創(chuàng)建,我們必須創(chuàng)建一個(gè)用于調(diào)節(jié)該神經(jīng)網(wǎng)絡(luò)的監(jiān)視器對象。下面的代碼創(chuàng)建監(jiān)視器對象。
//創(chuàng)建監(jiān)視器對象并且設(shè)置學(xué)習(xí)參數(shù)
monitor = new Monitor();
monitor.setLearningRate(0.8);
monitor.setMomentum(0.3);
學(xué)習(xí)速度和動(dòng)力作為參數(shù)以用于指定訓(xùn)練的產(chǎn)生方式。JOONE利用backpropagation學(xué)習(xí)算法。要更多了解關(guān)于學(xué)習(xí)速度或者動(dòng)力的信息,你應(yīng)該參考backpropagation算法。
這個(gè)監(jiān)視器對象應(yīng)該被賦值給每一個(gè)神經(jīng)原層。下面的代碼實(shí)現(xiàn)這一點(diǎn)。
input.setMonitor(monitor);
hidden.setMonitor(monitor);
output.setMonitor(monitor);
就象許多Java對象本身一樣,JOONE監(jiān)視器允許聽者可以添加到它上面去。隨著訓(xùn)練的進(jìn)行,JOONE將通知聽者有關(guān)訓(xùn)練進(jìn)程的信息。在這個(gè)簡單的例子中,我們使用:
monitor.addNeuralNetListener(this);
我們現(xiàn)在必須建立輸入觸角。如前所述,我們將使用一個(gè)FileInputSynapse來讀取一個(gè)磁盤文件。磁盤文件不是JOONE唯一能夠接受的輸入種類。JOONE對于不同的輸入源具有很強(qiáng)的靈活性。為使JOONE能夠接收其它輸入類型,你只需創(chuàng)建一個(gè)新的觸角來接受輸入。在本例中,我們將簡單地使用FileInputSynapse。FileInputSynapse首先被實(shí)例化。
inputStream = new FileInputSynapse();
然后,必須通知FileInputSynapse要使用哪些列。列表1中顯示的文件使用了輸入數(shù)據(jù)的前兩列。下面代碼建立起前兩列用于輸入到神經(jīng)網(wǎng)絡(luò)。
// 前兩列包含輸入值
inputStream.setFirstCol(1);
inputStream.setLastCol(2);
然后,我們必須提供輸入文件的名字,這個(gè)名字直接來源于用戶接口。然后,提供一個(gè)編輯控件用于收集輸入文件的名字。下面代碼為FileInputSynapse設(shè)置文件名。
// 這是包含輸入數(shù)據(jù)的文件名
inputStream.setFileName(inputFile.getText());
如前所述,一個(gè)觸角僅是一個(gè)神經(jīng)原層之間的數(shù)據(jù)導(dǎo)管。FileInputSynapse正是這里的數(shù)據(jù)導(dǎo)管,通過它數(shù)據(jù)進(jìn)入到神經(jīng)網(wǎng)絡(luò)。為了更容易實(shí)現(xiàn)這點(diǎn),我們必須要把FileInputSynapse加到神經(jīng)網(wǎng)絡(luò)的輸入層。這由下面一行實(shí)現(xiàn)。
input.addInputSynapse(inputStream);
現(xiàn)在既然已經(jīng)建立起神經(jīng)網(wǎng)絡(luò),我們必須創(chuàng)建一個(gè)訓(xùn)練員和一個(gè)監(jiān)視器。訓(xùn)練員用于訓(xùn)練該神經(jīng)網(wǎng)絡(luò),因?yàn)樵摫O(jiān)視器通過一個(gè)事先設(shè)置好的訓(xùn)練重復(fù)數(shù)來運(yùn)行這個(gè)神經(jīng)網(wǎng)絡(luò)。對于每一次訓(xùn)練重復(fù),數(shù)據(jù)被提供到神經(jīng)網(wǎng)絡(luò),然后就可以觀察到結(jié)果。該神經(jīng)網(wǎng)絡(luò)的權(quán)重(存儲在穿梭在神經(jīng)原層之間的觸角連接中)將根據(jù)誤差作適當(dāng)調(diào)整。隨著訓(xùn)練的進(jìn)行,誤差級將下降。下列代碼建立訓(xùn)練員并把它依附到監(jiān)視器。
trainer = new TeachingSynapse();
trainer.setMonitor(monitor);
你會記得列表1中提供的輸入文件包含三個(gè)列。到目前為止,我們僅僅使用了第一、二列,它們指定了到神經(jīng)網(wǎng)絡(luò)的輸入。第三列包含當(dāng)提供給神經(jīng)網(wǎng)絡(luò)第一列中的數(shù)字時(shí)的期盼的輸出值。我們必須使得訓(xùn)練員能夠存取該列以便能確定誤差。該錯(cuò)誤是神經(jīng)網(wǎng)絡(luò)的實(shí)際輸出和期盼的輸出之間的差距。下列代碼創(chuàng)建另外一個(gè)FileInputSynapse并作好準(zhǔn)備以讀取與前面相同的輸入文件。
// 設(shè)置包含期望的響應(yīng)值的文件,這由FileInputSynapse來提供
samples = new FileInputSynapse();
samples.setFileName(inputFile.getText());
這時(shí),我們想指向在第三列的FileInputSynapse。下列代碼實(shí)現(xiàn)了這一點(diǎn),然后讓訓(xùn)練員使用這個(gè)FileInputSynapse。
//輸出值在文件中的第三列上
samples.setFirstCol(3);
samples.setLastCol(3);
trainer.setDesired(samples);
最后,訓(xùn)練員被連結(jié)到神經(jīng)網(wǎng)絡(luò)輸出層,這將使訓(xùn)練員接收神經(jīng)網(wǎng)絡(luò)的輸出。
// 連接訓(xùn)練員到網(wǎng)絡(luò)的最后一層
output.addOutputSynapse(trainer);
我們現(xiàn)在已為所有的層準(zhǔn)備好后臺線程,包括訓(xùn)練員。
input.start();
hidden.start();
output.start();
trainer.start();
最后,我們?yōu)橛?xùn)練設(shè)置一些參數(shù)。我們指定在輸入文件中共有四行,而且想訓(xùn)練20,000個(gè)周期,而且還在不段學(xué)習(xí)。如果你設(shè)置學(xué)習(xí)參數(shù)為false,該神經(jīng)網(wǎng)絡(luò)將簡單地處理輸入并不進(jìn)行學(xué)習(xí)。我們將在下一節(jié)討論輸入處理。
monitor.setPatterns(4);
monitor.setTotCicles(20000);
monitor.setLearning(true);
現(xiàn)在我們已經(jīng)為訓(xùn)練過程作好準(zhǔn)備。調(diào)用監(jiān)視器的Go方法將在后臺啟動(dòng)訓(xùn)練過程。
monitor.Go();
神經(jīng)網(wǎng)絡(luò)現(xiàn)在將要被訓(xùn)練20,000個(gè)周期。當(dāng)神經(jīng)網(wǎng)絡(luò)訓(xùn)練完成,誤差層應(yīng)該在一個(gè)合理的低級別上。一般低于10%的誤差級是可接受的
人工智能編程論文篇二
人工智能的應(yīng)用與發(fā)展研究
摘 要:人工智能是用人工的方法和技術(shù)模仿、延伸和擴(kuò)展人的智能,實(shí)現(xiàn)某些“機(jī)器思維”。本文在闡述人工智能定義的基礎(chǔ)上,詳細(xì)分析了人工智能的應(yīng)用領(lǐng)域和當(dāng)前的發(fā)展?fàn)顩r,深入探討了人工智能未來的發(fā)展。
關(guān)鍵詞:人工智能;應(yīng)用;問題;發(fā)展
當(dāng)前,人工智能這個(gè)術(shù)語已被用作“研究如何在機(jī)器上實(shí)現(xiàn)人類智能”這門學(xué)科的名稱。從這個(gè)意義上說,可把它定義為:是一門研究如何構(gòu)造智能機(jī)器或智能系統(tǒng),使它能模擬、延伸、擴(kuò)展人類智能的學(xué)科。具體來說,人工智能就是研究如何使機(jī)器具有能聽、會說、能看、會寫、能思維、會學(xué)習(xí)、能適應(yīng)環(huán)境變化、能解決各種實(shí)際問題的一門學(xué)科。
一、人工智能的應(yīng)用現(xiàn)狀
大部分學(xué)科都有各自的研究領(lǐng)域,每個(gè)領(lǐng)域都有其獨(dú)有的研究課題和研究技術(shù)。在人工智能中,這樣的分支包含自動(dòng)定理證明、問題求解、自然語言處理、人工智能方法、程序語言和智能數(shù)據(jù)檢索系統(tǒng)及自動(dòng)程序設(shè)計(jì)等等。在過去的30年中,已經(jīng)建立了一些具有人工智能的微機(jī)軟件系統(tǒng)。
目前,人工智能的應(yīng)用領(lǐng)域主要有以下幾個(gè)方面:一是問題求解。到目前為止,人工智能程序能知道如何思考他們解決的問題;二是邏輯推理與定理證明。邏輯推理是人工智能研究中最持久的領(lǐng)域之一。定理尋找一個(gè)證明或反證,不僅需要有根據(jù)假設(shè)進(jìn)行演繹的能力,而且許多非形式的工作,在人工智能方法的研究中定理證明是一個(gè)極其重要的論題。三是自然語言處理。自然語言的處理是人工智能技術(shù)應(yīng)用與實(shí)際領(lǐng)域的典范,目前該領(lǐng)域的主要課題是:計(jì)算機(jī)系統(tǒng)如何以主題和對話情景為基礎(chǔ),注重大量的嘗試一一世界知識和期望作用,生成和理解自然語言。四是智能信息檢索技術(shù)。信息獲取和凈精華技術(shù)已成為當(dāng)代計(jì)算機(jī)科學(xué)與技術(shù)研究中迫切需要研究的課題,將人工智能技術(shù)應(yīng)用于這一領(lǐng)域是人工智能走向廣泛實(shí)際應(yīng)用的契機(jī)與突破口。五是專家系統(tǒng)。專家系統(tǒng)是目前人工智能中最活躍、最有成效的研究領(lǐng)域,它是一種具有特定領(lǐng)域內(nèi)大量知識與經(jīng)驗(yàn)的程序系統(tǒng)。
二、人工智能的發(fā)展瓶頸
人工智能(AI)學(xué)科自1956年誕生至今已走過50多個(gè)年頭,就研究解釋和模擬人類智能、智能行為及其規(guī)律這一總目標(biāo)來說,已經(jīng)邁出了可喜的一步,某些領(lǐng)域已取得了相當(dāng)?shù)倪M(jìn)展。但從整個(gè)發(fā)展的過程來看,人工智能發(fā)展曲折,而且還面臨不少難題,主要有以下幾個(gè)方面:
(一)研究方法不足
人工智能發(fā)展到今天,已經(jīng)取得了長足進(jìn)步,但人類對人腦結(jié)構(gòu)和工作模式的認(rèn)識還不全面、不深入,這也就決定了現(xiàn)階段神經(jīng)網(wǎng)絡(luò)模型無法真正實(shí)現(xiàn)對人腦的模擬;硅基元素組成的電子器件與碳基元素組成的神經(jīng)元組織在物理及化學(xué)屬性上有很大的不同,適合于人腦的工作模式,但并不適應(yīng)神經(jīng)網(wǎng)絡(luò)計(jì)算機(jī);根據(jù)馬克思主義實(shí)踐論觀點(diǎn),人腦是人類長期勞動(dòng)實(shí)踐的產(chǎn)物,僅靠在實(shí)驗(yàn)室里電子器件以及線路的排列組合是不可就能實(shí)現(xiàn)模擬的。
(二)機(jī)器翻譯存在困難
目前機(jī)器翻譯所面臨的主要問題仍然是構(gòu)成句子的單詞和歧義性問題。歧義性問題一直是自然語言理解中的一大難關(guān),要消除歧義性就要對原文的每一個(gè)句子及其上下文進(jìn)行分析理解,尋找導(dǎo)致歧義的詞和詞組在上下文中的準(zhǔn)確意義。然而,計(jì)算機(jī)卻往往孤立地將句子作為理解單位。另外,即使對原文有了一定的理解,理解的意義如何有效地在計(jì)算機(jī)里表示出來也存在問題。目前的NLU系統(tǒng)幾乎不能隨著時(shí)間的增長而增強(qiáng)理解力,系統(tǒng)的理解大都局限于表層上,沒有深層的推敲,沒有學(xué)習(xí),沒有記憶,更沒有歸納。導(dǎo)致這種結(jié)果的原因是計(jì)算機(jī)本身結(jié)構(gòu)和研究方法的問題?,F(xiàn)在NLU的研究方法很不成熟,大多數(shù)研究局限在語言這一單獨(dú)的領(lǐng)域,而沒有對人們是如何理解語言這個(gè)問題做深入有效的探討。
(三)模式識別存在困惑
雖然使用計(jì)算機(jī)進(jìn)行模式識別的研究與開發(fā)已取得大量成果,有的已成為產(chǎn)品投入實(shí)際應(yīng)用,但是它的理論和方法與人的感官識別機(jī)制是全然不同的。人的識別手段、形象思維能力,是任何最先進(jìn)的計(jì)算
機(jī)識別系統(tǒng)望塵莫及的,另一方面,在現(xiàn)實(shí)世界中,生活并不是一項(xiàng)結(jié)構(gòu)嚴(yán)密的任務(wù),一般家畜都能輕而易舉地對付,但機(jī)器不會,這并不是說它們永遠(yuǎn)不會,而是說目前不會。
三、人工智能發(fā)展的思考
人工智能具有十分巨大的發(fā)展?jié)摿Γ?dāng)前人工智能雖然經(jīng)過多年研究已取得了一定成績,但這也僅僅是剛剛開始而已,繼續(xù)研究下去在很多方面都會有重大的突破。尤其是在科學(xué)技術(shù)日新月異的今天,各種新科技的出現(xiàn)層出不窮,人工智能將來的發(fā)展將不可限量:一是構(gòu)建智能計(jì)算機(jī),代替人類從事腦力勞動(dòng)。將人類從繁雜的腦力勞動(dòng)中解放出來,從而極大的提高運(yùn)算速度和效率;二是機(jī)器學(xué)習(xí)??茖W(xué)家一直在致力于研究計(jì)算機(jī)怎樣模擬或?qū)崿F(xiàn)人類的學(xué)習(xí)行為,以獲取新的知識或技能。雖然在過去的很長的一段時(shí)間內(nèi)都沒有取得十分顯著的成果,但許多新的學(xué)習(xí)方法相繼問世,并且已經(jīng)有了實(shí)際的應(yīng)用,這充分說明在這方面的研究已經(jīng)有了很大的進(jìn)步。二是自然語言處理。它是計(jì)算機(jī)科學(xué)領(lǐng)域與人工智能領(lǐng)域中的一個(gè)重要方向。在經(jīng)過人工智能研究人員的艱苦努力之后,在該領(lǐng)域中已取得了大量令人矚目的理論與實(shí)際應(yīng)用成果,許多產(chǎn)品已經(jīng)進(jìn)入了眾多領(lǐng)域。智能信息檢索技術(shù)在Internet技術(shù)的影響下,近年來發(fā)展勢頭十分迅猛,而且已經(jīng)成為了人工智能的一個(gè)獨(dú)立研究分支。
人工智能始終處于計(jì)算機(jī)這門學(xué)科的前沿,其研究的理論和成果在很大程度上將控制科學(xué)與技術(shù),決定計(jì)算機(jī)技術(shù)的發(fā)展方向?,F(xiàn)如今,已經(jīng)有許多人工智能的研究成果進(jìn)入到人們的日常生活中。將來,人工智能技術(shù)的發(fā)展也必將會給人們的工作、生活和教育等帶來長遠(yuǎn)深刻的影響。
看了“人工智能編程論文”的人還看了:
5.人工智能研究論文