轉載自:https://www.cnblogs.com/feffery/p/8996623.html ;

    部落格園網站“費弗裡”博主的《資料科學學習手札34》

    因作者正在進行電力使用者短期負荷預測方向學習,正遇到了多層感知機的應用問題,所以搜到部落格園中費弗裡博主寫的的以下資料,進行轉載以便學習查閱。

一、簡介

  機器學習分為很多個領域,其中的連線主義指的就是以神經元(neuron)為基本結構的各式各樣的神經網路,規範的定義是:由具有適應性的簡單單元組成的廣泛並行互連的網路,它的組織能夠模擬生物神經系統對真實世界的刺激作出的互動反應。而我們在機器學習中廣泛提及的神經網路學習就是機器學習與神經網路的交叉部分,本篇就將介紹基本的神經元模型、感知機模型的知識以及更進一步的多層感知機的具體應用(注意,本篇介紹的內容只是當下流行的深度學習的鋪墊,因此只使用了無GPU加速的相應模組,關於深度學習的知識、當下流行的深度學習方法及相應的可GPU加速的訓練方法將在後續的博文中陸續介紹)

二、從神經元模型到多層前饋網路

2.1 知識鋪墊

  在介紹神經網路學習中的神經元模型之前我們先類比一下生物神經元,神經元是基本的資訊處理單元,生物神經元主要由樹突、軸突和突觸組成,結構簡圖如下:

通過觀察它的結構可以總結出以下特點:

  1、樹突由細胞體向外伸出,且有不規則的表面和許多較短的分支,它的角色是訊號的輸入端,用於接收神經衝動;

  2、軸突指由細胞體向外伸出的最長的一條分支,即神經纖維,相當於訊號的輸出端,用於傳出神經衝動;

  3、神經元之間通過軸突(輸出)+樹突(輸入)的形式進行互連,且對於單個神經元,在輸入——>輸出這個方向上不可逆;

而關於神經元的功能,也總結出以下幾點:

  1、可塑性:神經元存在著這樣一種機制:通過新突觸的產生和對現有神經突觸的調整,使得神經網路能夠適應環境(正如當下人們對記憶是存在與神經元間的連線之中的假設);

  2、時空整合:傳入某一箇中間神經元的刺激,是來自前面所有相關神經元的反覆調整過的累積結果;

  3、興奮與抑制狀態:當傳入衝動的累計刺激結果使得細胞膜電位上升併成功超過了閾值,則細胞會進入興奮狀態,產生一次傳出刺激上的階躍;若傳入的累計刺激結果低於發生階躍的閾值,則無後續神經活動產生,細胞隨之進入抑制狀態;

  4、突觸的延時和不應期:突觸對神經活動的傳遞具有延時和不應期性,在相鄰兩次衝動之間存在時間間隔,且在時間間隔內神經元處於休息狀態,不會產生自發性的神經衝動;

  5、學習、遺忘和疲勞:突觸的傳遞作用有學習、遺忘和疲勞過程

通過以上說明,我們可以驚喜的發現生物神經元的這些結構特性使得它與我們在機器學習中希望達到的目的完美契合——即通過一系列規則的的刺激傳遞過程,最終達到正確的決策結果輸出,早在上個世紀四五十年代,人們就發現了這種奇妙的聯絡,並隨之構造出基本的神經元模型;

2.2 神經元模型

2.2.1 基本結構

  一個典型的M-P人工神經元模型結構如下:

其中xj表示來自第j條“樹突”的輸入值,wji表示連線權(每條固定的輸入上只有一個唯一的權),ui表示在該神經元i上,所有輸入訊號的線性組合,係數即為對應的權值,即

θi為該神經元i的閾值,通過ui與θi的簡單相加,即可得到中間值vi

而f()表示啟用函式,yi表示該神經元i的輸出,即:

