神經網絡結構及模型訓練(筆記)


一、神經網絡

1、人工神經元

神經網絡由很多的節點構成,這些節點又叫做人工神經元(或神經元)
他的結構如圖所示:
image
x1~xn是輸入信號

wij代表從神經元j到神經元i的連接權值
θ表示一個閾值 ( threshold ),或稱為偏置( bias )

神經元i的輸出與輸入的關系表示為:
image

yi=f(neti)

yi表示神經元i的輸出,函數f稱為激活函數或轉移函數,net稱為凈函數。
若用X代表輸入向量,用W代表權重向量,即:
image
則神經元的輸出可以表示為向量相乘的形式:
image
image

若神經元的凈激活net為正,稱該神經元處於激活狀態或興奮狀態,若凈激活為負則稱神經元處於抑制狀態。
這種“閾值加權和”的神經元模型稱為M-P模型(McCulloch-Pitts Model),也稱為神經網絡的一個處理單元

2、常用的幾種激活函數

1、S函數(Sigmoid函數)
image
2、雙極性S函數
image
兩種函數的對比:
image

3、幾種神經網絡模型(基石)

1、前饋神經網絡(Feedforward Neural Networks)

前饋網絡又稱為前兩網絡
模型如圖:
image
這是一個三層的前饋神經網絡,其中第一層是輸入單元,第二層稱為隱含層,第三層稱為輸出層(輸入單元不是神經元,因此圖中有2層神經元)
這種網絡只在訓練過程中會有反饋信號,而在分類過程中數據只能向前傳送直到到達輸出層,層間沒有向后的反饋信號。
感知機與BP神經網絡就屬於前饋網絡。

2、反饋神經網絡(Feedback Neural Networks)

反饋神經網絡是一種從輸出到輸入具有反饋連接的神經網絡,經典的反饋型神經網絡有:Elman網絡和Hopfield網絡。
image

3、自組織網絡(SOM,Self-Organizing Neural Networks)

自組織神經網絡是一種無導師學習網絡。它通過自動尋找樣本中的內在規律和本質屬性,自組織、自適應地改變網絡參數與結構。
image

二、模型訓練過程

神經網絡中最基本的思想:先“蒙”一個結果,姑且稱它為預測結果a,看看這個預測結果和事先標記好的訓練集中的真實結果y之間的差距,然后調整策略,再試一次,這一次不再是“蒙”了,而是有依據地向正確的方向靠近,如此反復多次,一直到預測結果和真實結果之間相差無幾(即|a-y|趨於0)才結束訓練。在神經網絡訓練中,我們把“蒙”叫做初始化,可以隨機初始化,也可以根據以往的經驗給定初始值(有技術含量地“蒙”)。 //我覺得這一個總體綱領關於其他的一些細節都是在這個總體綱領下慢慢完善優化。

簡單的神經網絡的訓練過程包括以下幾個步驟:
1、定義一個包含多個可學習參數(權重)的神經網絡;
2、對輸入的數據集進行迭代計算;
3、通過多層網絡結構來處理輸入數據;
4、計算損失值(輸出值與目標值的差值);
5、反向傳播梯度到神經網絡的參數中;
6、根據更新規則來更新網絡中的權重值。
神經網絡訓練及參數更新流程圖:
image
下面來根據這張圖進行說明。

1、構建數據集

訓練集:模型用於訓練和調整模型參數
驗證集:來驗證模型精度和調整模型超參數
測試集:驗證模型的泛化能力

因為訓練集和驗證集是分開的,所以模型在驗證集上面的精度在一定程度上是可以反映模型的泛化能力。在划分驗證集的時候需注意驗證集的分布應該與測試集盡量保持一致,不然模型在驗證集上的精度就失去了指導意義。
驗證集的划分主要有如下幾種方式:
image

留出法:直接將訓練集划分成兩部分,新的訓練集和測試集。這種划分方法的優點是最為直接簡單;缺點是只得到了一份驗證集,有可能導致模型在驗證集上過擬合。留出法的應用場景是數據量比較大的情況。

