深度學習基礎知識


一、Normlization

原因和動機
在機器學習和深度學習中,有一個共識:獨立同分布的數據可以簡化模型的訓練以及提升模型的預測能力——這是通過訓練數據獲得的模型能夠在測試集獲得好的效果的一個基本保障。也就是說我們在使用機器學習和深度學習的時候,會把數據盡可能的做一個獨立同分布的處理,用來加快模型的訓練速度和提升模型的性能。說到這里就不得不提一下——白化whitening。

白化whitening

什么是白化呢?就是對數據進行如下的2個操作:
1. 去除數據之間的關聯性,使之滿足獨立這個條件;
2. 使得特征具有相同的均值和方差,就是同分布。

首先看看,深度學習中的一個經典問題。Internal Covariate Shift——內部變量偏移

深度學習這種包含很多隱層的網絡結構,在訓練過程中,因為各層參數不停在變化。另一方面,深度神經網絡一般都是很多層的疊加,每一層的參數更新都會導致上層的輸入數據在輸出時分布規律發生了變化,並且這個差異會隨着網絡深度增大而增大——這就是Internal Covariate Shift。它會導致什么樣的問題呢?

每個神經元的輸入數據不再是獨立同分布的了,那么:

  • 上層參數需要不斷適應新的輸入數據分布,降低學習速度
  • 下層輸入的變化可能趨向於變大或者變小,導致上層落入飽和區。反向傳播時低層神經網絡的梯度消失,這是訓練深層神經網絡收斂越來越慢的本質原因——梯度消失。

BN把每層神經網絡任意神經元這個輸入值的分布強行拉回到均值為0方差為1的標准正態分布,其實就是把越來越偏的分布強制拉回比較標准的分布。這樣讓梯度變大,避免梯度消失問題產生,而且梯度變大意味着學習收斂速度快,能大大加快訓練速度。經過BN后,目前大部分Activation的值落入非線性函數的線性區內,其對應的導數遠離導數飽和區,這樣來加速訓練收斂過程。

BN

BN的目標是標准化任何特定層的輸入(即來自前一層的激活)。 標准化輸入意味着網絡中任何層的輸入都應該具有近似為零的均值和單位方差。 在數學上,BN 層通過減去當前小批量中的輸入均值並除以標准差來轉換當前小批量中的每個輸入。

但是每一層不需要期望具有零均值和單位方差的輸入,相反,模型可能在其他一些均值和方差的情況下表現更好。 因此,BN 層還引入了兩個可學習參數 γ 和 β。

整個層操作如下。 它接受輸入\(x_i\) 並將其轉換為 \(y_i\),如下圖所述。

缺點:

  1. BN 在每次訓練迭代中計算批次統計數據(Mini-batch 均值和方差),因此在訓練時需要更大的批次大小,以便它可以有效地從 mini-batch 逼近總體均值和方差。 這使得 BN 更難訓練用於對象檢測、語義分割等應用的網絡,因為它們通常在高輸入分辨率(通常高達 1024x 2048)下工作,並且使用更大的批量進行訓練在計算上是不可行的。
  2. 在Rnn中不適用。Rnn是根據時間步往后傳遞的,需要在每個時間步長都需要單獨的計算γ 和 β,RNN和BN一起使用比較困難。此外在RNN中因為每條輸入樣本的長度是不同的,對padding后的樣本計算均值和方差不太合理。
  3. 訓練和測試階段的不一致。在測試階段是不計算均值和方差的,而是使用固定的均值和方差(從訓練數據得到的),引入了計算的復雜度。

LN

簡單總結來說:Batch Normalization 的處理對象是對一批樣本, Layer Normalization 的處理對象是單個樣本。Batch Normalization 是對這批樣本的同一維度特征做歸一化, Layer Normalization 是對這單個樣本的所有維度特征做歸一化。

二、過擬合和欠擬合

如何區分過擬合和欠擬合?

過擬合的原因?

  1. 訓練數據包含噪聲
  2. 訓練集和測試集的數據分布就不同
  3. 訓練數據量不足
  4. 訓練過度
  5. 模型太復雜

解決方式

(要和原因一一匹配)

  1. 更多的數據
  2. early stopping
  3. 正則化
  • 正則化表示的是在原來損失函數的基礎上加上一些正則化項。或者稱為模型復雜度的懲罰項。
  • 正則化是結構風險最小化的策略實現。
  • L1正則化是指權值向量中各個元素的絕對值之和,L2正則化是指權值向量中各個元素的平方和然后再求平方根。

