机器学习实战第15章pegasos算法原理剖析以及伪代码和算法的对应关系
Pegasos原文是:
http://ttic.uchicago.edu/~nati/Publications/PegasosMPB.pdf
還是挺長(zhǎng)的,論文結(jié)構(gòu)是:
第1~6頁(yè):主要原理
第7~15頁(yè):講一些定理配合核函數(shù)使用的一些理論
第16~26頁(yè):實(shí)驗(yàn)和參考文獻(xiàn)
對(duì)于急功近利的同學(xué)而言,這個(gè)博客就不要浪費(fèi)時(shí)間看了,因?yàn)槊嬖嚮臼怯貌坏降摹?br /> 因?yàn)檫@是這本書的最后一章,本人有點(diǎn)完美主義,所以還是想搞懂。
################下面是一些必備的基本知識(shí)#######################
對(duì)于subgradient
不采用國(guó)內(nèi)的次梯度的翻譯,一律使用子梯度的說法
子梯度下降的應(yīng)用場(chǎng)景是?
子梯度下降就是對(duì)付非處處求導(dǎo)的函數(shù)的極值求解的
所以子梯度的意思就是:其實(shí)還是梯度,但是可能是多個(gè)分段函數(shù)的梯度,相鄰兩個(gè)分段函數(shù)之間的分界點(diǎn)可能導(dǎo)數(shù)不存在,
分界點(diǎn)的梯度可能是一個(gè)區(qū)間,而不是唯一的一個(gè)值,為了應(yīng)對(duì)這種情況,取名叫做字梯度(sub-gradient)
而梯度下降和梯度上升都是針對(duì)所研究的函數(shù)處處可導(dǎo)的情況的。
先來一個(gè)案例吧:
子梯度求導(dǎo)參考案例:
該案例來自:
http://www.seas.ucla.edu/~vandenbe/236C/lectures/subgradients.pdf
所以看看,其實(shí)也沒啥,通俗來講:什么是子梯度下降呢?
其實(shí)就是分段求導(dǎo),對(duì)于導(dǎo)數(shù)不存在的臨界點(diǎn),我們?nèi)≡擖c(diǎn)左右兩邊的導(dǎo)數(shù)作為“次導(dǎo)數(shù)”的區(qū)間的上下限
#######################以上是一些基本知識(shí)#################
下面開始回顧SVM要解決的問題:
首先是論文P4(第4頁(yè),下同)的式(3):
f(w;it)=λ2∣∣w∣∣2+l(w;(xit,yit))f(w;i_t)=\frac{\lambda}{2}||w||^2+l( w;( x_{i_t},y_{i_t} ))f(w;it?)=2λ?∣∣w∣∣2+l(w;(xit??,yit??))
其中l(w;(xit,yit))=max{0,1?y?<w,x>}l( w;( x_{i_t},y_{i_t} ) )=max\{0,1-y·<w,x>\}l(w;(xit??,yit??))=max{0,1?y?<w,x>}
l(w;(xit,yit))l( w;( x_{i_t},y_{i_t} ) )l(w;(xit??,yit??))定義來自論文P2的式(2)
考慮子梯度求導(dǎo),我們得到論文P4(第4頁(yè),下同)的式(4):
▽wt=λwt?index[yit?<wt?xit><1]?yitxit①\triangledown_{w_t}=\lambdaw_t-index[y_{i_t}·<w_t·x_{i_t}><1 ]·y_{i_t}x_{i_t}①▽wt??=λwt??index[yit???<wt??xit??><1]?yit??xit??①
(Pegasos Algorithm)
這里的index是指示函數(shù),意思是當(dāng)滿足括號(hào)中的條件時(shí),返回1,否則返回0
這么看其實(shí)還是優(yōu)點(diǎn)暈的哈,我們把(4)寫得更加清楚些,如下:
▽wt={λ?wt?yitxit,yit?<wt,xit><1λ?wtyit?<wt,xit>≥1①\triangledown_{w_t}=\left\{ \begin{array}{c l} λ·w_t-y_{i_t}x_{i_t}, & y_{i_t}· <w_t,x_{i_t}><1\\ λ·w_t & y_{i_t}· <w_t,x_{i_t}> ≥1 \end{array}\right.①▽wt??={λ?wt??yit??xit??,λ?wt??yit???<wt?,xit??><1yit???<wt?,xit??>≥1?①
所以上面的意思其實(shí)就是,預(yù)測(cè)錯(cuò)誤,就施加懲罰項(xiàng),
沒有預(yù)測(cè)錯(cuò),那就維持原樣。
#---------------------------------------
但是顯然,每次循環(huán)處理一條數(shù)據(jù)不太劃算,
於是啊,這裏原先的式(4)變成了論文中的式(8),如下:
▽wt=λwt?1k∑i∈Atindex[yit?<wt?xit>\triangledown_{w_t}=\lambdaw_t-\frac{1}{k}\sum_{i∈A_t}index[y_{i_t}·<w_t·x_{i_t}>▽wt??=λwt??k1?∑i∈At??index[yit???<wt??xit??><1]?yitxit②1]·y_{i_t}x_{i_t}②1]?yit??xit??②
(Mini_Batch Pegasos Algorithm)
下面注意!!!!!
①與②的▽wt\triangledown_{w_t}▽wt??不是同一個(gè)意思,他們有細(xì)微的差別。
在下面描述僞代碼後,結(jié)合僞代碼再說明他們的區(qū)別。
#---------------------------------------
好了,接下來說下算法的偽代碼:
和書中代碼對(duì)應(yīng)的偽代碼是論文中的Mini_batch Iterations(在論文的P5~P6)
#---------------------------下面是Mini_Batch Pegasos Algorithm僞代碼------------------------------------------------
INPUT:S,λ,T,kI_{NPUT}:S,\lambda,T,kINPUT?:S,λ,T,k
INITIALIZE:Setw1=0I_{NITIALIZE}:Set w_1=0INITIALIZE?:Set w1?=0
FORt∈[1,T]F_{OR} t∈[1,T]FOR? t∈[1,T]
ChooseAt?[m],where∣At∣=k,uniformlyatrandomChoose A_t?[m],where|A_t|=k,uniformly at random Choose At??[m],where∣At?∣=k,uniformly at random
SetAt+={i∈At:yi?<wt,xi><1}Set A_t^{+}=\{i∈A_t:y_i·<w_t,x_i><1\} Set At+?={i∈At?:yi??<wt?,xi?><1}
Setηt=1λ?tSet \eta_t=\frac{1}{\lambda·t} Set ηt?=λ?t1?
FORj?in?range(k):F_{OR} \text{j in range(k):} FOR? j?in?range(k):
判斷當(dāng)前batch中的每條數(shù)據(jù)對(duì)應(yīng)的yixi)是否需要被添加入懲罰項(xiàng)判斷當(dāng)前batch中的每條數(shù)據(jù)對(duì)應(yīng)的y_ix_i)是否需要被添加入懲罰項(xiàng) 判斷當(dāng)前batch中的每條數(shù)據(jù)對(duì)應(yīng)的yi?xi?)是否需要被添加入懲罰項(xiàng)
Setwt+1?wt-ηt(λwt?1k∑i∈Ai+yixi)③Set w_{t+1}\longleftarrow w_t-\eta_t(\lambda w_t-\frac{1}{k}\sum_{i∈A_i^{+}}y_ix_i)③ Set wt+1??wt?-ηt?(λwt??k1?∑i∈Ai+??yi?xi?)③
#-------------------------------上面是Mini_Batch Pegasos Algorithm僞代碼-------------------------------------#
其中:
T:最大迭代次數(shù)
t:第t次迭代
S:整個(gè)數(shù)據(jù)集
k:∣At∣=k|A_t|=k∣At?∣=k,也就是mini-batch的數(shù)據(jù)集的數(shù)量。
我們可以看到,這個(gè)僞代碼中,居然沒有if語(yǔ)句,也就是說,它被省略了。
《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》P287中,是有if語(yǔ)句的,那麼這個(gè)if語(yǔ)句就在上面的僞代碼中,我自己用中文添加的內(nèi)循環(huán)中。
也就是說,②中的▽wt是上述僞代碼中內(nèi)for循環(huán)結(jié)束後的結(jié)果\triangledown_{w_t}是上述僞代碼中內(nèi)for循環(huán)結(jié)束後的結(jié)果▽wt??是上述僞代碼中內(nèi)for循環(huán)結(jié)束後的結(jié)果
也就是說③=wt?ηt?②=wt?ηt?▽wt③=w_t- \eta_t·②=w_t-\eta_t·\triangledown_{w_t}③=wt??ηt??②=wt??ηt??▽wt??
那麼①中的▽wt\triangledown_{w_t}▽wt??對(duì)應(yīng)僞代碼中的什麼地方呢?
這個(gè)對(duì)應(yīng)的是"Pegasos Algorithm"的③中的懲罰項(xiàng)
(**PegasosAlgorithm ̄\underline{Pegasos Algorithm}Pegasos Algorithm?與本文的MiniBatchPegasosAlgorithm ̄\underline{Mini_Batch Pegasos Algorithm}MiniB?atch Pegasos Algorithm?**是不一樣的,由於和《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》第15章不完全對(duì)應(yīng),所以本文沒有給出MiniBatchPegasosAlgorithm ̄\underline{Mini_Batch Pegasos Algorithm}MiniB?atch Pegasos Algorithm?的僞代碼)。
算法停止迭代的條件是(論文第2頁(yè)上方):
f(w)≤minwf(w)+f(w)≤min_wf(w)+f(w)≤minw?f(w)+ε
偽代碼中yiy_iyi?與yity_{i_t}yit??的區(qū)別?
yiy_iyi?表示的是第i條數(shù)據(jù)的標(biāo)簽值
yity_{i_t}yit??表示的是for循環(huán)中的第t次迭代隨機(jī)選中的第i條數(shù)據(jù)對(duì)應(yīng)的標(biāo)簽值
上述算法分析對(duì)應(yīng)的《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》第15章中的代碼是:
def batchPegasos(dataSet, labels, lam, T, k):m,n = shape(dataSet); w = zeros(n); dataIndex = range(m)for t in range(1, T+1):wDelta = mat(zeros(n)) #reset wDeltaeta = 1.0/(lam*t)random.shuffle(dataIndex)for j in range(k):#go over training set i = dataIndex[j]p = predict(w, dataSet[i,:]) #mapper codeif labels[i]*p < 1: #mapper codewDelta += labels[i]*dataSet[i,:].A #accumulate changes w = (1.0 - 1/t)*w + (eta/k)*wDelta #apply changes at each Treturn w#############pegasos的算法復(fù)雜度分析######################
論文講了兩個(gè)東西:原始版本的pegasos和mini-batch的pegasos
論文中只給出了原始版本(非mini-batch的pegasos)的算法的復(fù)雜度,
下面是原始版本的偽代碼和《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》上的代碼:
原始版本的pegasos偽代碼:
原始版本的pegasos的《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》上第十五章給出的實(shí)現(xiàn)代碼
下面分析復(fù)雜度為什么是論文中提到的:
Ω(dλ?)Ω(\fracozvdkddzhkzd{λ\epsilon})Ω(λ?d?)
注意這里的復(fù)雜度的單位不再是傳統(tǒng)算法中常見的“一次循環(huán)”=Ω(1)
這里的Ω(1)=一次計(jì)算機(jī)底層運(yùn)算
這里的d是每一條數(shù)據(jù)的維度,其實(shí)也就是最終求解目標(biāo)w的維度
代碼中的1t=ηλ\frac{1}{t}=\eta\lambdat1?=ηλ其實(shí)就是λ?λ\epsilonλ?
所以當(dāng)數(shù)據(jù)的非0維度是d時(shí)
那么整個(gè)循環(huán)的復(fù)雜度等于Ω(dTλ?)Ω(\frac{dT}{λ\epsilon})Ω(λ?dT?)->Ω(dλ?)Ω(\fracozvdkddzhkzd{λ\epsilon})Ω(λ?d?)
###################################
下面是與SMO的大致比較:
SMO主要思想是使用KKT+廣義的拉格朗日,主要解決的問題就是狹義的拉格朗日(就是我們高等數(shù)學(xué)中的那個(gè)拉格朗日)只能處理等式約束,不能處理不等式約束,所以來個(gè)KKT條件,就能使用廣義的拉格朗日了,使用形式上與狹義的拉格朗日一致,只不過
KKT約束條件實(shí)在又多又麻煩,所以出來個(gè)SMO解決一下。
而pegasos的主要原理是對(duì)於“非處處可導(dǎo)”的凸函數(shù)使用,上面的描述中,“非處處可導(dǎo)”的凸函數(shù)指的是l(w;(xit,yit))l( w;( x_{i_t},y_{i_t} ) )l(w;(xit??,yit??)),我們知道,感知機(jī)是用的梯度下降,那麼SVM和感知機(jī)這麼相似,爲(wèi)啥不用梯度下降呢?
因爲(wèi)感知機(jī)的目標(biāo)函數(shù)是處處可導(dǎo)的。
而SVM的目標(biāo)函數(shù)中,帶有“非處處可導(dǎo)”的函數(shù)l(w;(xit,yit))l( w;( x_{i_t},y_{i_t} ) )l(w;(xit??,yit??)),所以沒辦法使用梯度下降,只能使用“子梯度下降”(sub-gradient),所以文章開頭的預(yù)備知識(shí)就是這個(gè)。
也就是說,對(duì)於SVM的目標(biāo)函數(shù),目前處理有兩個(gè)思路:
一,滿足KKT條件,不等式約束->等式約束,然後使用廣義的拉格朗日(SMO算法)。
二,使用子梯度下降,處理l(w;(xit,yit))l( w;( x_{i_t},y_{i_t} ) )l(w;(xit??,yit??))(Pegasos算法)
總結(jié)
以上是生活随笔為你收集整理的机器学习实战第15章pegasos算法原理剖析以及伪代码和算法的对应关系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 等式约束和不等式约束下的KKT条件求法
- 下一篇: numpy.matrixlib.defm