首先我們來測試一下,可以發現調整訓練集之后,輸出的結果雖然有變化,但仍然是一個非常接近1的數。
運行完整代碼看看具體的權重值,可見第三列的權重值極小接近于0,而第一、二列的權重值絕對值相當。所以我們的這個單細胞神經網絡,并沒有“學會”期望的邏輯關系。
這是因為,“第一列與第三列同時為1->1,否則->0”是一個非線性關系。與上一篇的“輸入=第一列”不同,后者是高度線性的(不能再線性了)。要解決更復雜的非線性問題,就需要把多個神經元連接起來,真正形成“網絡”。
在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]))。重新點擊運行,觀察我們現在的神經網絡能否解決問題。
-
神經網絡
+關注
關注
42文章
4807瀏覽量
102760 -
python
+關注
關注
56文章
4825瀏覽量
86171
原文標題:機器人編程 | 小伙利用Python搭建多層神經網絡,三天內被邀請去騰訊阿里面試!
文章出處:【微信號:worldofai,微信公眾號:worldofai】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
機器人控制的入門經驗
機器人未來設想
如何避免程序員面向監獄編程
機器人十大流行編程語言的介紹及機器人編程系統以及操作方法
OrangeEdit-OrangeEdit機器人編程軟件應用程序免費下載

評論