交叉驗證法(Cross Validation):將訓練集划分成K份,將其中的K-1份作為訓練集,剩余的一份作為驗證集,循環K訓練。這種划分方法是所有的訓練集都是驗證集,最終模型驗證精度是K份平均得到。這種方式的優點是驗證集精度比較可靠,訓練K次可以得到K個有多樣性差異的模型;CV驗證的缺點是需要訓練K次,不適合數據量很大的情況。

自助采樣法:通過有放回的采樣方式得到新的訓練集和驗證集,每次的訓練集和驗證集都是有區別的。這種划分方式一般適用於數據量較小的情況。

2、防止過擬合的幾個方法

1、正則化方法。正則化包括L0正則化,L1正則、L2正則,而正則一般是在目標函數之后加上對於的范數,機器學習中一般使用L2正則化。
2、數據增強(Data augmentation)。增大數據的訓練量,還有一個原因就是我們用於訓練的數據太少了導致的,訓練數據占總數據的比例過小。
4、提前終止法 ,對模型的訓練的過程即是對模型的參數進行學習更新的過程,這個參數學習的過程往往會用到一些迭代優化方法,比如梯度下降學習算法。提前終止法便是一種迭代數次截斷的方法來防止過擬合的方法,即在模型對訓練數據集迭代收斂之前停止迭代來防止過擬合(這種方法我沒有看懂)
5、丟棄法。這個方法在神經網絡中很常用。丟棄法是ImageNet中提出的一種方法,通俗一點講就是在訓練的時候讓神經元以一定的概率不工作。如圖:
image
左側為全連接網絡,右側的網絡以0.5的概率丟棄神經元。

1、防止欠擬合的幾個方法:

1、添加其他特征項:有時候我們的模型出現欠擬合的時候是因為特征項不夠導致的,可以添加其他特征項來很好地解決。例如,“組合“、”泛化"、“相關性”三類特征是特征添加的重要手段,無論在什么場景,都可以照葫蘆畫瓢,總會得到意想不到的效果。出上面的特征之外,“上下文特征”、“平台特征”等等,都可以作為特征添加的首選項。
2、添加多項式特征:****機器學習中普片應用的算法,例如將線性模型通過添加二次項或者三次項使模型泛化能力更強。
3、減少正則化參數,正則化目的是用來防止過擬合,但是現在模型出現了欠擬合,則需要減少正則化參數。

2、模型訓練和驗證

我認為模型的訓練過程本質上是參數的自我學習與更新的過程
神經網絡的循環過程
如下:
1,輸入進來神經網絡(每個神經元先輸入值加權累加再輸入激活函數作為該神經元的輸出值),前向傳播,先用初始化的矩陣將輸入轉換成和輸出類似的形式,得到得分。
2、將得分輸入損失函數loss function(正則化乘法,防止過度擬合),與期待值比較得到誤差,通過誤差判斷識別成都(損失值越小越好)。
4、通過反向傳播(反向求導的過程,誤差函數和神經網絡中每個激活函數都要求,目的是使誤差最小)來確定梯度向量。
5,根據獲取的梯度,更新梯度。具體的過程是通過梯度向量來調整每一個權值,向“得分”使誤差趨於0或者收斂的趨勢調節(SGD算法)
6、重復每一個epoch,直到損誤差失的平均值不再下降(最低點)。

整個流程大致就是一個epoch,在實際場景的神經網絡訓練中,這樣的循環可能都是成百萬次,千萬次級別的。

計算loss就是那個所謂的交叉熵損失函數的計算(通過初始的我們給予模型的參數來進行的訓練,也就是隨機種子)
更新梯度就是優化算法,各種梯度下降之類的。
模型訓練的過程應該會有很多的筆記,但是現有的各種庫調用一個函數就完全能訓練好一個模型,雖然代碼的實現過程非常容易,
但是內部原理的事項我覺得是非常重要的。
整個的這個過程還有大量的細節沒有完全搞明白,現在只是能上手用而已。包括各種參數,各種推導公式都是需要繼續學習的。

下面寫一些細節:

1、權重初始化

