在前面的文章中,我們通常是拿到一個任務,譬如圖像分類、識別等,搜集好數據后就開始直接用模型進行訓練,但是現實情況中,由於設備的局限性、時間的緊迫性等導致我們無法從頭開始訓練,迭代一兩百萬次來收斂模型,所以這個時候遷移學習就派上用場了。
什么是遷移學習?
為什么需要遷移學習?
- 滿足深度學習訓練數據量的數據太少。對於一個機器學習的任務,譬如分類,如果數據量過小,我們是否一定要上深度學習呢?其實不必然。如果在實際的生產過程中,能夠用規則就能得到好的效果的就用規則,能夠用簡單的模型就用簡單的模型,我們常聽到的“奧卡姆剃刀”其實就是這個意思,減少模型的復雜度,能夠從某種程度上避免過擬合的情況。那么對於小量數據集,沒有必要一定需要用深度學習的方法來做。同樣,如果要對一個新任務分類,或者識別,搜集不了大量的正負樣本,怎么訓練呢?
-
新數據集相比於原數據集更小但內容很不相同。由於數據較小,只訓練一個線性分類器可能更好。因為數據集不同,從網絡頂部就開始訓練分類器可能不是最好的選擇,這包含更多的數據集特定特征。另外,從網絡前部的激活函數開始訓練分類器可能更好一點。
-
新數據集相比於原數據集較大,但內容非常不同。由於數據集很大,我們可能會期望從頭開始訓練一個 DCNN。然而,在實踐中從一個預訓練模型開始初始化權重仍然是一種有益的方法。在這種情況下,我們會有足夠的數據和信心對整個網絡進行微調。
如何做遷移學習?
在實踐中,我們通常不會完全從頭開始隨機初始化訓練 DCNN,這是因為有能滿足深度網絡需求的足夠大小的數據集相當的少見。作為代替,常見的是在一個大型數據集上預訓練一個 DCNN,然后使用這一訓練的 DCNN 的權重作為初始設置或作為相關任務的固定的特征提取器。 舉個例子,我們知道Imagnet是目前最大的圖像識別數據庫,目前已經有很多基於imagenet數據訓練的網絡模型,如inceptionv3、v4等,假如現在給你一個任務,希望你能做一個車系識別,你有兩個選擇:
一是搜集大量的車系數據,對這些車系數據進行模型訓練;
二是基於imagenet訓練好的網絡模型,然后把搜集好的車系數據加到基於之前訓練好的模型繼續訓練,進行fine-tuning。
傳統的做法都是第一種,但是這就會遇到一個問題,一是車系的圖片夠不夠多,體量夠不夠大?如果數據量不夠,最后訓練的效果會不會很不好?其實我們可以通過 把ImageNet 或其他大型數據集學習到的網絡特征運用於一個圖片分類或其他基於圖片特征的任務,這就是遷移學習的思想。其實可以這樣理解,如果從零開始訓練,那么初始化權重一般情況下要么是都為0,要么隨機設置,當我們導入了在大規模數據集上訓練好的模型后,相當於在以這個模型現有的參數作為初始化的權重,不過至於在具體的任務上的泛化能力如何,還是得看具體的場景。
遷移學習的限制
上文提到我們在遷移學習中會使用預訓練的網絡,所以我們在模型架構方面受到了一點點限制。比如說,我們不能隨意移除預訓練網絡中的卷積層。但由於參數共享的關系,我們可以很輕松地在不同空間尺寸的圖像上運行一個預訓練網絡。這在卷積層和池化層和情況下是顯而易見的,因為它們的前向函數(forward function)獨立於輸入內容的空間尺寸。在全連接層(FC)的情形中,這仍然成立,因為全連接層可被轉化成一個卷積層。所以當我們導入一個預訓練的模型時,網絡結構需要與預訓練的網絡結構相同,然后再針對特定的場景和任務進行訓練。
遷移學習的相關資料
對遷移學習感興趣的同學,可以關注這個github repo:transferlearning,以及王晉東寫的系列文章:
《小王愛遷移》系列之六:學習遷移(Learning To Transfer)
《小王愛遷移》系列之七:負遷移(Negative Transfer)
《小王愛遷移》系列之九:開放集遷移學習(Open Set Domain Adaptation)
《小王愛遷移》系列之十:張量遷移學習(tensor unsupervised domain adaptation)
《小王愛遷移》系列之十一:選擇性對抗遷移學習(Selective Adversarial Network)
《小王愛遷移》系列之十二:新年新氣象-重新整理的遷移學習資源倉庫
參考資料:
1.https://zhuanlan.zhihu.com/p/33369085
2.http://blog.csdn.net/maweifei/article/details/52444342