本章內容主要描述了在機器學習中的前向傳播,反向求導的原理與計算,常見的啟用函式和損失函式,以及在網路訓練過程中過擬合,梯度消失/爆炸等產生的原理以及解決方案。本人也在學習過程中,如果有錯誤之處,請各位多多指教。
1.1 神經網路的前向傳播
我們首先定義如下圖所示的神經網路,為了簡單起見,所有的層都不加偏置。其中,\(X\) 表示輸入層,\(Z_{i}^{j}\) 表示第 \(j\) 個隱含層的所有神經元,\(W^{j}\) 表示第 \(j\) 層的權重。
因此:
所以:
最終的 \(Loss\) 函式可以表示為:\(Loss = \dfrac{1}{2}(y^{i} - y_{out})^{2}\)
在訓練過程中,我們要保證 \(Loss\) 越小越好,因此採用梯度下降的方法來求解網路的引數 \(W = [w_{11}^{1},w_{21}^{1},...,w_{21}^{3}]\),於是就需要求解 \(Loss\) 對所有引數的偏導數 \(\nabla L(w) = [\dfrac{\partial L(w)}{\partial w_{11}^{1}}, \dfrac{\partial L(w)}{\partial w_{12}^{1}},...\dfrac{\partial L(w)}{\partial w_{21}^{3}}]^{T}\),於是權重更新公式可以寫為:
1.2 神經網路的反向求導
在上一節中, 我們大致對神經網路的梯度更新有了瞭解,其中最核心的部分就是求出損失函式對權重 \(w_{ij}^{l}\) 的導數。由於網上大多數資料都是生搬硬套,因此我們以計算 \(W^{1}\) 的導數為例,對整個反向求導過程進行細緻的剖析。如下圖所示:
其中,\(w_{jk}^{l}\) 表示從第 \(l\) 層的第 \(j\) 個節點到第 \(l+1\) 層中的第 \(k\) 個節點的權重,根據前向傳播的計算我們可以得到:
用矩陣表示為:
因此,整個反向傳播的過程如下:
首先計算:\(\dfrac{\partial L}{\partial W^{3}} = \dfrac{\partial L}{\partial y_{out}}\odot (\dfrac{\partial y_{out}}{\partial W^{3}})^{T} = \dfrac{\partial L}{\partial y_{out}}\odot [\dfrac{\partial y_{out}}{\partial w_{11}^{3}},\dfrac{\partial y_{out}}{\partial w_{12}^{3}}]^{T} = \dfrac{\partial L}{\partial y_{out}} \odot (Z^{2})^{T}\)
然後計算:\(\dfrac{\partial L}{\partial W^{2}} = \dfrac{\partial L}{\partial y_{out}} (\dfrac{\partial y_{out}}{\partial Z^{2}} \odot \dfrac{\partial Z^{2}}{\partial W^{2}})^{T} = \dfrac{\partial L}{\partial y_{out}}(\dfrac{\partial y_{out}}{\partial Z^{2}}\odot Z^{1})^{T} = \dfrac{\partial L}{\partial y_{out}}(W^{3}\odot Z^{1})^{T}\)
最後計算:\(\dfrac{\partial L}{\partial W^{1}} = \dfrac{\partial L}{\partial y_{out}} (\dfrac{\partial y_{out}}{\partial Z^{2}} \dfrac{\partial Z^{2}}{\partial Z^{1}}\odot \dfrac{\partial Z^{1}}{\partial W^{1}})^{T} = \dfrac{\partial L}{\partial W^{1}} (W^{3}W^{2}\odot X)^{T}\)
為了方便計算,反向傳播通過使用計算圖的形式在 Tensorflow,PyTorch 等深度學習框架中實現,將上述過程繪製成計算圖如下:
根據計算圖,可以輕而易舉地計算出損失函式對每個變數的導數。
1.3 啟用函式
1.3.1 sigmoid 啟用函式
我們通常就用其中最常用的logistic函式來代指sigmoid函式:
特點:sigmoid函式和階躍函式非常相似,但是解決了光滑和連續的問題,同時它還成功引入了非線性。由於其值域處在0~1,所以往往被用到二分類任務的輸出層做概率預測。
缺點:
- 當輸入值大於3或者小於-3時,梯度就非常接近0了,在深層網路中,這非常容易造成“梯度消失”(也就是反向傳播時誤差難以傳遞到前面一層)而使得網路很難訓練。
- 其解析式中含有冪運算,計算機求解時相對來講比較耗時。
1.3.2 Softmax 啟用函式
Softmax 又稱歸一化指數函式, 適用於只有一個正確答案多類別分類問題(例如手寫數字)。構建分類器,解決只有唯一正確答案的問題時,用Softmax函式處理各個原始輸出值。
Softmax函式是二分類函式Sigmoid在多分類上的推廣,目的是將多分類的結果以概率的形式展現出來。直白來說就是將原來的輸出對映成為 (0,1) 的值,而這些值的累和為1(滿足概率的性質),我們就可以選取概率最大(也就是值對應最大的)結點,作為我們的預測目標。
1.3.3 tanh函式
這個tanh函式又被稱作雙曲正切函式,可以看出它的函式範圍是(-1,1)而均值為0。
缺點:該函式依舊沒有解決梯度消失和冪運算的問題。
1.3.4 ReLu函式
ReLu函式是當前最常用的一個啟用函式,尤其是在卷積神經網路和層次較深的神經網路中。
優點:
- 解決了gradient vanishing問題 (在正區間),因為大於0的梯度始終為1
- 計算速度非常快,只需要判斷輸入是否大於0,不含數學運算
- 收斂速度遠快於 sigmoid 和 tanh
缺點:對於小於0的這部分值,梯度會迅速降為0而不再影響網路訓練。這會造成部分神經元從來不被啟用,也稱作“死區”。
1.3.5 Leaky ReLu
將 \(x<=0\) 部分調整為 \(f(x)=αx\), 其中 \(α\) 一般設為一個較小的正數如 0.01 或 0.001。
特點:將小於0部分的梯度從零提高到 \(α\),給了這些被抑制部分一定參與網路訓練的可能。在 PReLU 中,將引數 \(\alpha\) 作為可學習的引數,從而避免了 Leaky ReLu 中的 \(\alpha\) 選擇問題。
1.4 損失函式
1.4.1 L1 和 L2 損失函式
平均絕對誤差(L1 Loss): 平均絕對誤差(Mean Absolute Error,MAE) 是指模型預測值f(x)和真實值y之間距離的平均值,其公式如下:
均方誤差MSE (L2 Loss):均方誤差(Mean Square Error,MSE)是模型預測值f(x) 與真實樣本值y 之間差值平方的平均值,其公式如下
1.4.2 交叉熵(Cross Entropy)損失函式
這裡的 \(y\) 代表真實值,0或1,\(y_{out}\) 代表預測值/估計值,值為一個概率,取值範圍0~1,那麼對某個輸出節點來講,所對應的 \(y\) 只有兩種情況,即:\(y=0,\quad y=1\)。於是:
- 當 \(y=0\) 時,\(L=-log(1-y_{out})\),要保證 \(L\) 最小,那麼 \(y_{out}\) 必須為0;
- 當 \(y=1\) 時,\(L=-log(y_{out})\),要保證 \(L\) 最小,那麼 \(y_{out}\) 必須為1。
所以,交叉熵損失函式的目的就是要使得每一個樣本屬於其真實值的概率最大化,其函式影像如下所示:
從上圖可以看出,相對於 MSE 做多分類任務的損失函式,使用交叉熵的優點為:用平方誤差損失函式,誤差增大引數的梯度會增大,但是當誤差很大時,引數的梯度就會又減小了。而使用交叉熵損失作為函式,誤差越大引數的梯度也越大,能夠快速收斂。
1.4.3 不同分類問題的損失函式選擇
- 二分類 Sigmoid函式 二分類交叉熵損失函式(binary_crossentropy)
- 多分類 Softmax函式 多類別交叉熵損失函式(categorical_crossentropy)
- 多標籤分類 Sigmoid函式 二分類交叉熵損失函式(binary_crossentropy)
1.5 優化演算法
由於在之前的文章中就係統介紹過優化演算法,為了本章節系統知識的完整性,在這裡簡單地列舉一些內容,有興趣瞭解的請參考:https://www.cnblogs.com/zhaozhibo/p/15098452.html。
1.5.1 一階方法
- SGD:在每輪迭代中,隨機優化某一條訓練資料上的損失函式。由於單個樣本並不能代表全體樣本的趨勢,造成損失函式嚴重震盪,影響準確性。後來改進為批量梯度下降。
- Momentum:更新的時候在一定程度上保留之前更新的方向,同時利用當前batch的梯度微調最終的更新方向,使演算法具有一定的擺脫區域性最優解的能力。
- AdaGrad:將引數的梯度之和作為分母,從而實現:1)對於經常更新的引數,不希望被單個樣本影響太大,希望學習速率慢一些;2)對於偶爾更新的引數,希望學習速率大一些。
- RMSProp:在AdaGrad的基礎上,不累積全部歷史梯度,而只關注過去一段時間視窗的下降梯度。
- Adam:Adam = RMSProp+Momentum,除了像 RMSprop 一樣儲存了過去梯度的平方的指數衰減平均值 ,也像 momentum 一樣保持了過去梯度的指數衰減平均值。
1.5.2 二階方法
- 牛頓法:目標函式必須具有連續的一、二階偏導數,海海森矩陣必須正定,且計算量大,每次迭代都要計算海森矩陣和它的逆矩陣。
- 擬牛頓法:不⽤⼆階偏導數而構造出可以近似海森矩陣或者海森矩陣的逆的正定對稱陣,在擬⽜頓的條件下優化目標函式。不同的構造⽅法就產生了不同的擬牛頓法。
1.6 過擬合
過擬合(overfitting)是指在模型引數擬合過程中,在訓練集上準確度很高而在測試集上準確度很低。
從數學角度上來理解過擬合產生原因:神經網路就是根據輸入資料 \(X\), 通過學習權重 \(W\) 來將 \(X\) 對映到所希望的輸出 \(Y\)。因此整個過程可以描述為:
實際上,在深度學習訓練中,輸入特徵 \(X\) 的維度 \(n\) 遠遠大於方程組的個數 \(m\),因此上述方程存在無窮多解,最後的結果就容易掉進非正常的區域性最優解(過擬合解)中。因此,過擬合的解決辦法主要有兩個方面:
增加方程個數:即增加樣本量
- 翻轉,旋轉,縮方,平移;
- 上下采樣,影像融合,平移等。
減少特徵維度:
- 減少模型複雜度,使用更小的網路;
- 在loss中新增正則化項,使部分權重為0,縮小解空間,從而減少求出過擬合解的可能性;
- 採取 dropout,隨機失活部分權重;
- 新增 batch normalization 層;
- 使用 PCA 等方法對特徵進行降維。
1.7 梯度爆炸與梯度消失
1.7.1 梯度消失
在反向傳播中由於鏈式求導法則的連乘,如果乘數都比較小趨於0,最終傳遞到網路輸入層的梯度會變得很小,導致梯度更新緩慢甚至不更新(梯度消失)。
梯度消失的原因:(1)隱藏層的層數過多;(2)採用了不合適的啟用函式(sigmoid)
1.7.2 梯度爆炸
在反向傳播中由於鏈式求導法則的連乘,如果乘數都比較大,最終傳遞到網路輸入層的梯度會變得很大(梯度爆炸)。
梯度爆炸的原因:(1)隱藏層的層數過多;(2)權重的初始化值過大
1.7.3 梯度爆炸與梯度消失的解決方案
- 用ReLU、Leaky-ReLU、P-ReLU、R-ReLU、Maxout等替代sigmoid函式;
- 用Batch Normalization;
- 預訓練+微調;
- 使用殘差網路。