計算機視覺-全連線神經網路(多層感知機)
全連線神經網路
全連線神經網路級聯多個變換來實現輸入到輸出的對映。
每一層神經網路就是一個線性變換,將上一層的變換結果經過啟用函式處理傳遞給下一層就形成了多層全連線神經網路。
啟用函式的目的就是對結果進行非線性操作。
全連線神經網路的描述能力更強。因為調整W1行數等於增加模板個數,分類器有機會學到兩個不同方向的馬的模板。
除了輸入層以外有多少層神經網路,就是幾層神經網路。
常用啟用函式:
Sigmoid,Relu,tanh,LeakyRelu。
Sigmoid:將資料壓縮到(0-1)之間。
tanh:將資料壓縮到(-1,1)之間。
Relu:小於0的部分為0,大於0的部門是他本身。
Leaky Relu:在Relu的基礎上,讓小於0的部分為0.1倍的x。
網路結構設計:
神經元、隱藏層的個數越多,分介面就可以越複雜,在這個資料集合上的分類能力就越強。
小結:
全連線神經網路組成:一個輸入層、一個輸出層及多個隱藏層。
輸入層與輸出層的神經元個數由任務決定,而隱藏層數量以及每個隱藏層的神經元個數需要人為指定。
啟用函式是全連線神經網路中的一個重要部分,缺少了啟用函式,全連線神經網路將退化為線性分類器。
SOFTMAX:
每一種類別的e的指數次方佔所有類別指數次方的比例,就可以得到預測為該類別的概率。
不新增softmax層與新增softmax層一般都模型預測的準確度不產生影響。只不過在加入softmax後,不僅能夠得到預測結果,而且可以得到獲得該結果的概率是多少。
交叉熵損失:
交叉熵的出現是為了預測結果可以與真實的標答進行比較。在這個過程中,需要對標答進行one-hot編碼而且這個過程中其實是使用的相對熵,而一般情況下(在資訊熵等於0),交叉熵會等於相對熵。
當真實分佈為one-hot形式時,交叉熵損失簡化為:Li=-log(qj)。
度量分類器的輸出值與預測值之間的距離。
相對熵:也叫KL散度,用來度量兩個分佈之間的不相似性(不相似程度)。
所以可以直接使用交叉熵來度量這兩個分佈之間的不一致性就好了。
計算圖:
計算圖是一種有向圖,它用來表達輸入、輸出以及中間變數之間的計算關係,圖中的每個節點對應著一種數學運算。
鏈式反向傳播可以算出相對於輸出的任何一個輸入的導數。同時也可以算出輸出相對於任何一個節點的導數。導數即梯度。
啟用函式:
梯度消失:是神經網路訓練中非常致命的問題,其本質是由於鏈式法則的乘法特性導致。
在反向傳播過程中,由於啟用函式的導數為0,因此會導致反向傳播的區域性梯度為0,而下一層(實則是正向傳播的上一層)的梯度是由上層梯度*區域性梯度。而牛頓下降法要靠梯度響應來做,從而導致梯度消失。
梯度爆炸:區域性梯度很大,從而導致上層梯度乘上區域性梯度出現一個非常大的值。因為權值=權值-學習率*梯度。當梯度很大,就會導致權值反覆橫跳。
斷崖處梯度乘以學習率後會是一個非常大的值,從而“飛”出合理區域,最終導致演算法不收斂。
解決方案:把沿梯度方向前進的步長限制在某個值內就可以避免“飛”出了,這個方法也稱為梯度裁剪。簡單來說就是當沿梯度方向前進的步長超過了閾值時,就以特性的步長作為替換進行學習訓練。
tanh與sigmoid類似,區域性梯度特性不利於網路梯度流的反向傳遞。
啟用函式選擇:儘量選擇Relu函式或者LeakyRelu函式,相對於Sigmoid、tanh,Relu這兩個函式會讓梯度流更加順暢,訓練過程收斂得更快。
使用動量法的目的是為了改進梯度下降演算法存在的問題,減少震盪,加速通往谷底。
改進思想:利用累加歷史梯度資訊更新梯度。
動量法:簡單來說就是利用動量累加的方法,在反覆橫跳的方向上,動量逐漸相互抵消,而動量較小的單方向上呢,會逐漸變大,從而對梯度更新方向進行更改。
動量法的優勢:由於動量的存在,演算法可以衝出區域性最優解以及鞍點,找出更優的解。
自適應梯度法:
通過減小震盪方向步長,增大平坦方向步長來減小震盪,加速通過谷底放下。
如何區分震盪方向與平坦方向?
梯度幅度的平方較大的方向是震盪方向,梯度幅度的平方較小的方向是平坦方向。
自適應AdaGrad方法的缺點就是雖然能夠加快往正確梯度方向修正的速度,但是由於累計梯度平方會越來越大,因此導致最終的第4步的權重更新步長越來越小,導致更新緩慢。
RMSProp:
在第3步的過程中,獲得r與越接近當前時刻的梯度g關係越大,越遠離當前時刻的梯度g的關係越小。
Adam:
同時使用動量與自適應的思想。
秒啊,分別用v來修正梯度,r來修正學習率。最後在第5步中加入了一個修正偏差,這一步是為了解決冷啟動問題,其中的t表示第幾輪運算。當t=1時,表示第1輪,這個時候的v=g,r=g*g。
總結:大多數情況下使用Adam,但是Adam沒有動量法+SGD的傳統的演算法調優的效果更好。 但是Adam在很多情況下很快就能處理好,而動量法+SGD手動調優想調到一個很優的值是不太容易的。
權值初始化:
建議:採用隨機初始化,避免全零初始化!
有效的初始化方法:使網路各層的啟用值和區域性梯度的方差在傳播過程中儘量保持一致;以保持網路中正向和反向資料流動。
就是是的輸出和輸入之間具有相同的資料分佈情況,如果輸入是0均值1方差,那我也要保證輸出也是0均值1方差。
Xavier初始化。
其中,式中的E表示均值,Var表示方差。
因此,隨機初始化,權值取樣自均值為0,方差為1/N的高斯分佈,N為輸入神經元的個數。
Xavier方法再Relu上的表現並不好,因此何凱明等人都提出了MSRA。區別知識在方差的分子變成了2.
因此,如果使用的是Relu的啟用函式,這應該使用MSRA初始化方法,如果使用的是Sigmoid和tanh啟用函式,則使用Xavier的初始化方法。
好的初始化方法可以防止前向傳播過程中的資訊消失,也可以解決反向傳遞過程中的梯度消失。
批歸一化:
方法:直接對神經元的輸出進行批歸一化。
簡單來說,假設每次小批量梯度下降演算法會輸出32個值,對著32個值減均值除方差操作,就可以保證當前神經元的輸出值是分佈符合0均值1方差。
批歸一化(BN)層一般被插在非線性操作之前。
在批歸一化這個過程中,由網路自動學習方差γ和均值β。而在單樣本測試時,使用到的x尖是由訓練過程中所有的均值方差的平均值來計算y的。
不管是使用啟用函式還是批歸一化還是權值初始化都是為了保證正向和反向的資訊流通暢。
過擬合現象:
學習時選擇的模型所包含的引數過多,以至於出現這一模型對已知資料預測的很好,但對位置資料預測得很差的現象。
欠擬合現象:
模型描述能力太弱,以至於不能很好地學習到資料中的規律。
機器學習的根本問題就是優化和泛化的問題。
優化:調節模型引數,讓他更好的擬合訓練樣本。
泛化:訓練好的模型在前所未見的資料上的效能好壞。
訓練初期,優化和泛化是相關的:訓練集上的誤差越小,驗證集上的誤差也就越小,模型的泛化能力逐漸增強。
訓練後期,模型在驗證集上的錯誤率不再降低,轉而開始變高。模型出現了過擬合,開始學習僅和訓練資料有關的模型了。因此,我們將驗證集錯誤率發生轉折的那個點對應的模型進行輸出,這個時候是泛化能力最好的模型。
應對過擬合:
最優方案:獲取更多的訓練資料。
次優方案:調節模型允許儲存的資訊量或者對模型允許儲存的資訊加以約束,該類方法也稱為正則化。
調節模型大小。
約束模型權重,即權重正則化(常用的有L1、L2正則化。)。
隨機失活(Dropout)。
L2正則損失對於大數值的權值向量進行嚴厲懲罰,鼓勵更加分散的權重向量,使模型傾向於使用所有輸入特徵做出決策,此時的模型泛化效能好。
L2正則過程中會選擇儘量多的考慮到所有的維度特徵,而不是簡單依賴於其中某一個或幾個特徵就得出結果,避免了某個重要維度出現損傷的情況下導致整體出錯。也就是避免了對其中某些少數維度的強依賴性。同時防止模型過擬合。
隨機失活比率:是被設為0的特徵所佔的比例,通常在0.2-0.5範圍內。
隨機失活
隨機失活為什麼能夠防止過擬合呢?
1.隨機失活使得每次更新梯度時參與計算的網路引數減少了,降低了模型容量,所以能防止過擬合。
2.隨機失活鼓勵權重分散,從這個角度來看,隨機失活也能起到正則化的作用,進而防止過擬合。
3.Dropout可以看作模型整合。
Dropout只在訓練階段產生作用,而在測試階段會全部開啟,運用所有的神經元來進行預測。
神經網路中的超引數:
超引數:
網路結構:隱藏層神經元個數,網路層數,非線性單元選擇等。
優化相關:學習率、dropout比率、正則項強度等。
學習率設定:
學習率過大,訓練過程無法收斂。
學習率偏大,在最小值附近震盪,達不到最優。
學習率太小,收斂時間較長。
學習率適中,收斂快,結果好。
退火法:就是在學習率為0.1時,loss達到平穩,將學習率減小10倍。如此重複。
超引數優化方法:
網格搜尋法:
1.每個超引數分別取幾個值,組合這些超引數值,形成多組超引數。
2.在驗證集上評估每組超引數的模型效能。
3.選擇效能最優的模型所採用的那組超引數值作為最終的超引數的值。
隨機搜尋法:(最常使用的方法。)
1.引數空間內隨機取點,每個點對應一組超引數。
2.在驗證集上評估每組超引數的模型效能。
3.選擇效能最優的模型所採用的那組值作為最終的超引數的值。
總結上圖:首先從整體空間中隨機選取一部分超引數值進行訓練,然後得到這部分值中的較優值,對這部分較優值所在的空間進行進一步隨機選取一部分點,然後再進行訓練,選擇出較優值,經過多輪選取,找到在驗證集上精度最高的那組超引數。
對於學習率、正則項強度這類超引數,在對數空間上進行隨機取樣更合適。