在前面的文章中,咱們一般是拿到一個任務,譬如圖像分類、識別等,蒐集好數據後就開始直接用模型進行訓練,可是現實狀況中,因爲設備的侷限性、時間的緊迫性等致使咱們沒法從頭開始訓練,迭代一兩百萬次來收斂模型,因此這個時候遷移學習就派上用場了。git
什麼是遷移學習?github
爲何須要遷移學習?數據庫
新數據集相比於原數據集更小但內容很不相同。因爲數據較小,只訓練一個線性分類器可能更好。由於數據集不一樣,從網絡頂部就開始訓練分類器可能不是最好的選擇,這包含更多的數據集特定特徵。另外,從網絡前部的激活函數開始訓練分類器可能更好一點。網絡
新數據集相比於原數據集較大,但內容很是不一樣。因爲數據集很大,咱們可能會指望從頭開始訓練一個 DCNN。然而,在實踐中從一個預訓練模型開始初始化權重仍然是一種有益的方法。在這種狀況下,咱們會有足夠的數據和信心對整個網絡進行微調。架構
如何作遷移學習?dom
在實踐中,咱們一般不會徹底從頭開始隨機初始化訓練 DCNN,這是由於有能知足深度網絡需求的足夠大小的數據集至關的少見。做爲代替,常見的是在一個大型數據集上預訓練一個 DCNN,而後使用這一訓練的 DCNN 的權重做爲初始設置或做爲相關任務的固定的特徵提取器。 舉個例子,咱們知道Imagnet是目前最大的圖像識別數據庫,目前已經有不少基於imagenet數據訓練的網絡模型,如inceptionv三、v4等,假如如今給你一個任務,但願你能作一個車系識別,你有兩個選擇:機器學習
一是蒐集大量的車系數據,對這些車系數據進行模型訓練;函數
二是基於imagenet訓練好的網絡模型,而後把蒐集好的車系數據加到基於以前訓練好的模型繼續訓練,進行fine-tuning。學習
傳統的作法都是第一種,可是這就會遇到一個問題,一是車系的圖片夠不夠多,體量夠不夠大?若是數據量不夠,最後訓練的效果會不會很很差?其實咱們能夠經過 把ImageNet 或其餘大型數據集學習到的網絡特徵運用於一個圖片分類或其餘基於圖片特徵的任務,這就是遷移學習的思想。其實能夠這樣理解,若是從零開始訓練,那麼初始化權重通常狀況下要麼是都爲0,要麼隨機設置,當咱們導入了在大規模數據集上訓練好的模型後,至關於在以這個模型現有的參數做爲初始化的權重,不過至於在具體的任務上的泛化能力如何,仍是得看具體的場景。spa
遷移學習的限制
上文提到咱們在遷移學習中會使用預訓練的網絡,因此咱們在模型架構方面受到了一點點限制。好比說,咱們不能隨意移除預訓練網絡中的卷積層。但因爲參數共享的關係,咱們能夠很輕鬆地在不一樣空間尺寸的圖像上運行一個預訓練網絡。這在卷積層和池化層和狀況下是顯而易見的,由於它們的前向函數(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