source data 我們稱為源域,通常源域數據量很大;
target data 我們稱為目標域,通常數據量很小;
遷移學習是把 在 源域 上學到的東西 遷移到 目標域上;
遷移學習不僅可以用於 監督學習,也可以用於無監督學習;

保守訓練
預訓練的模型是非常經典的模型,大數據集下得到的泛化能力很強的模型;
遷移學習通常 數據量 較小,如果過分訓練很容易過擬合;
保守訓練的思想是我還是相信一個權威的模型,只允許你在這個模型上做些許的變動,不允許大幅度改變模型;
通常的做法是 保證 訓練后的參數和預訓練的參數 差距不大; 【只是一種思路,你可以腦洞大開】

可在 loss function 上添加約束 loss + λ[(w1-w1')^2 + ... (wn-wn')^2] λ 正則化系數
layer 層遷移
這是最常用的做法,我們常說的 finetune 就是這個;

層遷移有個問題:遷移哪些層?這根據任務來確定

多任務學習
多任務學習是指多個任務同時學習,使得一套參數可以完成多個任務;
有很多這樣的場景,比如:
1. 在目標檢測中,基於共同的卷積 完成 分類 和 檢測的 任務;
2. 兩個分類任務,一個是判斷是不是狗,一個是判斷是不是狼,由於狗的樣本很多,狼的樣本很少,我可以先訓練狗的模型,然后 層遷移到 狼的網絡進行 finetune,
也可以 同時訓練,loss = 狗 loss + 狼 loss,這樣做或許可以避免 狼的樣本少,造成過擬合;
訓練完之后,我可以分開使用;結果可能是 狗的模型比單獨訓練差點,但是狼的模型比單獨訓練好很多;而我們的目標是狼的模型;
多任務學習的重點在於 多任務 loss;

多任務學習已經在語因識別領域有一定應用

漸進式學習
隨着任務的越來越困難,比如先訓練一個 是不是狗的模型,又訓練一個 狗與 狼的模型,又訓練一個不同品種的狗的模型;
第一個模型相對容易訓練,在訓練第二個模型時,我們可以把 第一個模型的特征加到第二個模型上,可能有助於學到更好的特征;

域對抗
這種情況針對 目標域 沒有 標簽的情況,如下圖

黑白色的手寫數字是有標簽的 源域;
彩色並有一定噪聲的手寫數字是目標域,目標域沒有標簽;
我們的目標是得到一個模型能夠識別 目標域;

這是一個對抗網絡,
上路是對輸入進行分類,類別為 0123456789,輸入是源域,
下路是對輸入來源進行分類,類別為來源於 源域 還是 目標域,輸入是源域和目標域,
在訓練時,二者交替訓練,先訓練幾次上路,然后固定上路,訓練下路,依次進行,
網絡的思想是得到一種特征,使得 網絡無法判斷他來源於 源域還是目標域,而且能准確分類,
對抗的思想體現在,網絡希望通過特征 來識別 輸入來源於 源域還是目標域,但同時又希望 識別不出來,注意,在我們得到 loss Ld 時,我們反向傳播來減小 loss 使得 我們可以區分來源,但是傳播時我們又把 梯度乘以 -1,使得本身希望可以區分來源變成區分不了來源,當區分不了來源時,源域和目標域就得到了公共特征,從而在源域上表現不錯的分類器也可以用於目標域;

零樣本學習-zero shot
除了 zero shot,還有 one shot,few shot,這里以 zero shot 為例進行講解;
zero shot 不同於上面的遷移學習,
上面的遷移學習都是學習一個 新的分類器 用於 獨立的 目標域上,也就是說 源域和目標域相互獨立,各有各的分類器;
而 zero shot 是 目標域 也包含在 源域里,他們是一個任務,學習一個分類器,即可識別源域,也可以識別目標域;
如 源域是 人,label 是男女,目標域是鬼,顯然沒有樣本,但 分類器依然能夠識別男女;
或者如下圖, 源域是 貓狗,label 是動物名稱,目標域是一種不知道是啥的動物,沒見過,依然能夠識別,哪怕是隨便起個名字呢,比如 草泥馬,但不是貓,也不是狗;

這種情況比較少見,我大致介紹下解決方法,有幾種方式
1. 貓狗 我們從像素和形狀的角度進行識別,是否可以換一種 角度 去識別呢,比如 屬性 角度:幾只眼睛、幾條腿等

chimp,猩猩,毛茸茸,2條腿,沒尾巴;
dog,狗,毛茸茸,4條腿,有尾巴;
這樣 就可以 識別 草泥馬了,當然有可能識別為 馬,但是總比識別成狗強;

2. 對輸出做加權平均,這種處理方式其實不是很正式的遷移學習;
他是把 輸出 多個目標的概率做加權平均,如下圖

網絡輸出 50% 是老虎, 50% 是獅子,加權平均后得到一種 獅虎獸;
總結
遷移學習,transform learning 是一個大學科,內容很多,且研究空間很大,是未來的發展方向,后面會繼續學習...
參考資料:
https://blog.csdn.net/XJTU_NOC_Wei/article/details/77850221?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
