机器学习实战第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 ; i t ) = λ 2 ∣ ∣ w ∣ ∣ 2 + l ( w ; ( x i t , y i t ) ) f(w;i_t)=\frac{\lambda}{2}||w||^2+l( w;( x_{i_t},y_{i_t} )) f(w;it)=2λw2+l(w;(xit,yit))
其中 l ( w ; ( x i t , y i t ) ) = m a x { 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,1y<w,x>}
l ( w ; ( x i t , y i t ) ) l( w;( x_{i_t},y_{i_t} ) ) l(w;(xit,yit))定義來自論文P2的式(2)

考虑子梯度求导,我们得到论文P4(第4页,下同)的式(4):
▽ w t = λ w t − i n d e x [ y i t ⋅ < w t ⋅ x i t > < 1 ] ⋅ y i t x i t ① \triangledown_{w_t}=\lambdaw_t-index[y_{i_t}·<w_t·x_{i_t}><1 ]·y_{i_t}x_{i_t}① wt=λtindex[yit<wtxit><1]yitxit
(Pegasos Algorithm)
这里的index是指示函数,意思是当满足括号中的条件时,返回1,否则返回0
这么看其实还是优点晕的哈,我们把(4)写得更加清楚些,如下:
▽ w t = { λ ⋅ 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 ① \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={λwtyitxit,λwtyit<wt,xit>1yit<wt,xit>1
所以上面的意思其实就是,预测错误,就施加惩罚项,
没有预测错,那就维持原样。
#---------------------------------------
但是顯然,每次循環處理一條數據不太劃算,
於是啊,這裏原先的式(4)變成了論文中的式(8),如下:
▽ w t = λ w t − 1 k ∑ i ∈ A t i n d e x [ y i t ⋅ < w t ⋅ x i t > \triangledown_{w_t}=\lambdaw_t-\frac{1}{k}\sum_{i∈A_t}index[y_{i_t}·<w_t·x_{i_t}> wt=λtk1itindex[yit<wtxit>< 1 ] ⋅ y i t x i t ② 1]·y_{i_t}x_{i_t}② 1]yitxit
(Mini_Batch Pegasos Algorithm)

下面注意!!!!!
①與②的 ▽ w t \triangledown_{w_t} wt不是同一個意思,他們有細微的差別。
在下面描述僞代碼後,結合僞代碼再說明他們的區別。
#---------------------------------------
好了,接下来说下算法的伪代码:
和书中代码对应的伪代码是论文中的Mini_batch Iterations(在论文的P5~P6)
#---------------------------下面是Mini_Batch Pegasos Algorithm僞代碼------------------------------------------------
I N P U T : S , λ , T , k I_{NPUT}:S,\lambda,T,k INPUTS,λ,T,k
I N I T I A L I Z E : S e t     w 1 = 0 I_{NITIALIZE}:Set  w_1=0 INITIALIZE:Set  w1=0
F O R     t ∈ [ 1 , T ] F_{OR}   t∈[1,T] FOR  t[1,T]
      C h o o s e   A t ⊆ [ m ] , w h e r e ∣ A t ∣ = k , u n i f o r m l y   a t   r a n d o m    Choose A_t⊆[m],where|A_t|=k,uniformly at random    Choose t[m],whereAt=k,uniformly at random
      S e t   A t + = { i ∈ A t : y i ⋅ < w t , x i > < 1 }    Set A_t^{+}=\{i∈A_t:y_i·<w_t,x_i><1\}    Set t+={iAt:yi<wt,xi><1}
      S e t   η t = 1 λ ⋅ t    Set \eta_t=\frac{1}{\lambda·t}     ηt=λ1
      F O R   j in range(k):    F_{OR} \text{j in range(k):}    FOR j in range(k):
          判 斷 當 前 b a t c h 中 的 每 條 數 據 對 應 的 y i x i ) 是 否 需 要 被 添 加 入 懲 罰 項      判斷當前batch中的每條數據對應的y_ix_i)是否需要被添加入懲罰項      batchyixi)
      S e t   w t + 1 ⟵ w t - η t ( λ w t − 1 k ∑ i ∈ A i + y i x i ) ③    Set w_{t+1}\longleftarrow w_t-\eta_t(\lambda w_t-\frac{1}{k}\sum_{i∈A_i^{+}}y_ix_i)③    Set t+1wtηt(λwtk1ii+yixi)
#-------------------------------上面是Mini_Batch Pegasos Algorithm僞代碼-------------------------------------#
其中:
T:最大迭代次數
t:第t次迭代
S:整個數據集
k: ∣ A t ∣ = k |A_t|=k At=k,也就是mini-batch的數據集的數量。
我們可以看到,這個僞代碼中,居然沒有if語句,也就是說,它被省略了。
《機器學習實戰》P287中,是有if語句的,那麼這個if語句就在上面的僞代碼中,我自己用中文添加的內循環中。
也就是說,②中的 ▽ w t 是 上 述 僞 代 碼 中 內 f o r 循 環 結 束 後 的 結 果 \triangledown_{w_t}是上述僞代碼中內for循環結束後的結果 wtfor
也就是說 ③ = w t − η t ⋅ ② = w t − η t ⋅ ▽ w t ③=w_t- \eta_t·②=w_t-\eta_t·\triangledown_{w_t} tηttηtwt

