遷移學習(Transfer Learning)

本博客是針對李宏毅教授在youtube上上傳的Machine Learning課程視頻的學習筆記。課程鏈接

概念

  • 遷移學習是什麼?

    假設手上有一些和現在要進行的學習任務不相關的數據,那麼能不能用這些數據幫助完成學習任務。

    如下圖,比如我們想做一個貓狗分類器,

    但是我們沒有貓狗的圖片數據,而只有以下數據:

    • 大象和老虎圖片(都是動物圖片,所以屬於相似的域(domain),但是與貓狗分類相比是完全不同的學習任務)
    • 招財貓和高飛狗圖片(都是卡通人物圖片,所以屬於不同的域,但是同屬於貓狗分類任務)

  • 爲什麼要研究遷移學習?

    • 比如如果要做臺語的語音識別,但是網絡上的訓練數據很少,於是想到能不能利用youtube上海量的其它語音數據來做臺語的語音識別訓練。
    • 做醫學圖像識別,但是醫學圖像的存量往往很少,那麼海量的其它圖片能不能幫忙呢
    • 做文本分析,可能特定領域的文本數據少,那麼能不能利用其它領域的文本來幫忙呢
  • 可行性

    遷移學習的可行性一定基礎上建立在人類的行爲上,因爲人類是不斷在做遷移學習的。

    如下圖所示,比如如果想要做好一名研究生,你可以參考稱爲一名好的漫畫家應該如何做。

概覽

根據源數據(我們手上已有數據)和目標數據(目標學習任務所需數據)是否有label,我們將遷移學習分成四種不同的類別。

Model Fine-tuning (labelled source, labelled target)

  • 任務描述

    目標數據量很少,源數據量很多。(One-shot learning:在目標域中只有幾個或非常少的樣例)

  • 例子:(有監督)講話者調整

    目標數據:語音數據和某一特定講話者的稿子。

    源數據:語音數據和很多講話者的稿子。

  • 想法:用源數據訓練一個模型,然後用目標數據微調模型

    • 難點:只有很有限的目標數據,所以要注意過擬合問題。

    • 一個解決過擬合難點的訓練方法: Conservative Training(保留訓練)

    在微調新模型時加入限制(regularization),比如要求微調後的新模型與舊模型針對相同的輸入的輸出越相似越好,或者說模型的參數越相似越好。

    • 另一種方法:Layer Transfer(層轉移器)

    將用源數據訓練好的模型的某幾層取出/拷貝(連帶參數),然後用目標數據去訓練沒有保留(拷貝出來)的層。

    那麼,這裏就產生一個問題:究竟哪些層應該被轉移(拷貝)呢?答案是:針對不同的學習任務,往往是需要不一樣的層。

    • 在語音識別上,一般拷貝最後幾層。(直覺:不同的人由於口腔結構差異,同樣的發音方式得到的聲音可能不同。而模型的前幾層做的事是講話者的發音方式,後面的幾層再根據發音方式就可以獲得被辨識的文字,即是跟具體講話者沒有太大關係的,所以做遷移時,只保留後面幾層即可,而前面幾層就利用新的特定講話者的目標數據來做訓練)

    • 在圖像識別上,一般拷貝前幾層。(直覺:網絡的前幾層一般學到的是最簡單的模式(比如直線,橫線或最簡單的幾何模型),比較通用,而後幾層學習到的模式已經很抽象了,很難遷移到其它的領域)

    《How transferable are features in deep neural networks》論文的相關實驗結果:做圖像識別,拷貝不同的層,並對遷移模型做不同的操作,觀察效果。

    另外一個實驗結果:將源數據與目標數據的域劃分開,比如源數據都是自然界的東西,而目標數據都是人造的東西,那麼這對遷移模型的效果會有怎樣的影響。

    可以從上圖看出,這對遷移模型的前幾層的影響是不大的,說明遷移模型不管是識別自然界事物還是人造事物,其在前幾層上面做的事情其實是很相似的。

Multitask Learning (labelled source, labelled target)

在Fine-tuning上,我們其實只關心遷移模型在目標數據域上的學習任務完成的好不好,而不關心在源數據域上表現如何。而Multitask Learning是會同時關注這兩點的。

如上圖,我們針對兩種任務A和B,我們用它們的數據一起訓練NN模型的前幾層,再分別訓練模型的後面幾層包括輸出層,以針對各自任務輸出針對性的結果,這樣的好處是由於訓練數據量的增加,模型的性能可能會更好。關鍵是要確定兩個任務有沒有共通性,即是不是能共用前面幾層。

另外,也可以在中間幾層用共同數據來訓練。

多任務學習比較成果的一個應用實例是:多語言識別。

如上圖,多國語言語音識別模型的前幾層共享一些公共特徵。

那麼,就又產生了一個問題:語言遷移的範圍可以有多廣呢?

下圖是:藉助歐洲語言幫助中文的識別(在有歐洲語言數據輔助的情況下,只用大約50小時的中文數據可以達到用100小時中文數據單獨訓練的效果)。

  • Progressive Neural Network

先針對Task1訓練一個NN,在訓練Task2的NN時,它的每一個隱層都會借用一個Task1中的NN的隱層(也可以直接設爲全0的參數,相當於不借用),這樣對Task1的模型性能不會有影響,也可以在Task2中對其已有參數進行借用。

