1. 程式人生 > >大白話5分鐘帶你走進人工智慧-第30節整合學習之Boosting方式和Adaboost

大白話5分鐘帶你走進人工智慧-第30節整合學習之Boosting方式和Adaboost

目錄

 

1、前述:

2、Bosting方式介紹:

3、Adaboost例子:

4、adaboost整體流程:

5、待解決問題:

6、解決第一個問題:如何獲得不同的g(x):

6.1 我們看下權重與函式的關係:

6.2 gt和un的關係數學公式表達:

6.3 引導Un+1的思路:

6.4 推導Un+1的由來:

6.5 規劃因子的由來:

7、解決第二個問題:α的計算:

7.1 每一個弱分類器需要什麼樣的樹:

8、具體總結Adaboost的整體流程:

9、舉例說明Adaboost的流程:

10、總結Adaboost:


1、前述:

 從本節開始我們講解整合學習的思想和一個重要的演算法Adaboost。

2、Bosting方式介紹:

之前我們介紹了blending的一種方式,uniformly blending,均勻的攪拌,也就是bagging形式,就是把所有g(x)加起來,取個符號,每個g(x)的結果認為是同樣重要的,此時每個g(x)的權重就等於1。數學符號表達為:

                                                      

今天開始我們講解另一種blending的方式,linearly Blending,就是把結果線性組合一下。線性組合就是一次項前邊可以和一個係數相乘,再相加叫做線性組合,線性組合關注的是,它不帶平方關係,不帶立方關係,只是一次項,我們稱這種一次方的相乘相加就叫做線性的。因為它是直的,帶平方它就變成曲線了,或者相乘就變成曲線了。假如g1(x)乘以g2(x)雖然沒帶平方,但它也不是線性的,它們彼此之間相乘了。它們不能相乘,只能有相加的關係,係數可以隨便加,我們管這個東西叫做線性的Blending,簡稱Lineraly Blending 。也就是Boosting 方式,此時它們的權重是unequal,不相等的。數學符號表達為:

                                                   

Boosting方式代表有Adaboost和GBDT。

為什麼linearly Blending加α而uniformly Blending不加α,取決於怎麼訓練的模型。uniformly Blending之所以不加是因為我們公平地進行了一個隨機抽樣,而linearly Blending為什麼會加?取決於訓練的時候就決定了一定需要加了α才有意義。

Boosting是整合學習的一種思路,它通過多輪迭代生成多個弱分類器,它是用全部的資料,而Bagging不一定用全部的資料。Boosting通過多輪迭代,每輪產生一個弱分類器,最後將弱分類器的結果線性組合,得到強分類器的最終結果。

3、Adaboost例子:

我們先看下Adaboost的一個例子,對於下圖:

假如只允許思考一秒鐘,如何判斷一個物體是蘋果?

第一個人說圓的是蘋果,那麼會發現所有圓的裡面,圖上標的藍色部分被分錯了,有的是圓的,但是沒有被標出來,有的是蘋果,但是因為不是圓的所以也沒被識別出來,總之就是看錯了,弱分類器,允許犯錯誤。為了彌補這些錯誤,我們著重在錯誤的裡面考慮,又發現紅的是蘋果。現在就是兩個條件了,圓的和紅的是蘋果。發現在這兩個條件下面,又有被分錯的,如下圖藍色部分:

本來是蘋果,因為顏色是綠色的所以在圓的和紅的兩個條件下面沒有被識別出來。又因為番茄是圓的和紅的,所以識別錯了。再著重在錯誤的裡面考慮,我們又會發現綠色的是蘋果。這三個說法相當於我們每一次都得出一個弱分類器,來得出最後的判斷。但是這3個弱分類器的靠譜程度顯然不一樣。我們需要組合去用他們,現在就得到了三個結果,一是圓的是蘋果,二是紅的是蘋果,三是綠色是蘋果,三不是很靠譜,翻譯過來就是它的正確率不會太高,而前兩個的正確率相對來說有點不相上下。我們給每一個賦予一個權重的概念,也就相當於投票。這三個投票的話,第一個靠譜一點的給它高一點權重,比如是1.5,第二個紅的還可以,給1.45,綠的最差,給它0.1。比如我們拿下面的蘋果做測試:

我們判斷是不是蘋果,就根據最後的結果,如果>0就是蘋果<0不是蘋果1。對於這一個來說,它不是紅的,所以給它-1.5,對於第二個來說,它是圓的所以給+1.45,此時-1.5+1.45=-0.05,判斷為不是蘋果。但是如果跟第三個條件結合的話,-1.5+1.45+0.1=0.05。就會判斷成蘋果。而對於以下這種來說

因為是圓的和紅色的所以,根據賦予的權重相加就是1.5+1.45,而對於第三個條件來說-0.1,不太怎麼會影響最後的結果。所以說這些看起來不太靠譜的分類器,他們都是通過錯誤的子集訓練出來的,在那些靠譜的分類器得不到正確結果的情況下,需要這些不太靠譜的分類器去平衡,而那些已經得到結論的時候它就不會太大程度的干擾結論。

