天天看點

9行Python代碼搭建神經網絡來掌握一些基本概念

這裡的“用Python”指的就是不用那些現成的神經網絡庫比如Keras、Tensorflow等,否則連9行都不用了。

本文我會解釋這個神經網絡是怎樣煉成的,是以你也可以搭建你自己的神經網絡。也會提供一個加長版、但是也更漂亮的源代碼。

不過首先,什麼是神經網絡?人腦總共有超過千億個神經元細胞,通過神經突觸互相連接配接。如果一個神經元被足夠強的輸入所激活,那麼它也會激活其他神經元,這個過程就叫“思考”。

我們可以在計算機上建立神經網絡,來對這個過程進行模組化,且并不需要模拟分子級的生物複雜性,隻要觀其大略即可。為了簡化起見,我們隻模拟一個神經元,含有三個輸入和一個輸出。

9行Python代碼搭建神經網絡來掌握一些基本概念

我們将訓練這個神經元來解決下面這個問題,前四個樣本叫作“訓練集”,你能求解出模式嗎??處應該是0還是1呢?

9行Python代碼搭建神經網絡來掌握一些基本概念

或許已經發現了,輸出總是與第一列的輸入相等,是以?應該是1。

訓練過程

問題雖然很簡單,但是如何教會神經元來正确的回答這個問題呢?我們要給每個輸入賦予一個權重,權重可能為正也可能為負。權重的絕對值,代表了輸入對輸出的決定權。在開始之前,我們先把權重設為随機數,再開始訓練過程:

從訓練集樣本讀取輸入,根據權重進行調整,再代入某個特殊的方程計算神經元的輸出。

計算誤差,也就是神經元的實際輸出和訓練樣本的期望輸出之差。

根據誤差的方向,微調權重。

重複10000次。

9行Python代碼搭建神經網絡來掌握一些基本概念

最終神經元的權重會達到訓練集的最優值。如果我們讓神經元去思考一個新的形勢,遵循相同過程,應該會得到一個不錯的預測。

計算神經元輸出的方程

你可能會好奇,計算神經元輸出的人“特殊方程”是什麼?首先我們取神經元輸入的權重總和:

9行Python代碼搭建神經網絡來掌握一些基本概念
9行Python代碼搭建神經網絡來掌握一些基本概念
9行Python代碼搭建神經網絡來掌握一些基本概念

為什麼是這個方程?首先我們希望調整量與誤差量成正比,然後再乘以輸入(0-1)。如果輸入為0,那麼權重就不會被調整。最後乘以Sigmoid曲線的梯度,為便于了解,請考慮:

我們使用Sigmoid曲線計算神經元輸出。

如果輸出絕對值很大,這就表示該神經元是很确定的(有正反兩種可能)。

Sigmoid曲線在絕對值較大處的梯度較小。

如果神經元确信目前權重值是正确的,那麼就不需要太大調整。乘以Sigmoid曲線的梯度可以實作。

9行Python代碼搭建神經網絡來掌握一些基本概念

實際上也有其他讓神經元學習更快的方程,這裡主要是取其相對簡單的優勢。

建構Python代碼

盡管我們不直接用神經網絡庫,但還是要從Python數學庫Numpy中導入4種方法:

exp: 自然對常數

array: 建立矩陣

dot:矩陣乘法

random: 随機數

比如我們用array()方法代表訓練集:

9行Python代碼搭建神經網絡來掌握一些基本概念

.T函數就是矩陣轉置。我想現在可以來看看美化版的源代碼了,最後我還會提出自己的終極思考。源代碼中已經添加了注釋逐行解釋。注意每次疊代我們都一并處理了整個訓練集,以下為完整的Python示例:

9行Python代碼搭建神經網絡來掌握一些基本概念

終極思考

(Kaiser:原文講的是将代碼寫入本地main.py檔案,再在終端中運作python main.py,這裡隻需點選運作即可。)

我們用Python打造了一個簡單的神經網絡。

首先神經網絡給自己賦予随機的權重值,然後用訓練集訓練自己,最後去思考新的形勢[1 0 0]并預測了0.99993704,這與正确答案非常接近。

傳統的計算機程式無法學習,神經網絡的最大魅力就在于學習能力,可以自主适應新形勢,就像人的心智一樣。當然,僅僅一個神經元隻能完成特别簡單的任務,但如果我們把上百萬個如此的神經元連接配接起來呢?能否有朝一日制造出具有自我意識的東西?

原文釋出時間為:2018-07-09

本文來自雲栖社群合作夥伴“

大資料挖掘DT機器學習

”,了解相關資訊可以關注“