1. 程式人生 > 實用技巧 >如何提升演算法效能?

如何提升演算法效能?

目錄

一. 通過資料提升效能

1、獲取更多資料

2、創造更多資料

3、重放縮資料

4、重新架構問題

二.通過演算法提升效能

三.通過調參提升效能

1、分清問題

2、網路超引數調整

3訓練超引數調整

小結


一. 通過資料提升效能

1、獲取更多資料

深度學習基於大量的學習資料,資料的質量直接影響到模型的表現,資料量越多,學習的特徵越多

2、創造更多資料

為了提高模型的泛化能力,當找不到更多樣本但確實需要更多更全的樣本的時,可以考慮自己創造樣本

在影象處理方面,常用的方法包括:圖片的平移、縮放、旋轉、翻轉、裁剪、新增噪聲等方式

如果是一維的波形資料,可以考慮在原有樣本上新增一小段範圍內(如:-2到2之間)的隨機數,這種做法可以在一定程度上彌補自己冒然造出的資料的不準確性,不會改變原有波形的正常走勢。

注意:一般情況下自己基於原有樣本創造出的樣本,不超過原有樣本的5倍

3、重放縮資料

此處和所使用的啟用函式密切相關,當輸出層使用的啟用函式是sigmoid函式時將資料縮放到(0, 1)之間,當使用tanh函式時將資料縮放到(-1, 1)之間。後者是都資料進行標準化使其符合0均值,單位標準差。

4、重新架構問題

不同的問題從不同的角度去理解會有不同解法,當遇到瓶頸是可通過重新觀察資料,尋求更優的解決方式,比如原本理解的迴歸問題是否可以從分類的角度理解。

二.通過演算法提升效能

根據不通的問題劃分,有時可以從機器學習演算法入手,也可以從深度學習來考慮,通過在不同演算法間的比較總會得到最優的那一個。

幾種常見的重取樣方法:

深度學習的過程通常較為漫長如何更快得到想要的結果?

1.在進行大量樣本訓練之前先使用少量的較為簡單的樣本進行訓練,如果實驗結果和預期相差不大,可進行大量樣本訓練。

2.使用的較好的硬體

3.早停法(停止標準詳見文末參考資料)

image.png

圖一 理想訓練集誤差和驗證集誤差

image.png

圖二 實際訓練集誤差和驗證集誤差

三.通過調參提升效能

1、分清問題

1.首先需要弄清楚模型效果不好的原因是過擬合還是欠擬合:

型別

常見情況

對策

過擬合

訓練集表現較好,驗證集表現較差

正則化、dropout方法......

欠擬合

訓練集和驗證集表現都較差

提升網路模型複雜度,增長訓練時間.....

同上圖中的圖二

早停法

2、網路超引數調整

1、輸入畫素:

為便於GPU平行計算,一般將影象大小設定為到 2的次冪。

2、卷積層引數的設定:

卷積核大小一般使用 1x1、3x3 或 5x5

使用 zero padding,可以充分利用邊緣資訊、使輸入大小保持不變

卷積核的個數通常設定為 2的次冪,如 64, 128, 256, 512, 1024 等

3、池化層引數的設定:

一般採用卷積核大小 2x2 ,步長為 2

也可採用 stride convolutional layer 來代替池化層實現下采樣

4、全連線層(可使用 Global Average Pooling 來代替):

Global Average Pooling 和 Average Pooling(Local) 的差別就在 “Global” 這個字眼上。Global 和 Local 在字面上都是用來形容 pooling 視窗區域的。Local 是取 Feature Map 的一個子區域求平均值,然後滑動;Global 顯然就是對整個 Feature Map 求均值了(kernel 的大小設定成和 Feature Map 的相同)

所以,有多少個 Feature Map 就可以輸出多少個節點。一般可將輸出的結果直接餵給 softmax 層
image

5、卷積的選取:

1.卷積核尺寸方面:

大卷積核用多個小卷積核代替(如一個5x5的卷積核可以用兩個3x3的卷積核代替)

使用1×1卷積核

2.卷積層通道方面:

標準卷積用 depthwise 卷積代替

使用分組卷積groups(注意groups的值要為輸入通道核輸出通道的公約數)

分組卷積前使用 channel shuffle

通道加權計算

3.卷積層連線方面:

使用 skip connection,讓模型更深