2.2.2 啟用函式

  理想的啟用函式是階躍函式,如下圖,它將連續域上的輸入值對映為{0,1},1對應神經元興奮 ,0對應神經元抑制;

  事實上,類似邏輯迴歸中的logit函式,我們需要用一些數學性質良好的函式來替代數學性質較差(不處處連續)的階躍函式,常用的是sigmoid型函式,如下:

2.3 感知機與多層網路

2.3.1 單層感知機

 感知機(perceptron)由兩層神經元組成,如下圖所示,輸入層接受外界輸入訊號後傳遞給輸出層,輸出層是M-P神經元,亦稱作“閾值邏輯單元”(threshold logic unit);

 

感知機的學習過程就是對於給定的訓練集,在每一輪迭代中同時調整各權重wi(i=1,2,...,n),以及閾值θ,直到滿足預設精度為止,為了方便訓練,閾值θ可看作第n+1個輸入為1的結點的對應權重wn+1,亦稱為啞結點(dummy node),這樣權重和閾值的學習變得到了統一,例如下圖這種表示形式,閾值θ就被視為一個特別的輸入:

而單個感知機的學習規則也十分簡單,對訓練資料集(x,y),若當前感知機的輸出為y*,則感知機各權重調整規則如下:

只有在y*=y或訓練輪數達到預設的上限或精度第一次達到或超過設定的閾值時,該學習過程才會停止,否則都將進行一輪又一輪的權重調整;

  在整個感知機的結構中,只有輸出層神經元包含啟用函式的計算過程,輸入層只管輸入值*權重,即只擁有一層功能神經元(functional neuron),學習能力非常有限,只能處理線性可分問題,否則感知機的學習過程將會發生震盪,w難以穩定下來,即學習失效,例如對於常見的異或問題,感知機就無法習得其規則:

也正是這個原因,對於感知機學習的熱度在上世紀60年代跌入谷底,但隨著研究的深入,很多用於改造感知機的方法被提出,下面舉幾個例子:

  1、對神經元施加非線性輸入函式

  類似部分非線性迴歸中我們常使用的線性化方法,對於單純線性輸入的感知機輸入層,我們可以根據對具體問題的理解,在個別輸入神經元上進行非線性改造,如下例:

  2、使用AND邏輯器構成割平面式的非線性化

  普通感知機的分割平面是線性的,我們思考一下,有哪種機器學習演算法本質也是線性分割呢?沒錯,如果你看過我之前關於決策樹的博文,一定還記得,決策樹的分割平面式由很多段與各座標軸平行的拼接而成的,那麼我們可以將這種思想類似地遷移到感知機的改造中,用多條線性分割來圍成近似的非線性分割:

2.3.2 多層感知機與神經網路

  之前介紹的幾種改造線性感知機的方法,實際實施起來存在著很多侷限,比如施加輸入層非線性函式就存在著很多不確定的部分,要想更加通用地解決非線性可分問題,需要考慮使用多層功能神經元,例如下圖所示的這個簡單的兩層感知機就可以解決異或問題,其中輸入層與輸出層間的若干層神經元被稱為隱層或隱含層(hidden layer),隱層和輸出層都是含有啟用函式部分的功能神經元:

  而更一般的多層感知機,如下圖所示具有規則的層級結構,這時它已經可以稱作是神經網路了,每層神經元與下一層神經元全互連,且同層神經元之間不存在連線,也不存在跨層連線,這樣的神經網路結構通常被乘稱作“多層前饋神經網路”(multi-layer feedforward neural networks),其中輸入層神經元依舊單純地接收外界輸入,隱層與輸出層對訊號進行處理,最終結果依舊是由輸出層神經元處理並輸出,所以我們平時對一個多層前饋神經網路的層數的稱呼都來源於其隱含層的層數,例如下圖a就是單隱含層前饋網路,b就是雙隱含層前饋網路:

2.3.3 訓練方法

  多層感知機的學習能力比單個感知機強得多,但隨著其結構的複雜化,對應的訓練方法也不同於前面簡單感知機的簡單規則,最常使用的方法是誤差逆傳播(error BackPropgation,即常用的BP演算法);

演算法過程:

