1. 程式人生 > >Recognition System複習筆記:Adaboost Learning Algorithm

Recognition System複習筆記:Adaboost Learning Algorithm

筆者是一個沒有任何工作經驗的辣雞學生,想給自己期末複習的時候留點東西,因為自己太健忘了。 這是我的第一篇部落格,微博不算的話,那就是人生第一篇,平時說話都說不明白,寫東西更說不明白了,更何況我說的不一定對,怕是隻有我自己才知道自己說些什麼吧!

總之如果這篇文真的有人看(大概率沒有),文章有說的不對的地方請指正!別噴小辣雞我就是了(奉承臉)

Dear自己,如果你下次再想不起來adaboost是什麼的話,請往下看,你之前是這麼想的:

Adaboost實際上是做了一個分類器,訓練的時候,比如識別人臉,你要把你的一堆訓練圖片標記成兩類,是人臉(1)、不是人臉(0)。這樣等訓練好之後,當你向分類器輸入一張圖片,他就會告訴你這張圖片是不是人臉。

理論上說,一個訓練完好的分類器是對他自己的輸出結果百分百自信的,所以我們管這個叫強分類器(strong classifier),而強分類器的結果是由一系列弱分類器(weak classifier)的結果綜合產生的。就好像一個牛X的投資公司,在做一個決策的時候,投資部門說投股票,風控部門說投黃金,那麼這個公司的老總肯定會根據這些部門以前投資建議的表現來做一個綜合考量,最後給出一個結果。

那麼就從最小的部分講起。什麼是弱分類器呢,弱分類器可以表示為以下公式:ht(x)=1or1h_t(\vec x)=1\ or {-1},也就是如果標號為t的這個弱分類器認為這張圖片是人臉的話,他的函式值就會返回1,否則返回-1。那麼現在就可以知道各個弱分類器是怎麼給強分類器來提供資訊的了,強分類器: H

(x)=sgn(i=1nαtht(x))H(\vec x)=sgn(\sum_{i=1}^{n}\alpha_th_t(\vec x)) 這裡的sgn()返回bool值,也就是正的返回true或者說1,負的返回false,而αt\alpha_t就是第t個弱分類器的權重了,可以理解成這個弱分類器在強分類器面前說話佔了多少分量。

現在拆開來看一下到底什麼是弱分類器,每個弱分類器實質上對應一個feature,這裡用的是一個叫做herr-like function的東西。如下圖就是一個two-rectangle feature, 我們把他放到圖片的某個位置,用左面白色的部分減去右面黑色的部分,就可以得到一個數,為什麼是一個數呢,實際上這個減法是用白色部分所有畫素的加和減去黑色部分和,這裡有一個方法叫summed-area table可以極大的加速整個運算過程,不過不影響理解,我就不在這裡介紹了。 two-rectangle feature

所以herr-like function做了好多好多這樣的東西,兩個的、三個的、四個的,然後設一個閥值,如果這個function算出來的數大於某個數T,那麼通過這個弱分類器它認為這是人臉,如果小於則不是,但這個結果是片面的,因為它只能觀察到很小的區域,所以也稱為弱分類器。事實上,這樣的feature有好多,能很好的探測到畫素中體現出來的邊、塊、線條等,既然每塊feature都能提供部分的結論,那麼我們想辦法找出最能代表識別物件(例如人臉)的feature做一個組合,就能既準確又快速的辨別物件了,這就是剛剛提到的強分類器。

我們注意到,這個演算法叫adaboost learning algorithm,它裡面有個learning(現在啥東西帶了learning都感覺好智慧!),再結合上面給出的強分類器的公式,這個learning實際上是一種對樣本資料的自適應,1.我們把哪個feature放進去,2.這個feature的結論有多大權重是可信的。

首先,要找出各個feature對於訓練集判斷的誤差,ej=i=1nwi[1hj(x)yi2]e_j=\sum_{i=1}^{n}w_i[\frac{1-h_j(\vec x)y_i}{2}]。 這裡的eje_j代表第j個弱分類器的誤差(好像有點亂了,feature和弱分類器的意思是差不多的,一個弱分類器就對應一個feature),一個弱分類器的誤差就在於它分錯了多少張圖片,這裡i代表第i張圖片,來看公式中的第二項,如果第j個分類器錯誤的分類了第i張圖片,那麼它的誤差就會增加1,而前面的wi對應的是這張圖片的權重,也就是它有多麼迫切的需要被正確分類,這個後面還會介紹。 算完誤差之後,我們挑選誤差最小的分類器假如強分類器大家庭,它佔有的比重當然要根據它的正確率來決定:αj=12ln(1ekek)\alpha_j=\frac{1}{2}ln(\frac{1-e_k}{e_k}),這裡就可以看到你對的越多,你佔的比重也就越大,並且,如果你的正確率還沒有到50%,沒關係,你的權重是負的,也就是你是反面典型,你算出來的正的大概率是負的,我把你倒過來就可以了,但是一般情況下,feature的數量很大很大,一般誤差率最小的feature都會小於50%。 這時就提到這個wi了,當選擇完一個分類器之後,每張圖片的權重都會改變,:wi=wie(αjyihk(x))w_i=w_ie^{(-\alpha j*y_i*h_k(\vec x))},yi和hk(x)分別對應的是這張圖片的真實類別和被挑選中的分類器給它分配的類別,也就是說,如果分類器正確對它分類,那麼對於剩下還沒有被挑選的分類器來說正確分類這張圖片的任務就不是那麼重了,所以wi會變小,反之會變大。 當然,在整個挑選開始前,所以圖片wi的和要等於1,這也就是要做一個規範化,wi=wiwjw_i=\frac{wi}{\sum wj}

這就是整個adaboost的過程,究竟要挑選多少feature作為一個類別的分類呢,這就需要實踐來檢驗了。