我們通常稱1,-1,0.1為權重。把錯誤的圖片放大這個過程怎麼理解?也就是在訓練模型的時候,怎麼實現讓計算機考慮讓分錯的類別下次著重考慮?也是通過權重,那麼這兩個權重,是一個權重含義嗎?肯定不是,因為第二個權重是跟著資料走的,在這個例子裡是跟著每張圖片走的,哪張圖片大,也就是當前分錯了,它權重就高一些;而第一個權重是跟著訓練出來的分類器走的。我們把第一個叫做分類器權重,把第二個叫做資料權重。linearly Blending裡有一個α,αgi(x)或者αgt(x) 。α跟著gi(x)走,gi(x)就是分類器得出來的結果,所以它是分類器權重,通常用α來表示。而資料權重通常用un來表示。

4、adaboost整體流程:

我們先粗略的看下adaboost的計算流程:

首先用全部資料訓練一個弱分類器g1,弱分類器就能給出一個在訓練集上,誰判斷對了,誰判斷錯了的結果,我們利用結果修改訓練集每一個數據的權重。 權重變了,訓練出來的模型也就是新的弱分類器就跟以前不一樣了,得到了g2。g2又能得到一組判斷結果,這個判斷結果又可以看它判斷對了還是判斷錯了,之後又可以利用對錯的結果去修改權資料權重,然後拿到新的資料權重,訓練g3。一直迴圈,就達到了剛才蘋果那個例子,拿到一堆弱分類器,但是每個人看的是一方面,最後大家綜合討論一下,結合所有人的意見,得到一個最終結果。這裡需要強調下這是有監督的還是無監督的演算法?答案是有監督的。因為我們必須知道每一個分類器對結果的判斷對錯,既然是判斷對錯就一定是有監督的,有了ŷ,沒有yi怎麼判斷對錯。所以在訓練集上一定已經已知了yi,才有所謂的對錯。總結下上面的描述,首先對樣本賦予權重,賦予了權重這個值才能實現 著重看一下某些資料的這種方式,然後採用迭代的方式來構造每一步的弱分類器,最終通過弱分類器的linearly Blending(線性組合)得到強分類器,那麼linearly Blending是G(x)= α1* g1(x)+ α2* g2(x)+……+αn* gn(x),如果用向量形式表示的話,就是[α1……αn]*[ g1(x)……gn(x)]。所以這個就表明了向量形式就是一種簡寫。它本質上就是這個東西,只不過我給它寫成這種形式了。在這為什麼沒寫行向量和列向量的點乘?向量的點乘也叫向量的內積,就是把前面向量跟後邊向量對位相乘再相加,就是點乘的定義。[1,2,3]·[1,2,3],得到的結果是1×1+2×2+3×3,這是一種寫法,它實際代表的還是咱們數學中的這些東西,所以所有線性代數它並不是發明了一種新的運算,它只是把特別長的一個式子給寫成兩個方塊的形式了。

5、待解決問題:

瞭解了adaboost的計算流程之後,我們需要解決兩個問題:

1、第一是如何迭代生成若干互不相同的g(x)。我們最終想要G(x),G(x)裡邊有兩項,所有g(x)和所有的α;

2、第二是如何獲得跟每一個x相配的與眾不同的α。

6、解決第一個問題:如何獲得不同的g(x):

我們一個一個來,先解決第一個問題。如何獲得不同的g(x),也就是我們的每一個弱分類器。

我們先來回顧下隨機森林的構造方式:也需要獲得若干與眾不同的g(x),通過bootstrap re-sample,re-sample就是有放回的重抽樣,那麼這裡面g(x)有什麼特點? 它們是公平的,它們訓練過程中都是公平的,只不過每人看到的資料比較少,導致它比較弱。既然它是公平的,如何利用g(x)生成G(x)?均勻投票,每人一票不偏不倚。

而Adaboost:也需要得到若干不同的g(x),只是通過全部樣本來獲得,不再做bootstrap re-sample。如何讓它與眾不同?通過賦予樣本不同的權重,就能獲得不同的g(x)。這個權重是資料權重,通常用un來表示,為什麼帶一個n呢?說明有我們有N條樣本,每一條樣本背後都有自己的一個權重,代表我這條資料有多重要。重要多少取決於權重到底有多大,權重越大越重要。

