作為開發(fā)人員,我們習慣從用命令或函數(shù)的角度來思考問題。程序由任務組成,每個任務都包含一些編程結(jié)構(gòu)。神經(jīng)網(wǎng)絡不同于這種編程方法,因為它加入了自動任務改進的概念,或者類似于大腦的學習和改進的能力。換句話說,神經(jīng)網(wǎng)絡在沒有特定任務編程的情況下主動學習新的活動。
本教程不是教你從頭開始編寫神經(jīng)網(wǎng)絡的教程,而是介紹結(jié)合Java代碼的神經(jīng)網(wǎng)絡。本文主要內(nèi)容是首先介紹神經(jīng)網(wǎng)絡的發(fā)展從McCulloch和Pitt的神經(jīng)元開始,然后通過Hebb的發(fā)現(xiàn),實現(xiàn)了Rosenblatt的感知器來增強它,并說明了它為什么不能解決XOR問題。其次介紹了通過連接神經(jīng)元,生成一個多層感知器,并通過應用反向傳播算法進行學習,從而實現(xiàn)XOR問題的解決方案。后在演示神經(jīng)網(wǎng)絡實現(xiàn)、訓練算法和測試之后,介紹利用一些致力于深度學習的開源Java ML框架如Neuroph、Encog和Deeplearning4j來快速實現(xiàn)神經(jīng)網(wǎng)絡:
早期的人造神經(jīng)元模型是由神經(jīng)生理學家Warren McCulloch和邏輯學家Walter Pitts在1943年引入的。他們的論文名為“神經(jīng)活動的邏輯微積分”,通常被認為是神經(jīng)網(wǎng)絡研究的開始。mcculloch - pitts神經(jīng)元工作原理是對每一個輸入輸入1或0,其中1為真,0為假,然后給神經(jīng)元分配一個二元閾值激活函數(shù)來計算神經(jīng)元的輸出。
該閾值給定一個實際值,比如1,如果閾值達到或超過閾值,則允許輸出0或1。此外,為了表示AND函數(shù),我們設置2.0的閾值,如下表所示:
如果我們將閾值切換到1,那么這個方法也可以應用于OR函數(shù)。到目前為止,我們具有如表所示的典型的線性可分離數(shù)據(jù),我們可以使用直線來劃分數(shù)據(jù)。 然而,McCulloch-Pitts神經(jīng)元有一些嚴重的局限性。它既不能解決“異或”功能(XOR)也不能解決不是線性分離的“排他性”功能(XNOR)。 唐納德·赫布(Donald Hebb)提出下一次革命,他以關(guān)于Hebbian學習的理論而聞名。在他1949年出版的《行為的組織》一書中這樣寫道:
當細胞A的軸突足夠接近細胞B,不斷反復持續(xù)的激活細胞B,兩個細胞之間就會產(chǎn)生生長過程或代謝變化,這樣A的效率提高了,就像燃燒了細胞B一樣”。
換句話說,當一個神經(jīng)元不停地觸發(fā)另一個神經(jīng)元時,個神經(jīng)元的軸突/連接就會形成突觸小結(jié),如果它們已經(jīng)與第二個神經(jīng)元連接,就會放大它們。Hebb不僅提出,當兩個神經(jīng)元一起點燃神經(jīng)元之間的連接時,神經(jīng)元之間的聯(lián)系就會增強——這被稱為神經(jīng)元之間連接的權(quán)重——還提出這個活動是學習和記憶所必需的基本操作之一。因此必須改變McCulloch-Pitts神經(jīng)元,以便為每個輸入分配權(quán)重。 此外,相對于總閥值量,1的輸入或多或少都被被賦予了權(quán)重。
后來,在1962年,由Frank Rosenblatt在他的《神經(jīng)動力學原理》一書中定義并描述了感知器。這是一個神經(jīng)元的模型,它可以通過輸入的權(quán)重在Hebbean Sense 中學習,并為后來神經(jīng)網(wǎng)絡的發(fā)展奠定了基礎。感知器學習使用隨機權(quán)重初始化感知器,在激活后反復檢查答案是否正確。如果不正確,神經(jīng)網(wǎng)絡可以從錯誤中學習并調(diào)整它的權(quán)重。
盡管感知器對原始McCulloch-Pitts神經(jīng)元進行了許多改變,但感知器仍然局限于解決某些功能。1969年,Minsky與Seymour Papert,合著了” 感知器:計算幾何的介紹”,在文章中攻擊了感知器的局限性。文章中表明,感知器只能解決線性可分函數(shù),并沒有打破這點的限制。直到20世紀80年代以前,這方面的研究還很少?,F(xiàn)在解決這些困難的方法之一就是建立神經(jīng)網(wǎng)絡。這些網(wǎng)絡將人工神經(jīng)元的輸入與其他人工神經(jīng)元的輸出連接起來。因此,網(wǎng)絡能夠解決更困難的問題,但它們也會變得相當復雜。但感知器沒有解決的XOR問題。如果我們仔細觀察真值表,我們可以看到XOR函數(shù)變成等價于單個神經(jīng)元可表示的OR和NOT AND函數(shù)。
讓我們再來看看真值表:
但是我們可以將代表NOT和AND的兩個神經(jīng)元結(jié)合起來,并構(gòu)建一個神經(jīng)網(wǎng)絡來解決類似于下圖所示的XOR問題:
這個圖表示多層感知器,它有一個輸入層,一個隱藏層和一個輸出層。神經(jīng)元之間的連接與圖片中沒有顯示的權(quán)重有關(guān)。與單一感知器類似,每個處理單元都有一個summing和激活組件。它看起來很簡單,但我們也需要一個訓練算法來調(diào)整各個層次的權(quán)重,并讓它學習。通過簡單的感知器,我們可以很容易地根據(jù)誤差計算變化權(quán)重。從而訓練多層感知器實現(xiàn)計算神經(jīng)網(wǎng)絡的整體錯誤。
1986年,Geoffrey Hinton,David Rumelhart和Ronald Williams發(fā)表了一篇論文,“通過反向傳播錯誤學習表示”,描述了一個新的學習過程,反向傳播。該過程反復調(diào)整網(wǎng)絡中連接的權(quán)重,從而小化網(wǎng)絡實際輸出向量和所需輸出向量之間的差值。作為權(quán)重調(diào)整的結(jié)果,內(nèi)部隱藏的單元(不是輸入或輸出的一部分)被用來表示重要的特征,并且這些單元通過交互捕獲規(guī)律性任務。
現(xiàn)在我們已經(jīng)能夠編寫使用Java學習XOR函數(shù)的多層感知器。這需要創(chuàng)建一些類,比如名為ProcessingUnit的神經(jīng)元接口,連接類,一些更活躍的函數(shù),以及一個能夠?qū)W習的單層神經(jīng)網(wǎng)絡。在我的GitHub存儲庫中你可以在項目中找到這些接口和類。
其中NeuralNet類負責對層的構(gòu)造和初始化。它還提供了訓練和評估激活結(jié)果的功能。 如果運行NeuralNet類來解決典型的XOR問題,它將激活,評估結(jié)果,應用反向傳播算法和輸出訓練結(jié)果。
如果你仔細查看代碼,你會發(fā)現(xiàn)它在可重用性方面并不是非常靈活。如果我們將NeuralNet結(jié)構(gòu)從訓練部分分離出來,變成把各種學習算法應用在各種神經(jīng)網(wǎng)絡結(jié)構(gòu)上,那就更好了。此外,我們想要更深入的學習結(jié)構(gòu)和各種激活函數(shù),則必須改變數(shù)據(jù)結(jié)構(gòu)。因為到目前為止,只有一個隱藏層被定義。為了確保不產(chǎn)生任何bug,反向傳播計算必須經(jīng)過仔細的測試。一旦完成了所有的重構(gòu),我們就必須開始考慮深層神經(jīng)網(wǎng)絡的性能。
我想說的是,如果我們進行實際開發(fā),那么首先需要看看現(xiàn)有的神經(jīng)網(wǎng)絡庫。雖然從頭開始實現(xiàn)神經(jīng)網(wǎng)絡有助于理解整個網(wǎng)絡的細節(jié),但是如果一個真實的解決方案必須從頭開始實施,那么將要付出很大的努力。在本文中,我只選擇了純Java神經(jīng)網(wǎng)絡庫。盡管Deeplearning4j得到了商業(yè)支持,但所有這些都是開源的。網(wǎng)上都有大量的參考文檔和例子。其中Deeplearning4j也支持CUDA。維基百科也提供了一份關(guān)于各種語言的深度學習軟件的綜合列表。
如何使用神經(jīng)網(wǎng)絡庫的示例也被包含在關(guān)于使用XOR NeuralNet的GitHub中。很明顯,在開發(fā)中利用現(xiàn)成的函數(shù)庫與自己編寫java代碼相比工作量要少很多。其中Neuroph是為數(shù)據(jù)集提供的API,它更容易初始化訓練數(shù)據(jù),學習規(guī)則的層次結(jié)構(gòu),進行神經(jīng)網(wǎng)絡串行化/持久性和反序列化,并帶有GUI。Encog是一種先進的機器學習框架,支持多種高級算法,也支持規(guī)范化類和處理數(shù)據(jù)。然而,它的主要優(yōu)勢在于神經(jīng)網(wǎng)絡算法。Encog包含創(chuàng)建各種網(wǎng)絡的類,以及支持這些神經(jīng)網(wǎng)絡的規(guī)范化和處理數(shù)據(jù)的支持類。Deeplearning4j是一個非常強大的庫,支持多種算法,包括與Apache Hadoop和Spark集成的分布式并行版本。對于有經(jīng)驗的開發(fā)人員和軟件架構(gòu)師來說,這絕對是正確的選擇。這里作為神經(jīng)網(wǎng)絡庫的一部分提供了一個XOR示例。
想在要利用現(xiàn)有的眾多神經(jīng)網(wǎng)絡庫,開發(fā)人員需要熟悉各種各樣的參數(shù),從而讓他們的神經(jīng)網(wǎng)絡進行學習。本文演示了一個非常簡單的例子,它包含神經(jīng)元和反向傳播。然而,今天使用的許多人工神經(jīng)網(wǎng)絡仍然來使用mcculloch - pitts神經(jīng)元和Rosenblatt感知器的早期版本。作為構(gòu)建現(xiàn)代深層神經(jīng)網(wǎng)絡的基石,重要的是要理解神經(jīng)元的根,并在庫中利用好現(xiàn)成的神經(jīng)元、層、激活函數(shù)和學習算法。
本站文章版權(quán)歸原作者及原出處所有 。內(nèi)容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構(gòu)成任何投資及應用建議。本站是一個個人學習交流的平臺,網(wǎng)站上部分文章為轉(zhuǎn)載,并不用于任何商業(yè)目的,我們已經(jīng)盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯(lián)系我們,我們將根據(jù)著作權(quán)人的要求,立即更正或者刪除有關(guān)內(nèi)容。本站擁有對此聲明的最終解釋權(quán)。