NO IMAGE

本部落格是針對李巨集毅教授在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去幫助有標籤的目標資料的學習任務。