文章目錄
- 14.1 寫在前面
- 14.2 超參數概述
- 14.2.1 什麼是超參數,參數和超參數的區別
- 14.2.2 神經網絡中包含哪些超參數
- 14.2.3 模型優化尋找最優解和正則項之間的關係
- 14.2.4 超參數的重要性順序
- 14.2.5 部分超參數如何影響模型性能
- 14.2.6 部分超參數合適的範圍
- 14.3 網絡訓練中的超參調整策略
- 14.3.1 如何調試模型?
- 14.3.2 爲什麼要做學習率調整?
- 14.3.3 學習率調整策略有哪些?
- 14.3.4 極端批樣本數量下,如何訓練網絡?
- 14.3.5 爲什麼卷積核設計尺寸都是奇數
- 14.3.6 權重共享的形式有哪些,爲什麼要權重共享
- 14.4 合理使用預訓練網絡
- 14.4.1 什麼是微調(fine-tune)
- 14.4.2 微調有哪些不同方法?
- 14.4.3 微調先凍結底層,訓練頂層的原因?
- 14.4.4 不同的數據集特性下如何微調?
- 14.4.4 目標檢測中使用預訓練模型的優劣?
- 14.4.5 目標檢測中如何從零開始訓練?
- 14.5 如何改善 GAN 的性能
- 14.6 AutoML
# 第十四章 超參數調整
Markdown Revision 1;
Date: 2018/10/25
Editor: 喬成磊-同濟大學,王超鋒
Contact: [email protected],[email protected]
Updater: sjsdfg,王超鋒
14.1 寫在前面
關於訓練深度學習模型最難的事情之一是你要處理的參數的數量。無論是從網絡本身的層寬(寬度)、層數(深度)、連接方式,還是損失函數的超參數設計和調試,亦或者是學習率、批樣本數量、優化器參數等等。這些大量的參數都會有網絡模型最終的有效容限直接或者間接的影響。面對如此衆多的參數,如果我們要一一對其優化調整,所需的無論是時間、資源都是不切實際。結果證實一些超參數比其它的更爲重要,因此認識各個超參數的作用和其可能會造成的影響是深度學習訓練中必不可少的一項重要技能。
目前,超參數調整一般分爲手動調整和自動優化超參數兩種。本章節不會過多闡述所有超參數的詳細原理,如果需要了解這部分,您可以翻閱前面的基礎章節或者查閱相關文獻資料。當然,下面會講到的一些超參數優化的建議是根據筆者們的實踐以及部分文獻資料得到認知建議,並不是非常嚴格且一定有效的,很多研究者可能會很不同意某些的觀點或有着不同的直覺,這都是可保留討論的,因爲這很依賴於數據本身情況。
14.2 超參數概述
14.2.1 什麼是超參數,參數和超參數的區別
區分兩者最大的一點就是是否通過數據來進行調整,模型參數通常是有數據來驅動調整,超參數則不需要數據來驅動,而是在訓練前或者訓練中人爲的進行調整的參數。例如卷積核的具體核參數就是指模型參數,這是有數據驅動的。而學習率則是人爲來進行調整的超參數。這裏需要注意的是,通常情況下卷積核數量、卷積核尺寸這些也是超參數,注意與卷積核的核參數區分。
14.2.2 神經網絡中包含哪些超參數
通常可以將超參數分爲三類:網絡參數、優化參數、正則化參數。
網絡參數:可指網絡層與層之間的交互方式(相加、相乘或者串接等)、卷積核數量和卷積核尺寸、網絡層數(也稱深度)和激活函數等。
優化參數:一般指學習率(learning rate)、批樣本數量(batch size)、不同優化器的參數以及部分損失函數的可調參數。
正則化:權重衰減係數,丟棄法比率(dropout)
14.2.3 模型優化尋找最優解和正則項之間的關係
網絡模型優化調整的目的是爲了尋找到全局最優解(或者相比更好的局部最優解),而正則項又希望模型儘量擬合到最優。兩者通常情況下,存在一定的對立,但兩者的目標是一致的,即最小化期望風險。模型優化希望最小化經驗風險,而容易陷入過擬合,正則項用來約束模型複雜度。所以如何平衡兩者之間的關係,得到最優或者較優的解就是超參數調整優化的目的。
14.2.4 超參數的重要性順序
-
首先, 學習率,損失函數上的可調參數。在網絡參數、優化參數、正則化參數中最重要的超參數可能就是學習率了。學習率直接控制着訓練中網絡梯度更新的量級,直接影響着模型的有效容限能力;損失函數上的可調參數,這些參數通常情況下需要結合實際的損失函數來調整,大部分情況下這些參數也能很直接的影響到模型的的有效容限能力。這些損失一般可分成三類,第一類輔助損失結合常見的損失函數,起到輔助優化特徵表達的作用。例如度量學習中的Center loss,通常結合交叉熵損失伴隨一個權重完成一些特定的任務。這種情況下一般建議輔助損失值不高於或者不低於交叉熵損失值的兩個數量級;第二類,多任務模型的多個損失函數,每個損失函數之間或獨立或相關,用於各自任務,這種情況取決於任務之間本身的相關性,目前筆者並沒有一個普適的經驗由於提供參考;第三類,獨立損失函數,這類損失通常會在特定的任務有顯著性的效果。例如RetinaNet中的focal loss,其中的參數γ,α,對最終的效果會產生較大的影響。這類損失通常論文中會給出特定的建議值。
-
其次,批樣本數量,動量優化器(Gradient Descent with Momentum)的動量參數β。批樣本決定了數量梯度下降的方向。過小的批數量,極端情況下,例如batch size爲1,即每個樣本都去修正一次梯度方向,樣本之間的差異越大越難以收斂。若網絡中存在批歸一化(batchnorm),batch size過小則更難以收斂,甚至垮掉。這是因爲數據樣本越少,統計量越不具有代表性,噪聲也相應的增加。而過大的batch size,會使得梯度方向基本穩定,容易陷入局部最優解,降低精度。一般參考範圍會取在[1:1024]之間,當然這個不是絕對的,需要結合具體場景和樣本情況;動量衰減參數β是計算梯度的指數加權平均數,並利用該值來更新參數,設置爲 0.9 是一個常見且效果不錯的選擇;
-
最後,Adam優化器的超參數、權重衰減係數、丟棄法比率(dropout)和網絡參數。在這裏說明下,這些參數重要性放在最後並不等價於這些參數不重要。而是表示這些參數在大部分實踐中不建議過多嘗試,例如Adam優化器中的β1,β2,ϵ,常設爲 0.9、0.999、10−8就會有不錯的表現。權重衰減係數通常會有個建議值,例如0.0005 ,使用建議值即可,不必過多嘗試。dropout通常會在全連接層之間使用防止過擬合,建議比率控制在[0.2,0.5]之間。使用dropout時需要特別注意兩點:一、在RNN中,如果直接放在memory cell中,循環會放大噪聲,擾亂學習。一般會建議放在輸入和輸出層;二、不建議dropout後直接跟上batchnorm,dropout很可能影響batchnorm計算統計量,導致方差偏移,這種情況下會使得推理階段出現模型完全垮掉的極端情況;網絡參數通常也屬於超參數的範圍內,通常情況下增加網絡層數能增加模型的容限能力,但模型真正有效的容限能力還和樣本數量和質量、層之間的關係等有關,所以一般情況下會選擇先固定網絡層數,調優到一定階段或者有大量的硬件資源支持可以在網絡深度上進行進一步調整。
14.2.5 部分超參數如何影響模型性能
超參數 | 如何影響模型容量 | 原因 | 注意事項 |
---|---|---|---|
學習率 | 調至最優,提升有效容量 | 過高或者過低的學習率,都會由於優化失敗而導致降低模型有效容限 | 學習率最優點,在訓練的不同時間點都可能變化,所以需要一套有效的學習率衰減策略 |
損失函數部分超參數 | 調至最優,提升有效容量 | 損失函數超參數大部分情況都會可能影響優化,不合適的超參數會使即便是對目標優化非常合適的損失函數同樣難以優化模型,降低模型有效容限。 | 對於部分損失函數超參數其變化會對結果十分敏感,而有些則並不會太影響。在調整時,建議參考論文的推薦值,並在該推薦值數量級上進行最大最小值調試該參數對結果的影響。 |
批樣本數量 | 過大過小,容易降低有效容量 | 大部分情況下,選擇適合自身硬件容量的批樣本數量,並不會對模型容限造成。 | 在一些特殊的目標函數的設計中,如何選擇樣本是很可能影響到模型的有效容限的,例如度量學習(metric learning)中的N-pair loss。這類損失因爲需要樣本的多樣性,可能會依賴於批樣本數量。 |
丟棄法 | 比率降低會提升模型的容量 | 較少的丟棄參數意味着模型參數量的提升,參數間適應性提升,模型容量提升,但不一定能提升模型有效容限 | |
權重衰減係數 | 調至最優,提升有效容量 | 權重衰減可以有效的起到限制參數變化的幅度,起到一定的正則作用 | |
優化器動量 | 調至最優,可能提升有效容量 | 動量參數通常用來加快訓練,同時更容易跳出極值點,避免陷入局部最優解。 | |
模型深度 | 同條件下,深度增加,模型容量提升 | 同條件,下增加深度意味着模型具有更多的參數,更強的擬合能力。 | 同條件下,深度越深意味着參數越多,需要的時間和硬件資源也越高。 |
卷積核尺寸 | 尺寸增加,模型容量提升 | 增加捲積核尺寸意味着參數量的增加,同條件下,模型參數也相應的增加。 |
14.2.6 部分超參數合適的範圍
超參數 | 建議範圍 | 注意事項 |
---|---|---|
初始學習率 | SGD: [1e-2, 1e-1] momentum: [1e-3, 1e-2] Adagrad: [1e-3, 1e-2] Adadelta: [1e-2, 1e-1] RMSprop: [1e-3, 1e-2] Adam: [1e-3, 1e-2] Adamax: [1e-3, 1e-2] Nadam: [1e-3, 1e-2] |
這些範圍通常是指從頭開始訓練的情況。若是微調,初始學習率可在降低一到兩個數量級。 |
損失函數部分超參數 | 多個損失函數之間,損失值之間儘量相近,不建議超過或者低於兩個數量級 | 這是指多個損失組合的情況,不一定完全正確。單個損失超參數需結合實際情況。 |
批樣本數量 | [1:1024] | 當批樣本數量過大(大於6000)或者等於1時,需要注意學習策略或者BN的替代品。 |
丟棄法比率 | [0, 0.5] | |
權重衰減係數 | [0, 1e-4] | |
卷積核尺寸 | [7x7],[5x5],[3x3],[1x1], [7x1,1x7] |
14.3 網絡訓練中的超參調整策略
14.3.1 如何調試模型?
在討論如何調試模型之前,我們先來糾正一個誤區。通常理解如何調試模型的時候,我們想到一系列優秀的神經網絡模型以及調試技巧。但這裏需要指出的是數據纔是模型的根本,如果有一批質量優秀的數據,或者說你能將數據質量處理的很好的時候,往往比挑選或者設計模型的收益來的更大。那在這之後纔是模型的設計和挑選以及訓練技巧上的事情。
1、探索和清洗數據。探索數據集是設計算法之前最爲重要的一步,以圖像分類爲例,我們需要重點知道給定的數據集樣本類別和各類別樣本數量是否平衡,圖像之間是否存在跨域問題(例如網上爬取的圖像通常質量各異,存在噪聲)。若是類別數遠遠超過類別樣本數(比如類別10000,每個類別卻只有10張圖像),那通常的方法可能效果並不顯著,這時候few-shot learning或者對數據集做進一步增強可能是你比較不錯的選擇。再如目標檢測,待檢測目標在數據集中的尺度範圍是對檢測器的性能有很大影響的部分。因此重點是檢測大目標還是小目標、目標是否密集完全取決於數據集本身。所以,探索和進一步清洗數據集一直都是深度學習中最重要的一步。這是很多新手通常會忽略的一點。
2、探索模型結果。探索模型的結果,通常是需要對模型在驗證集上的性能進行進一步的分析,這是如何進一步提升模型性能很重要的步驟。將模型在訓練集和驗證集都進行結果的驗證和可視化,可直觀的分析出模型是否存在較大偏差以及結果的正確性。以圖像分類爲例,若類別間樣本數量很不平衡時,我們需要重點關注少樣本類別在驗證集的結果是否和訓練集的出入較大,對出錯類別可進一步進行模型數值分析以及可視化結果分析,進一步確認模型的行爲。
3、監控訓練和驗證誤差。首先很多情況下,我們忽略代碼的規範性和算法撰寫正確性驗證,這點上容易產生致命的影響。在訓練和驗證都存在問題時,首先請確認自己的代碼是否正確。其次,根據訓練和驗證誤差進一步追蹤模型的擬合狀態。若訓練數據集很小,此時監控誤差則顯得格外重要。確定了模型的擬合狀態對進一步調整學習率的策略的選擇或者其他有效超參數的選擇則會更得心應手。
4、反向傳播數值的計算,這種情況通常適合自己設計一個新操作的情況。目前大部分流行框架都已包含自動求導部分,但並不一定是完全符合你的要求的。驗證求導是否正確的方式是比較自動求導的結果和有限差分計算結果是否一致。所謂有限差分即導數的定義,使用一個極小的值近似導數。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-LM5oG3VX-1575791570200)(./img/ch14/%E5%AF%BC%E6%95%B0.png)]
14.3.2 爲什麼要做學習率調整?
學習率可以說是模型訓練最爲重要的超參數。通常情況下,一個或者一組優秀的學習率既能加速模型的訓練,又能得到一個較優甚至最優的精度。過大或者過小的學習率會直接影響到模型的收斂。我們知道,當模型訓練到一定程度的時候,損失將不再減少,這時候模型的一階梯度接近零,對應Hessian 矩陣通常是兩種情況,一、正定,即所有特徵值均爲正,此時通常可以得到一個局部極小值,若這個局部極小值接近全局最小則模型已經能得到不錯的性能了,但若差距很大,則模型性能還有待於提升,通常情況下後者在訓練初最常見。二,特徵值有正有負,此時模型很可能陷入了鞍點,若陷入鞍點,模型性能表現就很差。以上兩種情況在訓練初期以及中期,此時若仍然以固定的學習率,會使模型陷入左右來回的震盪或者鞍點,無法繼續優化。所以,學習率衰減或者增大能幫助模型有效的減少震盪或者逃離鞍點。
14.3.3 學習率調整策略有哪些?
通常情況下,大部分學習率調整策略都是衰減學習率,當然也有部分增大學習率的策略。這裏結合TensorFlow的內置方法來舉例。
1、exponential_decay和natural_exp_decay
exponential_decay(learning_rate, global_step, decay_steps, decay_rate,
staircase=False, name=None)
natural_exp_decay(learning_rate, global_step, decay_steps, decay_rate,
staircase=False, name=None)
指數衰減是最常用的衰減方式,這種方式簡單直接,在訓練初期衰減較大利於收斂,在後期衰減較小利於精調。以上兩種均爲指數衰減,區別在於後者使用以自然指數下降。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VTsxWPzE-1575791570201)(.\img\ch14\指數衰減.jpeg)]
2、piecewise_constant
piecewise_constant(x, boundaries, values, name=None)
分段設置學習率法,跟指數型類似,區別在於每個階段的衰減並不是按指數調整。可在不同階段設置手動不同的學習率。這種學習率重點在有利於精調。
3、polynomial_decay
polynomial_decay(learning_rate, global_step, decay_steps,
end_learning_rate=0.0001, power=1.0,
cycle=False, name=None)
多項式衰減,計算如下:
global_step = min(global_step,decay_steps)
decayed_learning_rate = (learning_rate-end_learning_rate)*(1-global_step/decay_steps)^ (power)+end_learning_rate
有別去上述兩種,多項式衰減則是在每一步迭代上都會調整學習率。主要看Power參數,若Power爲1,則是下圖中的紅色直線;若power小於1,則是開1/power次方,爲藍色線;綠色線爲指數,power大於1。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-zy4VQTfD-1575791570203)(.\img\ch14\多項式衰減.jpeg)]
此外,需要注意的是參數cycle,cycle對應的是一種週期循環調整的方式,主要的目的在後期防止在一個局部極小值震盪,若跳出該區域或許能得到更有的結果。這裏說明cycle的方式不止可以在多項式中應用,可配合類似的週期函數進行衰減,如下圖。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-kF3Bamzv-1575791570205)(.\img\ch14\cycle衰減.jpeg)]
4、inverse_time_decay
inverse_time_decay(learning_rate, global_step, decay_steps, decay_rate,
staircase=False, name=None)
逆時衰減,這種方式和指數型類似。如圖,[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-zI05Nbvw-1575791570207)(.\img\ch14\逆時衰減.jpeg)]
5、cosine_decay
cosine_decay(learning_rate, global_step, decay_steps, alpha=0.0,
name=None)
餘弦衰減,即按餘弦函數的方式衰減學習率,如圖
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-7T6JfylJ-1575791570207)(.\img\ch14\餘弦衰減.jpeg)]
6、cosine_decay_restarts
cosine_decay_restarts(learning_rate, global_step, first_decay_steps,
t_mul=2.0, m_mul=1.0, alpha=0.0, name=None)
餘弦重啓衰減,即餘弦版本的cycle策略,作用與多項式衰減中的cycle相同。區別在於餘弦重啓衰減會重新回到初始學習率,拉長週期,而多項式版本則會逐週期衰減。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-O47Ruvlk-1575791570209)(.\img\ch14\餘弦cycle衰減.jpeg)]
7、linear_cosine_decay
linear_cosine_decay(learning_rate, global_step, decay_steps,
num_periods=0.5, alpha=0.0, beta=0.001,
name=None)
線性餘弦衰減,主要應用於增強學習領域。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-1yrFtfWZ-1575791570209)(.\img\ch14\線性餘弦衰減.jpeg)]
8、noisy_linear_cosine_decay
噪聲線性餘弦衰減,即在線性餘弦衰減中加入隨機噪聲,增大尋優的隨機性。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-gx1Ah7MT-1575791570211)(.\img\ch14\噪聲線性餘弦衰減.jpeg)]
14.3.4 極端批樣本數量下,如何訓練網絡?
14.3.5 爲什麼卷積核設計尺寸都是奇數
主要原因有兩點:
- 保證像素點中心位置,避免位置信息偏移
- 填充邊緣時能保證兩邊都能填充,原矩陣依然對稱
14.3.6 權重共享的形式有哪些,爲什麼要權重共享
權重共享的形式:
- 深度學習中,權重共享最具代表性的就是卷積網絡的卷積操作。卷積相比於全連接神經網絡參數大大減少;
- 多任務網絡中,通常爲了降低每個任務的計算量,會共享一個骨幹網絡。
- 一些相同尺度下的結構化遞歸網絡
權重共享的好處:
權重共享一定程度上能增強參數之間的聯繫,獲得更好的共性特徵。同時很大程度上降低了網絡的參數,節省計算量和計算所需內存(當然,結構化遞歸併不節省計算量)。此外權重共享能起到很好正則的作用。正則化的目的是爲了降低模型複雜度,防止過擬合,而權重共享則正好降低了模型的參數和複雜度。
因此一個設計優秀的權重共享方式,在降低計算量的同時,通常會較獨享網絡有更好的效果。
14.4 合理使用預訓練網絡
14.4.1 什麼是微調(fine-tune)
微調(fine-tune),顧名思義指稍微調整參數即可得到優秀的性能,是遷移學習的一種實現方式。微調和從頭訓練(train from scratch)的本質區別在於模型參數的初始化,train from scratch通常指對網絡各類參數進行隨機初始化(當然隨機初始化也存在一定技巧),隨機初始化模型通常不具有任何預測能力,通常需要大量的數據或者特定域的數據進行從零開始的訓練,這樣需要訓練到優秀的模型通常是稍困難的。而微調的網絡,網絡各類參數已經在其他數據集(例如ImageNet數據集)完成較好調整的,具備了較優秀的表達能力。因此,我們只需要以較小的學習速率在自己所需的數據集領域進行學習即可得到較爲優秀的模型。微調通常情況下,無須再重新設計網絡結構,預訓練模型提供了優秀的結構,只需稍微修改部分層即可。在小數據集上,通常微調的效果比從頭訓練要好很多,原因在於數據量較小的前提下,訓練更多參數容易導致過度擬合。
14.4.2 微調有哪些不同方法?
以圖像分類爲例,通常情況下由於不同數據集需要的類別數不同,我們需要修改網絡的輸出頂層。這種情況下有兩種微調方式:
-
不凍結網絡模型的任何層,對最後的改動層使用較大的學習率,對未改動層以較小的學習率進行訓練全模型訓練,進行多輪訓練即可。即一步完成訓練。
-
凍結除了頂部改動層以外的所有層參數,即不對凍結部分的層進行參數訓練更新,進行若干輪的微調訓練後,放開頂部層以下的若干層或者全部放開所有層的參數,再次進行若干輪訓練即可。即分多步訓練。
以上兩種都屬於微調。目前由於存在大量優秀的預訓練模型,如何確定哪個模型適合自己的任務並能得到最佳性能需要花大量的時間探索。此時,上述的前者是種不錯訓練方式,你無須進行過多分步的操作。而當探索到一個比較適合的模型時,你不妨可以再次重新嘗試下以第二種方式進行訓練,或許能得到相比於前者稍高些的性能,因爲小數據集上調整過多的參數過擬合的機率也會增大,當然這並不是絕對的。
14.4.3 微調先凍結底層,訓練頂層的原因?
14.12中第二種凍結多步訓練的方式。首先凍結除了頂部改動層以外的所有層參數,對頂層進行訓練,這個過程可以理解爲頂層的域適應訓練,主要用來訓練適應模型的現有特徵空間,防止頂層糟糕的初始化,對已經具備一定表達能力的層的干擾和破壞,影響最終的性能。之後,在很多深度學習框架教程中會使用放開頂層往下一半的層數,繼續進行微調。這樣的好處在於越底層的特徵通常是越通用的特徵,越往上其整體的高層次語義越完備,這通過感受野很容易理解。所以,若預訓練模型的數據和微調訓練的數據語義差異越大(例如ImageNet的預模型用於醫學圖像的訓練),那越往頂層的特徵語義差異就越大,因此通常也需要進行相應的調整。
14.4.4 不同的數據集特性下如何微調?
- 數據集數據量少,數據和原數據集類似。這是通常做法只需修改最後的輸出層,訓練即可,訓練過多參數容易過擬合。
- 數據集數據量少,數據和原數據集差異較大。由於數據差異較大,可以在完成輸出頂層的微調後,微調頂層往下一半的層數,進行微調。
- 數據集數據量大,數據與原數據集差異較大。這種情況下,通常已經不需要用預訓練模型進行微調,通常直接重新訓練即可。
- 數據集數據量大,數據與原數據類似。這時預訓練模型的參數是個很好的初始化,可利用預訓練模型放開所有層以較小的學習率微調即可。
14.4.4 目標檢測中使用預訓練模型的優劣?
目標檢測中無論是一階段的YOLO、SSD或者RetinaNet 還是二階段的Faster R-CNN、R-FCN 和 FPN都是基於ImageNet上預訓練好的分類模型。
優勢在於:
1、正如大部分微調的情況一樣,使用預訓練網絡已擁有優秀的語義特徵,能有效的加快訓練速度;
2、其次,對於大部分二階段的模型來說,並未實現嚴格意義上的完全端對端的訓練,所以使用預訓練模型能直接提取到語義特徵,能使兩個階段的網絡更容易實現模型的優化。
劣勢在於,分類模型和檢測模型之間仍然存在一定任務上的差異:
1、檢測模型能在多尺度上獲取更高的收益;
2、分類模型大部分訓練於單目標數據,對同時進行多目標的捕捉能力稍弱;
3、分類模型並不關注目標的位置,在一定程度上讓模型損失部分空間信息,這對檢測模型通常是不利的。
14.4.5 目標檢測中如何從零開始訓練?
參考14.15提到的使用預訓練模型訓練檢測模型的優劣勢,有兩個方案在實際實現中可能會更有效。
方案一、通常二階段檢測模型並未實現真正完全端對端的訓練,因此二階段模型會更難以訓練。所以一階段檢測模型相較起來更適合從零訓練,參考DSOD,使用DenseNet使用更多層次的特徵將更適應訓練。
方案二、二階段模型從零訓練很難,而分類模型對於多目標、尺度並不敏感。因此仍然需要預訓練模型的參數,這時借鑑DetNet訓練一個專屬於目標檢測的模型網絡,而參考分類模型的劣勢,該專屬網絡應對多目標、尺度和位置擁有更強的適應性。
14.5 如何改善 GAN 的性能
優化GAN性能通常需要在如下幾個方面進行
- 設計或選擇更適合目的代價函數。
- 添加額外的懲罰。
- 避免判別器過度自信和生成器過度擬合。
- 更好的優化模型的方法。
- 添加標籤明確優化目標。
GAN常用訓練技巧
-
輸入規範化到(-1,1)之間,最後一層的激活函數使用tanh(BEGAN除外)
-
使用wassertein GAN的損失函數,
-
如果有標籤數據的話,儘量使用標籤,也有人提出使用反轉標籤效果很好,另外使用標籤平滑,單邊標籤平滑或者雙邊標籤平滑
-
使用mini-batch norm, 如果不用batch norm 可以使用instance norm 或者weight norm
-
避免使用RELU和pooling層,減少稀疏梯度的可能性,可以使用leakrelu激活函數
-
優化器儘量選擇ADAM,學習率不要設置太大,初始1e-4可以參考,另外可以隨着訓練進行不斷縮小學習率,
-
給D的網絡層增加高斯噪聲,相當於是一種正則
14.6 AutoML
14.6.1 什麼是AutoML?
目前一個優秀的機器學習和深度學習模型,離不開這幾個方面:
一、優秀的數據預處理;
二、合適的模型結構和功能;
三、優秀的訓練策略和超參數;
四、合適的後處理操作;
五、嚴格的結果分析。
這幾方面都對最終的結果有着舉足輕重的影響,這也是目前的數據工程師和學者們的主要工作。但由於這每一方面都十分繁瑣,尤其是在構建模型和訓練模型上。而大部分情況下,這些工作有無須過深專業知識就能使用起來。所以AutoML主要的作用就是來幫助實現高效的模型構建和超參數調整。例如深度學習網絡的架構搜索、超參數的重要性分析等等。當然AutoML並不簡單的進行暴力或者隨機的搜索,其仍然需要機器學習方面的知識,例如貝葉斯優化、強化學習、元學習以及遷移學習等等。目前也有些不錯的AutoML工具包,例如Alex Honchar的Hyperopt、微軟的NNI、Autokeras等。
14.6.2 自動化超參數搜索方法有哪些?
目前自動化搜索主要包含網格搜索,隨機搜索,基於模型的超參優化
網格搜索:
通常當超參數量較少的時候,可以使用網格搜索法。即列出每個超參數的大致候選集合。利用這些集合 進行逐項組合優化。在條件允許的情況下,重複進行網格搜索會當優秀,當然每次重複需要根據上一步得到的最優參數組合,進行進一步的細粒度的調整。網格搜索最大的問題就在於計算時間會隨着超參數的數量指數級的增長。
隨機搜索:
隨機搜索,是一種用來替代網格搜索的搜索方式。隨機搜索有別於網格搜索的一點在於,我們不需要設定一個離散的超參數集合,而是對每個超參數定義一個分佈函數來生成隨機超參數。隨機搜索相比於網格搜索在一些不敏感超參上擁有明顯優勢。例如網格搜索對於批樣本數量(batch size),在[16,32,64]這些範圍內進行逐項調試,這樣的調試顯然收益更低下。當然隨機搜索也可以進行細粒度範圍內的重複的搜索優化。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-M5U5DiYS-1575791570212)(.\img\ch14\14.14.png)]
基於模型的超參優化:
有別於上述兩種的搜索策略,基於模型的超參調優問題轉化爲了優化問題。直覺上會考慮是否進行一個可導建模,然後利用梯度下降進行優化。但不幸的是我們的超參數通常情況下是離散的,而且其計算代價依舊很高。
基於模型的搜索算法,最常見的就是貝葉斯超參優化。有別於的網格搜索和隨機搜索獨立於前幾次搜索結果的搜索,貝葉斯則是利用歷史的搜索結果進行優化搜索。其主要有四部分組成,1.目標函數,大部分情況下就是模型驗證集上的損失。2、搜索空間,即各類待搜索的超參數。3、優化策略,建立的概率模型和選擇超參數的方式。4、歷史的搜索結果。首先對搜索空間進行一個先驗性的假設猜想,即假設一種選擇超參的方式,然後不斷的優化更新概率模型,最終的目標是找到驗證集上誤差最小的一組超參數。
14.6.3 什麼是神經網絡架構搜索(NAS)
2015至2017年間,是CNN網絡設計最興盛的階段,大多都是由學者人工設計的網絡結構。這個過程通常會很繁瑣。其主要原因在於對不同模塊組件的組成通常是個黑盒優化的問題,此外,在不同結構超參數以及訓練超參數的選擇優化上非凸優化問題,或者是個混合優化問題,既有離散空間又有連續空間。NAS(Neural Architecture Search)的出現就是爲了解決如何通過機器策略和自動化的方式設計出優秀高效的網絡。而這種策略通常不是統一的標準,不同的網絡結合實際的需求通常會有不同的設計,比如移動端的模型會在效率和精度之間做平衡。目前的網絡架構搜索通常會分爲三個方面,搜索空間,搜索策略以及評價預估。鏈接 | https://www.paperweekly.site/papers/2249
-
搜索空間,定義了優化問題的變量,網絡結構和超參數的變量定義有所不同,不同的變量規模對於算法的難度來說也不盡相同。早期很多工作都是用以遺傳算法爲代表的進化算法對神經網絡的超參數和權重進行優化,因爲當時的神經網絡只有幾層,每層十幾個神經元,也不存在複雜的網絡架構,參數很有限,可直接進行優化。而深度學習模型一方面有着複雜的網絡結構,另一方面權重參數通常都以百萬到億來計,進化算法根本無法優化。但換個思路,假如我們找到了一組網絡架構參數和對應的超參數,深度學習模型的性能其實是由這組參數來控制和決定的,所以只需要對複雜模型的架構參數和對應的超參數進行優化即可。
-
搜索策略, 搜索策略定義了使用怎樣的算法可以快速、準確找到最優的網絡結構參數配置。常見的搜索方法包括:隨機搜索、貝葉斯優化、進化算法、強化學習、基於梯度的算法。其中,2017 年穀歌大腦的那篇強化學習搜索方法將這一研究帶成了研究熱點,後來 Uber、Sentient、OpenAI、Deepmind 等公司和研究機構用進化算法對這一問題進行了研究,這個 task 算是進化算法一大熱點應用。
-
評價預估,類似於工程優化中的代理模型(surrogate model),因爲深度學習模型的效果非常依賴於訓練數據的規模,大規模數據上的模型訓練會非常耗時,對優化結果的評價將會非常耗時,所以需要一些手段去做近似的評估。
一種思路是用一些低保真的訓練集來訓練模型,低保真在實際應用可以有多種表達,比如訓練更少的次數,用原始訓練數據的一部分,低分辨率的圖片,每一層用更少的濾波器等。用這種低保真的訓練集來測試優化算法會大大降低計算時間,但也存在一定的 bias,不過選擇最優的架構並不需要絕對數值,只需要有相對值就可以進行排序選優了;
另一種主流思路是借鑑於工程優化中的代理模型,在很多工程優化問題中,每一次優化得到的結果需要經過實驗或者高保真仿真(有限元分析)進行評價,實驗和仿真的時間非常久,不可能無限制地進行評價嘗試,學者們提出了一種叫做代理模型的迴歸模型,用觀測到的點進行插值預測,這類方法中最重要的是在大搜索空間中如何選擇儘量少的點預測出最優結果的位置;
第三種主流思路是參數級別的遷移,用之前已經訓練好的模型權重參數對target問題進行賦值,從一個高起點的初值開始尋優將會大大地提高效率。在這類問題中,積累了大量的歷史尋優數據,對新問題的尋優將會起到很大的幫助,用遷移學習進行求解,是一個很不錯的思路;另一種比較有意思的思路叫做單次(One-Shot)架構搜索,這種方法將所有架構視作一個 one-shot 模型(超圖)的子圖,子圖之間通過超圖的邊來共享權重。