深度神經網路訓練的必知技巧

重磅乾貨,第一時間送達

本文轉自:機器學習演算法工程師

本文主要介紹

8

種實現細節的技巧或 tricks :

資料增廣

影象預處理

網路初始化

訓練過程中的技巧

啟用函式的選擇

不同正則化方法

來自於資料的洞察

整合多個深度網路的方法

資料增廣

在不改變影象類別的情況下,增加資料量,能提高模型的泛化能力。

自然影象的資料增廣方式包括很多,如常用的水平翻轉(horizontally flipping),一定程度的位移或者裁剪和顏色抖動(color jittering)。此外還可以嘗試多種操作的組合, 例如同時做旋轉和隨機尺度變換,此外還可以把每個 patch 中所有畫素在 HSV 顏色空間中的飽和度和明度提升 0。25-4 次冪方,乘以 0。7-1。4 之間的一個因子,再加一個 -0。1-0。1 之間的值。同樣你可以在色調通道(H)對每張圖片或 patch 的所有畫素增加一個 -0。1~0。1 之間的值。

影象預處理

2.1 最簡單的預處理方法

零均值化

標準化

2.1.1 為什麼要零均值化

資料有過大的均值可能導致引數的梯度過大,如果有後續的處理,可能要求資料零均值,比如 PCA 。零均值化並沒有消除畫素之間的相對差異,人們對影象資訊的攝取通常來自於畫素之間的相對色差,而不是畫素值的高低。

2.1.2 為什麼要歸一化

歸一化是為了讓不同維度的資料具有相同的分佈。假如二維資料(X1,X2)兩個維度都服從均值為零的正態分佈,但是 X1 方差為 100 ,X2 方差為 1 。那麼對(X1,X2)進行隨機取樣在二維座標系中繪製的影象,應該是狹長的橢圓形。

對這些資料做特徵提取會用到以下形式的表示式:

S = w1*x1 + w2*x2 + b;

那麼引數 W1,W2 的梯度為:

dS / dw1 = x1 ; dS / dw2 = x2

由於 x1 與 x2 在分佈規模上的巨大差異,w1 與 w2 的導數也會差異巨大。此時繪製目標函式(不是S)的曲面圖,就像一個深邃的峽谷,沿著峽谷方向變化的是 w2,坡度很小;在峽谷垂直方向變化的是 w1,坡度非常陡峭,如圖 1,而我們期望的目標函式是圖 2 這樣的。

目標函式是非常難以最佳化的,因為 w1 和 w2 的梯度差異太大,所以在兩個維度上需要不同的迭代方案。但在實際操作中,為了方便,我們通常為所有維度設定相同的步長,隨著迭代的進行,步長的縮減在不同維度也是同步的。這就要求 w 不同緯度的分佈規模大致相同,而這一切都始於資料的歸一化。

2.1.3 實現程式碼

注:對於灰度影象,零均值化也可以減去整張圖片的均值:X-=numpy。mean(X)

X 是輸入資料,(圖片數目X圖片維度)。另一種標準化(normalize)方式是標準化每個維度,保證每個維度的最大值和最小值是 -1 和 1 。這種預處理的方式只在輸入的各個特徵的尺度或者單位不同時才有意義。以圖片畫素作為輸入為例子,所有畫素值尺度都在 0 - 255 這個尺度之間,所以沒必要嚴格的執行這種預處理操作。在自然影象上進行訓練時,可以不進行歸一化操作,因為理論上影象任一部分的統計性質都應該和其他部分相同,影象的這種特性被稱作平穩性(stationarity)。

2.2 白化(Whitening)

白化相當於在零均值化和歸一化操作之間插入一個旋轉操作,將資料投影到主軸上。一張圖片經過白化後,可以認為每個畫素之間是統計獨立的。然而白化很少在卷積神經網路中使用,可能原因是影象資訊本來就是依靠畫素之間的相對差異來體現的,白化讓畫素間去相關,讓這種差異變得不確定,損失了資訊。

首先將資料零均值化,再計算協方差矩陣(convariance matrix)來觀察資料中的相關結構。

然後做去相關操作,即透過將原始資料(零均值化後的資料)投影到特徵基空間(eigenbasis)。

最後一步變換是白化,即把特徵基空間的資料除以每個維度的特徵值來標準化尺度。

PCA 白化的一個缺點是會增加資料中的噪聲,因為它把輸入資料的所有維度都延伸到相同的大小,這些維度中就包含噪音維度(往往表現為不相關的且方差較小)。這種缺點在實際操作中可以透過把 1e - 5 增大到一個更大的值來引入更強的平滑。

網路初始化

3.1 不要將引數全部初始化為零

幾乎所有的 CNN 網路都是堆成結構,將引數零初始化會導致流過網路的資料也是對稱的(都是零),並且沒有辦法在不受擾動的情況下打破這種資料對稱,從而導致網路無法學習。

引數零初始化時,無論輸入是什麼,中間神經元的啟用值都是相同的(任意一個神經元的啟用值 a=f(WTX) , 當權重W是零向量時,WTX 也是零向量,因此經過啟用函式後啟用值都相同),反向傳播過程中計算的梯度也是相同,每個權重引數的更新因此也是相同的,網路因此失去了不對稱性。

