感知器学习(Perceptrons)
感知器学习的一般形式:
f
(
x
)
=
{
+
1
if
w
1
x
1
+
w
2
x
2
+
…
w
d
x
d
≥
θ
−
1
otherwise
f(\mathbf{x})=\left\{\begin{array}{ll}{+1} & {\text { if } \mathbf{w}_{1} \mathbf{x}_{1}+\mathbf{w}_{2} \mathbf{x}_{2}+\ldots \mathbf{w}_{\mathrm{d}} \mathbf{x}_{\mathrm{d}} \geq \mathbf{\theta}} \\ {-\mathbf{1}} & {\text { otherwise }}\end{array}\right.
f(x)={+1−1 if w1x1+w2x2+…wdxd≥θ otherwise
输入:
x
i
x^i
xi,
y
i
y^i
yi,目标:找出一组权重
w
1
w_1
w1、
w
2
w_2
w2、…、
w
d
w_d
wd使得该模型能将数据正确分类
对于上述垃圾邮件分类的例子而言,若
w
∗
x
>
0
w*x>0
w∗x>0,则说明其为正常邮件;若
w
∗
x
<
0
w*x<0
w∗x<0,说明其为垃圾邮件。
权重更新的过程:
说明:
I
(
t
)
I^{\left(t\right)}
I(t)为权重
w
(
t
)
w^{\left(t\right)}
w(t)的法线;
I
(
t
+
1
)
I^{\left(t+1\right)}
I(t+1)为权重
w
(
t
+
1
)
w^{\left(t+1\right)}
w(t+1)的法线
如何理解更新公式为
w
(
t
+
1
)
=
w
(
t
)
+
η
⋅
y
(
t
)
⋅
x
(
t
)
w^{(t+1)}=w^{(t)}+\eta \cdot y^{(t)} \cdot x^{(t)}
w(t+1)=w(t)+η⋅y(t)⋅x(t),上图的例子中,
y
(
t
)
=
1
y^{\left(t\right)}=1
y(t)=1但却被错误分类为
y
(
t
)
=
0
y^{\left(t\right)}=0
y(t)=0,为了使得其被正确分类,则权重
w
(
t
)
w^{\left(t\right)}
w(t)应该向
x
(
t
)
x^{\left( t\right)}
x(t)的方向旋转,即
w
(
t
+
1
)
=
w
(
t
)
+
η
⋅
y
(
t
)
⋅
x
(
t
)
w^{(t+1)}=w^{(t)}+\eta \cdot y^{(t)} \cdot x^{(t)}
w(t+1)=w(t)+η⋅y(t)⋅x(t),同理,对另一种情况分析也是合理的。
对于不能线性可分的情况,参数可能不能收敛,如何停止训练:
- 缓慢地降低学习速率,例如: η = c 1 / ( t + c 2 ) \eta=\mathfrak{c}_{1} /\left(\mathfrak{t}+\mathfrak{c}_{2}\right) η=c1/(t+c2)
- 当分类的错误率未发生改变时
- 某一部分数据用作测试集,当测试集的错误率停止下降时
- 当迭代次数达到某个固定值时
针对多分类问题,例如要分三类
A
A
A、
B
B
B、
C
C
C三类时,应该训练三个分类器
A
A
A与
B
C
BC
BC、
B
B
B与
A
C
AC
AC、
C
C
C与
A
B
AB
AB三个分类器,使用时比较,三个分类器的值,若某一分类器的值大于其他两者,则认为其属于该类。
总结:
- 过拟合
- 当数据不能线性可分时,权重会出现摆动 (dance around )
- 分类器的分割方案不是最完美的(这一点会在之后的支持向量机中解决该问题)
Winnow算法
和之前提到的感知器学习算法类似,但在此处,权重全部为正值。
补充:如果
x
x
x被错误分类为正类,则应该减小
w
w
w;反之,若被错误分类为负类,则应该增加
w
w
w。
当特征
x
x
x出现负值时,可以引入新的向量
x
′
=
−
x
x^{'}=-x
x′=−x,并且组成size为
2
d
2d
2d的向量。例如
x
=
[
1
,
.
7
,
−
.
4
]
,
w
=
[
.
5
,
.
2
,
−
.
3
]
x=[1, .7,-.4], w=[.5, .2,-.3]
x=[1,.7,−.4],w=[.5,.2,−.3],新的
x
x
x 和
w
w
w 是
x
=
[
1
,
.
7
,
−
.
4
,
x=[1, .7,-.4,
x=[1,.7,−.4,
−
1
,
−
.
7
,
.
4
]
,
w
=
[
.
5
,
.
2
,
0
,
0
,
0
,
.
3
]
-1,-.7, .4], \mathbf{w}=[.5, .2,0,0,0, .3]
−1,−.7,.4],w=[.5,.2,0,0,0,.3]
延伸:引入软间隔的概念
算法的总结:
当数据线性不可分时,可以对数据进行一些简单的处理,例如下图中的数据,可以将直角坐标转换为球坐标。
Online Learning:处理的是流式数据,首先在训练数据集进行训练,实时处理某个数据时,当该数据被错误分类,则更新权重。
Instance Based Learning
常见的算法有最近邻、K近邻、Kernel Regression。前两种已经接触过很多,这里只介绍Kernel Resgression。
距离衡量的方式:欧式距离
邻居的数量:所有点
权重衡量及预测的方式:
w
i
=
e
x
p
(
−
d
(
x
i
q
)
2
K
w
)
\boldsymbol{w}_{\boldsymbol{i}}=\mathbf{e x p}\left(-\frac{\boldsymbol{d}\left(\boldsymbol{x}_{\boldsymbol{i}} \boldsymbol{q}\right)^{2}}{\boldsymbol{K}_{\boldsymbol{w}}}\right)
wi=exp(−Kwd(xiq)2)
∑
i
w
i
y
i
∑
i
w
i
\frac{\sum_{i} w_{i} y_{i}}{\sum_{i} w_{i}}
∑iwi∑iwiyi
为了解决在高维空间搜索的复杂度较高这一问题,常用的其他方法有:线性扫描(Linear scan)、Kd-Tree、局部哈希敏感(Locality-Sensitive Hashing
)等
支持向量机(SVM)
原理
支持向量机的目标使得分类的间隔尽可能大,在下图中,右边的分类器的效果要明显好于左边的分类器。
如何计算间隔:
假设中间那条线的方程为
w
∗
x
+
b
=
0
w*x+b=0
w∗x+b=0,则其上分界线为
w
∗
x
+
b
=
−
1
w*x+b=-1
w∗x+b=−1,则其下分界线为
w
∗
x
+
b
=
1
w*x+b=1
w∗x+b=1。为何会存在这样的两条线
w
∗
x
+
b
=
+
1
/
−
1
w*x+b=+1/-1
w∗x+b=+1/−1,假设中间那条线为
a
∗
x
+
y
=
0
a*x+y=0
a∗x+y=0,上下分界线为
a
∗
x
+
y
=
+
b
/
−
b
a*x+y=+b/-b
a∗x+y=+b/−b,两边同时除以
b
b
b,不难得到
a
′
∗
x
+
b
′
=
+
1
/
−
1
a^{'}*x+b^{'}=+1/-1
a′∗x+b′=+1/−1。根据平行线间的距离距离公式,不难得到,其间隔为
2
∣
∣
w
∣
∣
\frac{2}{||w||}
∣∣w∣∣2
a
r
g
m
a
x
2
∣
∣
w
∣
∣
⟹
a
r
g
m
i
n
1
2
∣
∣
w
∣
∣
2
argmax\frac{2}{||w||}\Longrightarrow argmin\frac{1}{2}||w||^2
argmax∣∣w∣∣2⟹argmin21∣∣w∣∣2
且其约束条件为:
y
i
(
w
∗
x
i
+
b
)
≥
1
y_{i}\left(w*x_i+b\right)\geq1
yi(w∗xi+b)≥1
但在实际情况中,如果严格按照上述的分类方法,可能会存在找不到这样的一个超平面。由于数据中会存在一些噪点,应该采取某些措施容忍这些噪点的存在。
对于上述公式做一些调整如下。
min
w
,
b
,
ξ
i
≥
0
1
2
∥
w
∥
2
+
C
⋅
∑
i
=
1
n
ξ
i
y
i
(
w
⋅
x
i
+
b
)
≥
1
−
ξ
i
\begin{array}{l}{\min _{w, b, \xi_{i} \geq 0} \frac{1}{2}\|w\|^{2}+C \cdot \sum_{i=1}^{n} \xi_{i}} \\ \\{y_{i}\left(w \cdot x_{i}+b\right) \geq 1-\xi_{i}}\end{array}
minw,b,ξi≥021∥w∥2+C⋅∑i=1nξiyi(w⋅xi+b)≥1−ξi
f
(
w
,
b
)
=
1
2
∑
j
=
1
d
(
w
(
j
)
)
2
+
C
∑
i
=
1
n
max
{
0
,
1
−
y
i
(
∑
j
=
1
d
w
(
j
)
x
i
(
j
)
+
b
)
}
f(w, b)=\frac{1}{2} \sum_{j=1}^{d}\left(w^{(j)}\right)^{2}+C \sum_{i=1}^{n} \max \left\{0,1-y_{i}\left(\sum_{j=1}^{d} w^{(j)} x_{i}^{(j)}+b\right)\right\}
f(w,b)=21j=1∑d(w(j))2+Ci=1∑nmax{0,1−yi(j=1∑dw(j)xi(j)+b)}
参数求解可以采用SMO算法或者梯度下降(随机梯度下降)来求解。
若使用梯度下降法,则
∇
f
(
j
)
=
∂
f
(
w
,
b
)
∂
w
(
j
)
=
w
(
j
)
+
C
∑
i
=
1
n
∂
L
(
x
i
,
y
i
)
∂
w
(
j
)
\nabla f^{(j)}=\frac{\partial f(w, b)}{\partial w^{(j)}}=w^{(j)}+C \sum_{i=1}^{n} \frac{\partial L\left(x_{i}, y_{i}\right)}{\partial w^{(j)}}
∇f(j)=∂w(j)∂f(w,b)=w(j)+Ci=1∑n∂w(j)∂L(xi,yi)
∂
L
(
x
i
,
y
i
)
∂
w
(
j
)
=
0
if
y
i
(
w
⋅
x
i
+
b
)
≥
1
=
−
y
i
x
i
(
j
)
else
\begin{aligned} \frac{\partial L\left(x_{i}, y_{i}\right)}{\partial w^{(j)}} &=0 \quad \text { if } y_{i}\left(\mathrm{w} \cdot x_{i}+b\right) \geq 1 \\ &=-y_{i} x_{i}^{(j)} \quad \text { else } \end{aligned}
∂w(j)∂L(xi,yi)=0 if yi(w⋅xi+b)≥1=−yixi(j) else
如何将
S
V
M
SVM
SVM分类算法运用到多分类中,主要有以下两种方法(以A、B、C三类为例):
- 训练三个分类器( A A A VS B C BC BC, B B B VS A C AC AC, C C C VS A B AB AB,在对某个样例进行分类时,某个分类器的值大( arg max c w c x + b c \arg \max _{c} \mathbf{w}_{c} \mathbf{x}+\mathbf{b}_{c} argmaxcwcx+bc, c c c为三个分类器中的某一个)就认为其是那一类
应用(Text categorization)
权重的更新:
w
t
+
1
←
w
t
−
η
t
t
+
t
0
(
w
t
+
C
∂
L
(
x
i
,
y
i
)
∂
w
)
w_{t+1} \leftarrow w_{t}-\frac{\eta_{t}}{t+t_{0}}\left(w_{t}+C \frac{\partial L\left(x_{i}, y_{i}\right)}{\partial w}\right)
wt+1←wt−t+t0ηt(wt+C∂w∂L(xi,yi))
会时刻改变学习速率
η
t
\eta_{t}
ηt及
t
0
t_{0}
t0的值。
在这个例子中遇到的问题是数据过于稀疏,例如,
x
i
=
[
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
5
,
0
,
0
,
0
,
0
,
0
,
0
,
…
]
x_{i}=[0,0,0,1,0,0,0,0,5,0,0,0,0,0,0, \ldots]
xi=[0,0,0,1,0,0,0,0,5,0,0,0,0,0,0,…],存储时,可以将该向量变换成
x
i
=
[
(
4
,
1
)
,
(
9
,
5
)
,
…
]
x_{i}=[(4,1),(9,5), \dots]
xi=[(4,1),(9,5),…],对于稀疏性数据,该如何使用
S
G
D
SGD
SGD方法来求解。
两个更新步骤:
- w ← w − η C ∂ L ( x i , y i ) ∂ w w \leftarrow w-\eta C \frac{\partial L\left(x_{i}, y_{i}\right)}{\partial w} w←w−ηC∂w∂L(xi,yi),由于 x i x_{i} xi是稀疏的,则权重向量 w w w中将有很少的部分会被更新
- w ← w ( 1 − η ) w \leftarrow w(1-\eta) w←w(1−η)
其他参考阅读:
学习SVM,这篇文章就够了!(附详细代码)
SVM实现多分类的三种方案
支持向量机通俗导论(理解SVM的三层境界)