在這篇文章中,我將解釋我是如何做到的,這樣妳就可以自己寫了。我將提供壹個更長但更完美的源代碼。
首先,什麽是神經網絡?人腦由通過突觸相互連接的數千億個細胞(神經元)組成。來自突觸的足夠興奮會引起神經元的興奮。這個過程叫做“思考”。
我們可以在計算機上寫壹個神經網絡來模擬這個過程。不需要在生物分子層面模擬人腦,只需要模擬更高層次的規則。我們使用矩陣(二維數據表)作為數學工具,為了簡單起見,只模擬壹個三輸入壹輸出的神經元。
我們將訓練神經元來解決以下問題。前四個示例稱為訓練集。找到規律了嗎?'?'是0還是1?
您可能已經發現,輸出總是等於輸入的最左列中的值。所以呢?應該是1。
培訓過程
但是我們如何讓我們的神經元正確回答呢?給每個輸入壹個權重,可以是正數也可以是負數。具有較大正(或負)權重的輸入將決定神經元的輸出。首先,將每個權重的初始值設置為壹個隨機數,然後開始訓練過程:
取壹個訓練樣本的輸入,通過權重進行調整,通過特殊的公式計算出神經元的輸出。
計算誤差,即訓練樣本中神經元的輸出與期望輸出的差異。
根據誤差稍微調整重量。
重復這個過程10000次。
最終的權重將成為符合訓練集的最優解。如果用神經元來考慮這個規律的壹個新情況,它會給出壹個很大的預測。
這個過程就是反向傳播。
計算神經元輸出的公式
妳可能會想,神經元輸出的計算公式是什麽?首先,計算神經元輸入的加權和,即
然後歸壹化,結果在0,1之間。為此,使用壹個數學函數——sigmoid函數:
Sigmoid函數的圖形是壹條S形曲線。
將第壹個等式代入第二個等式,計算神經元輸出的最終公式為:
妳可能已經註意到,為了簡單起見,我們沒有引入最小興奮閾值。
調整重量的公式
我們在訓練中不斷調整體重。但是怎麽調整呢?您可以使用“誤差加權導數”公式:
為什麽要用這個公式?首先,我們希望調整與誤差的大小成比例。其次,乘以輸入(0或1)。如果輸入為0,則不會調整權重。最後,乘以s形曲線的斜率(圖4)。要理解最後壹個問題,請考慮以下幾點:
我們使用Sigmoid曲線來計算神經元的輸出。
如果輸出是壹個很大的正數(或負數),說明神經元采用了這種(或另壹種)方式。
從圖4中可以看出,Sigmoid曲線的斜率在較大值時較小。
如果神經元認為當前權重是正確的,就不會大幅度調整。這可以通過乘以s形曲線斜率來實現。
Sigmoid曲線的斜率可以通過推導獲得:
將第二個等式代入第壹個等式,得到調整權重的最終公式:
當然,還有其他公式可以讓神經元學習得更快,但是這個公式的好處是非常簡單。
構建Python代碼
雖然我們不使用神經網絡庫,但我們將從Python數學庫numpy導入四個方法。它們是:
指數自然指數
數組-創建壹個矩陣
點陣乘法
隨機-生成隨機數。
例如,我們可以使用array()方法來表示前面顯示的訓練集:
的”。t”方法用於矩陣轉置(行到列)。所以,計算機像這樣存儲數字:
我認為我們可以開始構建更漂亮的源代碼。給出這段源代碼後,我來做個總結。
我在每壹行源代碼中添加了註釋來解釋壹切。註意,在每次叠代中,我們同時處理所有的訓練集數據。所以變量都是矩陣(二維數據表)。以下是用Python編寫的完整樣本代碼。
我們做到了!我們用Python搭建了壹個簡單的神經網絡!
首先,神經網絡給自己壹個隨機的權重,然後使用訓練集來訓練自己。然後,它考慮壹個新的情況[1,0,0]並預測0.9004.000000000005正確答案是1。非常接近!
傳統的計算機程序通常不會學習。但是,神經網絡可以自己學習、適應和應對新的情況,這很神奇,就像人類壹樣。