如何提升演算法效能?
目錄
一. 通過資料提升效能
1、獲取更多資料
深度學習基於大量的學習資料,資料的質量直接影響到模型的表現,資料量越多,學習的特徵越多
2、創造更多資料
為了提高模型的泛化能力,當找不到更多樣本但確實需要更多更全的樣本的時,可以考慮自己創造樣本
在影象處理方面,常用的方法包括:圖片的平移、縮放、旋轉、翻轉、裁剪、新增噪聲等方式
如果是一維的波形資料,可以考慮在原有樣本上新增一小段範圍內(如:-2到2之間)的隨機數,這種做法可以在一定程度上彌補自己冒然造出的資料的不準確性,不會改變原有波形的正常走勢。
注意:一般情況下自己基於原有樣本創造出的樣本,不超過原有樣本的5倍
3、重放縮資料
此處和所使用的啟用函式密切相關,當輸出層使用的啟用函式是sigmoid函式時將資料縮放到(0, 1)之間,當使用tanh函式時將資料縮放到(-1, 1)之間。後者是都資料進行標準化使其符合0均值,單位標準差。
4、重新架構問題
不同的問題從不同的角度去理解會有不同解法,當遇到瓶頸是可通過重新觀察資料,尋求更優的解決方式,比如原本理解的迴歸問題是否可以從分類的角度理解。
二.通過演算法提升效能
根據不通的問題劃分,有時可以從機器學習演算法入手,也可以從深度學習來考慮,通過在不同演算法間的比較總會得到最優的那一個。
幾種常見的重取樣方法:
深度學習的過程通常較為漫長如何更快得到想要的結果?
1.在進行大量樣本訓練之前先使用少量的較為簡單的樣本進行訓練,如果實驗結果和預期相差不大,可進行大量樣本訓練。
2.使用的較好的硬體
3.早停法(停止標準詳見文末參考資料)
圖一 理想訓練集誤差和驗證集誤差
圖二 實際訓練集誤差和驗證集誤差
三.通過調參提升效能
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 層
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訓練超引數調整
- learning-rate 的選擇
-
- 固定學習率時,
0.01,0.001
等都是比較好的選擇,另外我們可以通過 validation error 來判斷學習率的好壞,如下圖所示。 - 自動調整學習率時,可使用 learning rate decay 演算法(step decay,exponential decay)或一些自適應優化演算法(Adam,Adadelta)。
- 固定學習率時,
- mini-batch 的選擇
-
- batch size 太小會使訓練速度很慢;太大會加快訓練速度,但同時會導致記憶體佔用過高,並有可能降低準確率。
- 所以 32 至 256 是不錯的初始值選擇,尤其是
64 和 128
,選擇2的指數倍
的原因是:計算機記憶體一般為 2 的指數倍,採用 2 進位制編碼。
- 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)