那麼①中的 ▽ w t \triangledown_{w_t} wt對應僞代碼中的什麼地方呢?
這個對應的是"Pegasos Algorithm"的③中的懲罰項
(** P e g a s o s   A l g o r i t h m ‾ \underline{Pegasos Algorithm} Pegasos Algorithm與本文的 M i n i B a t c h   P e g a s o s   A l g o r i t h m ‾ \underline{Mini_Batch Pegasos Algorithm} MiniBatch Pegasos Algorithm**是不一樣的,由於和《機器學習實戰》第15章不完全對應,所以本文沒有給出 M i n i B a t c h   P e g a s o s   A l g o r i t h m ‾ \underline{Mini_Batch Pegasos Algorithm} MiniBatch Pegasos Algorithm的僞代碼)。

算法停止迭代的条件是(论文第2页上方):
f ( w ) ≤ m i n w f ( w ) + f(w)≤min_wf(w)+ f(w)minwf(w)+ε

伪代码中 y i y_i yi y i t y_{i_t} yit的区别?
y i y_i yi表示的是第i条数据的标签值
y i t y_{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 wDelta
        eta = 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 code
            if labels[i]*p < 1:                 #mapper code
                wDelta += labels[i]*dataSet[i,:].A #accumulate changes  
        w = (1.0 - 1/t)*w + (eta/k)*wDelta       #apply changes at each T
    return w

#############pegasos的算法复杂度分析######################
论文讲了两个东西:原始版本的pegasos和mini-batch的pegasos
论文中只给出了原始版本(非mini-batch的pegasos)的算法的复杂度,
下面是原始版本的伪代码和《机器学习实战》上的代码:
原始版本的pegasos伪代码:
在这里插入图片描述
原始版本的pegasos的《机器学习实战》上第十五章给出的实现代码

def seqPegasos(dataSet, labels, lam, T):#這個對應論文中的Pegasos Algorithm(Fig.1)
    m,n = shape(dataSet); w = zeros(n)
    for t in range(1, T+1):
        i = random.randint(m)
        eta = 1.0/(lam*t)
        p = predict(w, dataSet[i,:])
        if labels[i]*p < 1:
            w = (1.0 - 1/t)*w + eta*labels[i]*dataSet[i,:]
        else:
            w = (1.0 - 1/t)*w
        print w
    return w

下面分析复杂度为什么是论文中提到的:
Ω ( d λ ϵ ) Ω(\frac{d}{λ\epsilon}) Ωλϵd
注意这里的复杂度的单位不再是传统算法中常见的“一次循环”=Ω(1)
这里的Ω(1)=一次计算机底层运算

这里的d是每一条数据的维度,其实也就是最终求解目标w的维度
代码中的 1 t = η λ \frac{1}{t}=\eta\lambda t1=ηλ其实就是 λ ϵ λ\epsilon λϵ
所以当数据的非0维度是d时
那么整个循环的复杂度等于 Ω ( d T λ ϵ ) Ω(\frac{dT}{λ\epsilon}) ΩλϵdT-> Ω ( d λ ϵ ) Ω(\frac{d}{λ\epsilon}) Ωλϵd

###################################
下面是與SMO的大致比較:
SMO主要思想是使用KKT+廣義的拉格朗日,主要解決的問題就是狹義的拉格朗日(就是我們高等數學中的那個拉格朗日)只能處理等式約束,不能處理不等式約束,所以來個KKT條件,就能使用廣義的拉格朗日了,使用形式上與狹義的拉格朗日一致,只不過
KKT約束條件實在又多又麻煩,所以出來個SMO解決一下。

而pegasos的主要原理是對於“非處處可導”的凸函數使用,上面的描述中,“非處處可導”的凸函數指的是 l ( w ; ( x i t , y i t ) ) l( w;( x_{i_t},y_{i_t} ) ) l(w;(xit,yit)),我們知道,感知機是用的梯度下降,那麼SVM和感知機這麼相似,爲啥不用梯度下降呢?
因爲感知機的目標函數是處處可導的。
而SVM的目標函數中,帶有“非處處可導”的函數 l ( w ; ( x i t , y i t ) ) l( w;( x_{i_t},y_{i_t} ) ) l(w;(xit,yit)),所以沒辦法使用梯度下降,只能使用“子梯度下降”(sub-gradient),所以文章開頭的預備知識就是這個。
也就是說,對於SVM的目標函數,目前處理有兩個思路:
一,滿足KKT條件,不等式約束->等式約束,然後使用廣義的拉格朗日(SMO算法)。
二,使用子梯度下降,處理 l ( w ; ( x i t , y i t ) ) l( w;( x_{i_t},y_{i_t} ) ) l(w;(xit,yit))(Pegasos算法)

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值