1. 程式人生 > >第五章(1.6)深度學習——常用的八種神經網路效能調優方案

第五章(1.6)深度學習——常用的八種神經網路效能調優方案

一、神經網路效能調優主要方法

  • 資料增廣
  • 影象預處理
  • 網路初始化
  • 訓練過程中的技巧
  • 啟用函式的選擇
  • 不同正則化方法
  • 來自於資料的洞察
  • 整合多個深度網路

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 python實現程式碼

X-=numpy.mean(X,axis=0) # 即X的每一列都減去該列的均值

X/=numpy.std(X,axis=0) # 資料歸一化

  • 注:對於灰度影象,零均值化也可以減去整張圖片的均值:X-=numpy.mean(X)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)。

  • U,S,V=np.linalg.svd(cov) #計算資料協方差矩陣的奇異值分解(SVDfactorization)
    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做處理就可以了:
    W=numpy.random.randn(n)/sqrt(n) #n是資料維度

  • 上面操作是正確的推導過程:
    n*Var(W) = 1,就得到std(W) = 1 / sqrt(n)
    注意:現在更多的論文中在實際中都在用ReLUs函式,針對ReLUs推薦:
    w=numpy.random.randn(n)*sqrt(2.0/n)

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. 啟用函式

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

啟用函式示意圖
啟用函式示意圖

Sigmoid 啟用函式
Sigmoid 啟用函式

tanh 啟用函式
tanh 啟用函式

ReLU 啟用函式
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 ReLUalpha作為一個引數,通過從資料中學習獲取它的最優值。

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

有學者將當前最優的兩類CNN網路結合不同的啟用函式在CIFAR-10,CIFAR-100NDSB資料集上做實驗,評價四種啟用函式的優劣。

實驗結果表明Leaky ReLU取較大的alpha準確率更好。Parametric ReLU很容易在小資料集上過擬合(訓練集上錯誤率最低,測試集上不理想),但依然比ReLU好。RReLU效果較好,實驗表明它可以克服模型過擬合,這可能由於alpha選擇的隨機性。在實踐中, Parametric ReLURandomized ReLU都是可取的。

6. 正則化(Regularizations)

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

6.1 L1正則化

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

6.2 L2正則化

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

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

最流行使用的正則化技術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. 整合

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

深度學習場景中的整合技巧:

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

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

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

相關推薦

1.6深度學習——常用神經網路效能調方案

一、神經網路效能調優主要方法 資料增廣 影象預處理 網路初始化 訓練過程中的技巧 啟用函式的選擇 不同正則化方法 來自於資料的洞察 整合多個深度網路 1. 資料增廣 在不改變影象類別的情況下,增加資料量,能提高模型的泛化能力。 自然影象的資料增廣方式

1.4深度學習——神經網路架構和原理

一、為什麼需要機器學習 有些任務直接編碼較為複雜,我們不能處理所有的細微之處和簡單編碼,因此,機器學習很有必要。相反,我們向機器學習演算法提供大量資料,讓演算法不斷探索資料並構建模型來解決問題。比如:在新的雜亂照明場景內,從新的角度識別三維物體;編寫一個計算信

1.5深度學習——卷積神經網路簡介

卷積神經網路(Convolutional Neural Network, CNN)是一種前饋神經網路, 在計算機視覺等領域被廣泛應用. 本文將簡單介紹其原理並分析Tensorflow官方提供的示例. 一、工作原理 卷積是影象處理中一種基本方法. 卷積核是一個

回溯法最大團問題

原文:http://www.cnblogs.com/pushing-my-way/archive/2012/08/08/2627993.html 問題描述:團就是最大完全子圖。 給定無向圖G=(V,E)。如果UV,且對任意u,vU 有(u,v)  E,則稱U 是

ALS演算法

