機器人編程|利用 Python 搭建多層神經網絡 三天內被邀請去騰訊、阿里面試!

機器人編程|利用 Python 搭建多層神經網絡 三天內被邀請去騰訊、阿里面試!
▲利用 Python 搭建多層神經網絡(圖/翻攝自機器人網,下同)

【原文:《機器人編程|利用 Python 搭建多層神經網絡 三天內被邀請去騰訊、阿里面試!》,智慧機器人網編輯整理】

文、圖/機器人網

機器人編程讓程序員再次火熱,身價也水漲船高。首先我們來測試一下,可以發現調整訓練集之後,輸出的結果雖然有變化,但仍然是一個非常接近1的數。

運行完整代碼看看具體的權重值,可見第三列的權重值極小接近於0,而第一、二列的權重值絕對值相當。所以我們的這個單細胞神經網絡,並沒有“學會”期望的邏輯關係。

這是因為,“第一列與第三列同時為1->1,否則->0”是一個非線性關係。與上一篇的“輸入=第一列”不同,後者是高度線性的(不能再線性了)。要解決更複雜的非線性問題,就需要把多個神經元連接起來,真正形成“網絡”。

私信小編“01”獲取Python入門學習資料!

在Milo的原文中,他也提出了一個非常類似的問題,就是“異或”。

正文

下表的?處應該是什麼?

訓練集與新形勢

經過觀察可以發現,第三列是無關的,而前兩列成“異或”關係——相等為0,相異為1。所以正確答案應為0。

對於單個神經元來說,這樣的線性關係太複雜了,輸入-輸出之間沒有一對一的映射關係。所以我們必須加入一個含4個神經元的隱藏層(Layer 1),這一層使得神經網絡能夠思考輸入的組合問題。

藍線代表神經突觸,圖來自https://github.com/miloharper/visualise-neural-network

由圖可見,Layer 1的輸出給了Layer 2,如此神經網絡就可以學習Layer 1的輸出和訓練集的輸出之間的關係。在學習過程中,這些關係會隨著兩層的權重調整而加強。

實際上,圖像識別的原理就很相似。一個像素點和蘋果之間並沒有直接關係,但是像素點組合起來,就和蘋果發生了關係。

往神經網絡中加更多的層,使其思考狀態組合,這就是“深度學習”。首先放出代碼,之後我會進一步詳解。

重置複製

兩層神經網絡

運行

跟上一版代碼最大的不同在於,這次有多層。當神經網絡計算第二層的誤差時,這個誤差會被反向傳播回第一層,並影響權重值的調整。這就是反向傳播算法 (Back Propagation)。

點擊運行鍵,觀察輸出結果,這次的輸出會比較多,主要看最後的預測結果。我們得到了0.0078876,這與正確答案0非常接近了。

雖然看起來很輕鬆,其實計算機在背後執行了大量的矩陣運算,而且這個過程不是很容易可視化。在下一篇文章中,我將把我們的神經網絡的神經元和突觸都做個可視化,讓我們看看她究竟是如何思考的。

後記

現在我們已經有了一個可以思考非線性關係的神經網絡,那麼回到開頭的那個問題,能否識別出“第一列與第三列同時為1->1,否則->0”的關係呢?

請將相應的代碼替換為:

重置複製

新訓練集

training_set_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1],[1,1,0],[0,1, 0],[0,0,0]])

training_set_outputs = array([[0, 1, 1, 0,0,0,0]]).T

同時也不要忘記調整

hidden_​​state, output = neural_network.think(array([1, 1, 0]))

裡的測試樣本(array([1,1,0]))。重新點擊運行,觀察我們現在的神經網絡能否解決問題。

留言

延伸閱讀