机器学习实战第15章pegasos算法原理剖析以及伪代码和算法的对应关系

版权声明:本文为博主原创文章,可以随便转载 https://blog.csdn.net/appleyuchi/article/details/82941221

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} ))
其中 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 ; ( x i t , y i t ) ) l( w;( x_{i_t},y_{i_t} ) ) 定義來自論文P2的式(2)

考虑子梯度求导,我们得到论文P4(第4页,下同)的式(4):
w t = λ 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}①
这里的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.①
所以上面的意思其实就是,预测错误,就施加惩罚项,
没有预测错,那就维持原样。
#---------------------------------------
但是顯然,每次循環處理一條數據不太劃算,
於是啊,這裏原先的式(4)變成了論文中的式(8),如下:
w t = λ t 1 k i 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-\frac{1}{k}\sum_{i∈A_t}index[y_{i_t}·<w_t·x_{i_t}><1 ]·y_{i_t}x_{i_t}②

下面注意!!!!!
①與②的 w t \triangledown_{w_t} 不是同一個意思,他們有細微的差別。
在下面描述僞代碼後,結合僞代碼再說明他們的區別。
#---------------------------------------
好了,接下来说下算法的伪代码:
和书中代码对应的伪代码是论文中的Mini_batch Iterations(在论文的P5~P6)
#---------------------------下面是pegasos-minibatch僞代碼------------------------------------------------
I N P U T S , λ , T , k I_{NPUT}:S,\lambda,T,k
I N I T I A L I Z E : S e t     w 1 = 0 I_{NITIALIZE}:Set  w_1=0
F O R     t [ 1 , T ] F_{OR}   t∈[1,T]
        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
      S e t   t + = { i A t : y i < w t , x i > < 1 }    Set A_t^{+}=\{i∈A_t:y_i·<w_t,x_i><1\}
        η t = 1 λ    Set \eta_t=\frac{1}{\lambda·t}
      F O R          F_{OR} j in range(k):
          y i x i )      判斷當前batch中的每條數據對應的y_ix_i)是否需要被添加入懲罰項
        t + 1 w t η t ( λ w t 1 k i 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)③
#-------------------------------上面是pegasos-minibatch僞代碼-------------------------------------#
其中:
T:最大迭代次數
t:第t次迭代
S:整個數據集
k: A t = k |A_t|=k ,也就是mini-batch的數據集的數量。
我們可以看到,這個僞代碼中,居然沒有if語句,也就是說,它被省略了。
《機器學習實戰》P287中,是有if語句的,那麼這個if語句就在上面的僞代碼中,我自己用中文添加的內循環中。
也就是說,②中的 w t \triangledown_{w_t}是上述僞代碼中內for循環結束後的結果
也就是說 t η t t η t w t ③=w_t- \eta_t·②=w_t-\eta_t·\triangledown_{w_t}
那麼①中的 w t \triangledown_{w_t} 對應僞代碼中的什麼地方呢?這個對應的是pegasos算法在逐條處理數據時(也就是“非mini-batch算法”中)的③中的懲罰項(“非mini-batch算法”中的③與本文的③是不一樣的,由於和《機器學習實戰》第15章不完全對應,所以本文沒有給出“非mini-batch算法”的僞代碼)。

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

伪代码中 y i y_i y i t y_{i_t} 的区别?
y i y_i 表示的是第i条数据的标签值
y i t y_{i_t} 表示的是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})
注意这里的复杂度的单位不再是传统算法中常见的“一次循环”=Ω(1)
这里的Ω(1)=一次计算机底层运算

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

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

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

猜你喜欢

转载自blog.csdn.net/appleyuchi/article/details/82941221