西瓜書:以線性回歸模型,平方誤差為損失函數為例,優化目標為

\[min\sum^{m}_{i=1}(y_i-w^Tx_i)^2 \]

當樣本特征很多,而樣本數量很少。容易出現過擬合,為了緩解過擬合,可以引入正則化項。

如果使用L2范數正則化(權值向量w中各元素的平方和再開根號)。則有

\[min\sum^{m}_{i=1}(y_i-w^Tx)^2 + \lambda||w||_2^2 \]

L1范數正則化(權值向量w中各元素的絕對值之和)

\[min\sum^{m}_{i=1}(y_i-w^Tx)^2 + \lambda||w||_1 \]

加入正則化項以后,優化目標的求解要在平方誤差項和正則化項之間折中,(畫圖的話就是相交處)
采用\(L_1\)范數時,平方誤差項等值線與正則化項等值線的交點常出現在坐標軸上,即w1 或者w2為0。而采用\(L_2\)范數的時候,兩者交點常出現在某個象限中,即w1和w2均非0。因此L1范數比L2范數更容易得到稀疏解。

西瓜書:w 取得稀疏解意味着初始的d個特征中僅有對應着w的非零分量特征才會出現在最終的模型中。因此求解L1范數正則化的結果是得到了僅采用一部初始特征的模型。

  • L1是拉普拉斯分布,L2是高斯分布
  • L1正則化問題的求解可使用近端梯度下降。
  1. Dropout
  • 直觀上理解,dropout會使某些神經元失活,得到一個較小的網絡,從而達到正則化的目的;
  • 另一方面,它使得某一個節點不再依賴上一層的某個節點(因為這個節點可能會隨機失活)所以該神經元不會再特別依賴於任何一個輸入特征,即不會給任何一個輸入特征設置太大的權重。(如果該特征是噪音的話,影響從而變小了)
  • 在訓練和測試階段怎么用
    • 訓練階段:每個神經元p%概率被刪除,然后用新的網絡結構訓練。
    • Training 使用Dropout,比如p%,而Testing不用Dropout. 但是Testing時權值需要乘以(1-p%)

!! 重要的補充知識:BN和Dropout在訓練和測試時的差別

三、常見的激活函數 & 導數

激活函數的主要作用是提供網絡的非線性建模能力,如果沒有激活函數,那么神經網絡只能表達線性映射,此刻即便是有再多的隱藏層,其整個網絡跟單層神經網絡也是等價的。因此可以說,只有加入了激活函數之后,深度神經網絡才具備了分層的非線性的學習能力。

激活函數至少應該滿足以下幾點:

  • 可微性:因為優化方法是基於梯度的,這個性質是必須的
  • 單調性:當激活函數是單調的時候,能夠保證單層網絡是凸函數

1. sigmoid

\[f(z) = \frac{1}{1+e^{-z}} \]

或者是:

\[f(z) = \frac{1}{1+exp(-z)} \]

對應的導函數:

\[f^{'}(z) = f(z)(1-f(z)) \]

函數
導數

將輸入值映射到區間(0,1),當z很大時,f(z)趨近於1;當z很小時,f(z)趨近於0.
導數在z很大或者很小的時候,都趨近於0,造成梯度消失的現象。
2. tanh

\[f(z) = tanh(z) = \frac{e^z-e^{-z}}{e^z+e^{-z}}\\ 對應的導函數:f^{'}(z) = 1-(f(z))^2 \]

3. relu

\[f(z) = max(0, z) \]

對應的導函數:

\[f^{'}(z) = 1,z>0\\ f^{'}(z) = 0,z<=0 \]

ReLU是針對sigmoid和tanh的飽和性提出的新的激活函數。從上圖中可以很容易的看到,當 \(z>0\) 的時候,不存在飽和問題,所以ReLU能夠在 \(z>0\) 的時候保持梯度不衰減,從而緩解梯度消失的問題。

然而,隨着訓練的推進,部分輸入會落入硬飽和區導致權重無法更新,這種現象稱為“神經元死亡”。

  • relu的優點:
    • 解決了梯度消失、爆炸的問題
    • 計算方便,計算速度快
    • 加速了網絡的訓練
  • relu的缺點:
    • 由於負數部分恆為0,會導致一些神經元無法激活(可通過設置小學習率部分解決)
    • 輸出不是以0為中心的

3-1. LeakyRelu

\[f(z)= \begin{cases} z, z>0 \\ az, z<=0 \end{cases} \]

四、常用損失函數

常見的損失函數(loss function)總結
loss functions
tf keras losses

五、優化算法

BGD、SGD、小批量梯度下降、動量優化算法、自適應學習率優化算法;batch-size如何設置,過大過小會怎樣,若硬件滿足要求,為什么不能無限增大batch-size

六、評價指標

准確率、精確率、召回率、F1、AUC(GAUC)、RMSE等 意義是什么;都是在什么情況下使用

七、模型訓練攻略

李宏毅機器學習【week2】視頻
原文 筆記(可以看到圖片)

網絡訓練過程中幾個關鍵點

批處理的大小

大的batch size梯度在更新的時候會更穩,且更新的時候更能精准的沿着梯度下降的方向做梯度更新。然而,實驗證明,小的batch size反而更有助於模型訓練,當batch size過分大的時候(大過幾千),模型的精度會有明顯的下降,這個現象不是Overfitting,也不是Model bias造成的,而是Optimization造成的。

原因:

大的 batch_size 為整個訓練數據的時候

  • 一個可能的解釋是,當采用大batch size訓練時,並且當參數更新至局部最優點或者鞍點的時候,顯然梯度為0,就不會再更新了,因為下一次更新時輸入數據沒有改變,損失函數也不會有變化,但是,如果現在是將一小部分數據作為一個batch進行訓練,每次訓練時batch里面的數據都是不一樣的(這也是為什么每個epoch都要將數據shuffle的原因),那在每一次做training update的時候,會得到不一樣的梯度,損失函數在某個batch數據上關於參數 \(\theta\) (theta) 的梯度為0,這個時候在這個batch上不會更新梯度,但是,在另外一個batch上,損失函數關於參數 \(\theta\) 的梯度不一定為0,因為輸入變了,損失函數也變了
  • 另外一種解釋是,在大batch數據上訓練容易造成過擬合,所謂過擬合意思是說,當我們使用大batch size做training和小batch size做training,並同時讓它們在training data上達到一樣的accuracy,此時在小batch size上訓練得到的model在testing data上的accuracy要高於在大batch size上訓練得到的model在testing data上的accuracy,也就是說小batch size上訓練得到的model泛化性更好。這里李宏毅老師引用了一篇paper里的解釋來說明是由於在大batch size上training的到的model更容易陷入”壞的“local minima,不容易跳出局部最優,因此它針對的是整個數據集上的梯度更新策略,如果模型陷入了”壞的“local minima,那么這個時候的損失函數只是適應了當前數據的梯度方向為0,而對於新的數據(比如testing data)也許在這個位置的梯度不一定為0,也就是說在testing data上損失還很大。假如我們現在采取的是小batch size做training的話,同樣是陷入local minima,這個雖然也是局部最優,但是由於此時的損失函數是相對於很多個不同batch的數據在該點梯度方向都為0,也就是說有很強的泛化性,這就很有可能使得訓練好的model在testing data也有較好的表現。

動量

所謂的動量就是在梯度更新的時候,人為的給與某個方向上的梯度,使得當損失函數到達局部最優的時候,有能力能跳出這個局部最優值。兩個關鍵:動量的方向和大小。

每次朝着梯度的反方向更新梯度

  • 普通梯度下降的更新規則:

\[\theta^t_i = \theta^{t-1}_i - \eta g^{t-1}_i\\ g^t_{i} = \frac {\partial L}{\partial \theta_i} \]

  • 加入Momentum技術后梯度更新規則

當前梯度的反方向 \(g\) 加上前一步參數更新的方向 \(m\) ,初始值為 0
也就是說參數更新的方向不只是取決於當前梯度的方向,還取決於過去的參數更新方向

\[m^t = \lambda m^{t-1}-\eta g^{t-1} \\ \theta^t = \theta^{t-1} + m^t \\ \lambda 和 \eta 代表過去時刻和當前時刻梯度的權重 \]

自動調節學習率

假如模型訓練至某一時刻,發現training loss不再下降,除了因為gradient很小,還有一種可能就是此時的學習率 \(\eta\) 已經很小了

當學習率比較大的時候,梯度更新很離譜,幾乎不會走到最優點,當梯度很小的時候,訓練了很久都不能收斂到局部最優,因為在訓練后期,學習率很小,這個時候梯度不起作用了。

普通的更新方式

\[\theta^t_i = \theta^{t-1}_i - \eta g^{t-1}_i\\ g^t_{i} = \frac {\partial L}{\partial \theta_i} \]

改動學習率后的更新方式

不同的參數就有不同的學習率,相互之間是獨立不影響的,同時不同的迭代周期對於同一個參數下也會有不同的學習率

\[\theta^{t+1}_i = \theta^t_i - \frac {\eta}{\sigma^t_i}g^t_i \]

下面介紹一些實現方式,主要是圍繞着 \(\sigma\)\(\eta\)\(g\) 這三個變量進行改動。

第一種:對 \(\sigma\)(sigma) 的改進

  • 當前時刻和過去時刻的梯度的平方和有關。Adagrad優化算法使用這種方式

\[\sigma^t_i = \sqrt {\frac {1}{t+1} \sum_{i=0}^t(g_i^t)^2} \]

  • 當我們遇到一個比較平穩的局部最優區域時,此時該點附近的大部分區域梯度都很小,這個時候就可以給與一個較大的學習率
  • 反之如果遇到的是一個比較陡峭的局部最優區域,此時該點附近的大部分區域梯度相對來說都比較大,這個時候就需要一個比較小的學習率,讓參數更新慢一些。
  • 但細心的同學也許會發現,Adagrad並沒有對當前時刻的梯度和過去時刻的梯度給與不一樣的權重考慮,因此Adagrad算法勢必存在一些問題,下面我們來分析下。
  • 自適應學習率(RMSProp)

\[\sigma^t_i = \sqrt {\alpha (\sigma^{t-1}_i)^2 + (1-\sigma(g^t_i)^2)} \\ \sigma^t_0 = \sqrt {(g^t_0)^2)} = |g_i^0| \\ 0<\alpha <1 \\ 可以認為 \sigma^{t-1}_i 代表了過去時刻的gradient,而 g^t_i 則代表了當前時刻的gradient \]

  • Adam = RMSProp + Momentum

先來總結一下Momentum和RMSProp這兩個優化算法,Momentum的目的是防止陷入局部最優,當梯度更新陷入局部最優或者鞍點時,Momentum可以為梯度更新提供新的“動力”,而這個動力和最優點附近的梯度有關,也就是說Momentum是對梯度( \(g\) )本身的改進優化,RMSProp的目的則是自適應的調整學習率,使得模型能夠快速並且穩定的到達最優點,RMSProp是對學習率系數( \(\sigma\) )的改進和優化,Adam則同時對 \(g\), \(\sigma\) 兩個參數做改動,更新規則如下

\[m^t = \beta_1m^{t-1} - (1-\beta_1)g'^{t-1} \\ v^t = \beta_2v^{t-1} - (1- \beta_2)g''^{t-1} \\ \theta^t = \theta^{t-1} - \frac {\eta}{\sqrt {v^t}+\epsilon}m^t \]

如果能用二階梯度,相當於梯度的梯度,那么也就知道坡度變化的趨勢,因此一步就能走到位。

第二種:對 \(\eta\) (eta)的改進

  • 學習率衰減
    通常在我們的實際工程中就是給定一個學習率衰減系數,比如常見的指數型衰退法,式中的 \(\alpha\)為衰減系數, \(decay_{step}\) 代表了每多少步衰減一次。

\[\eta^t = \eta^{t-1} * \alpha^{global_{step} / decay_{steps}} \]

  • warm up
    warm up的策略則是讓學習率 \(\eta\)先增大,后減小,為什么warm up會有效果呢?李宏毅老師給出了一個可能的解釋是:在模型剛開始訓練的時候,每個數據點對模型來說都是新的,並沒有學到任何東西,或者說並不知曉數據的分布情況,這個時候的 \(\sigma\) 統計是不精准的,模型這個時候如果給與比較大的學習率很容易學偏,並且在一開始的時候很難把錯誤的點拉回來,因此在模型一開始訓練的時候讓它慢慢學,等到學到一定的先驗知識,對數據分布有了解之后,再加大學習率去學習,至於后面為什么要小下去,這個解釋和前面的learning rate decay的思想一樣。

另一種解釋

參考


免責聲明!

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



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