机器学习实战第15章pegasos算法原理剖析以及伪代码和算法的对应关系
Pegasos原文是:
http://www.ee.oulu.fi/research/imag/courses/Vedaldi/ShalevSiSr07.pdf
还是挺长的,论文结构是:
第1~6页:主要原理
第7~15页:讲一些定理配合核函数使用的一些理论
第16~26页:实验和参考文献
对于急功近利的同学而言,这个博客就不要浪费时间看了,因为面试基本是用不到的。
因为这是这本书的最后一章,本人优点完美主义,所以还是想搞懂。
################下面是一些必备的基本知识#######################
对于subgradient
不采用国内的次梯度的翻译,一律使用子梯度的说法
子梯度下降的应用场景是?
子梯度下降就是对付非处处求导的函数的极值求解的
所以子梯度的意思就是:其实还是梯度,但是可能是多个分段函数的梯度,相邻两个分段函数之间的分界点可能导数不存在,
分界点的梯度可能是一个区间,而不是唯一的一个值,为了应对这种情况,取名叫做字梯度(sub-gradient)
而梯度下降和梯度上升都是针对所研究的函数处处可导的情况的。
先来一个案例吧:
子梯度求导参考案例:
该案例来自:
http://www.seas.ucla.edu/~vandenbe/236C/lectures/subgradients.pdf
所以看看,其实也没啥,通俗来讲:什么是子梯度下降呢?
其实就是分段求导,对于导数不存在的临界点,我们取该点左右两边的导数作为“次导数”的区间的上下限
#######################以上是一些基本知识#################
下面开始回顾SVM要解决的问题:
首先是论文P4(第4页,下同)的式(3):
其中
定義來自論文P2的式(2)
考虑子梯度求导,我们得到论文P4(第4页,下同)的式(4):
这里的index是指示函数,意思是当满足括号中的条件时,返回1,否则返回0
这么看其实还是优点晕的哈,我们把(4)写得更加清楚些,如下:
所以上面的意思其实就是,预测错误,就施加惩罚项,
没有预测错,那就维持原样。
#---------------------------------------
但是顯然,每次循環處理一條數據不太劃算,
於是啊,這裏原先的式(4)變成了論文中的式(8),如下:
下面注意!!!!!
①與②的不是同一個意思,他們有細微的差別。
在下面描述僞代碼後,結合僞代碼再說明他們的區別。
#---------------------------------------
好了,接下来说下算法的伪代码:
和书中代码对应的伪代码是论文中的Mini_batch Iterations(在论文的P5~P6)
#---------------------------下面是pegasos-minibatch僞代碼------------------------------------------------
#-------------------------------上面是pegasos-minibatch僞代碼-------------------------------------#
其中:
T:最大迭代次數
t:第t次迭代
S:整個數據集
k:,也就是mini-batch的數據集的數量。
我們可以看到,這個僞代碼中,居然沒有if語句,也就是說,它被省略了。
《機器學習實戰》P287中,是有if語句的,那麼這個if語句就在上面的僞代碼中,我自己用中文添加的內循環中。
也就是說,②中的
也就是說
那麼①中的對應僞代碼中的什麼地方呢?這個對應的是pegasos算法在逐條處理數據時(也就是“非mini-batch算法”中)的③中的懲罰項(“非mini-batch算法”中的③與本文的③是不一樣的,由於和《機器學習實戰》第15章不完全對應,所以本文沒有給出“非mini-batch算法”的僞代碼)。
算法停止迭代的条件是(论文第2页上方):
ε
伪代码中与的区别?
表示的是第i条数据的标签值
表示的是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
###################################
下面是與SMO的大致比較:
SMO主要思想是使用KKT+廣義的拉格朗日,主要解決的問題就是狹義的拉格朗日(就是我們高等數學中的那個拉格朗日)只能處理等式約束,不能處理不等式約束,所以來個KKT條件,就能使用廣義的拉格朗日了,使用形式上與狹義的拉格朗日一致,只不過
KKT約束條件實在又多有麻煩,所以出來個SMO解決一下。
而pegasos的主要原理是對於“非處處可導”的凸函數使用,上面的描述中,“非處處可導”的凸函數指的是,我們知道,感知機是用的梯度下降,那麼SVM和感知機這麼相似,爲啥不用梯度下降呢?
因爲感知機的目標函數是處處可導的。
而SVM的目標函數中,帶有“非處處可導”的函數,所以沒辦法使用梯度下降,只能使用“子梯度下降”(sub-gradient),所以文章開頭的預備知識就是這個。
也就是說,對於SVM的目標函數,目前處理有兩個思路:
一,滿足KKT條件,不等式約束->等式約束,然後使用廣義的拉格朗日(SMO算法)。
二,使用子梯度下降,處理(Pegasos算法)