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λ∣∣w∣∣2+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,1−y⋅<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=λwt−index[yit⋅<wt⋅xit><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={λ⋅wt−yitxit,λ⋅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=λwt−k1∑i∈Atindex[yit⋅<wt⋅xit><
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
INPUT:S,λ,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 At⊆[m],where∣At∣=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 At+={i∈At:yi⋅<wt,xi><1}
S
e
t
η
t
=
1
λ
⋅
t
Set \eta_t=\frac{1}{\lambda·t}
Set ηt=λ⋅t1
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)是否需要被添加入懲罰項
判斷當前batch中的每條數據對應的yixi)是否需要被添加入懲罰項
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 wt+1⟵wt-ηt(λwt−k1∑i∈Ai+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循環結束後的結果
▽wt是上述僞代碼中內for循環結束後的結果
也就是說
③
=
w
t
−
η
t
⋅
②
=
w
t
−
η
t
⋅
▽
w
t
③=w_t- \eta_t·②=w_t-\eta_t·\triangledown_{w_t}
③=wt−ηt⋅②=wt−ηt⋅▽wt
那麼①中的
▽
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算法)