對於Adaboost裡面,所有boosting演算法,都偏好於特別淺的層,不同於Bagging偏好深層。這個原因後面我們再具體解釋。比如GBDT一般5到6層就夠了,而Adaboost更加極端,通常使用1層。什麼叫一層或者有的也叫兩層?就是一分為二,每一個g(x)對資料就做一個一分為二,這個訓練速度會很快。基分類器g(x)通常會使用decision-stump,stump是一個戳的概念或者樁子的概念。原來是一棵樹,現在把上面都砍掉了就成了樹樁了,它就像一個樹樁一樣,它只會一分為二,我們通常管它叫decision-stump。我們通過修改資料的權重,使本次訓練的弱分類器在上次弱分類器做得不好的地方進行訓練。跟剛才的例子是可以對應上的,你哪些地方做得不好,我就著重考慮你沒做好的那些地方,這樣最後投票的時候才能有所Boosting,有所提升。 為什麼提升?因為每一棵樹是對上一棵樹的一個補強,而不是像原來弄出一大堆來,搞投票,它是一種補強的概念,它不能說更強,至少是把原來做的不好的地方給補上。

我們再普及下資料的正確率ACC怎麼計算?正確的個數/總的個數,就是我們的普通形式的正確率。那麼我們在Adaboost裡邊引入權重正確率。什麼含義呢?資料又是怎麼一個形式?假設我有N條資料,每一個數據都有一個權重記錄它的重要性,假如第一條資料認為是0.1份的重要,第二條資料認為0.2份的重要,一直到最後一條資料。此時的權重正確率就不再是正確個數的總和了,而是正確樣本對應權重的總和/總權重和。這代表每條資料不再認為它是同樣的重要性了,而是有的資料重要,有的資料不重要。因此首先還得看每條資料是分對了還是分錯了。excel舉例說明下:

 

比如現在有五條資料,第一條資料權重0.1,第二條資料權重0.1,第三條資料權重0.5,第四條資料權重0.2,第五條資料權重1。假如已經訓練出來一個分類器了,並且得到預測結果與真實結果的正確關係。此時它的權重正確率應該是(0.1+0.5+0.2)/(0.1+1)= 0.421,普通正確率是:正確的個數有3個,全部的個數5個,為0.6,所謂正確率ACC就是這麼定義的,正確個數除以總個數。在沒有資料權重的時候,通常都是追求正確率高,而加上資料權重了,我們此時去追求權重正確率高。假設決策樁(就是兩層的決策樹)就簡單粗暴地以結果論英雄,我找到一個分裂條件,把資料就分成了兩份,強制左邊是+1,右邊是-1,左邊是正,右邊是負。此時我遍歷的條件不再是基尼係數了,不再是資訊熵了,而是就看結果,誰的權重正確率最大,我就保留那種分裂條件。如果是這麼一個機制的話,它會傾向於儘量把第五條樣本資料判斷對。因為第五條樣本權重最高,一旦把它判斷對了,根據權重正確率的計算方式,此時結果更容易獲得高的權重正確率。

所以如果說要追求的是正確率最高,權重就沒有用了,而如果我這棵樹追求的是怎麼分了之後權重正確率最高,它就會去嘗試第一種分法權重正確率多少,第二種分法權重正確率是多少,當它突然嘗試到某一種分法權重正確率特別高的時候,它就把此時分裂條件保留下來了。此時能保留下來的分裂條件更容易的把高權重的資料分隊,因為只有高權重分對了,權重正確率才會相對容易高,不能說它絕對高。這樣就叫做讓計算機著重的去考慮高權重的資料,你給我儘量把它分對。

權重怎麼來的?第一代的權重全是1,通過一次一次的迭代去改變的。對應蘋果的例子,上來沒有任何一張照片被放大了,直接看,此時每條資料是同等重要的。當權重全為1的時候,權重正確率和正確率就相等了。隨著你迭代的加深,每一步樣本權重一定是一直在變的,所以它變化就不一樣了。迭代出來結果,有對錯,我要把對的權重降低一點,把錯的權重升高一點,下一個分類器就會著重去考慮上一個分類器沒看到的問題。

這裡不免有個問題,每次訓練完了之後,要不要把正確的都踢出去,只在錯誤的裡面重新訓練?如果這樣做的話,那就變成普通決策樹了,普通決策樹一分為二,在子集中再去分。  這裡因為每次迭代都是全量的,改權重就夠了,沒必要把正確的剔出去了。注意這裡的決策樁它的分裂條件是靠權重正確率判斷的,而原來是基尼係數判斷純度。大體的規則是判斷結果為對的要降低,判斷結果為錯的要升高,這樣才能達到讓後一代分類器,能著重看前一代分類器分錯的這些東西,儘量把之前錯的給分對。

而每次更改了權重都會生成一棵新的樹,這些新的樹之間彼此是什麼關係? 這些樹彼此之間看起來雖然是獨立的,而且我這些樹其實是樁子,都是一層的小樹,現在新來一條資料的時候,也要加給每一個小樹得到一個結果,之後我們就可以給每一個結果配上一個權重,α1* g1(x)+ α2* g2(x)+α3* g3(x)。這樣就得到一個最終想要的G(x)。

而G(x)為什麼有意義,參考剛才講的例子,第一棵樹看到的有可能就是紅的權重正確率最高,然後通過放大了那些判斷錯的權重,第二棵樹就認為紅的是最好的,第三棵樹會把所有綠的東西判斷為蘋果,然後再通過某種方法算出α,最終就得到了一個有道理的投票結果。

