做者|Vivek Patel
編譯|Flin
來源|towardsdatasciencepython
除非你能學習到一些東西,不然不要重複造輪子。算法
強大的庫已經存在了,如:TensorFlow,PyTorch,Keras等等。我將介紹在Python中建立多層感知器(MLP)神經網絡的基本知識。數據庫
感知器是神經網絡的基本組成部分。感知器的輸入函數是權重,誤差和輸入數據的線性組合。具體來講:in_j = weight input + bias.(in_j =權重輸入+誤差)。在每一個感知器上,咱們均可以指定一個激活函數g。網絡
激活函數是一種確保感知器「發射」或僅在達到必定輸入水平後才激活的數學方法。常見的非線性激活函數爲S型,softmax,整流線性單位(ReLU)或簡單的tanH。機器學習
激活函數有不少選項,可是在本文中咱們僅涉及Sigmoid和softmax。函數
圖1:感知器
性能
對於有監督的學習,咱們稍後將輸入的數據經過一系列隱藏層轉發到輸出層。這稱爲前向傳播。在輸出層,咱們可以輸出預測y。經過咱們的預測y,咱們能夠計算偏差| y*-y | 並使偏差經過神經網絡向後傳播。這稱爲反向傳播。經過隨機梯度降低(SGD)過程,將更新隱藏層中每一個感知器的權重和誤差。學習
圖2:神經網絡的基本結構
測試
如今咱們已經介紹了基礎知識,讓咱們實現一個神經網絡。咱們的神經網絡的目標是對MNIST數據庫中的手寫數字進行分類。我將使用NumPy庫進行基本矩陣計算。優化
在咱們的問題中,MNIST數據由 [748,1] 矩陣中的8位顏色通道表示。從本質上講,咱們有一個 [748,1] 的數字矩陣,其始於[0,1,.... 255],其中0表示白色,255表示黑色。
MNIST手寫數字數據庫包含60,000個用於訓練目的的手寫示例和10,000個用於測試目的的示例。在對60,000個示例進行了30個epoch的訓練以後,我在測試數據集上運行了通過訓練的神經網絡,並達到了93.2%的準確性。甚至能夠經過調整超參數來進一步優化。
本文分爲5個部分。這些部分是:
(1)激活函數
(2)權重初始化
(3)誤差初始化
(4)訓練算法
(5)進行預測
Sigmoid是由等式1 /(1+ exp(-x))定義的激活函數,將在隱藏層感知器中使用。
Softmax是一個激活函數,當咱們要將輸入分爲幾類時,它一般在輸出層中使用。在咱們的例子中,咱們但願將一個數字分紅10個bucket[0,1,2,…,9]中的一個。它計算矩陣中每一個條目的機率;機率將總計爲1。具備最大機率的條目將對應於其預測,即0,1,…,9。Softmax定義爲exp(x)/ sum(exp(x))。
圖3:激活函數的實現
對於咱們的每一個隱藏層,咱們將須要初始化權重矩陣。有幾種不一樣的方法能夠作到這一點,這裏是4。
零初始化-初始化全部權重= 0。
隨機初始化-使用隨機數初始化權重,而不是徹底隨機。咱們一般使用標準正態分佈(均值0和方差1)中的隨機數。
Xavier初始化-使用具備設定方差的正態分佈中的隨機數初始化權重。咱們將基於上一層的大小設置方差。
如上所述,進入感知器的邊緣乘以權重矩陣。關鍵的一點是,矩陣的大小取決於當前圖層的大小以及它以前的圖層。明確地,權重矩陣的大小爲[currentLayerSize,previousLayerSize]。
如上所述,進入感知器的邊緣乘以權重矩陣。關鍵的一點是,矩陣的大小取決於當前圖層的大小以及它以前的圖層。明確地,權重矩陣的大小爲[currentLayerSize,previousLayerSize]。
假設咱們有一個包含100個節點的隱藏層。咱們的輸入層的大小爲[748,1],而咱們所需的輸出層的大小爲[10,1]。輸入層和第一個隱藏層之間的權重矩陣的大小爲[100,748]。隱藏層之間的每一個權重矩陣的大小爲[100,100]。最後,最終隱藏層和輸出層之間的權重矩陣的大小爲[10,100]。
出於教育目的,咱們將堅持使用單個隱藏層;在最終模型中,咱們將使用多層。
圖4:權重初始化實現
像權重初始化同樣,偏置矩陣的大小取決於圖層大小,尤爲是當前圖層大小。偏置初始化的一種方法是將偏置設置爲零。
對於咱們的實現,咱們將須要爲每一個隱藏層和輸出層提供一個誤差。偏置矩陣的大小爲[100,1],基於每一個隱藏層100個節點,而輸出層的大小爲[10,1]。
圖5:偏置初始化實現
前面已經說過,訓練是基於隨機梯度降低(SGD)的概念。在SGD中,咱們一次只考慮一個訓練點。
在咱們的示例中,咱們將在輸出層使用softmax激活。將使用「交叉熵損失」公式來計算損失。對於SGD,咱們將須要使用softmax來計算交叉熵損失的導數。也就是說,此導數減小爲y* -y,即預測y*減去指望值y。
圖6:關於softmax激活的交叉熵損失及其導數
咱們還須要編寫S型激活函數的導數。在圖7中,我定義了S型函數及其衍生函數
圖7:Sigmoid函數(上)及其導數(下)
一般,神經網絡將容許用戶指定幾個「超參數」。在咱們的實施中,咱們將着重於容許用戶指定epoch,批處理大小,學習率和動量。還有其餘優化技術!
學習率(LR):學習率是一個參數,用戶能夠經過它指定網絡容許咱們學習和更新其參數的速度。選擇一個好的學習率是一門藝術。若是LR過高,咱們可能永遠不會收斂於良好的可接受的訓練錯誤。若是LR過低,咱們可能會浪費大量的計算時間。
epoch:epoch是整個訓練集中的一個迭代。爲了確保咱們不會過分擬合早期樣本中的數據,咱們會在每一個時期以後對數據進行隨機排序。
批次大小:經過Epoc2h的每次迭代,咱們將分批訓練數據。對於批次中的每一個訓練點,咱們將收集梯度,並在批次完成後更新權重/誤差。
動量:這是一個參數,咱們將經過收集過去的梯度的移動平均值並容許在該方向上的運動來加速學習。在大多數狀況下,這將致使更快的收斂。典型值範圍從0.5到0.9。
下面,我編寫了一些通用的僞代碼來模擬反向傳播學習算法的概況。爲了便於閱讀,已將諸如計算輸出和將訓練數據分紅批次之類的任務做爲註釋編寫。
如今,咱們將展現僞代碼的實現.
如今,咱們僅缺乏此實現的一個關鍵方面。預測算法。在編寫反向傳播算法的過程當中,咱們已經完成了大部分工做。咱們只須要使用相同的前向傳播代碼便可進行預測。輸出層的softmax激活函數將計算大小爲[10,1]的矩陣中每一個條目的機率。
咱們的目標是將數字分類爲0到9。所以,aj2矩陣的索引將與預測相對應。機率最大的索引將由np.argmax()選擇,並將做爲咱們的預測。
這就對了!咱們結束了。咱們已經用Python編寫了神經網絡的實現。
可是,咱們如何選擇最佳參數?咱們可使用算法的通常知識來選擇有意義的超參數。咱們須要選擇能歸納但不能過分擬合數據的超參數。咱們能夠調整動量,學習率,時期數,批處理大小和隱藏節點的數量,以實現咱們的目標。向前邁出一步,咱們能夠編寫更多算法來爲咱們作這件事!
遺傳算法是一種AI算法,可用於選擇最佳參數。遺傳算法的思想是建立一組具備不一樣參數的子代,並讓他們產生與參數相關的測試錯誤。咱們能夠對具備最佳超參數的神經網絡進行繁殖和變異,以找到性能更好的參數。花費大量時間後,咱們將可以學習有關超參數狀況的大量知識,並找到新的最佳超參數值。
咱們還能夠採起其餘措施來減小測試錯誤嗎?是的,咱們能夠縮放輸入數據。像許多算法同樣,數量更多會對算法的結果產生重大影響。在咱們的示例中,數字範圍爲[0到255]。若是咱們按比例縮放數字,使它們的範圍從[0到1],則能夠減小該誤差。
感謝你的閱讀!
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方文檔:
http://sklearn123.com/
歡迎關注磐創博客資源彙總站:
http://docs.panchuang.net/