Arphetian
我們先來看下異或問題的真值表:
從真值表上,我們看到,異或問題的輸出和任何單個輸入間都不存在線性關係,而是由兩個輸入同時決定。這就意味著,如果我們僅僅將輸入層和輸出層直接連接起來,網絡無法成功學習異或運算。換句話說,我們至少需要一個隱藏層。
所以,我們的神經網絡將是一個三層架構:輸入層、隱藏層、輸出層。
確定了網絡的層數之後,我們接著考慮激活函數。因為輸出是1或0,因此我們選用sigmoid作為激活函數。
隨機初始化權重,使用反向傳播和梯度下降,我們就得到了進行異或運算的神經網絡。
下面的示例代碼使用Python,不過這一邏輯是通用的,換成其他語言也一樣。
導入numpy(這將是我們唯一的依賴)
import numpy as np
前向傳播(X為輸入數據,我們這裡省略了sigmoid的定義,和隨機化初始化權重w0、w0的過程)
l0 = X
l1 = sigmoid(np.dot(l0, w0))
l2 = sigmoid(np.dot(l1, w1))
看下當前誤差多少(y為ground truth,也就是標準答案)
l2_error = y - l2
反向傳播(deriv_sigmoid為sigmoid的導數,這裡我們省略了它的定義)
l2_delta = l2_error * deriv_sigmoid(l2)
l1_error = l2_delta.dot(w1.T)
l1_delta = l1_error * deriv_sigmoid(l1)
w1 += l1.T.dot(l2_delta)
w0 += l0.T.dot(l1_delta)
將以上過程迭代個幾萬次,就是訓練神經網絡。
論智
異或問題,即判斷兩個輸入x1,x2是否一致。
下面是用Python實現的代碼
如果你執行了上面的代碼,你會發現這種非線性的多層神經網絡成功地解決了異或問題,當輸入x1,x2 相同時,會輸出0,不相同時,會輸出1。
喜歡人工智能,算法,Python、JavaScript、Java相關話題,就關注頭條號:編程快訊
喜歡的朋友可以點贊、關注、轉發、評論!同時歡迎大家在評論中補充不足的地方!
編程快訊
智能神經元函數自身在進行運算的時候要做矢量轉移,向量是輸入或量化輸入,而矢量則是行為趨向或行為定製與轉向,正因為轉向則是獨立和想象的關鍵。存儲區域分類決定智能意識也決定行為矢量的前進方向和邏輯方法,換句話說就是矢量變換與轉向完成異或運算。