在深度學習中,神經網絡的權重初始化方法對(weight initialization)對模型的收斂速度和性能有着至關重要的影響。說白了,神經網絡其實就是對權重參數w的不停迭代更新,以期達到較好的性能。在深度神經網絡中,隨着層數的增多,我們在梯度下降的過程中,極易出現梯度消失或者梯度爆炸。因此,對權重w的初始化則顯得至關重要,一個好的權重初始化雖然不能完全解決梯度消失和梯度爆炸的問題,但是對於處理這兩個問題是有很大的幫助的,並且十分有利於模型性能和收斂速度。

隨機種子

即高斯分布的方法隨機設置參數,這是最為傳統的方法
深度學習網絡模型中初始的權值參數通常都是初始化成隨機數
而使用梯度下降法最終得到的局部最優解對於初始位置點的選擇很敏感,為了能夠完全復現作者的開源深度學習代碼,隨機種子的選擇在一定程度上能夠減少算法結果的隨機性,也就是更趨於原始的作者的結果,產生隨機種子意味着每次運行產生的隨機數都是相同的。
在大多數情況下,即使設定了隨機種子,仍然沒有辦法完全復現paper中所給出的模型性能,這是因為深度學習代碼中除了產生隨機數中帶有隨機性,其訓練的過程中使用 mini-batch SGD或者優化算法進行訓練時,本身就帶有了隨機性。因為每次更新都是從訓練數據集中隨機采樣出batch size個訓練樣本計算的平均梯度。作為當前step對於網絡權值的更新值,所以即使提供了原始代碼和隨機種子,想要復現作者paper中的性能也是非常困難的。

2、一些優化技巧

前兩天看到一個博客給了一個優化的技巧:(但還未實踐)
將一個模型進行過擬合化訓練(即專注於訓練損失),然后適當對其進行正則化(即放棄一些訓練損失以獲得驗證損失)。

此階段的一些技巧:
1、選擇模型:為了減少訓練損失,您需要為數據選擇合適的體系結構。

2、Adam是安全的。在設定基准的早期階段,我喜歡以3e-4的學習率使用Adam 。以我的經驗,亞當更寬容超參數,包括不良的學習速度。對於ConvNets,調整良好的SGD幾乎總是比Adam稍勝一籌,但是最佳學習率區域要狹窄得多且針對特定問題。

3、一次只使一個復雜化。如果您有多個信號要插入您的分類器,我建議您將它們一個接一個地插入,並每次確保獲得預期的性能提升。

4、不要相信學習率衰減的默認值。如果您要重新使用其他領域的代碼,請務必小心學習率。

一些其他問題

1、收斂速度慢

深度學習實際是一個反復調整模型參數的過程。收斂速度多慢導致訓練時間過長一方面在總時間內迭代次數變少映像准確率,另一方面使得訓練次數變少,減少了嘗試不同超參數的機會。

1、設置合理的初始化權重W和偏置b

模型訓練的本質就是調整w和b的過程,也就是weight和bias。根據奧卡姆剃刀法則,模型越簡單那越好,我們通過線性函數這種最簡單的表達式來提取特征也就是
image
關於初始化w和b,前面已經說過傳統的使用高斯分布的方式來初始化,但是這種初始化方式效果並不好。

2、優化學習率

模型訓練是在不斷嘗試調整不同的w和b,學習率就是每次調整的幅度是多少。w和b是在一定范圍內調整的,增大學習率會減少迭代次數加快了訓練速度,但是學習率太大容易跳過局部最優解降低准確率,學習率太小會增加迭代次數加大訓練時間。
解決方法:
一開始可以學習率大一些從而加快收斂。在訓練的后期學習可以小一點從而穩定的落入局部最優解。使用Adam、Adagrad等自適應優化算法可以實現學習率的自適應調整,從而保證准確率的同時加快收斂。
image

3、網絡節點輸入值正則化 batch normalization

神經網絡訓練時,每一層的輸入分布都在變化。不論輸入值大還是小,我們的學習率都是相同的,這顯然是很浪費效率的。而且當輸入值很小時,為了保證對它的精細調整,學習率不能設置太大。我們可以讓輸入值標准化得落到某一個范圍內,比如[0, 1]之間呢,這樣我們就不必為太小的輸入值而發愁了。
解決方法:
由於我們學習的是輸入的特征分布,而不是它的絕對值,故可以對每一個mini-batch數據內部進行標准化,使他們規范化到[0, 1]內。這就是Batch Normalization,簡稱BN。它在每個卷積層后,使用一個BN層,從而使得學習率可以設定為一個較大的值。使用了BN的inceptionV2,只需要以前的1/14的迭代次數就可以達到之前的准確率,大大加快了收斂速度。

