首先,神經網絡是什麼?人腦由幾千億由突觸相互鏈接的細胞(神經元)組成。突觸傳入足夠的興奮就會引發神經元的興奮。這個過程被稱爲「思考」。python
咱們能夠在計算機上寫一個神經網絡來模擬這個過程。不須要在生物分子水平模擬人腦,只需模擬更高層級的規則。咱們使用矩陣(二維數據表格)這一數學工具,而且爲了簡單明瞭,只模擬一個有3個輸入和一個輸出的神經元。網絡
咱們將訓練神經元解決下面的問題。前四個例子被稱做訓練集。你可能發現了,輸出老是等於輸入中最左列的值。因此‘?’應該是1。app
可是如何使咱們的神經元回答正確呢?賦予每一個輸入一個權重,能夠是一個正的或負的數字。擁有較大正(或負)權重的輸入將決定神經元的輸出。首先設置每一個權重的初始值爲一個隨機數字,而後開始訓練過程:dom
最終權重將會變爲符合訓練集的一個最優解。若是使用神經元考慮這種規律的一個新情形,它將會給出一個很棒的預測。函數
這個過程就是BP。工具
你可能會想,計算神經元輸出的公式是什麼?首先,計算神經元輸入的加權和,即測試
接着使之規範化,結果在0,1之間。爲此使用一個數學函數--Sigmoid函數:spa
Sigmoid函數的圖形是一條「S」狀的曲線。3d
把第一個方程代入第二個,計算神經元輸出的最終公式爲:code
咱們在訓練時不斷調整權重。可是怎麼調整呢?可使用「Error Weighted Derivative」公式:
爲何使用這個公式?首先,咱們想使調整和偏差的大小成比例。其次,乘以輸入(0或1),若是輸入是0,權重就不會調整。最後,乘以Sigmoid曲線的斜率(圖4)。
Sigmoid曲線的斜率能夠經過求導獲得:
把第二個等式代入第一個等式裏,獲得調整權重的最終公式:
雖然咱們沒有使用神經網絡庫,可是將導入Python數學庫numpy裏的4個方法。分別是:
「.T」方法用於矩陣轉置(行變列)。因此,計算機這樣存儲數字:
我對每一行源代碼都添加了註釋來解釋全部內容。注意在每次迭代時,咱們同時處理全部訓練集數據。因此變量都是矩陣(二維數據表格)。下面是一個用Python寫地完整的示例代碼。
運行後你應該看到這樣的結果:
咱們作到了!咱們用Python構建了一個簡單的神經網絡!
首先神經網絡對本身賦予隨機權重,而後使用訓練集訓練本身。接着,它考慮一種新的情形[1, 0, 0]而且預測了0.99993704。正確答案是1。很是接近!