人工神經(jīng)網(wǎng)絡是一種經(jīng)典的機器學習模型,隨著深度學習的發(fā)展神經(jīng)網(wǎng)絡模型日益完善。聯(lián)想大家熟悉的回歸問題, 神經(jīng)網(wǎng)絡模型實際上是根據(jù)訓練樣本創(chuàng)造出一個多維輸入多維輸出的函數(shù), 并使用該函數(shù)進行預測, 網(wǎng)絡的訓練過程即為調(diào)節(jié)該函數(shù)參數(shù)提高預測精度的過程.神經(jīng)網(wǎng)絡要解決的問題與最小二乘法回歸解決的問題并無根本性區(qū)別。
回歸和分類是常用神經(jīng)網(wǎng)絡處理的兩類問題, 如果你已經(jīng)了解了神經(jīng)網(wǎng)絡的工作原理可以在 上體驗一個淺層神經(jīng)網(wǎng)絡的工作過程。
?
感知機(Perceptron)是一個簡單的線性二分類器, 它保存著輸入權重, 根據(jù)輸入和內(nèi)置的函數(shù)計算輸出.人工神經(jīng)網(wǎng)絡中的單個神經(jīng)元即是感知機。
在前饋神經(jīng)網(wǎng)絡的預測過程中, 數(shù)據(jù)流從輸入到輸出單向流動, 不存在循環(huán)和返回的通道。
目前大多數(shù)神經(jīng)網(wǎng)絡模型都屬于前饋神經(jīng)網(wǎng)絡, 在下文中我們將詳細討論前饋過程。
多層感知機(Multi Layer Perceptron, MLP)是由多個感知機層全連接組成的前饋神經(jīng)網(wǎng)絡, 這種模型在非線性問題中表現(xiàn)出色。
所謂全連接是指層A上任一神經(jīng)元與臨近層B上的任意神經(jīng)元之間都存在連接。
反向傳播(Back Propagation,BP)是誤差反向傳播的簡稱,這是一種用來訓練人工神經(jīng)網(wǎng)絡的常見算法, 通常與最優(yōu)化方法(如梯度下降法)結合使用。
本文介紹的神經(jīng)網(wǎng)絡模型在結構上屬于MLP, 因為采用BP算法進行訓練, 人們也稱其為BP神經(jīng)網(wǎng)絡。
BP神經(jīng)網(wǎng)絡原理
經(jīng)典的BP神經(jīng)網(wǎng)絡通常由三層組成: 輸入層, 隱含層與輸出層.通常輸入層神經(jīng)元的個數(shù)與特征數(shù)相關,輸出層的個數(shù)與類別數(shù)相同, 隱含層的層數(shù)與神經(jīng)元數(shù)均可以自定義。
每個神經(jīng)元代表對數(shù)據(jù)的一次處理:
每個隱含層和輸出層神經(jīng)元輸出與輸入的函數(shù)關系為:
我們用一個完成訓練的神經(jīng)網(wǎng)絡處理回歸問題, 每個樣本擁有n個輸入.相應地,神經(jīng)網(wǎng)絡擁有n個輸入神經(jīng)元和1個輸出神經(jīng)元。
實際應用中我們通常在輸入層額外增加一個偏置神經(jīng)元, 提供一個可控的輸入修正;或者為每個隱含層神經(jīng)元設置一個偏置參數(shù)。
我們將n個特征依次送入輸入神經(jīng)元, 隱含層神經(jīng)元獲得輸入層的輸出并計算自己輸出值, 輸出層的神經(jīng)元根據(jù)隱含層輸出計算出回歸值。
上述過程一般稱為前饋(Feed-Forward)過程, 該過程中神經(jīng)網(wǎng)絡的輸入輸出與多維函數(shù)無異。
現(xiàn)在我們的問題是如何訓練這個神經(jīng)網(wǎng)絡。
作為監(jiān)督學習算法,BP神經(jīng)網(wǎng)絡的訓練過程即是根據(jù)前饋得到的預測值和參考值比較, 根據(jù)誤差調(diào)整連接權重Wij的過程。
訓練過程稱為反向傳播過程(BackPropagation), 數(shù)據(jù)流正好與前饋過程相反。
首先我們隨機初始化連接權重Wij, 對某一訓練樣本進行一次前饋過程得到各神經(jīng)元的輸出。
首先計算輸出層的誤差:
為了避免神經(jīng)網(wǎng)絡進行無意義的迭代, 我們通常在訓練數(shù)據(jù)集中抽出一部分用作校驗.當預測誤差高于閾值時提前終止訓練。
Python實現(xiàn)BP神經(jīng)網(wǎng)絡
首先實現(xiàn)幾個工具函數(shù):
def rand(a, b):
return (b - a) * random.random() + a
def make_matrix(m, n, fill=0.0): # 創(chuàng)造一個指定大小的矩陣
mat = []
for i in range(m):
mat.append([fill] * n)
return mat
定義sigmod函數(shù)和它的導數(shù):
def sigmoid(x):
return 1.0 / (1.0 + math.exp(-x))
def sigmod_derivate(x):
return x * (1 - x)
定義BPNeuralNetwork類, 使用三個列表維護輸入層,隱含層和輸出層神經(jīng)元, 列表中的元素代表對應神經(jīng)元當前的輸出值.使用兩個二維列表以鄰接矩陣的形式維護輸入層與隱含層, 隱含層與輸出層之間的連接權值, 通過同樣的形式保存矯正矩陣。
評論
查看更多