4、采用更先進的網絡結構

如何用較少的參數量達到較高的精度,一直是構建網絡模型的難點。
目前的幾種方式:
(卷積神經網絡中)
使用小卷積核來代替大卷積核。VGGNet全部使用3x3的小卷積核,來代替AlexNet中11x11和5x5等大卷積核。小卷積核雖然參數量較少,但也會帶來特征面積捕獲過小的問題。inception net認為越往后的卷積層,應該捕獲更多更高階的抽象特征。因此它在靠后的卷積層中使用的5x5等大面積的卷積核的比率較高,而在前面幾層卷積中,更多使用的是1x1和3x3的卷積核。
使用兩個串聯小卷積核來代替一個大卷積核。inceptionV2中創造性的提出了兩個3x3的卷積核代替一個5x5的卷積核。在效果相同的情況下,參數量僅為原先的3x3x2 / 5x5 = 18/25
1x1卷積核的使用。1x1的卷積核可以說是性價比最高的卷積了,沒有之一。它在參數量為1的情況下,同樣能夠提供線性變換,relu激活,輸入輸出channel變換等功能。VGGNet創造性的提出了1x1的卷積核
非對稱卷積核的使用。inceptionV3中將一個7x7的卷積拆分成了一個1x7和一個7x1, 卷積效果相同的情況下,大大減少了參數量,同時還提高了卷積的多樣性。
depthwise卷積的使用。mobileNet中將一個3x3的卷積拆分成了串聯的一個3x3 depthwise卷積和一個1x1正常卷積。對於輸入channel為M,輸出為N的卷積,正常情況下,每個輸出channel均需要M個卷積核對輸入的每個channel進行卷積,並疊加。也就是需要MxN個卷積核。而在depthwise卷積中,輸出channel和輸入相同,每個輸入channel僅需要一個卷積核。而將channel變換的工作交給了1x1的卷積。這個方法在參數量減少到之前1/9的情況下,精度仍然能達到80%。
全局平均池化代替全連接層。這個才是大殺器!AlexNet和VGGNet中,全連接層幾乎占據了90%的參數量。inceptionV1創造性的使用全局平均池化來代替最后的全連接層,使得其在網絡結構更深的情況下(22層,AlexNet僅8層),參數量只有500萬,僅為AlexNet的1/12

2、過擬合問題

在一定次數的迭代后,模型精確度在訓練集上越來越好,但是在測試集上越來越差。原因是模型學習了太多無關特征,將這些特征認為是目標所應該具備的特征導致的。

3、梯度彌散,無法使用更深的網絡

深度學習利用正向傳播來提取特征,同時利用反向傳播來調整參數。反向傳播中梯度值逐漸減小,神經網絡層數較多時,傳播到前面幾層時,梯度接近於0,無法對參數做出指導性調整了,此時基本起不到訓練作用。這就稱為梯度彌散。梯度彌散使得模型網絡深度不能太大,但我們都知道網絡越深,提取的特征越高階,泛化性越好。因此優化梯度彌散問題就很重要了

1、relu函數代替simoid激活函數

sigmoid函數值在[0,1],ReLU函數值在[0,+無窮]。relu函數,x>0時的導數為1, 而sigmoid函數,當x稍微遠離0,梯度就會大幅減小,幾乎接近於0,所以在反向傳播中無法指導參數更新。

2、殘差網絡
resNet將一部分輸入值不經過正向傳播網絡,而直接作用到輸出中。這樣可以提高原始信息的完整性了,從而在反向傳播中,可以指導前面幾層的參數的調整了。如下圖所示。

image

使用了殘差網絡的resNet,將網絡深度提高到了152層,大大提高了模型的泛化性,從而提高了預測准確率,並一舉問鼎當年的imageNet冠軍!

線性模型的局限性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM