概述
針對一個給定的任務,通常採取的步驟是:準確一定非規模的數據集,這些數據要和真實數據集的分佈一致;然後設定一個優化目標和方法;然後在訓練集上訓練模型。
不同的模型往往都是從零開始訓練的,一切知識都需要從訓練集中得到,這就意味着每個任務都需要大量的訓練數據。在實際應用中,我們面對的任務很難滿足上述需求,比如訓練任務和目標任務的數據分佈不一致,訓練數據集過少等。這時機器學習的任務就會受到限制,因此人們開始關注一些新的任務學習方式。
本篇文章主要介紹一些“模型獨立的學習方式”,比如:集成學習、協同學習、自學習、多任務學習、遷移學習、終身學習、小樣本學習、元學習等。
集成學習
集成學習(Ensemble Learning)就是通過某種策略將多個模型集成起來,通過羣體決策來提高決策準確率。集成學習首要的問題是如何集成多個模型,比較常用的集成策略有直接平均、加權平均等。
集成學習可以分爲:Boosting、Bagging、Stacking,這三種的詳細區分和流程可以參考《推薦系統開發實戰》一書中第八章 點擊率預估部分。本文中主要介紹集成學習中的Boosting學習和AdaBoost算法。
集成學習的思想可以採用一句古老的諺語來描述:“三個臭皮匠,頂個諸葛亮”。但是一個有效的集成需要各個基模型的差異儘可能的大。爲了增加模型之間的差異性,可以採取Bagging類和Boosting類兩類方法。
Bagging類方法
Bagging類方法是通過隨機構造訓練樣本、隨機選擇特徵等方法來提高每個基模型的獨立性,代表性方法有Bagging和隨機森林。
- Bagging(Bootstrap Aggregating)是一個通過不同模型的訓練數據集的獨立性來提高不同模型之間的獨立性。我們在原始訓練集上進行有放回的隨機採樣,得到M比較小的訓練集並訓練M個模型,然後通過投票的方法進行模型集成。
- 隨機森林(Random Forest)是在Bagging的基礎上再引入了隨機特徵,進一步提升每個基模型之間的獨立性。在隨機森林中,每個基模型都是一棵樹。
隨機森林的算法步驟如下:
- 從樣本集中通過重採樣的方式產生n個樣本
- 假設樣本特徵數目爲a,對n個樣本選擇a中的k個特徵,用建立決策樹的方式獲得最佳分割點
- 重複m次,產生m棵決策樹
-多數投票機制來進行預測
需要注意的一點是,這裏m是指循環的次數,n是指樣本的數目,n個樣本構成訓練的樣本集,而m次循環中又會產生m個這樣的樣本集
Boosting類方法
Boosting類方法是按照一定的順序來先後訓練不同的基模型,每個模型都針對前續模型的錯誤進行專門訓練。根據前序模型的結果,來提高訓練樣本的權重,從而增加不同基模型之間的差異性。Boosting類方法的代表性方法有AbaBoost,GBDT,XGB,LightGBM等。
關於GBDT的介紹同樣可以參考《推薦系統開發實戰》一書。
Boosting類集成模型的目標是學習一個加性模型(additive model) ,其表達式如下:
其中爲弱分類器,或基分類器,爲弱分類器的集成權重,稱爲強分類器。
Boosting類方法的關鍵是如何訓練每個弱分類器以及對應的權重。爲了提高集成的效果,應儘可能使得每個弱分類器的差異儘可能大。一種有效的方法是採用迭代的策略來學習每個弱分類器,即按照一定的順序依次訓練每個弱分類器。
在學習了第m個弱分類器之後,增加分錯樣本的權重,使得第個弱分類器“更關注”於前邊弱分類器分錯的樣本。這樣增加每個弱分類器的差異,最終提升的集成分類器的準確率。這種方法稱爲AdaBoost(其實其他的Boost模型採用的也是類似的策略,根據前m-1顆樹的誤差迭代第m顆樹)。
AdaBoost算法
AdaBoost算法是一種迭代式的訓練算法,通過改變數據分佈來提高弱分類器的差異。在每一輪訓練中,增加分錯樣本的權重,減少對分對樣本的權重,從而得到一個新的數據分佈。
以兩類分類爲例,弱分類器,AdaBoost算法的訓練過程如下所示,最初賦予每個樣本同樣的權重。在每一輪迭代中,根據當前的樣本權重訓練一個新的弱分類器。然後根據這個弱分類器的錯誤率來計算其集成權重,並調整樣本權重。
AdaBoost算法的統計學解釋
AdaBoost算法可以看做是一種分步優化的加性模型,其損失函數定義爲:
其中
假設經過次迭代,得到:
則第次迭代的目標是找一個和使得下面的損失函數最小。
令 ,則損失函數可以表示爲:
因爲,有:
其中爲指示函數。
將損失函數在處進行二階泰勒展開,有:
從上式可以看出,當時,最優的分類器爲使得在樣本權重爲時的加權錯誤率最小的分類器。
在求解出之後,上述的損失函數可以寫爲:
其中爲分類器的加權錯誤率
求上式關於的導數並令其爲0,得到
AdaBoost算法的優缺點
優點:
- 作爲分類器精度很高
- 可以使用各種算法構建子分類器,AdaBoost提供的是一個框架
- 使用簡單分類器時,計算出的結果可理解,且構造簡單
- 不需要做特徵篩選
- 不同擔心過擬合
缺點:
- 容易收到噪聲干擾
- 訓練時間長,因爲需要遍歷所有特徵
- 執行效果依賴於弱分類器的選擇
自訓練和協同訓練
監督學習雖然準確度上有一定的保證,但往往需要大量的訓練數據,但在一些場景中標註數據的成本是非常高的,因此如何利用大量的無標註數據提高監督學習的效率,有着十分重要的意義。這種利用少量樣本標註數據和大量樣本標註數據進行學習的方式稱之爲半監督學習(Semi-Supervised Learning,SSL)。
本節介紹兩種無監督的學習算法:自訓練和協同訓練。
自訓練
自訓練(Slef-Training)也叫自訓練(Self-teaching)或者自舉法(boostStrapping)。
自訓練的思路是:利用已知的標註數據訓練一個模型,利用該模型去預測無標註的樣本數據,然後將置信度較高的樣本以及其僞標籤加入訓練集,然後重新訓練模型,進行迭代。下圖給出了自訓練的算法過程。
自訓練和密度估計中EM算法有一定的相似之處,通過不斷地迭代來提高模型能力。但自訓練的缺點是無法保證每次加入訓練集的樣本的僞標籤是正確的。如果選擇樣本的僞標籤是錯誤的,反而會損害模型的預測能力。因此自訓練最關鍵的步驟是如何設置挑選樣本的標準。
協同訓練
協同訓練(Co-Training)是自訓練的一種改進方法,通過兩個基於不同視角的分類器來相互促進。很多數據都有相對獨立的不同視角。比如互聯網上的每個網頁都由兩種視角組成:文字內容和指向其他網頁的鏈接。如果要確定一個網頁的類別,可以根據文字內容來判斷,也可以根據網頁之間的鏈條關係來判斷。
假設一個樣本,其中分別表示兩種不同視角的特徵,並滿足下面兩個假設:
- (1):條件獨立性,即給定樣本標籤y時,兩種特徵條件獨立
- (2):充足和冗餘性,即當數據充分時,每種視角的特徵都可以足以單獨訓練出一個正確的分類器。
令爲需要學習的真實映射函數,和分別爲兩個視角的分類器,有:
其中爲樣本的取值空間。
由於不同視角的條件獨立性,在不同視角上訓練出來的模型就相當於從不同的視角來理解問題,具有一定的互補性。協同訓練就是利用這種互補行來進行自訓練的一種方法。首先在訓練集上根據不同視角分別訓練兩個模型和然後用和在無標記數據集上進行預測,各選取預測置信度比較高的樣本加入到訓練集,重新訓練兩個不同視角的模型,並不斷重複這個過程(需要注意的是協同算法要求兩種視圖時條件獨立的,如果兩種視圖完全一樣,則協同訓練退化成自訓練算法)。
協同訓練的算法過程如下:
多任務學習
一般的機器學習模型是針對單個任務進行的,不同任務的模型需要在各自的訓練集上單獨學習得到。而多任務學習(Multi-task learning)是指同時學習多個相關任務,讓 這些任務在學習的過程中共享知識,利用多個任務之間的相關性來改進模型的性能和泛化能力。
多任務學習可以看做時一種歸納遷移學習(Inductive Transfer Learning),即通過利用包含在相關任務中的信息作爲歸納偏置(Inductive Bias)來提高泛化能力。
多任務學習的主要挑戰在於如何設計多任務之間的共享機制,在傳統的機器學習任務中很難引入共享信息,但是在神經網絡中就變得簡單了許多,常見的以下四種:
- 硬共享模式:讓不同任務的神經網絡模型共同使用一些共享模塊來提取一些通用的特徵,然後再針對每個不同的任務設置一些私有模塊來提取一些任務特定的特徵。
- 軟共享模式:不顯式設置共享模塊,但每個任務都可以從其他任務中“竊取”一些信息來提高自己的能力。竊取的方式包括直接複製使用其他任務的隱狀態,或使用注意力機制來主動選擇有用的信息。
- 層次共享模式:一般神經網絡中不同層抽取的特徵類型不同,底層一般抽取一些低級的局部特徵,高層抽取一些高級的抽象語義特徵。因此如果多任務學習中不同任務也有級別高低之分,那麼一個合理的共享模式是讓低級任務在底層輸出,高級任務在高層輸出。
- 共享-私有模式:一個更加分工明確的方式是將共享模塊和任務特定(私有)模塊的責任分開。共享模塊捕捉一些跨任務的共享特徵,而私有模塊只捕捉和特點任務相關的特徵。最終的表示由共享特徵和私有特徵共同構成。
在多任務學習中,每個任務都可以有自己單獨的訓練集。爲了讓所有任務同時學習,我們通常會使用交替訓練的方式來“近似”的實現同時學習,下圖給出了四種常見的共享模式圖
多任務學習的流程可以分爲兩個階段:
- (1)聯合訓練階段:每次迭代時,隨機挑選一個任務,然後從這個任務中隨機選擇一些訓練樣本,計算梯度並更新參數
- (2)單任務精調階段:基於多任務學習到的參數,分別在每個單獨任務進行精調,其中單任務精調階段爲可選階段。當多個任務的差異性比較大時,在每個單任務上繼續優化參數可以進一步提升模型能力。
假設有M個相關任務,其模型分別爲,多任務學習的聯合目標函數爲所有任務損失函數的線性加權:
其中爲第m個任務的損失函數,是第m個任務的權重,表示包含了共享模塊和私有模塊在內的所有參數。
多任務學習中聯合訓練階段的具體過程如下所示:
多任務學習通常比單任務學習獲得更好的泛化能力,主要由於以下幾個原因:
- 1.多任務學習在多個數據集上進行訓練,訓練集範圍更大,且多任務之間具有一定的相關性,相當於是一種隱式的數據增強,可以提高模型的泛化能力。
- 2.多任務學習中的共享模塊需要兼顧所有任務,在一定程度上避免了模型過擬合到單個任務的訓練集,可以看做是一種正則化。
- 3.多任務學習比單任務學習可以獲得更好的表示
- 4.在多任務學習中,每個任務都可以“選擇性”利用其他任務中學習到的隱藏特徵,從而提高自身的能力。
遷移學習
標準機器學習的前提假設只訓練數據和測試數據的分佈是相同的。如果不滿足這個假設,在訓練集上學習到的模型在測試集上的表現會比較差。如何將相關任務的訓練數據中學習到的可泛化知識遷移到目標任務中,就是遷移學習(Transfer Learning)要解決的問題。
遷移學習根據不同的遷移方式又分爲兩個類型:歸納遷移學習(Inductive Transfer Learning)和推導遷移學習(Transductive Transfer Learning)。這兩個類型分別對應兩個機器學習的範式:歸納學習(Inductive Learning)和轉導學習(Transductive Learning)。一般的機器學習任務都是指歸納學習,即希望再訓練集上學習到使得期望風險最小的模型。而轉導學習的目標是學習一種在給定測試集上錯誤率最小的模型,在訓練階段可以利用測試集的信息。
歸納遷移學習
一般而言,歸納遷移學習要求源領域和目標領域時相關的,並且源領域有大量的訓練樣本,這些樣本可以是有標註的樣本也可以時無標註的樣本。
-
當源領域只有大量無標註數據時,源任務可以轉換爲無監督學習任務,比如自編碼和密度估計,通過無監督任務學習一種可遷移的表示,然後將這些表示遷移到目標任務上。
-
當源領域有大量的標註數據時,可以直接將源領域上訓練的模型遷移到目標領域上。
歸納遷移學習一般有下面兩種遷移方式: -
基於特徵的方式:將預訓練模型的輸出或者中間隱藏層的輸出作爲特徵直接加入到目標任務學習模型中。目標任務的學習模型可以時一般的淺層分類器(比如支持向量機等)或一個新的神經網絡模型。
-
精調的方式:在目標任務上覆用預訓練模型的部分參數,並對其參數進行精調。
假設預訓練的模型是一個深層神經網絡,不同層的可遷移性也不盡相同。通常來說網絡的低層學習一些通用的低層特徵,中層或者高層學習抽象的高級語義特徵,而最後幾層一般學習和特定任務相關的特徵。因此根據目標任務的自身特點以及和源任務的相關性,可以針對性的選擇預訓練模型的不同層來遷移到目標任務中。
將預訓練模型遷移到目標任務中通常會比從零開始學習的方式好,主要體現在以下三點:
- (1)初始模型的性能一般比隨機初始化的模型要好
- (2)訓練時模型的學習速度比從零開始學習要快,收斂性更好
- (3)模型的最終性能更好,具有更好的泛化性
歸納遷移學習和多任務學習也比較類似,但是有下面兩點區別:
- (1)多任務學習是同時學習多個不同任務,而歸納遷移學習通常分爲兩個階段,即源任務上的學習階段,和目標任務上的遷移學習階段
- (2)歸納遷移學習是單向的知識遷移,希望提高模型在目標任務上的性能,而多任務學習時希望提高所有任務的性能。
轉導遷移學習
轉導遷移學習是一種從樣本到樣本的遷移,直接利用源領域和目標領域的樣本進行遷移學習。轉導遷移學習可以看作是一種特殊的轉導學習。轉導遷移學習通常假設源領域有大量的標註數據,而目標領域沒有(或少量)的標註數據,但是有大量的無標註數據。目標領域的數據在訓練階段是可見的。
轉導遷移學習的一個常見子問題時領域適應(Domain Adaptation),在領域適應問題中,一般假設源領域和目標領域有相同的樣本空間,但是數據分佈不同。
根據貝葉斯公式,,因此數據分佈的不一致通常由三種情況造成。
- (1)協變量偏移(Covariate Shift):源領域和目標領域的輸入邊際分佈不同,但後驗分佈相同,即學習任務相同
- (2)概念偏移(Concept Shift):輸入邊際分佈相同,但後驗分佈不同,即學習任務不同
- (3)先驗偏移(Prior Shift):源領域和目標領域中的輸出先驗分佈不同,條件分佈相同。在這樣的情況下,目標領域必須提供一定數量的標註樣本。
終生學習
終生學習(Lifelong Learning)也叫持續學習(Continuous Learning)是指像人類一樣具有持續不斷的學習能力,根據歷史任務中學到的經驗和知識來幫助學習不斷出現的新任務,並且這些經驗和知識是持續累積的,不會因爲新的任務而忘記舊的知識。
在終生學習中,假設一個終生學習算法已經在歷史人任務上學習到一個模型,當出現一個新任務時,這個算法可以根據過去在個任務上學習到的知識來幫助第個任務,同時積累所有的個任務上的知識。
在終生學習中,一個關鍵的問題是如何避免災難性遺忘(Catastrophic Forgetting),即按照一定順序學習多個任務時,在學習新任務的同時不忘記先前學習到的歷史知識。比如在神經網絡模型中,一些參數對任務非常重要,如果在學習任務時被改變了,就可能給任務造成不好的影響。
解決災難性遺忘的方法有很多,比如彈性權重鞏固方法(Elastic Weight Coonsolidation)。
元學習
根據沒有免費午餐定理,沒有一種通用的學習算法在所有任務上都有效。因此當使用機器學習算法實現某個任務時,我們通常需要“就事論事”,根據任務的特定來選擇合適的模型、損失函數、優化算法以及超參數。
而這種動態調整學習方式的能力,稱爲元學習(Meta-Learning),也稱爲學習的學習(Learning to Learn)。
元學習的目的時從已有的任務中學習一種學習方法或元知識,可以加速新任務的學習。從這個角度來說,元學習十分類似於歸納遷移學習,但元學習更側重從多種不同的任務中歸納出一種學習方法。
這裏主要介紹兩種典型的元學習方法:基於優化器的元學習和模型無關的元學習。
基於優化器的元學習
目前神經網絡的的學習方法主要是定義一個目標損失函數,並通過梯度下降算法來最小化
其中爲第步時的模型參數,爲梯度,爲學習率。在不同的任務上,通常選擇不同的學習綠以及不同的優化方法,比如動量法,Adam等。這些優化算法的本質區別在於更新參數的規則不同,因此一種很自然的元學習就是自動學習一種更新參數的規則,即通過另一個神經網絡(比如循環神經網絡)來建模梯度下降的過程。下圖給出了基於優化器的元學習示例。
我們用函數來預測第步時參數更新的差值,函數稱爲優化器,輸入是當前時刻的梯度值,輸出時參數的更新差值,這樣第步的更新規則可以寫爲:
其中爲優化器的參數。
學習優化器的過程可以看做是一種元學習過程,其目標是找到一個適用於多個不同任務的優化器。在標準的梯度下降中,每步迭代的目標是使得下降。而在優化器的元學習中,我們希望在每步迭代的目標是最小,具體的目標函數爲:
其中爲最大迭代次數,爲每一步的權重,一般可以設置。由於LSTM網絡可以記憶梯度的歷史信息,學習到的優化器可以看做是一個高階的優化方法。
模型無關的元學習
模型無關的元學習(Model-Agnostic Meta-Learning, MAML)是一個簡單的模型無關、任務無關的元學習算法。假設所有的任務都來自一個任務空間,其分佈爲,我們可以在這個任務空間的所有任務上學習一種通用的表示,這種表示可以經過梯度下降方法在一個特定的單任務上進行精調。假設一個模型爲,如果我們讓這個模型適應到一個新任務上,通過一步或多步的梯度下降更新,學習到的任務適配參數爲:
其中爲學習率,這裏的可以理解爲關於的函數,而不是真正的參數更新。
MAML的目標是學習一個參數使得其經過一個梯度迭代就可以在新任務上達到最好的性能。
即在所有任務上的元優化(Meta-Optimization)也採用梯度下降來進行優化,即:
其中爲元學習率,這裏爲一個真正的參數更新步驟。需要計算關於的二階梯度,但用一級近似通常也可以達到比較好的性能。
MAML的具體過程算法如下:
總結
目前神經網路的學習機制主要是以監督學習爲主,這種學習方式得到的模型往往是定向的,也是孤立的,每個任務的模型都是從零開始訓練的,一切知識都需要從訓練數據中得到,導致每個任務都需要大量的訓練數據。本章主要介紹了一些和模型無關的學習方式,包括集成學習、自訓練和協同訓練、多任務學習、遷移學習、元學習,這些都是深度學習中研究的重點。