來(lái)源:Datawhale 本文約6000字,建議閱讀10+分鐘 本文以圖文的形式對(duì)模型算法中的集成學(xué)習(xí),以及對(duì)集中學(xué)習(xí)在深度學(xué)習(xí)中的應(yīng)用進(jìn)行了詳細(xì)解讀。 標(biāo)簽:機(jī)器學(xué)習(xí) 數(shù)據(jù)及背景阿里天池-零基礎(chǔ)入門(mén)CV賽事: https://tianchi.aliyun.com/competition/entrance/531795/introduction 集成學(xué)習(xí)集成學(xué)習(xí),即分類器集成,通過(guò)構(gòu)建并結(jié)合多個(gè)學(xué)習(xí)器來(lái)完成學(xué)習(xí)任務(wù)。一般結(jié)構(gòu)是:先產(chǎn)生一組“個(gè)體學(xué)習(xí)器”,再用某種策略將它們結(jié)合起來(lái)。結(jié)合策略主要有平均法、投票法和學(xué)習(xí)法等。集成學(xué)習(xí)(ensemble learning)通過(guò)構(gòu)建并結(jié)合多個(gè)學(xué)習(xí)器來(lái)完成學(xué)習(xí)任務(wù),有時(shí)也被稱為多分類器系統(tǒng)(multi-classifier system)、基于委員會(huì)的學(xué)習(xí)(committee-based learning)。 集成學(xué)習(xí)是這樣一個(gè)過(guò)程,按照某種算法生成多個(gè)模型,如分類器或者稱為專家,再將這些模型按照某種方法組合在一起來(lái)解決某個(gè)智能計(jì)算問(wèn)題。集成學(xué)習(xí)主要用來(lái)提高模型(分類,預(yù)測(cè),函數(shù)估計(jì)等)的性能,或者用來(lái)降低模型選擇不當(dāng)?shù)目赡苄?。集成算法本身是一種監(jiān)督學(xué)習(xí)算法,因?yàn)樗梢员挥?xùn)練然后進(jìn)行預(yù)測(cè),組合的多個(gè)模型作為整體代表一個(gè)假設(shè)(hypothesis)。 集成方法是將幾種機(jī)器學(xué)習(xí)技術(shù)組合成一個(gè)預(yù)測(cè)模型的元算法,以達(dá)到減小方差(bagging)、偏差(boosting) 或改進(jìn)預(yù)測(cè)(stacking) 的效果。 分類器(Classifier) 分類器是數(shù)據(jù)挖掘中對(duì)樣本進(jìn)行分類的方法的統(tǒng)稱,包含決策樹(shù)、邏輯回歸、樸素貝葉斯、神經(jīng)網(wǎng)絡(luò)等算法。分類是數(shù)據(jù)挖掘的一種非常重要的方法。分類的概念是在已有數(shù)據(jù)的基礎(chǔ)上學(xué)會(huì)一個(gè)分類函數(shù)或構(gòu)造出一個(gè)分類模型(即分類器)。該函數(shù)或模型能夠把數(shù)據(jù)庫(kù)中的數(shù)據(jù)記錄映射到給定類別中的某一個(gè),從而可以應(yīng)用于數(shù)據(jù)預(yù)測(cè)。 分類器的構(gòu)造和實(shí)施大體會(huì)經(jīng)過(guò)以下幾個(gè)步驟:
1. 決策樹(shù)分類器 構(gòu)造這個(gè)分類器不需要任何領(lǐng)域的知識(shí),也不需要任何的參數(shù)設(shè)置。因此它特別適合于探測(cè)式的知識(shí)發(fā)現(xiàn)。此外,這個(gè)分類器還可以處理高維數(shù)據(jù),而且采用的是類似于樹(shù)這種形式,也特別直觀和便于理解。因此,決策樹(shù)是許多商業(yè)規(guī)則歸納系統(tǒng)的基礎(chǔ)。 2. 樸素貝葉斯分類器 素貝葉斯分類器是假設(shè)數(shù)據(jù)樣本特征完全獨(dú)立,以貝葉斯定理為基礎(chǔ)的簡(jiǎn)單概率分類器。 3. AdaBoost算法 AdaBoost算法的自適應(yīng)在于前一個(gè)分類器產(chǎn)生的錯(cuò)誤分類樣本會(huì)被用來(lái)訓(xùn)練下一個(gè)分類器,從而提升分類準(zhǔn)確率,但是對(duì)于噪聲樣本和異常樣本比較敏感。 4. 支持向量機(jī) 支持向量機(jī)是用過(guò)構(gòu)建一個(gè)或者多個(gè)高維的超平面來(lái)將樣本數(shù)據(jù)進(jìn)行劃分,超平面即為樣本之間的分類邊界。 5. K近鄰算法 基于k近鄰的K個(gè)樣本作為分析從而簡(jiǎn)化計(jì)算提升效率,K近鄰算法分類器是基于距離計(jì)算的分類器。 集成學(xué)習(xí)方法 集成學(xué)習(xí)有許多集成模型,例如自助法、自助聚合(Bagging)、隨機(jī)森林、提升法(Boosting)、堆疊法(stacking)以及許多其它的基礎(chǔ)集成學(xué)習(xí)模型。 集成方法的思想是通過(guò)將這些個(gè)體學(xué)習(xí)器(個(gè)體學(xué)習(xí)器稱為“基學(xué)習(xí)器”,基學(xué)習(xí)器也被稱為弱學(xué)習(xí)器。)的偏置和/或方差結(jié)合起來(lái),從而創(chuàng)建一個(gè)強(qiáng)學(xué)習(xí)器(或集成模型),從而獲得更好的性能。 我們可以用三種主要的旨在組合弱學(xué)習(xí)器的元算法:
非常粗略地說(shuō),我們可以說(shuō)Bagging的重點(diǎn)在于獲得一個(gè)方差比其組成部分更小的集成模型,而B(niǎo)oosting和Stacking則將主要生成偏置比其組成部分更低的強(qiáng)模型(即使方差也可以被減小)。 1. 自助聚合(Bagging) 在并行化的方法中,我們單獨(dú)擬合不同的學(xué)習(xí)器,因此可以同時(shí)訓(xùn)練它們。最著名的方法是自助聚合(Bagging),它的目標(biāo)是生成比單個(gè)模型更棒的集成模型。Bagging的方法實(shí)現(xiàn)。 自助法:這種統(tǒng)計(jì)技術(shù)先隨機(jī)抽取出作為替代的 B 個(gè)觀測(cè)值,然后根據(jù)一個(gè)規(guī)模為 N 的初始數(shù)據(jù)集生成大小為 B 的樣本(稱為自助樣本)。 在某些假設(shè)條件下,這些樣本具有非常好的統(tǒng)計(jì)特性:在一級(jí)近似中,它們可以被視為是直接從真實(shí)的底層(并且往往是未知的)數(shù)據(jù)分布中抽取出來(lái)的,并且彼此之間相互獨(dú)立。因此,它們被認(rèn)為是真實(shí)數(shù)據(jù)分布的代表性和獨(dú)立樣本(幾乎是獨(dú)立同分布的樣本)。 為了使這種近似成立,必須驗(yàn)證兩個(gè)方面的假設(shè):
舉例而言,自助樣本通常用于評(píng)估統(tǒng)計(jì)估計(jì)量的方差或置信區(qū)間。根據(jù)定義,統(tǒng)計(jì)估計(jì)量是某些觀測(cè)值的函數(shù)。因此,隨機(jī)變量的方差是根據(jù)這些觀測(cè)值計(jì)算得到的。為了評(píng)估這種估計(jì)量的方差,我們需要對(duì)從感興趣分布中抽取出來(lái)的幾個(gè)獨(dú)立樣本進(jìn)行估計(jì)。 在大多數(shù)情況下,相較于實(shí)際可用的數(shù)據(jù)量來(lái)說(shuō),考慮真正獨(dú)立的樣本所需要的數(shù)據(jù)量可能太大了。然而,我們可以使用自助法生成一些自助樣本,它們可被視為最具代表性以及最具獨(dú)立性(幾乎是獨(dú)立同分布的樣本)的樣本。這些自助樣本使我們可以通過(guò)估計(jì)每個(gè)樣本的值,近似得到估計(jì)量的方差。 2. 提升法(Boosting) 在順序化的方法中,組合起來(lái)的不同弱模型之間不再相互獨(dú)立地?cái)M合。其思想是迭代地?cái)M合模型,使模型在給定步驟上的訓(xùn)練依賴于之前的步驟上擬合的模型。提升法(Boosting)是這些方法中最著名的一種,它生成的集成模型通常比組成該模型的弱學(xué)習(xí)器偏置更小。 Boosting和Bagging的工作思路是一樣的:我們構(gòu)建一系列模型,將它們聚合起來(lái)得到一個(gè)性能更好的強(qiáng)學(xué)習(xí)器。然而,與重點(diǎn)在于減小方差的Bagging不同,Boosting著眼于以一種適應(yīng)性很強(qiáng)的方式順序擬合多個(gè)弱學(xué)習(xí)器:序列中每個(gè)模型在擬合的過(guò)程中,會(huì)更加重視那些序列中之前的模型處理的很糟糕的觀測(cè)數(shù)據(jù)。 直觀地說(shuō),每個(gè)模型都把注意力集中在目前最難擬合的觀測(cè)數(shù)據(jù)上。這樣一來(lái),在這個(gè)過(guò)程的最后,我們就獲得了一個(gè)具有較低偏置的強(qiáng)學(xué)習(xí)器(我們會(huì)注意到,Boosting也有減小方差的效果)。和Bagging一樣,Boosting也可以用于回歸和分類問(wèn)題。由于其重點(diǎn)在于減小偏置,用于Boosting的基礎(chǔ)模型通常是那些低方差高偏置的模型。 例如,如果想要使用樹(shù)作為基礎(chǔ)模型,我們將主要選擇只有少許幾層的較淺決策樹(shù)。而選擇低方差高偏置模型作為Boosting弱學(xué)習(xí)器的另一個(gè)重要原因是:這些模型擬合的計(jì)算開(kāi)銷較低(參數(shù)化時(shí)自由度較低)。實(shí)際上,由于擬合不同模型的計(jì)算無(wú)法并行處理(與Bagging不同),順序地?cái)M合若干復(fù)雜模型會(huì)導(dǎo)致計(jì)算開(kāi)銷變得非常高。 一旦選定了弱學(xué)習(xí)器,我們?nèi)孕枰x它們的擬合方式和聚合方式。介紹兩個(gè)重要的Boosting算法:自適應(yīng)提升(adaboost)和梯度提升(gradient boosting)。 簡(jiǎn)而言之,這兩種元算法在順序化的過(guò)程中創(chuàng)建和聚合弱學(xué)習(xí)器的方式存在差異。自適應(yīng)提升算法會(huì)更新附加給每個(gè)訓(xùn)練數(shù)據(jù)集中觀測(cè)數(shù)據(jù)的權(quán)重,而梯度提升算法則會(huì)更新這些觀測(cè)數(shù)據(jù)的值。這里產(chǎn)生差異的主要原因是:兩種算法解決優(yōu)化問(wèn)題(尋找最佳模型——弱學(xué)習(xí)器的加權(quán)和)的方式不同。 2.1. 自適應(yīng)adaboost 在自適應(yīng)adaboost中,我們將集成模型定義為L(zhǎng)個(gè)弱學(xué)習(xí)器的加權(quán)和: 其中為系數(shù),為弱學(xué)習(xí)器尋找這種最佳集成模型是一個(gè)困難的優(yōu)化問(wèn)題。因此,我們并沒(méi)打算一次性地解決該問(wèn)題(找到給出最佳整體加法模型的所有系數(shù)和弱學(xué)習(xí)器),而是使用了一種更易于處理的迭代優(yōu)化過(guò)程(即使它有可能導(dǎo)致我們得到次優(yōu)解)。另外,我們將弱學(xué)習(xí)器逐個(gè)添加到當(dāng)前的集成模型中,在每次迭代中尋找可能的最佳組合(系數(shù)、弱學(xué)習(xí)器)。換句話說(shuō),我們循環(huán)地將 定義如下: 其中,和被挑選出來(lái),使得是最適合訓(xùn)練數(shù)據(jù)的模型,因此這是對(duì) 的最佳可能改進(jìn)。我們可以進(jìn)一步將其表示為: 其中,是給定模型的擬合誤差,是損失/誤差函數(shù)。因此,我們并沒(méi)有在求和過(guò)程中對(duì)所有L個(gè)模型進(jìn)行「全局優(yōu)化」,而是通過(guò)「局部」優(yōu)化來(lái)近似最優(yōu)解并將弱學(xué)習(xí)器逐個(gè)添加到強(qiáng)模型中。 更特別的是,在考慮二分類問(wèn)題時(shí),我們可以將 adaboost 算法重新寫(xiě)入以下過(guò)程:首先,它將更新數(shù)據(jù)集中觀測(cè)數(shù)據(jù)的權(quán)重,訓(xùn)練一個(gè)新的弱學(xué)習(xí)器,該學(xué)習(xí)器重點(diǎn)關(guān)注當(dāng)前集成模型誤分類的觀測(cè)數(shù)據(jù)。其次,它會(huì)根據(jù)一個(gè)表示該弱模型性能的更新系數(shù),將弱學(xué)習(xí)器添加到加權(quán)和中:弱學(xué)習(xí)器的性能越好,它對(duì)強(qiáng)學(xué)習(xí)器的貢獻(xiàn)就越大。 因此,假設(shè)我們面對(duì)的是一個(gè)二分類問(wèn)題:數(shù)據(jù)集中有N個(gè)觀測(cè)數(shù)據(jù),我們想在給定一組弱模型的情況下使用adaboost算法。在算法的起始階段(序列中的第一個(gè)模型),所有的觀測(cè)數(shù)據(jù)都擁有相同的權(quán)重1/N。然后,我們將下面的步驟重復(fù)L次(作用于序列中的L個(gè)學(xué)習(xí)器):
重復(fù)這些步驟,我們順序地構(gòu)建出L個(gè)模型,并將它們聚合成一個(gè)簡(jiǎn)單的線性組合,然后由表示每個(gè)學(xué)習(xí)器性能的系數(shù)加權(quán)。注意,初始adaboost算法有一些變體,比如LogitBoost(分類)或L2Boost(回歸),它們的差異主要取決于損失函數(shù)的選擇。 3. 堆疊法(Stacking) 堆疊法Stacking與Bagging和Boosting主要存在兩方面的差異。首先,堆疊法通常考慮的是異質(zhì)弱學(xué)習(xí)器(不同的學(xué)習(xí)算法被組合在一起),而B(niǎo)agging和Boosting主要考慮的是同質(zhì)弱學(xué)習(xí)器。其次,stacking堆疊法學(xué)習(xí)用元模型組合基礎(chǔ)模型,而B(niǎo)agging和Boosting則根據(jù)確定性算法組合弱學(xué)習(xí)器。 正如上文已經(jīng)提到的,堆疊法的概念是學(xué)習(xí)幾個(gè)不同的弱學(xué)習(xí)器,并通過(guò)訓(xùn)練一個(gè)元模型來(lái)組合它們,然后基于這些弱模型返回的多個(gè)預(yù)測(cè)結(jié)果輸出最終的預(yù)測(cè)結(jié)果。 因此,為了構(gòu)建Stacking模型,我們需要定義兩個(gè)東西:想要擬合的L個(gè)學(xué)習(xí)器以及組合它們的元模型。例如,對(duì)于分類問(wèn)題來(lái)說(shuō),我們可以選擇KNN分類器、logistic回歸和SVM作為弱學(xué)習(xí)器,并決定學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)作為元模型。然后,神經(jīng)網(wǎng)絡(luò)將會(huì)把三個(gè)弱學(xué)習(xí)器的輸出作為輸入,并返回基于該輸入的最終預(yù)測(cè)。所以,假設(shè)我們想要擬合由L個(gè)弱學(xué)習(xí)器組成的Stacking集成模型。我們必須遵循以下步驟:
在前面的步驟中,我們將數(shù)據(jù)集一分為二,因?yàn)閷?duì)用于訓(xùn)練弱學(xué)習(xí)器的數(shù)據(jù)的預(yù)測(cè)與元模型的訓(xùn)練不相關(guān)。因此,將數(shù)據(jù)集分成兩部分的一個(gè)明顯缺點(diǎn)是,我們只有一半的數(shù)據(jù)用于訓(xùn)練基礎(chǔ)模型,另一半數(shù)據(jù)用于訓(xùn)練元模型。 為了克服這種限制,我們可以使用某種k-折交叉訓(xùn)練方法(類似于 k-折交叉驗(yàn)證中的做法)。這樣所有的觀測(cè)數(shù)據(jù)都可以用來(lái)訓(xùn)練元模型:對(duì)于任意的觀測(cè)數(shù)據(jù),弱學(xué)習(xí)器的預(yù)測(cè)都是通過(guò)在k-1折數(shù)據(jù)(不包含已考慮的觀測(cè)數(shù)據(jù))上訓(xùn)練這些弱學(xué)習(xí)器的實(shí)例來(lái)完成的。換句話說(shuō),它會(huì)在k-1折數(shù)據(jù)上進(jìn)行訓(xùn)練,從而對(duì)剩下的一折數(shù)據(jù)進(jìn)行預(yù)測(cè)。迭代地重復(fù)這個(gè)過(guò)程,就可以得到對(duì)任何一折觀測(cè)數(shù)據(jù)的預(yù)測(cè)結(jié)果。這樣一來(lái),我們就可以為數(shù)據(jù)集中的每個(gè)觀測(cè)數(shù)據(jù)生成相關(guān)的預(yù)測(cè),然后使用所有這些預(yù)測(cè)結(jié)果訓(xùn)練元模型。 十折交叉驗(yàn)證 由于深度學(xué)習(xí)模型一般需要較長(zhǎng)的訓(xùn)練周期,如果硬件設(shè)備不允許建議選取留出法,如果需要追求精度可以使用交叉驗(yàn)證的方法。 十折交叉驗(yàn)證用來(lái)測(cè)試算法準(zhǔn)確性。將數(shù)據(jù)集分成十份,輪流將其中九份作為訓(xùn)練數(shù)據(jù),一份作為測(cè)試數(shù)據(jù),進(jìn)行試驗(yàn)。每次試驗(yàn)都會(huì)得出相應(yīng)的正確率(或差錯(cuò)率)。十次的結(jié)果的正確率(或差錯(cuò)率)的平均值作為對(duì)算法精度的估計(jì),一般還需要進(jìn)行多次十折交叉驗(yàn)證(例如十次十折交叉驗(yàn)證),再求其均值,作為對(duì)算法準(zhǔn)確性的估計(jì)。 下面假設(shè)構(gòu)建了十折交叉驗(yàn)證,訓(xùn)練得到十個(gè)CNN模型。 那么在十個(gè)CNN模型可以使用如下方式進(jìn)行集成:
此外在深度學(xué)習(xí)中本身還有一些集成學(xué)習(xí)思路的做法,值得借鑒學(xué)習(xí):
1. 丟棄法Dropout Dropout可以作為訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)的一種技巧。在每個(gè)訓(xùn)練批次中,通過(guò)隨機(jī)讓一部分的節(jié)點(diǎn)停止工作。同時(shí)在預(yù)測(cè)的過(guò)程中讓所有的節(jié)點(diǎn)都起作用。 Dropout經(jīng)常出現(xiàn)在在先有的CNN網(wǎng)絡(luò)中,可以有效的緩解模型過(guò)擬合的情況,也可以在預(yù)測(cè)時(shí)增加模型的精度。加入Dropout后的網(wǎng)絡(luò)結(jié)構(gòu)如下: # 定義模型class SVHN_Model1(nn.Module): def __init__(self): super(SVHN_Model1, self).__init__() # CNN提取特征模塊 self.cnn = nn.Sequential( nn.Conv2d(3, 16, kernel_size=(3, 3), stride=(2, 2)), nn.ReLU(), nn.Dropout(0.25), nn.MaxPool2d(2), nn.Conv2d(16, 32, kernel_size=(3, 3), stride=(2, 2)), nn.ReLU(), nn.Dropout(0.25), nn.MaxPool2d(2), ) # self.fc1 = nn.Linear(32*3*7, 11) self.fc2 = nn.Linear(32*3*7, 11) self.fc3 = nn.Linear(32*3*7, 11) self.fc4 = nn.Linear(32*3*7, 11) self.fc5 = nn.Linear(32*3*7, 11) self.fc6 = nn.Linear(32*3*7, 11) def forward(self, img): feat = self.cnn(img) feat = feat.view(feat.shape[0], -1) c1 = self.fc1(feat) c2 = self.fc2(feat) c3 = self.fc3(feat) c4 = self.fc4(feat) c5 = self.fc5(feat) c6 = self.fc6(feat) return c1, c2, c3, c4, c5, c6 2. 測(cè)試集數(shù)據(jù)擴(kuò)增TTA 測(cè)試集數(shù)據(jù)擴(kuò)增(Test Time Augmentation,簡(jiǎn)稱TTA)也是常用的集成學(xué)習(xí)技巧,數(shù)據(jù)擴(kuò)增不僅可以在訓(xùn)練時(shí)候用,而且可以同樣在預(yù)測(cè)時(shí)候進(jìn)行數(shù)據(jù)擴(kuò)增,對(duì)同一個(gè)樣本預(yù)測(cè)三次,然后對(duì)三次結(jié)果進(jìn)行平均。
Snapshot 本章的開(kāi)頭已經(jīng)提到,假設(shè)我們訓(xùn)練了10個(gè)CNN則可以將多個(gè)模型的預(yù)測(cè)結(jié)果進(jìn)行平均。但是加入只訓(xùn)練了一個(gè)CNN模型,如何做模型集成呢? 在論文Snapshot Ensembles中,作者提出使用cyclical learning rate進(jìn)行訓(xùn)練模型,并保存精度比較好的一些checkopint,最后將多個(gè)checkpoint進(jìn)行模型集成。 由于在cyclical learning rate中學(xué)習(xí)率的變化有周期性變大和減少的行為,因此CNN模型很有可能在跳出局部最優(yōu)進(jìn)入另一個(gè)局部最優(yōu)。在Snapshot論文中作者通過(guò)使用表明,此種方法可以在一定程度上提高模型精度,但需要更長(zhǎng)的訓(xùn)練時(shí)間。 寫(xiě)到最后 在不同的任務(wù)中可能會(huì)有不同的解決方案,不同思路的模型不僅可以互相借鑒,同時(shí)也可以修正最終的預(yù)測(cè)結(jié)果。 在本次賽題中,可以從以下幾個(gè)思路對(duì)預(yù)測(cè)結(jié)果進(jìn)行后處理:
|
|
來(lái)自: taotao_2016 > 《AI》