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