densely connection,使每一層都融合上其它層的特徵輸出(DenseNet)

4.啟發:

類比到通道加權操作,卷積層跨層連線能否也進行加權處理?

bottleneck + Group conv + channel shuffle + depthwise 的結合會不會成為以後降低引數量的標準配置?

3訓練超引數調整

  1. learning-rate 的選擇
    • 固定學習率時,0.01,0.001 等都是比較好的選擇,另外我們可以通過 validation error 來判斷學習率的好壞,如下圖所示。
    • 自動調整學習率時,可使用 learning rate decay 演算法(step decay,exponential decay)或一些自適應優化演算法(Adam,Adadelta)。
      image
  1. mini-batch 的選擇
    • batch size 太小會使訓練速度很慢;太大會加快訓練速度,但同時會導致記憶體佔用過高,並有可能降低準確率。
    • 所以 32 至 256 是不錯的初始值選擇,尤其是 64 和 128,選擇2的指數倍的原因是:計算機記憶體一般為 2 的指數倍,採用 2 進位制編碼。
  1. dropout
    • 在輸入層和隱藏層同時使用
    • 取20%-50%為佳。

4.使用更大的網路

    • 在更大的網路上使用dropout可以有效提升模型的效能

小結

1:準備資料:務必保證有大量、高質量並且帶有乾淨標籤的資料

2:預處理:0均值和1方差化

3:minibatch:建議值128,1最好,但是效率不高,但過大容易過擬合

4:梯度歸一化:計算出來梯度之後,要除以minibatch的數量。

5:學習率

5.1:用一個一般的學習率開始,逐漸減小

5.2:一個建議值是0.1,適用於很多NN的問題,一般傾向於小一點。

5.3:關於學習率:如果在驗證集上效能不再增加就讓學習率除以2或者5,然後繼續,學習率會一直變得很小,到最後就可以停止訓練了。

5.4:很多人用的一個設計學習率的原則就是監測一個比率(每次更新梯度的norm除以當前weight的norm),如果這個比率在10-3附近,如果小於這個值,學習會很慢,如果大於這個值,那麼學習很不穩定,由此會帶來失敗。

6:使用驗證集可以知道什麼時候該開始降低學習率,什麼時候該停止訓練。

7:關於對weight初始化的選擇的一些建議:

7.1:如果你很懶,直接用0.02*randn(num_params)來初始化,當然別的值你也可以去嘗試

7.2:如果上面那個不太好使,那麼就依次初始化每一個weight矩陣用init_scale / sqrt(layer_width) * randn,init_scale可以被設定為0.1或者1

7.3:初始化引數對結果的影響至關重要,要引起重視。

7.4:在深度網路中,隨機初始化權重,使用SGD的話一般處理的都不好,這是因為初始化的權重太小了。這種情況下對於淺層網路有效,但是當足夠深的時候就不行了,因為weight更新的時候,是靠很多weight相乘的,越乘越小,有點類似梯度消失的意思(這句話是我加的)

8:如果訓練RNN或者LSTM,務必保證gradient的norm被約束在15或者5(前提還是要先歸一化gradient),這一點在RNN和LSTM中很重要。

9:如果是自己算的梯度,需要檢查梯度 。

10:如果使用長短期記憶人工神經網路(LSTM)來解決長時依賴的問題,記得初始化bias的時候要大一點

12:儘可能想辦法多的擴增訓練資料,如果使用的是影象資料,不妨對影象做一點扭轉啊之類的,來擴充資料訓練集合。

13:使用dropout

14:評價最終結果的時候,多做幾次,平均一下所有的結果

參閱資料:

How To Improve Deep Learning Performance(https://machinelearningmastery.com/improve-deep-learning-performance/

深度學習技巧之Early Stopping(早停法)(https://www.datalearner.com/blog/1051537860479157

深度學習技巧之Early Stopping(早停法)(https://blog.csdn.net/df19900725/article/details/82973049

深度學習訓練的小技巧,調參經驗。總結與記錄(https://blog.csdn.net/chenzhi1992/article/details/52905569/?utm_medium=distribute.pc_relevant.none-task-blog-title-7&spm=1001.2101.3001.4242

深度學習中的超引數設定及訓練技巧(https://blog.csdn.net/mzpmzk/article/details/80136958?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.nonecase