當前位置:
首頁 > 知識 > 訓練深度神經網路的必知技巧,你知道哪些?

訓練深度神經網路的必知技巧,你知道哪些?

AI研習社按:本文作者章華燕,金橋智慧科技演算法工程師,原文載於作者個人博客AI研習社已獲授權。

本文將主要介紹 8 種深度神經網路實現細節的技巧或 tricks,包括:數據增廣、圖像預處理、網路初始化、訓練過程中的技巧、激活函數的選擇、不同正則化方法、來自於數據的洞察、集成多個深度網路的方法等。

1. 數據增廣

在不改變圖像類別的情況下,增加數據量,能提高模型的泛化能力。

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

2. 預處理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,axis=0) # 即 X 的每一列都減去該列的均值

註:對於灰度圖像,零均值化也可以減去整張圖片的均值:X-=numpy.mean(X)

X/=numpy.std(X,axis=0) # 數據歸一化。

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

2.2 白化(Whitening)

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

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

X-=np.mean(X,axis=0)

cov=np.dot(X.T,X)/X.shape[0] #計算協方差矩陣

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

Xrot=np.dot(X,U) #對數據去相關

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

Xwhite=Xrot/np.sqrt(S+1e-5) #除以奇異值的平方根,注意到這裡加了個 1e-5 是為了防止分母是 0 的情況。

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

3. 初始化

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

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

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

3.2 用小的隨機數初始化

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

W=0.01*numpy.Random.randn(D,H)

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

3.3 方差歸一化

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

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

Var(A+B+C)=Var(A)+ Var(B)+ Var(C)

S = w1*x1 + w2*x2 +…+wi*xi+ b

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

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

令 n*Var(W) = 1,就得到 std(W) = 1 / sqrt(n)。

注意:現在更多的論文中在實際中都在用 ReLUs 函數,針對 ReLUs 推薦:

4. 訓練過程中

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 特徵。

5. 激活函數

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

激活函數示意圖,圖片來自斯坦福 Stanford CS231n

Sigmoid 激活函數

tanh 激活函數

ReLU 激活函數

ReLU 優點:

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

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

ReLU 缺點:

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

F = w1*x1 + w2*x2

如果 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 都是可取的。

6. 正則化 (Regularizations)

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

6.1 L2 正則化

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

6.2 L1 正則化

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

6.3 最大範數約束6.4 Dropout

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

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

7. 從數字中觀察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. 集成

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

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

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

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

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

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

8.3 單個模型的不同檢查點

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

參考文獻:

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 唯物 的精彩文章:

聊天機器人還能這麼玩!教你用 Tensorflow 搭建能理解語境的客服小二!
一文詳解 Word2vec之Skip-Gram 模型
你聽說過英偉達深度學習學院 DLI 嗎?
Yann LeCun 最新研究成果:可以幫助 GAN 使用離散數據的 ARAE
手把手教你用 PyTorch 辨別自然語言

TAG:唯物 |

您可能感興趣

這幾種必知的養花的小技巧,你都知道嗎?
買壺、玩壺 這些知識你未必知道!
跑鞋裡的高科技,你還真未必知道?
你不必知道的一些事
家長必知!想要挑選合適的好奶粉?不知道這些知識可不行!
皮膚深度清潔後怎樣護膚?皮膚深度清潔必知禁忌,你知道嗎?
西洋參的這些妙用,恐怕你未必知道
養寵物必知的幾大謠言,你可能已經相信了,你知道是哪幾條嗎?
這些魚常見,這些冷知識你未必知道
就連語文老師都未必知道的冷知識,快收藏吧!
你知道血檀,但你未必知道血檀的功效與作用?
彌勒佛的這些秘密 你未必知道!
丹道修鍊必知,氣沖病灶過程詳解!
你知道邊牧的智商非常的高,但你未必知道為什麼養的人卻不多?
媽媽必知的育兒知識有哪些
你永遠都不必知道
水痘知識,必知!
尿路結石知多少?尿路結石的病因、癥狀和治療,你未必知道!
都說生孩子疼,具體哪些情況疼你卻未必知道,那滋味經歷過才懂
小米粥怎麼才能熬出「米油」?經常熬粥的人,也未必知道這些技巧