3.2 用小的隨機數初始化

初始化引數應該非常接近於零(但不全等於零),來打破網路的對稱性。初始引數應該是隨機且獨立的來保證每個引數更新過程是不同的。給每個引數隨機賦予一個接近零的值:

randn 方法生成一個零均值,方差為 1 的正態分佈的隨機數,同樣也可以換用數值較小的均勻分佈來產生初始化引數,但在實踐中兩種方法最終結果差別不大。

3.3 方差歸一化

用隨機初始化方法來初始化引數會導致輸出 S 的方差隨輸入數量( X 或 W 向量的維度)增加而變大。

獨立隨機變數和的方差具有以下性質:

S 是多個隨機變數的加權和,假設 W 各維度之間相互獨立,隨著資料維度增長,S 的方差將會線性積累,由於資料的維度隨任務的不同,是不可控的,所以我們希望將 S 的方差做歸一化,這隻需要對 W 做處理就可以了:

上面操作是正確的推導過程:

訓練過程中的技巧

4.1 卷積濾波器和池化層大小

輸入資料最好是 2 的整數冪次方,比如 32(CIFAR-10 中圖片尺寸),64,224(ImageNet 中常見的尺寸)。此外採用較小尺寸的濾波器(例 3x3),小的步長(例 1)和 0 值填充,不僅會減少引數數量,還會提升整個網路的準確率。當用 3x3 的濾波器,步長為 1,填充(pad)為 1 時,會保持圖片或特徵圖的空間尺寸不變。池化層經常用的池化大小是 2x2 。

4.2 學習率

使用驗證集是獲得合適 LR(Learning Rate)的有效手段。開始訓練時,LR 通常設為 0。1 。在實踐中,當你觀察到在驗證集上的 loss 或者準確率不在變化時,將 LR 除以 2 或 5 後繼續跑。

4.3 在預訓練的模型上微調

很多 state-of-the-arts deep networks 的模型被開源出來,這些預訓練的模型泛化能力(generalization abilities)很強,因此可以在這些模型的基礎上根據自己的任務微調。微調涉及兩個重要的因素:新資料集的大小和兩個資料集的相似度。網路頂層特徵包含更多 dataset-specific 特徵。

啟用函式的選擇

啟用函式用於在網路中引入非線性。sigmoid 與 tanh 曾經很流行,但現在很少用於視覺模型了,主要原因在於當輸入的絕對值較大時,其梯度(導數)接近於零,這時引數幾乎不再更新,梯度的反向傳播過程將被中斷,出現梯度消散的現象。

啟用函式示意圖,圖片來自斯坦福 Stanford CS231n

深度神經網路訓練的必知技巧

Sigmoid 啟用函式

深度神經網路訓練的必知技巧

tanh 啟用函式

深度神經網路訓練的必知技巧

ReLU 啟用函式

ReLU 優點:

實現起來非常簡單,加速了計算過程。

加速收斂,沒有飽和問題,大大緩解了梯度消散的現象。

ReLU 缺點:

就是它可能會永遠“死”掉,假如有一組二維資料 X(x1, x2)分佈在 x1:[0,1],x2:[0,1] 的區域內,有一組引數 W(w1, w2)對 X 做線性變換,並將結果輸入到 ReLU 。

如果 w1 = w2 = -1,那麼無論 X 如何取值,F 必然小於等於零。那麼 ReLU 函式對 F 的導數將永遠為零。這個 ReLU 節點將永遠不參與整個模型的學習過程。

為了解決 ReLU 在負區間的導數為零的問題,人們發明了 Leaky ReLU, Parametric ReLU, Randomized ReLU 等變體,他們的中心思想都是為 ReLU 函式在負區間賦予一定的斜率,從而讓其導數不為零(這裡設斜率為 alpha)。

Leaky ReLU 就是直接給 alpha 指定一個固定的值,整個模型都用這個斜率:

Parametric ReLU 將 alpha 作為一個引數,透過從資料中學習獲取它的最優值。

Randomized ReLU 的alpha 是在規定的區間內隨機選取的,在測試階段是定值。

有學者將當前最優的兩類 CNN 網路結合不同的啟用函式在 CIFAR-10 , CIFAR-100 和 NDSB 資料集上做實驗,評價四種啟用函式的優劣。實驗結果表明 Leaky ReLU 取較大的 alpha 準確率更好。Parametric ReLU 很容易在小資料集上過擬合(訓練集上錯誤率最低,測試集上不理想),但依然比 ReLU 好。RReLU 效果較好,實驗表明它可以克服模型過擬合,這可能由於 alpha 選擇的隨機性。在實踐中, Parametric ReLU 和 Randomized ReLU 都是可取的。

不同正則化方法

以下是幾種常用的方透過控制模型的容量來阻止 神經網路 的過擬合(Overfitting)。

6.1 L2 正則化

