數據有限時怎樣調優深度學習模型
遷移學習
所謂遷移學習,就是將一個問題上訓練好的模型通過簡單的調整,使其適用一個新的問題,可以認為是一種模型調優的“取巧”方法。可以類比人的舉一反三能力。
遷移學習的特點
1. 需求數據量少
假設有兩個領域,一個領域已經有很多的數據,能成功地建一個模型,有一個領域數據不多,但是和前面那個領域是關聯的,就可以把那個模型給遷移過來。比如,我們想做一個化妝品推薦模型,但數據量較少,可以先用一個成型的較為穩定的飾品推薦模型進行調優。跨領域的在學術界也有嘗試哦,比如網絡搜索可以遷移到推薦,圖象識別可以遷移到文本識別。
2. 訓練時間少
在沒有GPU的普通臺式機或者筆記本上,實現Google的Inception-v3模型遷移學習訓練過程只需要大約五分鐘(tensorflow框架)。
3. 容易滿足個性化需求
比如每個人都希望自己的手機能夠記住一些習慣,這樣不用每次都去設定它,怎么才能讓手機記住這一點呢?
其實可以通過遷移學習把一個通用的用戶使用手機的模型遷移到個性化的數據上面 。不過,如果數據量足夠的情況下,遷移學習的效果一般不如完全重新訓練哦。遷移學習適合與快速小巧的工程化,解決所謂的冷啟動問題,當數據收集得足夠多了以后,我們再改用深度學習。
遷移學習四種實現方法
1. 樣本遷移Instance-based Transfer Learning
一般就是對樣本進行加權,給比較重要的樣本較大的權重。
樣本遷移即在數據集(源領域)中找到與目標領域相似的數據,把這個數據放大多倍,與目標領域的數據進行匹配。其特點是:需要對不同例子加權;需要用數據進行訓練。比如下圖,可以將一個動物識模型的源數據中的狗狗圖片增多,達到專門針對狗的識別模型。
2. 特征遷移Feature-based Transfer Learning
在特征空間進行遷移,一般需要把源領域和目標領域的特征投影到同一個特征空間里進行。
如下圖示例,特征遷移是通過觀察源領域圖像與目標域圖像之間的共同特征,然后利用觀察所得的共同特征在不同層級的特征間進行自動遷移。
3. 模型遷移Model-based Transfer Learning
整個模型應用到目標領域去,比如目前常用的對預訓練好的深度網絡做微調,也可以叫做參數遷移。
模型遷移利用上千萬的圖象訓練一個圖象識別的系統,當我們遇到一個新的圖象領域,就不用再去找幾千萬個圖象來訓練了,可以原來的圖像識別系統遷移到新的領域,所以在新的領域只用幾萬張圖片同樣能夠獲取相同的效果。模型遷移的一個好處是我們可以區分,就是可以和深度學習結合起來,我們可以區分不同層次可遷移的度,相似度比較高的那些層次他們被遷移的可能性就大一些 。
這里講一個例子,比如我們想將訓練好的Inception-v3簡單調整,解決一個新的圖像分類問題。根據論文DeCAF : A Deep Convolutional Activation Feature for Generic Visual Recognition中的結論,可以保留訓練好的Inception-v3模型中所有卷積層的參數,只是替換***一層全連階層。在***這一層全連階層之前的網絡層稱之為瓶頸層。
將新的圖像通過訓練好的卷積神經網絡直到瓶頸層的過程可以看成是對圖像進行特征提取的過程。在訓練好的Inception-v3模型中,因為將瓶頸層的輸出再通過一個單層的全連接層神經網絡可以很好的區分1000種類別的圖像,所以有理由認為瓶頸層輸出的借點向量可以作為任何圖像的一個新的單層全連接神經網絡處理新的分類問題。
4. 關系遷移Relational Transfer Learning
如社會網絡,社交網絡之間的遷移。
根據源和目標領域是否相同、源和目標任務是否相同、以及源和目標領域是否有標注數據,又可以把遷移學習分成如下圖所示:
前沿的遷移學習方向
1. Reinforcement Transfer Learning
怎么遷移智能體學習到的知識:比如我學會了一個游戲,那么我在另一個相似的游戲里面也是可以應用一些類似的策略的。
2. Transitive Transfer Learning
傳遞性遷移學習,兩個domain之間如果相隔得太遠,那么我們就插入一些intermediate domains,一步步做遷移。
3. Source-Free Transfer Learning
不知道是哪個源領域的情況下如何進行遷移學習。
假如你目前有了一些代表性數據集,進入了溫飽階段,恨不得壓榨出每一滴數據的價值,又害怕用力過以偏概全(俗稱過擬合)。那么我們可能需要如下技巧。
嚴防死守過擬合(所謂盡人事,聽……)
深度學習由于超參數的個數比較多,訓練樣本數目相對超參數來說略顯不足,一不小心就容易發生過擬合。從本質上來說,過擬合是因為模型的學習能力太強,除了學習到了樣本空間的共有特性外,還學習到了訓練樣本集上的噪聲。因為這些噪聲的存在,導致了模型的泛化性能下降。
深度學習中有幾種較為常用的改善過擬合方法:
1. data augmentation
data augmentation即數據增強,數據增強其實是增加訓練樣本的一種方法。以人臉識別為例,對于人臉識別的數據增強,一般有隨機裁剪,隨機加光照,隨機左右翻轉等。
通過類似的手段,無論是圖像處理,還是語音或者自然語言處理,我們都能有效地增加樣本數量。更多的訓練樣本意味著模型能夠學到更多的本質特征,具有對于噪聲更好的魯棒性,從而具有更好的泛化性能,能夠有效地避免過擬合。
2. early stopping
early stopping,顧名思義,就是在訓練次數沒有達到預先設定的***訓練次數時,我們就讓網絡停止訓練。采用early stopping需要我們在訓練集合上劃分出一小部分(大概10%~30%吧)作為驗證集,驗證集不參與訓練,可以視為是我們知道結果的測試集。我們通過實時監控模型在驗證集上的表現來(實時監控并不意味著每次迭代都去監控,可以每1000次去觀察一次),一旦模型在驗證集上的表現呈現下降趨勢,我們就停止訓練,因為再訓練下去模型的泛化性能只會更差。
而實際訓練中,我們不可能一直坐在電腦旁觀察驗證集的準確率,更一般的做法是每隔一段時間(比如每1000次迭代)就保存一次模型,然后選擇在驗證集上效果***的模型作為最終的模型。
3. 增加Dropout層
Dropout(https://www.cs.toronto.edu/~hinton/absps/JMLRdropout.pdf )原理非常簡單,Dropout t的作用對象是layer,對于某一層中的每個節點,Dropout技術使得該節點以一定的概率p不參與到訓練的過程中(即前向傳導時不參與計算,bp計算時不參與梯度更新)。
如上圖所示,實驗證明了,Dropout的效果非常爆炸,對于模型訓練有非常好的效果。
為什么Dropout能起到這么大作用呢?
一個原因是通過Dropout,節點之間的耦合度降低了,節點對于其他節點不再那么敏感了,這樣就可以促使模型學到更加魯棒的特征;
第二個是Dropout 層中的每個節點都沒有得到充分的訓練(因為它們只有一半的出勤率),這樣就避免了對于訓練樣本的過分學習;
第三個原因是在測試階段,Dropout 層的所有節點都用上了,這樣就起到了ensemble的作用,ensemble能夠有效地克服模型的過擬合。
在實際的模型訓練中,ropout在一般的框架中初始默認的0.5概率的丟棄率是保守的選擇,如果模型不是很復雜,設置為0.2就夠了。
不過也要注意到Dropout的缺點:
(1)Dropout是一個正則化技術,它減少了模型的有效容量。為了抵消這種影響,我們必須增大模型規模。不出意外的話,使用Dropout時***驗證集的誤差會低很多,但這是以更大的模型和更多訓練算法的迭代次數為代價換來的。對于非常大的數據集,正則化帶來的泛化誤差減少得很小。
在這些情況下,使用Dropout和更大模型的計算代價可能超過正則化帶來的好處。
(2)只有極少的訓練樣本可用時,Dropout不會很有效。
4. weight penality(L1&L2)
第四種常用的辦法就是weight decay,weight decay通過L1 norm和L2 norm強制地讓模型學習到比較小的權值。
這里有兩個問題:
(1)為什么L1和L2 norm能夠學習到比較小的權值?
(2)為什么比較小的權值能夠防止過擬合?
對于***個問題:
首先看一下L1和L2的定義:
其中C0為未加上懲罰項的代價函數。那么L1和L2形式的代價函數會如何影響w的值呢?
1)未增加懲罰項w的更新
2) L1下的w更新,其中u為學習率
3) L2下的w更新,其中u為學習率
由上面的(1)(2)(3)可以看出,加上懲罰項之后,w明顯減少得更多。L1是以減法形式影響w,而L2則是以乘法形式影響w,因此L2又稱為weight decay。
對于第二個問題:
過擬合的本質是什么呢?無非就是對于非本質特征的噪聲過于敏感,把訓練樣本里的噪聲當作了特征,以至于在測試集上的表現非常稀爛。當權值比較小時,當輸入有輕微的改動(噪聲)時,結果所受到的影響也比較小,所以懲罰項能在一定程度上防止過擬合。
除了千方百計增加數據多樣性,還要增加模型的多樣性
1、試試不斷調整隱層單元和數量
調模型,要有點靠天吃飯的寬容心態,沒事就調調隱層單元和數量,省的GPU閑著,總有一款適合你。
一般來說,隱層單元數量多少決定了模型是否欠擬合或過擬合,兩害相權取其輕,盡量選擇更多的隱層單元,因為可以通過正則化的方法避免過擬合。與此類似的,盡可能的添加隱層數量,直到測試誤差不再改變為止。
2、試試兩個模型或者多個模型concat
比如,兩種不同分辨率的圖像數據集,分別訓練出網絡模型a和網絡模型b,那么將a和b的瓶頸層concat在一起,用一個全連接層(或者隨便你怎么連,試著玩玩沒壞處)連起來,,輸入concat后的圖片,訓練結果可能比單個網絡模型效果要好很多哦。
loss函數那些事兒
這里只從模型調優的tric角度來介紹下。
Softmax-loss算是最常用的loss方法了,但是Softmax-loss不會適用于所有問題。比如在數據量不足夠大的情況下,softmax訓練出來的人臉模型性能差,ECCV 2016有篇文章(A Discriminative Feature Learning Approach for Deep Face Recognition)提出了權衡的解決方案。通過添加center loss使得簡單的softmax就能夠訓練出擁有內聚性的特征。該特點在人臉識別上尤為重要,從而使得在很少的數據情況下訓練出來的模型也能有很好的作用。此外,contrastive-loss和triplet-loss也有其各自的好處,需要采樣過程,有興趣的可以多了解下。
花式調優
1. batch size設置
batch size一般設定為2的指數倍,如64,128,512等,因為無論是多核CPU還是GPU加速,內存管理仍然以字節為基本單元做硬件優化,2的倍數設置將有效提高矩陣分片、張量計算等操作的硬件處理效率。
不同batch size的模型可能會帶來意想不到的準確率提升,這個調節其實是有一定規律和技巧的。
2. 激勵函數
激勵函數為模型引入必要的非線性因素。Sigmoid函數由于其可微分的性質是傳統神經網絡的***選擇,但在深層網絡中會引入梯度消失和非零點中心問題。Tanh函數可避免非零點中心問題。ReLU激勵函數很受歡迎,它更容易學習優化。因為其分段線性性質,導致其前傳,后傳,求導都是分段線性,而傳統的sigmoid函數,由于兩端飽和,在傳播過程中容易丟棄信息。ReLU激勵函數缺點是不能用Gradient-Based方法。同時如果de-active了,容易無法再次active。不過有辦法解決,使用maxout激勵函數。
3. 權重初始化
權重初始化常采用隨機生成方法以避免網絡單元的對稱性,但仍過于太過粗糙,根據目前***的實驗結果,權重的均勻分布初始化是一個***的選擇,同時均勻分布的函數范圍由單元的連接數確定,即越多連接權重相對越小。
Tensorflow的 word2vec程序中初始化權重的例子,權重初始值從一個均勻分布中隨機采樣:
4. 學習速率
學習速率是重要的超參數之一,它是在收斂速度和是否收斂之間的權衡參數。選擇0.01或者伴隨著迭代逐步減少都是合理的選擇,***的方法開始研究學習速率的自動調整變化,例如基于目標函數曲率的動量或自適應調參等。
5. 選擇優化算法
傳統的隨機梯度下降算法雖然適用很廣,但并不高效,最近出現很多更靈活的優化算法,例如Adagrad、RMSProp等,可在迭代優化的過程中自適應的調節學習速率等超參數,效果更佳。