在前面的文章中,我們通常是拿到一個任務,譬如影像分類、識別等,蒐集好資料後就開始直接用模型進行訓練,但是現實情況中,由於裝置的侷限性、時間的緊迫性等導致我們無法從頭開始訓練,迭代一兩百萬次來收斂模型,所以這個時候遷移學習就派上用場了。
什麼是遷移學習?
為什麼需要遷移學習?
- 滿足深度學習訓練資料量的資料太少。對於一個機器學習的任務,譬如分類,如果資料量過小,我們是否一定要上深度學習呢?其實不必然。如果在實際的生產過程中,能夠用規則就能得到好的效果的就用規則,能夠用簡單的模型就用簡單的模型,我們常聽到的“奧卡姆剃刀”其實就是這個意思,減少模型的複雜度,能夠從某種程度上避免過擬合的情況。那麼對於小量資料集,沒有必要一定需要用深度學習的方法來做。同樣,如果要對一個新任務分類,或者識別,蒐集不了大量的正負樣本,怎麼訓練呢?
-
新資料集相比於原資料集更小但內容很不相同。由於資料較小,只訓練一個線性分類器可能更好。因為資料集不同,從網路頂部就開始訓練分類器可能不是最好的選擇,這包含更多的資料集特定特徵。另外,從網路前部的啟用函式開始訓練分類器可能更好一點。
-
新資料集相比於原資料集較大,但內容非常不同。由於資料集很大,我們可能會期望從頭開始訓練一個 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