机器学习实战第15章pegasos算法原理剖析以及伪代码和算法的对应关系
Pegasos原文是:
http://ttic.uchicago.edu/~nati/Publications/PegasosMPB.pdf
還是挺長的,論文結構是:
第1~6頁:主要原理
第7~15頁:講一些定理配合核函數使用的一些理論
第16~26頁:實驗和參考文獻
對于急功近利的同學而言,這個博客就不要浪費時間看了,因為面試基本是用不到的。
因為這是這本書的最后一章,本人有點完美主義,所以還是想搞懂。
################下面是一些必備的基本知識#######################
對于subgradient
不采用國內的次梯度的翻譯,一律使用子梯度的說法
子梯度下降的應用場景是?
子梯度下降就是對付非處處求導的函數的極值求解的
所以子梯度的意思就是:其實還是梯度,但是可能是多個分段函數的梯度,相鄰兩個分段函數之間的分界點可能導數不存在,
分界點的梯度可能是一個區間,而不是唯一的一個值,為了應對這種情況,取名叫做字梯度(sub-gradient)
而梯度下降和梯度上升都是針對所研究的函數處處可導的情況的。
先來一個案例吧:
子梯度求導參考案例:
該案例來自:
http://www.seas.ucla.edu/~vandenbe/236C/lectures/subgradients.pdf
所以看看,其實也沒啥,通俗來講:什么是子梯度下降呢?
其實就是分段求導,對于導數不存在的臨界點,我們取該點左右兩邊的導數作為“次導數”的區間的上下限
#######################以上是一些基本知識#################
下面開始回顧SVM要解決的問題:
首先是論文P4(第4頁,下同)的式(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)
考慮子梯度求導,我們得到論文P4(第4頁,下同)的式(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是指示函數,意思是當滿足括號中的條件時,返回1,否則返回0
這么看其實還是優點暈的哈,我們把(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?①
所以上面的意思其實就是,預測錯誤,就施加懲罰項,
沒有預測錯,那就維持原樣。
#---------------------------------------
但是顯然,每次循環處理一條數據不太劃算,
於是啊,這裏原先的式(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??不是同一個意思,他們有細微的差別。
在下面描述僞代碼後,結合僞代碼再說明他們的區別。
#---------------------------------------
好了,接下來說下算法的偽代碼:
和書中代碼對應的偽代碼是論文中的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):
判斷當前batch中的每條數據對應的yixi)是否需要被添加入懲罰項判斷當前batch中的每條數據對應的y_ix_i)是否需要被添加入懲罰項 判斷當前batch中的每條數據對應的yi?xi?)是否需要被添加入懲罰項
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:最大迭代次數
t:第t次迭代
S:整個數據集
k:∣At∣=k|A_t|=k∣At?∣=k,也就是mini-batch的數據集的數量。
我們可以看到,這個僞代碼中,居然沒有if語句,也就是說,它被省略了。
《機器學習實戰》P287中,是有if語句的,那麼這個if語句就在上面的僞代碼中,我自己用中文添加的內循環中。
也就是說,②中的▽wt是上述僞代碼中內for循環結束後的結果\triangledown_{w_t}是上述僞代碼中內for循環結束後的結果▽wt??是上述僞代碼中內for循環結束後的結果
也就是說③=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??對應僞代碼中的什麼地方呢?
這個對應的是"Pegasos Algorithm"的③中的懲罰項
(**PegasosAlgorithm ̄\underline{Pegasos Algorithm}Pegasos Algorithm?與本文的MiniBatchPegasosAlgorithm ̄\underline{Mini_Batch Pegasos Algorithm}MiniB?atch Pegasos Algorithm?**是不一樣的,由於和《機器學習實戰》第15章不完全對應,所以本文沒有給出MiniBatchPegasosAlgorithm ̄\underline{Mini_Batch Pegasos Algorithm}MiniB?atch Pegasos Algorithm?的僞代碼)。
算法停止迭代的條件是(論文第2頁上方):
f(w)≤minwf(w)+f(w)≤min_wf(w)+f(w)≤minw?f(w)+ε
偽代碼中yiy_iyi?與yity_{i_t}yit??的區別?
yiy_iyi?表示的是第i條數據的標簽值
yity_{i_t}yit??表示的是for循環中的第t次迭代隨機選中的第i條數據對應的標簽值
上述算法分析對應的《機器學習實戰》第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的算法復雜度分析######################
論文講了兩個東西:原始版本的pegasos和mini-batch的pegasos
論文中只給出了原始版本(非mini-batch的pegasos)的算法的復雜度,
下面是原始版本的偽代碼和《機器學習實戰》上的代碼:
原始版本的pegasos偽代碼:
原始版本的pegasos的《機器學習實戰》上第十五章給出的實現代碼
下面分析復雜度為什么是論文中提到的:
Ω(dλ?)Ω(\fracze8trgl8bvbq{λ\epsilon})Ω(λ?d?)
注意這里的復雜度的單位不再是傳統算法中常見的“一次循環”=Ω(1)
這里的Ω(1)=一次計算機底層運算
這里的d是每一條數據的維度,其實也就是最終求解目標w的維度
代碼中的1t=ηλ\frac{1}{t}=\eta\lambdat1?=ηλ其實就是λ?λ\epsilonλ?
所以當數據的非0維度是d時
那么整個循環的復雜度等于Ω(dTλ?)Ω(\frac{dT}{λ\epsilon})Ω(λ?dT?)->Ω(dλ?)Ω(\fracze8trgl8bvbq{λ\epsilon})Ω(λ?d?)
###################################
下面是與SMO的大致比較:
SMO主要思想是使用KKT+廣義的拉格朗日,主要解決的問題就是狹義的拉格朗日(就是我們高等數學中的那個拉格朗日)只能處理等式約束,不能處理不等式約束,所以來個KKT條件,就能使用廣義的拉格朗日了,使用形式上與狹義的拉格朗日一致,只不過
KKT約束條件實在又多又麻煩,所以出來個SMO解決一下。
而pegasos的主要原理是對於“非處處可導”的凸函數使用,上面的描述中,“非處處可導”的凸函數指的是l(w;(xit,yit))l( w;( x_{i_t},y_{i_t} ) )l(w;(xit??,yit??)),我們知道,感知機是用的梯度下降,那麼SVM和感知機這麼相似,爲啥不用梯度下降呢?
因爲感知機的目標函數是處處可導的。
而SVM的目標函數中,帶有“非處處可導”的函數l(w;(xit,yit))l( w;( x_{i_t},y_{i_t} ) )l(w;(xit??,yit??)),所以沒辦法使用梯度下降,只能使用“子梯度下降”(sub-gradient),所以文章開頭的預備知識就是這個。
也就是說,對於SVM的目標函數,目前處理有兩個思路:
一,滿足KKT條件,不等式約束->等式約束,然後使用廣義的拉格朗日(SMO算法)。
二,使用子梯度下降,處理l(w;(xit,yit))l( w;( x_{i_t},y_{i_t} ) )l(w;(xit??,yit??))(Pegasos算法)
總結
以上是生活随笔為你收集整理的机器学习实战第15章pegasos算法原理剖析以及伪代码和算法的对应关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 等式约束和不等式约束下的KKT条件求法
- 下一篇: numpy.matrixlib.defm