L2 正則化也許是最常用的正則化的形式。它可以透過將模型中所有的引數的平方級作為懲罰項加入到目標函式(objective)中來實現。也就是說,對網路中的每一個權重 w ,我們將其項加入到目標函式中,其中λ 是正則化的強度引數。在懲罰項公式的前面加上 1/2 是很常見的,這樣做的原因是因為最佳化函式求導的時候不至於前面產生一個常數項因子 2,而只是 這樣簡單的形式。對 L2 正則化的直觀的解釋是,L2 正則化對尖峰向量的懲罰很強,並且傾向於分散權重的向量。

6.2 L1正則化

L1 正則化是另一個相關的常見的正則化方式。這裡,對於網路中的每一個權重 w ,我們都會加上一個項到目標函式中。L1 正則化有一個非常有趣的屬性,那就是它會使得權重向量w在最佳化期間變得稀疏(例如非常接近零向量)。 帶有 L1 正則化項結尾的神經網路僅僅使用它的最重要的並且接近常量的噪聲的輸入的一個稀疏的子集。相比之下,最終的權重向量從 L2 正則化通常是分散的、小數字。在實踐中,如果你不關心明確的特徵選擇,可以預計 L2 正則化在 L1 的效能優越。

6.3 最大範數約束

正規化的另一種形式是實施絕對上限的大小在每個神經元的權向量中,利用投影梯度下降來強制約束。在實踐中,這對應於執行引數正常更新,然後執行夾緊約束的 vec { w } 每個神經元的權向量滿足平行 vec { w } parallel_2 < c 。典型的 c 值是 3 或 4 的訂單。有些人報告改進在使用這種形式的正規化。其吸引人的特性之一是網路不能“爆炸”即使學習速率。

6.4 Dropout

Dropout 是一個極其有效的、簡單的並且是最近才被提出的正則化技術作為以上三種正則化方法(L1、L2、最大範數約束)的補充 。在訓練期間,dropout 能夠被理解為在一個全連線的神經網路中的神經網路進行子取樣,並且僅僅基於輸入資料更新網路取樣更新的引數。然而,該指數可能的取樣數量,網路並不是獨立的,因為他們共享引數。在測試過程中,dropout沒有被使用。透過整合指數級的所有子網路解釋預測的均值。實踐過程中,dropout 的比率為 p=0。5 是一個合理的預設值。但是這個值可以在驗證資料上進行微調。

最流行使用的正則化技術 Dropout

來自於資料的洞察

7.1 從學習率觀察

太高的學習率,loss 曲線會很奇怪,很容易會出現引數爆炸現象;低學習率,loss 下降很慢;高學習率,一開始 loss 會下降很快,但很容易跌入區域性最小值;好的學習率應該平滑下降。

7.2 放大loss曲線觀察

圖 2 中橫座標是 epoch(網路在整個訓練集上完整的跑一遍的時間,所以每個 epoch 中會有多個 mini batches),縱座標是每個訓練 batch 的分類 loss 。如果 loss 曲線表現出線性(下降緩慢)表明學習率太低;如果 loss 不再下降,表明學習率太高陷入區域性最小值;曲線的寬度和 batch size有關,如果寬度太寬,說明相鄰 batch 間的變化太大,應該減小 batch size 。

7.3 從精確率曲線觀察

圖 3 中紅色線是訓練集上的精確率,綠色驗證集上的精確率。當驗證集上精確度收斂時,紅線和綠線間隔過大很明顯訓練集上出現了過擬合。當兩線間隔很小且準確率都很低時,說明模型學習能力太低,需要增加模型的 capacity 。

整合

在機器學習中,在訓練多個學習器並將它們進行組合來使用是一種前沿的學習方法。眾所周知,整合方法通常在得到更高的精確性的時候相比於單個學習器是至關重要的。並且,整合方法已經在現實任務中取得了偉大的成功。在實際應用中,尤其是挑戰和競賽中,幾乎所有的第一和第二名獲勝者都使用整合。

這裡,我們介紹幾個在深度學習場景中的整合技巧:

8.1 相同的模型,不同的初始化

使用交叉驗證決定最優超引數,然後根據最好的超引數集訓練多個方法,但是使用不同的隨機初始化。這種方法的危險是模型的多樣性僅僅取決於初始化。

8.2 交叉驗證階段的最優模型的發現

使用交叉驗證決定最優超引數,然後選擇少量幾個效果最好的模型進行整合。這樣改善了整合的多樣性,但是他也有風險:例如區域性最優。在實踐中,這可以更容易執行,因為它不需要額外的培訓交叉驗證後的模型。事實上,你可以直接選擇幾個最先進的深度模型從 Caffe Model Zoo 執行整合。

8.3 單個模型的不同檢查

如果訓練的代價很高,有些人取得了有限的成功在不同的檢查點的單一網路隨時間(例如在每個階段)和使用這些形成了一個整體。顯然,這受制於某些缺乏多樣性,但是在實踐中仍然可以工作的很好。這種方法的優點是,非常簡便。

下載1:OpenCV-Contrib擴充套件模組中文版教程

下載2:Python視覺實戰專案52講

下載3:OpenCV實戰專案20講