程式碼: import org.apache.spark._ import org.apache.spark.mllib.recommendation.{ALS, Rating} object CollaborativeFilter { def main(

1.3自然語言處理實戰——使用tf-idf演算法實現簡單的文字聚類

一、原理 使用jieba切詞 用td-idf計算文字的詞頻和逆文件詞頻 排序選出最重要的2個或3個詞作為這段文字的id 具有相同id的文字被歸為一類 二、使用python實現簡單的文字聚類,其中使用了tf-idf演算法,jieba分詞,把相似的文字聚合在

1.2自然語言處理實戰——打造屬於自己的中文word2vector工具

一、環境 二、實戰演練 訓練語料source.txt 9月12日隨著頒獎典禮的結束,我院獲得了商委系統運動會系列活動之一——足球比賽的季軍,本次比賽立時十天,十二隻球隊分成兩個小組比賽。我院代表隊以小組第二名的成績出現,在和另一小組第二名石油公

1.4自然語言處理實戰——時間語義抽取

一、簡介 本工具是由復旦NLP中的時間分析功能修改而來,做了一些細節和功能的優化,經SpringBoot封裝成web工具。 泛指時間的支援,如:早上、晚上、中午、傍晚等。 時間未來傾向。 如:在週五輸入“週一早上開會”,則識別到下週一早上的時間;在下午

1.4linux下部署tensorflow環境

一、在安裝好 anaconda後,即可通過anaconda安裝tensorflow anaconda安裝請參考:http://blog.csdn.net/lzc4869/article/detail

第二1.6Python基礎知識高階函式

Python函式 一、定義函式 定義一個函式要使用def語句,依次寫出函式名、括號、括號中的引數和冒號:,然後,在縮排塊中編寫函式體,函式的返回值用return語句返回。 示例: def my_abs(x): if x >= 0:

第一1.2機器學習概念圖譜

一、機器學習概念圖譜 二、什麼是機器學習 機器學習(machine learning)是最近非常火的一個領域,關於其一些基本定義百度百科、維基百科或者網上隨便都可以找到很多資料,所以這裡不做過多解釋。 我們解決一個問題有兩種模式: 一種叫做模型驅動

《C語言的科學與藝術》課後習題答案部分1

#include <stdio.h> #include <genlib.h> double RaiseRealToPower(double n,int k); main() { int k; printf("顯示10的K次方,k從-4~4:\n"); printf("------

經典 例 5-6 UVA 540 Team Queue佇列的簡單應用【queue】

【題目分析】用佇列來模擬一個多人排隊的過程。 #include<cstdio> #include<cstring> #include<algorithm> #i

構建之法 團隊和流程

功能 實用 運用 驗證 的人 秘密 開發 個性化 社區 第五章主要講了典型的軟件團隊模式和開發流程。以及我們也將討論團隊模式和開發效率之間的一些關系。 1.非團隊和團隊 團隊的主要特點: 1) 團隊有一致的集體目標,團隊要一起完成這個目標。一個團

UNP學習

igp 編程 函數名 gpo atl clu 運行 poll 發生 一、POSIX信號處理 信號:告知某進程發生了某個事件的通知(軟中斷),通常是異步的。 信號可以:由進程發給另一個進程,由內核發給某個進程。 設置信號處理辦法,有三個選擇: 1.寫一個函數,在信號發生時

5 數值範圍及數值流綜合使用案例----獲取勾股數勾股數

1.產生一個數值範圍        和數字打交道時,有一個常用的東西就是數值範圍。比如,假設你想要生成1和100之間的所有數字。Java 8引入了兩個可以用於IntStream和LongStream的靜態方法,幫助生成這種範圍:range和rangeC

5數值流 去裝箱化

      我們之前學了規約reduce,那麼統計所有菜的總熱量應該這麼做: List<Dish> menu = Arrays.asList( new Dish("pork", false, 800, Dish.Type.MEAT), n

4流的規約操作reduce

我們之前見識了流的終端操作返回了boolen,List,Optional等。那麼這一章節我們介紹諸如求和,找出最大值最小值的玩法。 1.元素求和(或積等其他運算) 這個,用之前的方法,我相信大家都會得: List<Integer> nums = Arrays.asList(1

3查詢和匹配

     另一個常見的資料處理套路是看看資料集中的某些元素是否匹配一個給定的屬性。Stream API通過allMatch、anyMatch、noneMatch、findFirst和findAny方法提供了這樣的工具。 1.檢查謂詞是否至少匹配一個元素an

2使用流-----對映

1.map對映的基本使用       一個非常常見的資料處理套路就是從某些物件中選擇資訊。比如在SQL裡,你可以從表中選擇一列。Stream API也通過map和flatMap方法提供了類似的工具。 List<Dish> menu = Arrays.