Domain-adversarial training (labelled source, unlabelled target)

  • 任務描述

源數據對應的學習任務和目標數據對應的學習任務是比較相似的,都是做數字識別,但是兩者的輸入數據差別很大(目標數據加入了背景),那如何讓源數據上學出來的模型也能在目標數據上發揮良好呢?

而既然源數據的標籤已知,目標數據的標籤未知,那麼我們可以將源數據當做訓練數據,目標數據作測試數據來進行遷移。

  • Domain-adversarial training

而如果我們直接用MNIST的數據學一個model,去做MNIST-M的識別,效果是會非常差的。

而我們知道,一個NN前幾層做的事情相當於特徵抽取(feature extraction),後幾層做的事相當於分類(Classification),所以我們將前面幾層的輸出結果拿出來看一下會是什麼樣子。

如下圖,MNIST的數據可以看做藍色的點,MNIST-M的點可以看做紅色的點,所以它們分別對應的特徵根本不一樣,所以做遷移時當然效果很差。

於是思考:能不能讓NN的前幾層將不同域的各自特性消除掉,即把不同的域特性消除掉。

怎麼訓練這樣一個NN呢?

訓練一個域分類器,讓它無法準確地對特徵提取器的結果進行分類。(“騙過”分類器,類似GAN的思想)。但是,在GAN裏面,生成器是要生成一張圖片來騙過判別器,這個是很困難的,而這裏如果只是要騙過域分類器就太簡單了,直接讓域分類器對任意輸入都輸出0就行了。這樣學出來的特徵提取器很可能是完全無效的。所以,我們應該給特徵提取器增加學習難度。

所以,我們還要求特徵提取器的輸出能夠滿足標籤預測器(label predictor)的高精度判別需求。

那麼如何讓特徵提取器的訓練滿足我們上述兩個要求呢?也不難,針對標籤預測器的反向傳播的誤差,我們按照誤差的方向進行正常的參數調整,而針對域分類器反向傳回的誤差,我們則按照誤差的反方向進行誤差調整(即域分類器要求調高某個參數值以提高準確度,而我們就故意調低對應參數值,以“欺負”它)。所以在域分類器的誤差上加個負號就可以。

但是還需要注意的是,我們要讓域分類器“奮力掙扎”,否則如果特徵提取器隨便生成的輸出都能夠騙過域生成器,那可能是域生成器本身的判別能力太差,那這樣訓練出來的特徵提取器可能也其實是很弱的,所以

下圖是對應論文的一個實驗結果:

Zero-shot Leaning (labelled source, unlabelled target)

在Zero-shot Learning裏面,相對有比Domain-adversarial training更嚴苛的定義,它要求遷移的兩種任務差別也是很大的。

如下圖,源數據是貓狗圖片,而目標數據是草泥馬圖片,這兩種分類任務屬於不同的任務了。

  • 影像識別上的做法

我們首先將分類任務中對應的所有分類目標的屬性存在數據庫裏,並且必須保證每個分類目標的屬性組合獨一無二(屬性組合重複的兩者將無法在下述方法中區分)。

如下圖,那麼,我們在學習NN模型時,不再要求NN的輸出直接是樣例的分類,而要求是對應的分類目標包含哪些屬性
。那麼,我們再在目標數據/測試數據上做分類時,也只要先用模型獲提取出樣例的屬性,再查表即可。

而如果數據特徵變得複雜(比如是圖片作爲輸入),那麼我們就可以做embedding,即嘗試訓練一個NN,將樣例特徵映射到一個低維的embedding空間,然後讓映射後的結果和樣例對應的屬性儘可能地相近。

但是,如果我們沒有數據庫(沒有屬性數據)呢?

借用Word Vector的概念:word vector的每一個dimension代表了當前這個word的某一個屬性,所以其實我們也不需要知道具體每個動物對應的屬性是什麼,只要知道每個動物對應的word vector就可以了。即將屬性換成word vector,再做embedding。

  • Zero-shot Learning 的訓練

思想:讓同一對的x與y儘量靠近,讓不同對的x與y儘量遠離。

還有一種訓練方法更簡單:Convex Combination of Semantic Embedding

假設訓練出一個獅虎分類器,它對於一張圖片給出了“50%是獅子,50%是老虎”的結果,那麼我們就將獅子和老虎對應的word vector分別乘以0.5再加和,獲得新的vector,看這個vector和哪個動物對應的vector最相近(比如獅虎獸liger最相近)。

而做這個只要求我們有一組word vector和一個語義辨識系統即可。

下圖是一個對比普通CNN,做Embedding的Zero-shot Leaning,和Convex Combination of Semantic Embedding三種方法對於Stellar Sealion識別的效果比較:

Self-taught learning 和 Self-taught Clustering

這兩種都是源數據無標籤的。

self-taught learning可以看做一種半監督學習(semi-supervised learning),只是源數據和目標數據關係比較“疏遠”。我們可以嘗試利用源數據去提取出更好的representation(無監督方法),即學習一個好的Feature extractor,再用這個extractor去幫助有標籤的目標數據的學習任務。

發佈了81 篇原創文章 · 獲贊 193 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章