作者:grootyan 團隊:騰訊移動品質中心TMQ
假如你是一個資料窮鬼,其他資源也捉襟見肘,可以來試試遷移學習。
所謂遷移學習,就是将一個問題上訓練好的模型通過簡單的調整,使其适用一個新的問題,可以認為是一種模型調優的“取巧”方法。可以類比人的舉一反三能力。

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後的圖檔,訓練結果可能比單個網絡模型效果要好很多哦。
這裡隻從模型調優的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等,可在疊代優化的過程中自适應的調節學習速率等超參數,效果更佳。
擷取更多測試幹貨,請搜尋微信公衆号:騰訊移動品質中心TMQ!