在2019年9月16日11晚,Jay Chou開始發佈了他的新歌說好不哭
的時候,不到12個小時,售出量就已經達到了500萬,還導致了QQ音樂系統癱瘓,這充分看出周董的高流量人氣,當然,作爲90後的我也是其中粉絲之一。這告訴我們的是,無論做什麼,紮實的基礎很重要的,如果周董沒有紮實的音樂基礎(PS:當然,也不否認他在音樂方面也具備一定的天賦),他也不會在經過這麼長時間後重發表新歌時再次受到很多的粉絲的喜愛,記得小時候就特別喜歡周董的歌曲,一直到現在,仍然如此。哈哈,可能有些扯遠了,但是通過這件事情,我自己也有些思考。作爲IT圈的研究者而言,站在周董的層面思考,帶給我的是,在你想實現或者完成某件事情的時候,你需要在前期打下紮實的基礎,不斷地往前走;站在研發角度來看,對於QQ音樂的系統架構設計者,在設計之初,肯定沒想到有這麼一天,當用戶流量達到這個級別時,QQ音樂系統會承受不了,當然這也是騰訊QQ音樂負責人始料未及的。但是對於這些類似的事情,在微博的身上同樣也出現類似的情況。這背後的思考就是對於這些平臺類的系統不僅具備高穩定性等幾個高要求,還需要具備一定承受壓力的能力,這也表示平臺類的軟件開發需要逐步走向自適應化、智能化。
講述了這麼多,咱們繼續來"砌牆"——總結一些提升方法的算法以及相關推導。
相關概念
- **弱可學習:**可以找到一個方法,用這個方法預測輸出變量,對於分類問題,會比隨機猜測的效果略好。
- **強可學習:**可以學習的效果很好。
- **PAC學習框架:**在第1章講的泛化誤差上界的定理,也就是說,可以用一個訓練誤差和一個小的參數以一定的概率控制泛化誤差。
- **提升方法的基本思路:**如果能找到一個弱可學習算法,那就可以將該算法提升爲強可學習算法。
提升方法屬於集成學習中的一種,集成學習就是用一些比較簡單的模型,將它們綜合起來構成一個複雜的模型。
集成學習兩個主要類別:序列方法、並行方法。
- **序列方法:**當我們學到一個模型,再學下一個模型時,下一個模型依賴上一個模型的結果。
- **並行方法:**可以同時學很多模型,這些模型之間不會相互影響。
AdaBoost算法
AdaBoost算法是一個非常重要的序列方法,提出得比較早,具有很強的理論支撐;之後就是提升樹,AdaBoost主要解決二分類問題,提升樹分爲迴歸樹提升方法和分類樹提升方法,既可以用分類樹提升方法解決多分類問題,也可以用迴歸樹提升方法解決迴歸問題(當輸出變量是連續變量時,該問題稱爲迴歸問題)。
模型
AdaBoost實質上是一種加法模型。
輸入:訓練數據集T=(x1,y1),(x2,y2),⋯,(xN,yN),其中xi∈X⊆Rn,yi∈Y=−1,+1;弱學習算法;輸出:最終分類器G(x)。(1)初始化訓練數據的權值分布D1=(w11,⋯,w1i,⋯,w1N),w1i=N1,i=1,2,⋯,N(2)對m=1,2,⋯,M表示學習每個小分類器的過程。(a)使用具有權值分布Dm的訓練數據集學習,得到基本分類器Gm(x):X→−1,+1(b)計算Gm(x)在訓練數據集上的分類誤差率。em=i=1∑NP(Gm(xi)=yi)=i=1∑NwmiI(Gm(xi)=yi)(c)計算Gm(x)的系數。αm=21lnem1−em(d)更新訓練數據集的權值分布。Dm+1=(wm+1,1,⋯,wm+1,i,⋯,wm+1,N)wm+1,i=Zmwmiexp(−αmyiGm(xi)),i=1,2,⋯,N其中,Zm是規範化因子Zm=i=1∑Nwmiexp(−αmyiGm(xi))它使Dm+1成爲一個概率分布。(3)構建基本分類器的線性組合。f(x)=m=1∑MαmGm(x)得到最終分類器G(x)=sign(f(x))=sign(m=1∑MαmGm(x))
策略——訓練誤差分析
AdaBoost的損失函數是一個指數函數L(y,f(x))=exp[−yf(x)],二分類中y∈−1,+1,f(x)∈−1,+1,如果預測值等於真實值(預測正確即y=f(x)),yf(x)=1,損失爲e−1,如果不相等(預測錯誤即y=f(x)),損失爲e,這個與我們平常看到的損失不一致,這裏即使預測正確,也是有損失的,預測錯誤比預測正確的損失大。
AdaBoost最基本的性質是能在學習過程中不斷減少訓練誤差,即在訓練數據集上的分類誤差率。對於以上的定理有相關的推導。
數學推導
定理1.(AdaBoost的訓練誤差界)AdaBoost算法最終分類器的訓練誤差界爲:N1i=1∑NI(G(xi)=yi)⩽N1i∑exp(−yif(xi))=m∏Zm
證明過程:
對於正確分類點,I(G(xi)=yi)=0⩽exp(−yif(xi))=e−1,對於誤分類點,I(G(xi)=yi)=1⩽exp(−yif(xi))=e1,所以可得I(G(xi)=yi)⩽exp(−yif(xi)),故N1i=1∑NI(G(xi)=yi)⩽N1i∑exp(−yif(xi))成立。現證明N1i∑exp(−yif(xi))=m∏Zm:∵Zm=i∑wmiexp(−αmyiGm(xi)) wm+1,i=Zmwmiexp(−αmyiGm(xi))∴Zm⋅wm+1,i=wmiexp(−αmyiGm(xi))即:Z1⋅w2,i=Z2⋅w3,i=⋮ZM−1⋅wM,i=w1,iexp(−α1yiG1(xi))w2,iexp(−α2yiG2(xi))wM−1,iexp(−αM−1yiGM−1(xi)) 因此將上述各式都相乘,相同的項可以約去,得到:m=1∏M−1ZmwM,i=w1,iexp(−yim=1∑M−1αmGmxi)對比要證明的等式N1i∑exp(−yif(xi))=m=1∏MZm,其中f(xi)=m=1∑MαmGm(xi)左右兩邊都乘以exp(−αMyiGM(xi))∵w1,i=N1∴m=1∏M−1ZmwM,i⋅exp(−αMyiGM(xi))=N1exp(−yif(xi))由於最終得到的是關於整個數據集的,所以需要兩邊求和。∴m=1∏M−1Zmi∑wM,iexp(−αMyiGM(xi))=N1i∑exp(−yif(xi))∵ZM=i∑wM,iexp(−αMyiGM(xi))∴m=1∏M−1Zm⋅ZM=N1i∑exp(−yif(xi))∴m=1∏MZm=N1i∑exp(−yif(xi)),得證.定理的直觀理解:訓練誤差可以被Zm的連乘控制住,如果要訓練誤差小,就只要最小化每一個Zm,Zm=i∑wmiexp(−αmyiGm(xi)),wmi是通過上一輪訓練得到的,Gm是本輪已經訓練得到的,所以已知wmi,Gm,求解的是αm,通過最小化Zm求解αm=αmargminZm。∂αm∂Zm=i∑(−wmiyiGm(xi)exp(−αmyiGm(xi)))即:αm=21lnem1−em
定理2.(二類分類問題AdaBoost的訓練誤差界)m=1∏MZm=m=1∏M[2em(1−em)]=m=1∏M(1−4γm2)⩽exp(−2m=1∑Mγm2),其中,γm=21−em em越小,說明當前分類器效果越好,γm越大,21可以看做是分類問題中,隨機猜測分類結果的最大誤差率。γm可以解釋成當前的基本分類器對於隨機猜測結果的提升程度。提升程度越大,γm越大,上界exp(−2m=1∑Mγm2)就越小,訓練誤差隨着迭代次數的增加而越小,減小的速度是以指數速度變小的,也就是說,訓練次數增多的時候,訓練誤差降低的速度會變快。
證明過程:
Zm==i=1∑Nwmiexp(−αmyiGm(xi))yi=Gm(xi)wmie−αm∑+yi=Gm(xi)wmieαm∑∵em=Gm(xi)=yi∑wmi,αm=21lnem1−em∴yi=Gm(xi)wmie−αm∑+yi=Gm(xi)wmieαm∑=(1−em)e−αm+emeαm∵e−αm=1−emem,eαm=em1−em∴(1−em)e−αm+emeαm=2em(1−em)∴Zm=2em(1−em)∵γm=21−em∴2em(1−em)=1−4γm2∴m=1∏MZm=m=1∏M[2em(1−em)]=m=1∏M(1−4γm2)再考慮m=1∏M(1−4γm2)⩽exp(−2m=1∑Mγm2)由ex和1−x在點x=0的泰勒展開式推導,泰勒展開是用一個多項式逼近任意一個函數。考察(1−4γ2)⩽exp(−2γ2)f(x)=1−x=(1−x)21f′(x)=−21(1−x)−21f′′(x)=−41(1−x)−23f(x)在x=0處的二階泰勒展開爲:f(x)=f(0)+xf′(0)+21xf′′(0)+⋯ =1−21x−81x2+⋯∴f(4γ2)≈1−2γ2−2γ4g(x)=exg′(x)=ex g′′(x)=exg(x)在x=0處的二階泰勒展開爲:g(x)=g(0)+xg′(0)+21x2g′′(0)+⋯ =1+x+21x2+⋯∴g(−2γ2)≈1−2γ2+2γ4∴f(4γ2)=(1−4γ2)≈1−2γ2−2γ4g(−2γ2)=exp(−2γ2)≈1−2γ2+2γ4∵γm=21−em,γm的取值範圍是[0,21]所以當更高階次方出現的時候,後面的高階項趨近於0,那麼影響g(−2γ2)和f(4γ2)關系的只有前面的項,判斷1−2γ2−2γ4和1−2γ2+2γ4的大小,等同於判斷f(4γ2)和g(−2γ2)的大小。∵1−2γ2−2γ4⩽1−2γ2+2γ4∴f(4γ2)⩽g(−2γ2)∴m=1∏M(1−4γm2)⩽exp(−2m=1∑Mγm2),得證.
算法——前向算法
有了模型和策略,當擬合加法模型時,需要求解很多的參數,有一個比較簡單的算法(前向分步算法)。
輸入:訓練數據集T=(x1,y1),(x2,y2),⋯,(xN,yN),損失函數L(y,f(x)),基函數集b(x;γ);輸出:加法模型f(x)。(1)初始化f0(x)=0。(2)對m=1,2,⋯,M。(a)極小化損失函數。(βm,γm)=β,γargmini=1∑NL(yi,fm−1(xi)+βb(xi;γ))。(b)更新fm(x)=fm−1(x)+βmb(x;γm)。(3)得到加法模型f(x)=fM(x)=m=1∑Mβmb(x;γm)。這樣,前向分步算法將同時求解從m=1到M所有參數βm,γm的優化問題簡化爲逐次求解各個βm,γm的優化問題。
提升樹
提升樹與AdaBoost算法的思路是非常像的,也是考慮一個加法模型,AdaBoost算法中沒有規定所用的分類器,提升樹中,基本分類器爲分類樹或迴歸樹(分類樹用來做分類問題,迴歸樹用來做迴歸問題),所用的算法依然是前向分步算法。對於分類樹的提升樹,如果是二分類問題,該算法和AdaBoost算法是等價的。
假如不用平方誤差損失,換成其他的損失函數時,殘差不太好計算。梯度提升算法依然採用擬合每一個訓練數據,由於不是採用平方誤差損失,之前用殘差擬合下一棵樹的方法就不適用了,此時提出梯度提升算法。
∗∗∗梯度提升算法∗∗∗輸入:訓練數據集T=(x1,y1),(x2,y2),⋯,(xN,yN),x∈X⊆Rn,y∈Y⊆R,損失函數L(y,f(x))輸出:回歸樹f^(x)。(1)初始化。f0(x)=cargmini=1∑NL(yi,c)(2)對m=1,2,⋯,M(a)對i=1,2,⋯,N,計算rmi=−[∂f(xi)∂L(yi,f(xi))]f(x)=fm−1(x)(b)對rmi擬合一個回歸樹,得到第m棵樹的葉結點區域Rmj,j=1,2,⋯,J(c)對j=1,2,⋯,J,計算cmj=cargminxi∈Rmj∑L(yi,fm−1(xi)+c)(d)更新。fm(x)=fm−1(x)+j=1∑JcmiI(x∈Rmj)(3)得到回歸樹。f^(x)=fM(x)=m=1∑Mj=1∑JcmjI(x∈Rmj)∗∗在算法中,依然是需要一個類似與殘差的變量,該值(rmi)是用負梯度計算的,rmi是損失函數關於f(x)的負梯度,然後用rmi擬合新的回歸樹,一般情況下是求解Θm,Θm包含兩個部分:空間上的劃分Rmj,j=1,2,⋯,J和擬合值cmj。
問題思考
1.在提升算法中,爲什麼可以用負梯度近似代替殘差?
答:假設L(yi,f(xi))=[yi−f(xi)]2,則−∂f(xi)∂L(yi,f(xi))=−(−2[yi−f(xi)])=2[yi−f(xi)]=rmi,推廣用到的是一階泰勒展開的近似,從平方損失的例子中可以看到,用負梯度確實可以代替殘差。但是在推導的過程中,可以看到前面有一個系數2,所以負梯度只是殘差的代替,並不能等同於殘差。這也就是爲什麼在(c)步中要根據原始的yi和f(x)的形式求解c
2.計算殘差時,爲什麼只能通過殘差求解Rmj,還需要重新計算嗎?
答:由於已經確定了每一個葉子結點區域Rmj,對於每一個葉子結點j,只需考慮該葉子結點,而不需要考慮其他的葉子結點,當求這一個葉子結點(即求分到這個葉子結點的樣本點xi∈Rmj)中的樣本點xi,求這些點的經驗損失和(Rmj上對應樣本點的經驗風險),真實值爲yi,擬合值爲fm−1(xi)再加第m步中得到的數,此處只關心Rmj區域中的葉子結點部分,對這個葉子結點,新得到的這個數(擬合值)爲c,所以整體的擬合值爲fm−1(xi)+c。通過經驗風險最小,求得這個葉子結點上那棵新樹對應的c值,fm(xi)+c表示爲在Rmj區域範圍的樣本點的擬合值fm(xi)。所以對於一個新的回歸樹,已經求了J(第m棵樹中葉子結點的個數)個這樣的c,更新的形式爲fm(x)=fm−1(x)+j=1∑JcmjI(x∈Rmj),對於每個樣本點,只在其中的一個指示函數(indicatorfunction)中等於1,因爲只能屬於其中的一個Rmj,當I(x∈Rmj)=1時,累積求和。對於每一棵樹fm(x),都有一個cm,對每一棵樹上,又劃分了J個區域,所以擬合值爲cmj。對於每一個樣本點,在每一棵樹上,都只有一個指示函數爲1。雖然(3)步求和是M,J,但是最後求解時,只有M項的和。