對一個給定的訓練集D={(x1,y1),(x2,y2)...(xm,ym)},其中xi為d維向量,yi為l維向量,即自變數由d個維度組成,輸出值為l個維度,對應的,構造一個由d個輸入層神經元、q個隱含層神經元(隱含層神經元個數沒有硬性要求)以及l個輸出層神經元組成的單隱層前饋神經網路,其中輸出層第j個神經元的閾值用θj表示,隱層第h個神經元的閾值用γh表示,輸入層第i個神經元與隱層第h個神經元之間的連線權為vih,隱層第h個神經元與輸出層第j個神經元之間的連線權為whj,記隱層第h個神經元接收到的輸入為

輸出層第j個神經元接收到的輸入為

結構如下圖:

且假設隱層和輸出層每個功能神經元都使用Sigmoid型函式:

對於訓練集中的任意(xk,yk),假定神經網路的輸出為

則該網路在(xk,yk)上的均方誤差為:

 而整個網路中需要確定的引數共有

需要確定,而BP是一種迭代學習演算法,在迭代的每一輪採用廣義的感知機學習規則對引數進行更新估計,即其任意引數v的更新估計式為:

  以隱層到輸出層的連線權whj為例來進行推導:

  首先我們先確定一個事實,BP演算法基於梯度下降(gradient descent)策略,以目標的負梯度方向對引數進行調整,所以對均方誤差項

 給定學習率η,

注意到whj先影響到第j個輸出層神經元的輸入值βj再影響其輸出值,最後影響到Ek

又因為

且Sigmoid型函式有一個很好的性質:

於是綜上,有

所有最終得到whj的更新公式:

類似的,其他引數的更新公式:

其中eh為:

學習率η控制著演算法每一輪迭代中的更新步長,太大容易震盪(接近理想解時卻跨過),太小則收斂速度又會過慢,有時為了做精細調節,可以更加靈活的設定學習率而不必一直固定不變;需要注意的是,標準BP演算法在隨機初始化各引數(一般是初始化一個較小的非0陣)後,經過一輪一輪地迭代,每一輪都只輸入一個樣本值來調整各引數,訓練目的是逐漸縮小訓練集D上的累積誤差:

而上面推導的規則是基於每次一個樣本輸入的調整,即標準BP演算法,特點是引數更新的非常頻繁,並且前後的不同樣本可能會導致訓練效果的前後抵消,所以為了達到目標累積誤差極小點,需要進行很多次的迭代,但優點是下降和計算都較快,特別是當訓練集D非常大時,因此其被使用的最多;

一個重要的論點:

只要一個隱層包含足夠多神經元,多層前饋網路就可以以任意精度逼近任意複雜度的連續函式。但是在實際任務多層前饋網路的構造中,選擇單隱層 還是雙隱層,每一層隱層選取幾個神經元,這都尚無可靠的理論支撐,存在著大量試錯(trial-by-error)的成分,對神經網路最佳超引數的搜尋方法的研究也是一個相當活躍的領域;

  也正是因為其強大的表示能力,多層前饋網路很容易過擬合,即其訓練集上誤差持續下降,而驗證集上誤差卻可能上升,目前主要有兩種緩解多層前饋網路過擬合的方法:

  1、早停(early stopping)

  通過將資料集分成訓練集和驗證集,訓練集用來計算梯度、更新連線權和閾值,驗證集用來估計誤差,若訓練集誤差降低但驗證集上誤差升高,則停止訓練,同時返回具有當前最小驗證集誤差的連線權與閾值(基於貪心演算法的原則)

  2、正則化(regularization)

  正則化是指在誤差目標函式中增加一個用於描述網路複雜度的部分,常用的是連線權與閾值的平方和,令Ek表示第k個訓練樣本上的誤差,wi表示連線權和閾值,則誤差目標函式變為:

其中λ屬於(0,1),表示在經驗誤差和網路複雜度之間進行權衡,具體取值常通過交叉驗證來進行搜尋確定;

  3、懲罰項

  對目標函式附加懲罰項以強制無用的權值趨於0