剛提到有兩個權重,一個權重叫α,一個權重叫un,我們剛才跟著資料走的權重叫資料權重,通常用un來表示;而表達每一個分類器靠不靠譜的權重叫α,它是給最後預測結果去加一個權重,最後去組成G(x)用的。

α針對的是每一個弱分類器,α就是跟著小樹走的,而un是跟著每條資料走的。 現在就知道它是通過某種方式計算出來的就可以了。un跟維度沒關係,un要根據正確還是錯誤用,所以它是整條資料的權重,它不會去成到任何一個維度上。un是用來計算權重正確率的,你只要知道這條資料是判斷對了,還是判斷錯了,對錯是用yi和ŷ去比的,跟x並沒有關係。x是遍歷分裂條件的時候用的。因為我們生成一棵樹需要遍歷所有的分裂條件,x是因,而最後對錯是果,你選了不好的x作為分裂條件會導致錯誤的特別多。

6.1 我們看下權重與函式的關係:

對於同一個演算法 :
              1、 訓練集不同 ,生成的模型一定不同。
              2、如果訓練集相同,我們調整訓練集中資料的權重,生成的模型也一定不同。

這個解釋了為什麼我們通過更新這一組un(它是捆綁在每一條資料後的一個數)之後就能獲得一個新的G(x),因為G(x)在訓練的過程中,它的機制就是要讓權重正確率最高,權重變了肯定G(x)也會變。 


         對於同一個模型:
             1、輸入的資料權重不同, 模型預測的權重正確率也一定不同。
             2、可以通過調整輸入資料的權重, 讓本來還不錯的分類器的正確率達到1/2。

      我們再來看下權重錯誤率的定義:

  1、資料預測的錯誤率=錯誤資料的個數/全部資料的個數。剛才說的都是正確率,錯誤率也是一樣的。

  2、資料預測的權重錯誤率=預測錯誤資料的權重和/全部資料的權重和。

舉例:有幾個樣本的實際標籤yi是{+1,+1,+1,+1,-1},訓練出來g1(x)分類器的預測結果是{+1,+1,+1,+1,+1},在所有權重都為1/5的時候,g1(x)的權重錯誤率是多少?錯誤率是多少?因為只對了一個,所以,錯誤率是0.2。如果權重都是1,權重錯誤率也是0.2,所以不太在乎權重相加到底等不等於1,我只是需要它的比例大。當-1這條樣本資料權重是1/2,其它+1樣本資料是1/8的時候權重正確率是多少?正確的權重和做分子,前四個正確了,它們的權重和就是1/2,總權重和是1,此時的權重正確率變成了0.5。既然ŷ沒變,分類器就沒變,分類器決定的其實是ŷ,ŷ還是ŷ,yi還是yi,但是當你把權重改了,權重正確率就變了。實際上分類器本身g1(x)一點都沒變。所謂的把un2扔到g1(x)裡邊,這一組結果就是g1(x),算權重正確率的時候,你離不開權重,你把權重改了,同樣的g1(x)的結果,它的權重正確率也變了。

6.2 gt和un的關係數學公式表達:

我們再來看下Adaboost中的資料權重un變化:

1、在訓練集的每個資料背後都標註一個權重,初始權重設為1/N,也就是un1永遠都等於1/N,或者說永遠大家都等於1是一樣的。

2、每一輪訓練一個在當前權重下權重錯誤率最低,或者說權重正確率最高的g(x)。

3、然後迭代生成下一輪的權重。

考慮一下決策樁(decision-stump),如果下一輪資料的權重變了,訓練出來分類器內部會發生什麼改變?在剛才例子裡,它會不會選擇別的分裂維度去分裂?有可能會,剛才第一個是用圓和不圓分的,而改了權重之後,發現用綠和不綠分是更高的。既然如此,那我們就要考慮應該如何改變權重了,這個權重永遠不去參與維度的運算,它只是最後用來加一加,最後算評分用的。先有兩個函式,一個叫g函式,一個叫h函式,h函式從屬於一個叫H的函式空間的。

解釋一下,什麼叫函式空間呢,就是你想象一個美好的世界裡面生活著各種各樣的函式,這些函式組成了一個函式空間,這個h是函式空間裡的一員,在這個無窮無盡的函式裡面,如果我們能找到一個能夠讓權重正確率最高的h,此時,恭喜你,你被升職了,你的名字叫做g,OK吧?雖然我們計算的是權重正確率,但其實大家的分母部分都是一樣的,都是權重的總和,所以我們只需要找個分子部分最大的。也就是在H這個函式空間中,找到一個h,這個h能夠使最後的權重錯誤率最小(或者權重正確率最大),此時這個h我們成為g。我們看下用公式怎麼表達上面的思想:

解釋下上面公式:

首先所有t的標記都代表了第幾棵樹,因為我是一輪一輪迭代的,所以t1代表第一次的樹,t2代表第二次的樹,gt代表第t次的樹,而gt+1代表gt的下一顆樹,能理解嗎?我們gt+1是通過gt生成出來的。那麼gt有了就有了unt,我們知道un是訓練集的前面的權重,是不是每一資料權重都會發生變化,所以迭代到t次我們是不是就有t個un?那un有多少個呢?un有N個,N是樣本的數量,有多少個樣本就有多少個un。

[[這兩個中括號是if的意思,h是函式空間裡找的那個h,也就是你嘗試分裂的每一次樹是不是就是一個h,它是一個候選人的概念,yn是資料真實的yn,也就是真實的標籤,第n條資料的label。hxn是你扔給他之後它判斷出來的結果。然後這個東西真實的標籤不等於預測出來的標籤的時候,這一項等於1否則就等於0,再通過加和它實際上是把所有錯誤的權重加了一遍和,因為不等於的時候是錯誤的時候,不等於的時候返回1,這裡面它總共有n項加和,其中所有錯誤的項存活下來,正確的項因為這一項會返回零,就死掉了,所以最終這一項是所有錯誤的權重的和。我們要找的h是能夠讓錯誤權重和最小的那個h,也就是 正確權重和最大的那個h,所以我們找到了他就得到了gt,能理解嗎?其實這個東西我解釋了這麼半天它就解釋了一句話,就是當前輪的樹訓練的結果就是能夠在當前的這個情況下表現權重錯誤率最小的那棵樹。gt是能夠讓t輪的權重錯誤率最小的樹,那gt+1自然就想讓t+1輪的權重錯誤率最小的樹。

6.3 引導Un+1的思路:

那我們思考一下,我現在待求的是什麼?我希望它達到一個什麼標準?也就是說你希望這個新的資料權重是什麼樣的呢?希望它扔在原來的弱分類器裡錯誤率最小還是最大?思考一下這個問題,你想用新的權重訓練出一個新的分類器來,這個新的分類器要做到原來的分類器做不到的地方,所以我們希望這個新的權重帶入到原來的分類器裡面是原來的弱分類器表現最差的權重,這樣你用它表現的最弱的地方你才能訓練出來一個補償原來的弱分類器做不到的地方,能夠理解我的意思嗎?就相當於現在給你一副資料鏈讓你做,你的了80分,對嗎?接下來,你要做的是我就想針對你不會的那些題特訓,你應該出一份什麼卷子讓他去學習,你應該出一份他先做只能做0分的卷子讓他去學習,是不是才對他的提升是最大的?這個也是一樣,你原來的弱分類器是在這個unt這輪表現得還不錯了,那接下來我是不是要找一些你原來表現得不好的地方來著重訓練才能訓練出一個新的訓練器,所以說新的權重應該是能夠讓原來的分類器在它上面測試是表現最差的,這個權重才能去補強下一個分類器,讓下一個分類器具備這個分類器做不到的地方。

我們再捋一遍,我現在想訓練新的分類器,新的分類器要有一個什麼功能呢?要有一箇舊的分類器做到不好的地方我要額外的好,我要補強你,對之前有所提升,那麼如何讓它有所提升呢?你就得訓練新分類器的時候,將新分類器的權重帶入到老分類器裡面,並且是老分類器它做不到的地方進行訓練,那怎麼叫它做不到的呢,就是權重錯誤率最高就叫它做不到的地方,我不關注你做得好的地方,只關注做的最不好的地方。我最終要所有人一起投票,所有就是我不需要你做得好我也做得好,你做得差的我做好就行了,到時候投票的地方,你做得好的地方你負責說,你做的不好的地方我負責說,最後大家綜合起來,得到結果,能明白嗎?因為從一開始將那個蘋果的例子就是讓大家看你在錯誤的例子裡面你怎麼找到一個新的結果,能夠理解嗎?你提升的不是,一代比一代強,你提升的是最終的Gx。它是被提升的物件,通過什麼提升,通過對不停的加進來原來做不到的地方他能做的好的分類器,好與不好是相對於每輪權重來說的,它是在這一輪權重上表現的好,並不是說他總體的好,我更新了權重也是想把他之前做的差的那些地方給補強了,讓下一個分類器能夠去重視。

所以我首先有了unt,我搞出來了一個gt,現在最終我想要的是gt+1,那怎麼來呢?需要一個unt+1,那麼gt+1跟gt有什麼關係呢?就是希望gt+1在gt表現得不好的地方他能表現得好,gt+1不是設計出來的,而是訓練出來的,你gt+1希望gt表現得不好的地方表現得好,那好,你就構建一個訓練集,專門讓gt表現得不好,能夠理解嗎?因為只要改變了這一組權重就會影響它的表現,對吧?我專門構建一個訓練集讓它表現得最不好,這個相當於對他特製的訓練集就能夠訓練出來一個專門補強gt的訓練器。

這個看完了大家大部分都繞過來了,那如何叫做gt在unt+1上表現得最不好呢?它的權重正確率和錯誤率應該等於多少?有人會說正確率為0是最不好的時候,其實正確率為0並不是最不好的,正確率如果為0了,你的模型反著用就是一個正確率百分之百的一個模型,那麼最不好的分類模型永遠是和瞎猜一樣,這個叫最不好的模型,不會有任何規律可言,所以把舊的gt扔到新的unt+1上能夠得到2/1的權重錯誤率,此時的unt+1就是我們要找的那個unt+1。因為錯誤率為1/2,就相當於瞎蒙一樣。你之前的un甭管讓gt得到一個什麼樣的權重正確率,無所謂。咱們不要驕傲自滿,你0.99了我們也不在乎,我就專門出一個刁難你用的權重用它去訓練下一個分類器,只有這樣下一個分類器才能做到之前做不到的地方的補強,最終把他們聚合到一起的時候才會有各種各樣不同的角度來看這個東西,所以如何得到下一輪的unt+1呢,我只需要讓前一輪的錯誤率g(t)為2/1。

6.4 推導Un+1的由來:

接下來我們進行一些恆等推導,所謂恆等推導,就是拿等號左乘右乘匯出來的一個結論。比如ax=3,x=3/a。

我們希望的是unt+1的所有權重在gt上的表現,使得gt的權重正確率是1/2,怎麼能做到1/2,也就是錯誤的權重之和除以(錯誤的加上+正確的權重之和)為1/2。

 

我們希望 錯誤的總權重和/總權重和=1/2,其中橙色方塊代表錯誤的總權重和,綠色圓圈代表正確的總權重和,綠色錯誤權重和指的是t+1輪的權重扔到t輪的分類器gt裡的錯誤權重和。橙色指的是t+1輪的權重扔到t輪的分類器gt裡面的正確權重和。我們希望t+1輪權重在g(t)上的錯誤權重和 = t+1輪在g(t)的權重的正確權重和。也就是所有的un (t+1)的incorrect等於un (t+1)的correct,即unt+1的總錯誤和等於總正確和的時候,權重錯誤率結果為1/2。即:

假設上一輪錯誤權重和是1126,正確權重和是6211,

我希望它倆能相等,就把上一輪的1126乘以上一輪的6211,6211乘以1126,它們倆就一定會相等,但這樣越乘越大了,比較討厭,我再除以一個7337,7337是什麼?上一代的總權重和。所以相等的兩端現在變成了(1126*6211)/7337=(6211*1126)/7337,這是一個恆等式。我們換個角度看這個公式,1126/7337是上一代的錯誤權重率,6211/7337是上一代的正確權重率。

對於左半部分(1126*6211)/7337可以看成是1126*(6211/7337)。而1126是所有的錯誤權重總和,6211/7337是正確權重率。這是一個加法分配率(a+b)*c=a*c+b*c。所以只要我讓每一條資料,凡是你判斷對了的乘以錯誤權重率,凡是你判斷錯誤了的乘以正確權重率,即:

€t是t輪的權重錯誤率,1-€t是權重正確率。我們把所有正確的乘以€t;所有錯誤的乘以(1-€t),就能達到1/2的效果了。所以接下來我們的思路給大家捋一下,首先我有un了,我想算unt+1,接下來我要做的就是把從un訓練出來的gt用到unt+1上,讓它的表現是正確總權重等於錯誤總權重,怎麼讓正確總權重等於錯誤總權重呢?就是正確的總權重X錯誤率就等於原來的錯誤總權重X正確率,這樣就相等了,那現在是對和的操縱,我們手裡拿到的是一個一個的資料,那我怎麼做這個資料呢?我就是讓原來的正確的統統每一個都乘錯誤率,因為是有一個加法分配律,原來每一個錯誤都都X正確率,這樣我是不是就得到了新一代的每一個權重也就是un(t+1)。

6.5 規劃因子的由來:

然後你再巨集觀的看一下,一般是錯誤率高還是正確率高?肯定是正確率高,對吧?所以原來正確的都乘以一個比較小的數,原來錯誤的也乘以一個數,也變小了,大家統統都變小,正確的變得多,錯誤的變得少。而不是我們想要的錯誤的加大,正確的變小,所以我們加了一個規劃因子,我們統統讓正確的除以這個東西,錯誤的乘以這個東西,就能夠達到我們想要的結果。為什麼要這麼做呢,我們推導下:

假設A為正確的總權重和,B為錯誤的總權重和,€是權重錯誤率,1-€是權重正確率。有A*€=B*(1-€),那麼總權重和就是錯誤的權重和除以錯誤權重率,或者正確的權重和除以正確權重率,設總權重和C,則C=A/(1-€)= B/€。對於A*€=B*(1-€)這個式子裡,都各乘一個C,則A*€*A/(1-€) = B*(1-€)*B/€。整理一下,是A*A*€/(1-€)= B*B*(1-€)/€。€/(1-€)和(1-€)/€是倒數關係,把兩邊開根號,就是A*sqrt(€/(1-€))= B* sqrt ((1-€)/€)。總結下上面公式推導如下:

 (1-€)/€這一項,就是這裡面的規範因子◆t,這裡是錯誤的乘以根號下◆t ,如果正確乘以◆t的倒數,也就是除以◆t。即下面操作:

只要對un進行了這種操作,所有預測對的除◆t;所有預測錯的乘◆t,我們就得到了unt+1,此時的unt+1就是把它扔進gt裡,能夠使gt得到權重正確率為1/2的那一組unt+1。

sqrt((1-€)/€),它是大於一的數還是小於一的數?通常是權重正確率高,€是錯誤率,分母是一個比較小的數,分子是一個比較大的數,結果是一個大於一的數。最後得到一個結果是:錯誤的乘以大於1的數,而正確的除以大於1的數,最後結果是錯誤的權重提升了,正確的權重減小了,而此刻還達到了1/2。 完美!!!

7、解決第二個問題:α的計算:

所以目前的整體流程是根據資料un1訓練出來一個g1(x),然後根據g1(x)判斷是否正確,有了g1(x)就有€t1,€t1就是un1在g1(x)上的表現。un2就是un1裡邊所有正確的除以◆t,所有錯誤的乘以◆t,就得到了un2,然後我們去計算g2(x)。有了g2(x)跟un2,我們就有€t2,就是un2在g2(x)上面的表現。就可以往復迭代下去了。那我們還差每個g上的α,g裡面€t越低,α越大合適,€t越小就代表這個東西表現的還不錯,要給它一個比較高的權重。

α怎麼求呢,非常簡單,α=ln ◆t,◆t=√((1-€)/€)。實際上是根據損失函式推出來的,α=ln ◆t肯定是一個大於0的正數,通常大於一,萬一小於一會產生什麼問題?ln的點,當x<1的時候就得到了負數。也就是說對於◆t<1的這麼特別差的一個分類器,它算出來的α<0,代表它投的是負票。也不矛盾,它計算的正確率都已經不到0.5了,我們自然需要讓它去投負票。我們可以看ln曲線的變化,

隨著的◆t增大,也不會變大的特別快,也就是說你表現的是90份給你打的權重可能是1.2,你打了99分可能給你的權重是1.8變化的也不會特別多,所以加這麼一個ln表現的不會這麼明顯,我們既要通過限制數的深度防止獨裁也要通過限制α的設計上防止有些分類器的權重過高了導致的問題。這也正是為什麼需要Ln的原因。

7.1 每一個弱分類器需要什麼樣的樹:

假設是一個完全長成的樹,也就是完全分對的樹,它的優缺點各是什麼? 

優點:如果是完全長成的樹€t會等於0,分的完全正確,此時的αt= ln ◆t=ln√((1-€)/€),當€=0的時候,αt等於正無窮,就產生了autocracy這個問題,獨裁。容易導致一個問題---過擬合,這是個致命的缺點,一切運算效率上的缺點都可以忍受,但忍受不了的是這個模型過擬合一旦嚴重了就沒法用了。假設α1的€=0,此時的G(x)中α1就是正無窮了,其它的沒有意義了。最後G(x)等於多少就看g1等於多少了,此時的Adaboost就退化成一個完全長成的決策樹了,就一定會帶來過擬合的問題。別人再怎麼加也幹不過它。此時G(x)≈g1(x)。所以完全長成的樹不能用。

如果不是用完全長成的樹,樹的層次稍微深一點的話,準確率高一點又會有什麼情況呢?假如這棵樹能準確率能到95%,此時的€很小,當€t特別小的時候,((1-€)/€)會變得特別大,權重也會變化特別大。它一定程度上能緩解過擬合的問題,不會讓g1(x)獨裁,但是很大的話,這個弱分類器的權重也會相對很大,所以雖然不會獨裁,但是也不是我們所需要的。

所以我們在這裡面傾向於最淺的樹,也就是說傾向於pruned Dtree,被剪枝過的Dtree。一般只需要兩層,我們稱為決策樁(decision-stump),為什麼需要決策樁呢,決策樹不行嗎?我們解剖下原因:

decision-stump是一個一分為二的決策樹,它可以以權重正確率論英雄,去遍歷所有的分裂節點,看哪種分出來之後權重正確率最高。我們思考一個問題,之前講的決策樹為什麼不直接以ACC作為分裂結果,而要以純度呢?傳統決策樹雖然沒有權重,總可以用ACC,至少二分類的時候的正確率更高,為什麼每次分裂不去分一個ACC更高的值呢?而是要用純度這種間接的方式來判斷哪種分裂條件好還是不好?因為在只有一層的情況下,可以分為左邊是正例,右邊是負例。但有多層的情況下,你能左邊是正例,右邊是負例嗎?它並不一定能分好,強制的讓它把正例都分左邊,負例都分右邊,不如每一步都讓它去把純度搞純,最後再做投票,該是正例就是正例,該是負例就是負例,它如果只是一分為二,你可以簡單說左邊是1右邊-1,因為有多層了,所以就不能直接用正確率強制的分左右,否則分出來決策樹一定是表示正例的葉子節點,跟表示負例的葉子節點的數量是相同的,這樣有可能並不是最好的結果。而是每一個葉子節點你都儘量把它分純,讓它越分越純,雖然最後可能只有個別幾個葉子節點表示負例,但仍然是能找到的最好的分類的方式。

假如Adaboost硬要使用一個不止兩層的決策樹作為弱分類器,它的權重應該如何用起來呢?對比決策樁的權重,直接拿過來算權重正確率,然後找分裂條件,而決策樹不能這麼幹,那資料權重應該怎麼用起來? 實際上通過按比例抽樣的方式,這個權重不能直接丟到演算法裡去,對於decision-stump它能認識權重,但是對於decision-tree它不認識這個權重。於是就又要在訓練集上做文章了,按照資料的權重的比例去抽樣,比如樣本集的權重分別是1,2,將來資料裡就有1份第一條資料,2份第二條資料。重新構建一個符合資料權重比例的資料集,雖然決策樹不認識這個權重,但是在構造訓練集的時候已經把它按比例構造好了,它就可以認識權重了。通過這種間接的方式,相當於你的模型、演算法是個黑盒,它認識不了權重,改一改資料集,讓它在不需要認識權重的情況下,把權重的資訊直接體現在資料集裡面去,訓練一棵decision-tree。但這樣更麻煩,所以大部分時間就直接使用單層的決策樹,也就是決策樁。我們會手動的限制讓我們的每一個分類器儘量弱一點,怎麼讓它弱,對於決策樹來說就需要將樹的高度給限制掉,讓它儘量的別自己分的太好,讓它的正確率是0.6左右就可以了,還有兄弟姐妹們互相補強,這就是為什麼要使用弱一些的樹的原因。

8、具體總結Adaboost的整體流程:

        1、初始化權重un1。un1是一組數,它的數量等於樣本的數量。

        2、開始迭代。

             2.1 有un1可以理解為有第一個unt,根據unt訓練gt。

             2.2 gt根據在unt資料上的結果計算◆t

             2.3 根據◆t可以算unt+1 。所有這個資料集上一代被判斷錯了的,都乘以◆t;上一代為判斷對了的都除以◆t,就得到了下一代的u。

             2.4 根據◆t可以算αt,就是ln◆t,這種迭代方式是在一次迴圈中同時產生兩個迭代結果,和我們講的L-BFGS類似,L-BFGS在迭代xk+1的時候,也要迭代一個dk+1出來,也是在同一輪迴圈中要得出兩個結果,我們管這種迭代方式叫on the fly迭代。

       3、迭代完成後,得到一組g(x),返回G(x)。

9、舉例說明Adaboost的流程:

舉例驗證下一輪權重與上一輪權重的關係:

根據gt判斷樣本的正確性,判斷對了gt就是0,判斷錯了gt就是1,此時的權重誤差率是€=0.25,◆t是√3,α1是ln√3,此時我們就可以算出u2來了。把u2這組權重扔到g1裡面去,此時的€=0.5,因為判斷出來的結果是對對錯對,所以根據u2計算出來的權重正確率是1/2。此時u2不是生湊的,而是確實有的乘以了◆t,有的除以了◆t,所有判斷對的都除以了◆t,所有判斷錯的都乘以了◆t,最後結果等於了0.5。

10、總結Adaboost:

1. 把弱聚合強 

2. 每次生成新的權重時放大一次錯的, 縮小上一次對的。

3. 把得到的g(x) 線性組合得到G(x)。

Adaboost的優勢是快,它比隨機森林快好多,它雖然不能並行處理,但它只需要10,20顆樹就夠了。 90棵樹和40棵樹,差別已經不是很大了。

Adaboost的最早的應用,一炮成名是一個人臉識別的應用,在第一款數碼相機上面能顯示一個小框,識別出人臉的時候,背後演算法就Adaboost。它是在Adaboost提出論文之後,第二年年底出來的產品,是當時的學術界向產業輸出算相當快的。

為什麼能在當時實現這個功能,當時其實早就可以通過神經網路來實現人臉識別了,但是數碼相機的cpu根本就跑不起來,而Adaboost提供了一種輕量化的解決方案,它也能做到二分類,是人臉還是不是人臉。在這個演算法底層還有好多計算機視覺方面做法,它要把影象分成多少個方塊,怎麼分最合理。

最後它判斷每一張小方塊圖到底是不是人臉,通過Adaboost訓練好的模型直接在裡面去判斷,模型是直接內嵌在韌體裡面,不需要你拿你的數碼相機去訓練模型,廠商訓練好了模型,把這一組數的分裂條件存到了韌體裡面,然後它拿過來直接就跑這十個樹,最後一投票結果到底是人臉還是不是人臉就出來了,它就會判斷這個人臉到底在哪。這個是Adaboost最早成名的,它最早能在客戶端實現能夠達到人臉識別效果的這麼一個算