學一學Transfer Learning
學一個知識之前,我們先來看看這個知識的廣泛化定義是什麼?
該講的主要內容來自台灣大學李宏毅的PPT教程。
什麼是遷移學習?
遷移學習就是把那些已經訓練好的模型參數遷移到另外一個新的模型上,從而幫助新模型的訓練,使得我們不需要從0開始訓練一個model。
關於知乎達人王晉東對於遷移學習的解釋:
遷移學習是機器學習領域用於解決標記數據難獲取這一基礎問題的重要手段。
為什麼要進行遷移學習?
僅僅從數據的角度來談談這個問題。
- 收集數據比較困難
- 標記數據很耗時,很繁瑣,需要大量的人力
- 訓練one2one的model,缺失了ML中對於泛化性能的要求
綜合上面這三點原因,迫使我們必須要進行transfer learning。
關於遷移學習的方法分類:
- 基於實例的遷移:
- 通過權重的分配,來分別作用到源域和目標域來進行遷移,關於什麼是源域,什麼是目標域,這裡可以先不用細究,你就明白是兩個不同的空間就行了,具體的概念,後面的部分會詳細的進行概述
- 舉例:比如說在源域中有一個樣本和目標域中的一個樣本非常的相似,那麼我們就可以加大此樣本對應的權重。
- 基於特徵的遷移:
- 將源域和目標域的特徵變換到同一個空間。
- 舉例:比如說在兩個域上的feature具有很大的區別,那麼我們就可以通過將這兩個域的feature變換到同樣的空間,這個時候我們就可以很方便的研究這兩個域上的相關內容和性質了。
- 基於模型的遷移:
- 通過源域和目標域的參數共享機制
- 舉例:這也是我們在做DL中用到最多的一個方法了,比如說,將pre-trained的模型拿過來,通過固定一些layer的parameters,修改部分layer的parameters得到最終的非常好的結果。
- 基於關係的遷移:
- 利用源域中某種一般性的邏輯關係進行遷移
一些遷移學習中的基本概念:
有關域的概念(domain):
- source domain(源域):已經存在的知識的域
- target domain(目標域):要進行學習的域
Task:由目標函數和學習結果組成,是我們最終的學習結果
那麼遷移學習的數學定義:
Given a source domain and learning task , a target domain and learning task , transfer learning aims to help improve the learning of the target predictive function in using the knowledge in and , where , or .
有了上面關於域和task的理解,那麼對上述數學定義進行解釋就是:
- 我們現在手上有兩個域,一個域是source domain,並且其中一個function叫做 ,這個function的作用是來完成一個叫做 的任務的。
- 另一個域是target domain,並且其中也存在一個function,叫做 ,並且我們需要這個function去很好的完成一個叫做 的任務
- 遷移學習要做的就是通過對於source domain和 的學習,使得其能夠有助於target domain中 的學習,從而更好的完成任務
接下來,有了這些概念,我們進一步來介紹一些遷移學習中更加常用的知識。
Domain Adaptation(DA):cross-domain learning 也叫同構遷移學習。
一句話理解:源域和目標域的特徵分布不一樣。
接下來就講講在根據source domain和target domain的data是否有label得到的對於遷移學習是怎樣進行操作的?
- 第一種情況:是Source Data和Target Data都有label的時候。
- 這個時候,也是我們經常在DL中使用的一個方法了。比如我們在做某個圖像分類的時候,往往都會用別人提前在ImageNet上訓練好的pre-trained的model作為我們需要的model中的參數,然後僅僅只改變網路的最後一層的參數,最終完成在我們需要的task上的分類任務。
- Model Fine-tuning
- Target data: ,往往數據量會比較少
- Source data: ,往往數據量會比較多
- 因為如果我們的target data的數據都比較多的話,我們就不需要去做什麼transfer learning了,直接對target data進行常規的ML操作就行了。
- 如果針對Target data數據量的這個少進一步的劃分,就可以引出one-shot learning的概念。
- 關於什麼是one-shot learning,這裡簡單說說,就是說在我們的target domain上僅僅有很少的data可以讓我們用來model的train,這麼少的數據肯定是不夠的。所以,我們再通過對source domain上足夠多的信息的學習,將其在僅有一些data(target domain上的)的情況下,都能夠把要求的任務學習的很好,就達到了one-shot learning的作用。
- 舉例:比如我們在做speaker adaption的過程中。
- target data: 我們需要具體的找到的某個人的很少的語音信息
- source data: 從不同的人中所採集的大量的語音信息
- 方法:直接用我們的source data去train一個model出來,然後通過target data去fine-tuning這個model。有些初學者可能又會問?什麼是通過target data去fine-tuning我們的model呢?其實道理很簡單,就是通過用source data訓練出來的model的參數當做我們新model的初始化參數,然後直接把target data喂進這個新的model中進行訓練就行了。
- 由於在訓練的過程中,有很多技巧,這裡講一個叫做Conservative Training的方法
Conservative Training是說:
- 我們先通過Source data去train一個model
- 然後通過並不是直接把這個model當做pre-trained的model,去用少量的target data去訓練一個新的model
- 而是加入一些正則化項,來保證新的model和舊的model在input相同的情況下,得到的output儘可能的相近。
- 為什麼要這樣做呢?其實原因很簡單,如果我們在train新的model的過程中,並不去加這個正則項(也叫限制項),那麼如果我們將source data送進新的model,我們會發現整個model徹底壞掉了,他已經不具備原先model對於source data的表現能力了,這也是在ML中經常出現的一個非常重要的問題:災難性遺忘問題。
第二種訓練方法就叫做Layer Transfer
- 首先還是和Conservative Training一樣,通過Source data去train一個model
- 然後將該model中某些層的parameters直接複製進去新的model中
- 對於新model中那些沒有得到parameters的layer,我們固定其他層的參數,通過Source data對那些沒有被transfer到parameter的layer進行訓練
- 最後,如果target data的數據量比較充足,那麼我們就可以在對整個網路進行fine-tuning一下,可以進一步提升模型的性能。
接下來,我們重點講講Layer Transfer的方法,因為該方法是比較常用的一個技巧。
那麼,我們在操作Layer Transfer的時候,我們應該transfer哪些layer呢?
其實到底該transfer哪些layer,對於不同的問題,可能有不同的解決措施:
- 對於做語音辨識任務來說:我們通常去transfer最後幾層的parameters
- 對於做圖像辨識的任務來說:我們通常去transfer最前面的幾層parameters
關於為什麼會有這樣的差異,理解是這樣的:
- 對於語音信號來說,每個人使用同樣的發音方式,所得到的聲音結構是不一樣的,因為他們的口腔結構肺部組織什麼的都會存在差異。在train中,網路前幾層的目的就是辨識到這些人的發音方式,然後後幾層才會去聽到底這些人都說了什麼。所以,我們發現model的後幾層是和發音者完全無關的,而前面幾層才是在尋找發音者的發音方式。
- 對於圖像識別來說,我們知道,在CNN做圖像分類的過程中,前面的卷積層做的工作都是在做feature extraction的過程,而提取到的那些特徵都是圖像中的最基本的特徵,比如邊邊角角,線等。所以,我們很需要這樣的底層結構基礎信息,將其就可以transfer到其他的分類task上面了
也有想過學者對於layer transfer做了相關的實驗,我們來分析分析實驗的具體過程:
- 上圖中的橫坐標表示被transfer的網路的層數,比如0表示,一層layer也不被transfer,所以就可以被當做一個baseline。
- 這個實驗是說,對於ImageNet數據集,我們將其中的500個class拿出來當做Source domain,另外500個class拿出來作為Target domain。進行訓練。
- 我們可以看出,隨著被transfer的網路的層數的增多,model的表現性能越差,直到最後前7層的layer都被transfer掉後,整個model徹底的壞掉了。
- 如果做完transfer後,在通過target data進行fune-tuning後,model的性能相比以前還會有所提高
- 圖中的藍色線又是另外一個實驗,實驗的操作流程是說,我們首先通過target data去train一個model,然後固定住前幾層後,再通過target data去train後面剩下的幾層,發現整個model的性能是先下降後上升。這表示,前面幾層layer和後面幾層layer之間存著某種相互協調並做的關係,只有發揮好了這種相互搭配的關係,才能最大化的輸出網路的性能。
同時,學者們又做了另外一個實驗:
- 這個實驗的橫坐標和縱坐標還是和第一個實驗一樣表示相同的含義
- 綠色的線是說,如果前面幾層layer的參數多少random賦值的,那麼整個model的性能會越來越差,直到最後爛掉為止。
- 橙色的線是說,假如我們現在對於Source data和Target data的劃分是有限制的,比如說,規定Source data的來源都是自然景物,而Target data的來源都是人造景物。那麼在通過自然景物作為data訓練出的parameters對於人造景物的分類效果會有所下降。
- 而紅色線是說,在實驗的過程中,對於Source data和Target data就沒有橙色線那樣的限制條件了。
接下來,就講講另外一個重要的概念,Multitask Learning。
關於Multitask Learning的學習,我先前在我的模式識別學習筆記專欄中有簡單的介紹,那麼剛剛好這裡又出現multitask learning,我們就在重新好好學一遍吧。
- 再來回顧下Fine-tuning的過程,在做fine-tuning的時候,我們更加關注的是mode在target domain上做的好不好,至於在source domain上做的到底怎麼樣,哪怕是將source data輸入進這個新的model中,model都壞掉了,也不要緊。只要這個新的model在target domain上做的很出色就夠了。
- 而multitask learning和fine-tuning的過程就不同了,multitask是說,不僅要求我們的最終model在target domain上表現的相當出色,而且在source domain上同樣也要表現的相當出色。
關於多層的網路結構來說, 他為我們學習multitask learning提供了很好的條件,下面有兩種常用的通過multi-layer nn來進行transfer learning的例子
- 上圖所示是第一種方式
- 直接將Task A的訓練數據和Task B的訓練數據混合在一起,作為整個multi-layer的訓練數據,然後通過底層的layer來提取出兩個task之間最共性和基礎的信息,然後在高層再分別偏向於自己特有的信息,完成了multitask learning的過程。
- 上圖所示是第二種方式
- 直接將Task A中所學到的feature 和 Task B中所學到的feature 映射到同一個domain中,然後以這個domain為分支節點,再來做multitask learning
其實,關於multitask learning最成功的一個例子就是語音辨識
通過收集到的聲學特徵,然後將其通過這裡所說的兩個紅色的layer,這兩個layer是所有國家語言的基礎和共性信息,然後對於不同國家語言的轉換,就對應了不同的task。
講了這麼多,都是說的transfer learning的好處,那麼transfer learning有沒有不好的地方呢?
不好肯定是存在的,比如當Task A和Task B的相似度非常小的時候,這個時候,如果我們還是堅持在Task A到Task B的過程中使用Transfer Learning,那麼就會得到負遷移。
有一篇很好的論文用來說明這個問題:Progressive Neural Networks
- 這篇網路中的方法還是比較新的,首先對於task 1來說,我們train出一個model
- 然後將task 1 中的第i層的輸出直接輸入進task 2中的第i層的輸出,作為第i+1層的輸入。
- 然後後面如果有k個網路,就會應用到前k-1個網路的信息。
這樣做就能使得即使相似度不高的幾個task之間,也能進行transfer learning的。
再來看一種形式的transfer learning,叫做Domain-adversarial training
這種方法是說,當我們的Source data具有label的時候,Target data不具有label的時候,我們就要採取一種叫做Domain-adversarial的方法
- Task description
- Source data:
- Target data:
我們的Source domain是來自MNIST數據集,並且每個sample都帶有label
現在的Target domain是來自MNIST-M數據集,並且每個sample都不帶有label
我們現在要做的就是通過source data去train一個model,然後對於target data,也能有一個很好的分類。
在上述操作過程中,我們可以將source data作為training data,將target data作為testing data。來完成我們訓練model的任務。但是,通過兩類data的比較,我們發現,source data和target data並不是很匹配,也就說,兩者之間是mismatch的。
接下來,就來開始我們的實驗。
- 我么直接建立一個最常用的分類網路,前面綠色的部分都用來做feature extraction。
- 後面藍色的部分用來做 classification
- 當我們將source data輸入進網路後,經過降維,得到大分部的數據都位於藍色的區域內
- 當我們將target data輸入進網路後,也同樣經過降維,得到大部分的數據都位於紅色的區域內
- 那麼,我們得到了結論,由於source data與target data 不匹配的情況,使得輸出的結果也存在了這麼大的分布差異
那麼,針對具體出現的問題,我們就需要經過一定的改進和提高。請看下圖:
紅色叉叉是我們所產生的問題,而綠色的對勾是我們想要達到的目的。
大家這樣想,如果我們能夠將mismatch的兩類data,毫無區別的混合在一起,讓我們model前面的網路來進行feature extraction,然後在分類層對於不同的task執行不同的classification,transfer learning就能做好了。
- 我們只需要增加一個叫做domain classifier的東西,這個東西有點類似GAN(對抗生成網路),不知道GAN的原理的小夥伴們不要緊,後面的文章中會為大家帶來GAN的原理和應用。只要將feature extractor提取到的東西統統經過domain classifier,不管input的是什麼,domain classifier都將他們分到相同的domain內,就達到了將misbatch的數據相互混合的目的。
我們再來分析下,我們的網路結構:
- 第一部分綠色的feature extractor其實要做的就是提取出source data和target data的feature,然後使得最後在做classification的時候,通過這些提取出來的feature,能夠得到一個非常好的精確度。他還有儘可能讓這些mismatch的data混在一起,以至於domain classifier不能夠正確的判斷他們是否混在一起。
- 第二部分藍色的label predictor做的是,能夠儘可能大的輸出classification的精度
- 第三部分紅色的domain classifier做的是,能夠儘可能的將從feature extractor中提取出來的feature進行分開,將其各自歸屬到其所屬的domain里。
當然,關於這個網路的train,講起來很容易,實際操作起來,肯定會像GAN一樣,涉及到很多的trick。
Domain-adversarial training的訓練過程:
在這裡僅僅強調紅色方框框出來的一點:
- 通過前面對於網路結構的分析,我們知道了domain classifier和feature extractor之間的關係其實是:「互相傷害」的。
- 也就是說,feature extractor希望將兩個domain提取出來的feature儘可能的混合在一起。但是domain classifier卻希望他能夠儘可能的把從feature extractor中提取出來的feature劃分到兩個domain中。
- 那麼在做BP的過程中,只需要將誤差對於參數的偏導數加一個「負號」,就能夠達到這種目的。
- 其他部分的training和一般的網路的training沒有什麼區別。
如果對於domain adversarial 感興趣的讀者,可以看看下面的這兩篇paper
關於 transfer learning的東西實在太多,而且隨著學習的深入,越發覺得這部分的東西確實有趣,而且關於domain adaptation的研究,可以說是非常火熱的。
關於transfer learning後續的內容,我會再開一篇文章來講,這講就講到這裡了,洗洗準備睡覺了。
推薦閱讀:
※[中國電子學會]新一代人工智慧發展白皮書(2017)第一、二章
※這次人工智慧革命,你不用擔心是否會成功
※"阿爾法狗"再進化,人工智慧發展到底有何意義??
※智能取餐櫃——引領智慧新零售
TAG:深度學習DeepLearning | 機器學習 | 人工智慧 |