區域性極小情況:

由於不能保證目標函式在權空間中的正定性,而誤差曲面往往復雜且無規則,存在著多個分佈無規則的區域性極小點,因此基於梯度下降的BP演算法很容易陷入區域性極小,導致訓練效果不好,而常用的改進措施有:

  1、引入全域性優化技術

  包括同時訓練多個神經網路模型,然後按照在驗證集上的表現,選擇其中驗證誤差最小的作為全域性最小的近似值;使用諸如隨機梯度下降、模擬退火、遺傳演算法、蟻群演算法等啟發式的演算法來尋找最大可能接近全域性最小值的區域性最小值;

  2、平坦化優化曲面以消除區域性極小

  3、設計合適的網路結構使得其不會產生區域性極小

當然,後面兩種方案實施起來比較複雜,因此實際任務中常使用的第一種策略。

 三、Python實現

  本文暫時不介紹帶有GPU加速的神經網路訓練方法,因此不適用於過大規模的樣本集和過多超引數的神經網路;

  我們利用sklearn.neural_network中整合的方法來進行多層前饋神經網路的訓練,下面分別針對分類問題和迴歸問題進行展開:

3.1 分類問題

  我們使用sklearn.neural_network中的MLPClassifier()來實現BP演算法訓練的多層感知機,其主要引數如下:

hidden_layer_size:tuple型輸入,形如(m,n),其中m用來控制隱層神經元的個數,n用來控制隱層的層數,也可以理解為網路總層數-2(即減去輸入層與輸出層),預設值為(100,),即單隱層,隱層中含有100個神經元

activation:字元型,用於控制啟用函式的型別,可選型別有'identity',表示無非線性啟用函式,用於訓練線性模型時;'logistic',logit函式;'tanh',雙曲函式;'relu',f(x)=max(0,x)

solver:字元型,用來控制BP演算法中使用到的求解器,'lbfgs',表示準牛頓法;'sgd',表示標準的隨機梯度下降法;'adam',另一種型別的基於隨機梯度下降的方法。預設為'adam'

alpha:懲罰項係數,預設為0.0001

 batch_size:當solver設定為隨機梯度相關的求解器時,此引數控制隨機優化器的小批量尺寸

learning_rate:字元型,控制學習率,當設定為'constant'時,訓練過程中的學習率為另一引數learning_rate_init預設的常數;當設定為'invscaling',會逐步的降低學習率以減小在最優值附近震盪的風險;當設定為'adaptive'時,且early_stopping被設定為開啟時,如果連續兩次訓練集上的累積誤差沒有下降或交叉驗證得分無法得到提升時,學習率會變為原來的1/5,只有當solver設定為'sgd'時才生效

learning_rate_init:雙精度浮點值,控制初始的學習率,配合learning_rate的設定值,共同控制學習率的變化情況,只有當solver設定為'sgd'或'adam'時才生效(即基於梯度)

max_iter:整型,控制訓練的最大迭代輪數,預設值是200輪,當然,該方法也是隻有solver設定為'sgd'或'adam'時才會生效

shuffle:bool型,控制是否在每一輪迭代中打亂樣本的順序,預設值是True,只有solver設定為'sgd'或'adam'時才會生效

random_state:整型,控制隨機數種子,即控制訓練開始時隨時初始化權重的過程,預設不設定

tol:設定精度的閾值,預設是1e-4,設定的越小,理論上訓練精度越高,同時迭代次數也相應越多

verbose:bool型,控制是否列印整個訓練過程的細節

warm_start:bool型,控制是否進行預訓練,即通過預訓練得到一個較好的初始權重,再進行正式訓練,預設為False

momentum:float型,設定梯度下降中的動量因子,預設為0.9,只有當solver設定為'sgd'時才會生效

early_stopping:bool型,是否在驗證分數不再得到提高且未達到設定的最大迭代輪數之前”早停“訓練,預設為False,只有solver設定為'sgd'或'adam'時才會生效

相關文章