1. 感知机基础
1.1 模型
感知机是最基础的机器学习模型之一,它的类别为:
- 分类(√)、回归、标注
- 概率软分类(√)、非概率硬分类
- 监督(√)、无监督、强化
- 线性(√)、非线性
- 判别(√)、生成
模型定义:
输入空间 X ⊆ R n X\subseteq\R ^n X⊆Rn,输出空间 Y = { + 1 , − 1 } Y=\left\{ +1,-1\right\} Y={+1,−1},定义由输入空间到输出空间的函数映射为:
f ( x ) = s i g n ( ω ⋅ x + b ) f(x)=\mathrm{sign}(\omega \cdot x+b) f(x)=sign(ω⋅x+b)
该模型称为感知机。其中 ω , b \omega,b ω,b为感知机参数, ω ∈ R n \omega \in \R ^n ω∈Rn称为权值, b ∈ R b\in\R b∈R称为偏置, s i g n \mathrm{sign} sign为符号函数,即:
s i g n ( x ) = { + 1 , x ≥ 0 − 1 , x < 0 \mathrm{sign}(x)= \left\{ \begin{aligned} &+1, \quad x\geq 0 \\ &-1, \quad x<0 \end{aligned} \right. sign(x)={+1,x≥0−1,x<0
该模型本质上是在输入空间定义了一个分离超平面:
ω
⋅
x
+
b
=
0
\omega\cdot x+b=0
ω⋅x+b=0,
ω
\omega
ω为该超平面的法向量,
b
b
b为该超平面的截距。该超平面将输入空间划分为两部分,位于两侧的点(输入数据)分别属于正负两类。
给定一个线性可分的训练样本集,通过寻找合适的
ω
\omega
ω和
b
b
b使得训练样本集的数据被正确划分到超平面的两侧,该过程即感知机模型的训练过程。
这里有一个前提“训练样本集线性可分”,即对于训练样本集:
T
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
,
⋯
,
(
x
N
,
y
N
)
}
T=\lbrace(x_1,y_1),(x_2,y_2,\cdots,(x_N,y_N)\rbrace
T={(x1,y1),(x2,y2,⋯,(xN,yN)},其中,
x
i
∈
X
=
R
n
,
y
i
∈
Y
=
{
+
1
,
−
1
}
,
i
=
1
,
2
,
⋯
,
N
x_i\in X=\R ^n,y_i\in Y=\lbrace+1,-1\rbrace,i=1,2,\cdots,N
xi∈X=Rn,yi∈Y={+1,−1},i=1,2,⋯,N,若存在某超平面
S
:
ω
⋅
x
+
b
=
0
S:\omega\cdot x+b=0
S:ω⋅x+b=0,使得
∀
(
x
i
,
y
i
)
∈
T
:
y
i
(
ω
⋅
x
i
+
b
)
>
0
\forall(x_i,y_i)\in T:y_i(\omega\cdot x_i+b)>0
∀(xi,yi)∈T:yi(ω⋅xi+b)>0,则称
T
T
T为线性可分数据集。
1.2 函数间隔与训练策略
为了寻找能正确划分训练样本集的超平面,需要定义损失函数,并将损失函数极小化。如何度量损失呢?如下图所示,有A、B、C三点,表示三个样本,都在分离超平面的正侧,距离分离超平面的距离依次减小。距离越远,预测为正类的确信度越大,反之则不那么确信。
在超平面
ω
⋅
x
+
b
=
0
\omega\cdot x+b=0
ω⋅x+b=0确定的情况下,
∣
ω
⋅
x
+
b
∣
|\omega\cdot x+b|
∣ω⋅x+b∣能够相对地表示点
x
x
x距离超平面的远近,而
ω
⋅
x
+
b
\omega\cdot x+b
ω⋅x+b的符号与类标记
y
y
y的符号是否一致能够表示分类是否正确。所以可以用
y
(
ω
⋅
x
+
b
)
y(\omega\cdot x+b)
y(ω⋅x+b)来表示分类的正确性与确信度,这就是函数间隔(functional margin)的概念。
设
M
M
M为
T
T
T上被超平面
S
S
S误分类的所有点的集合,则
∀
(
x
i
,
y
i
)
∈
M
:
y
i
(
ω
⋅
x
i
+
b
)
<
0
\forall (x_i,y_i) \in M:y_i(\omega\cdot x_i+b)<0
∀(xi,yi)∈M:yi(ω⋅xi+b)<0
按照机器学习约定俗成的惯例,损失函数为正,对损失函数求极小值。因此,我们将感知机的损失函数定义为
T
T
T上所有被误分类的点到超平面
S
S
S的函数间隔的绝对值,即:
−
∑
x
i
∈
M
y
i
(
ω
⋅
x
i
+
b
)
-\sum_{x_i\in M}{y_i(\omega\cdot x_i+b)}
−xi∈M∑yi(ω⋅xi+b)
感知机的学习策略是在假设空间中选取使上式最小的分离超平面系数
ω
\omega
ω和
b
b
b。
1.3 学习算法
感知机的学习问题可转化为求解使损失函数最小的最优化问题,即求参数
ω
,
b
\omega,b
ω,b,使其为以下极小化问题的解。
min
ω
,
b
L
(
ω
,
b
)
=
−
∑
x
i
∈
M
y
i
(
ω
⋅
x
i
+
b
)
\min_{\omega,b}L(\omega,b)=-\sum_{x_i\in M}{y_i(\omega\cdot x_i+b)}
ω,bminL(ω,b)=−xi∈M∑yi(ω⋅xi+b)
其中,M为误分类点的集合。求解该问题可使用梯度下降算法。
损失函数
L
(
ω
,
b
)
L(\omega,b)
L(ω,b)的梯度为:
Δ
ω
L
(
ω
,
b
)
=
−
∑
x
i
∈
M
y
i
x
i
Δ
b
L
(
ω
,
b
)
=
−
∑
x
i
∈
M
y
i
\begin{aligned} \Delta _{\omega} L(\omega,b) &=-\sum_{x_i\in M}{y_ix_i} \\ \Delta _{b} L(\omega,b) &=-\sum_{x_i\in M}{y_i} \end{aligned}
ΔωL(ω,b)ΔbL(ω,b)=−xi∈M∑yixi=−xi∈M∑yi
如果样本集非常大,梯度下降算法每轮迭代都要计算全局梯度,这需要耗费非常大的计算资源,实际应用中通常使用随机梯度下降算法代替,即每次随机选取一个误分类点
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi),对
ω
,
b
\omega,b
ω,b沿梯度负方向更新。
ω
←
ω
+
η
y
i
x
i
b
←
b
+
η
y
i
\begin{aligned} \omega \leftarrow & \omega +\eta y_ix_i \\ b\leftarrow & b+\eta y_i \end{aligned}
ω←b←ω+ηyixib+ηyi
其中
η
(
0
<
η
≤
1
)
\eta(0<\eta\leq 1)
η(0<η≤1)为步长,又叫做学习率。随机梯度的期望为全局梯度,因此其收敛性与梯度下降算法一致。通过不断迭代以上步骤,可以期待损失函数
L
(
ω
,
b
)
L(\omega,b)
L(ω,b)不断减小,直到为0.
该算法的直观理解为:当一个实例点被误分类,调整
ω
,
b
\omega,b
ω,b的值,使分离超平面向该误分类点移动,减小该误分类点与超平面的距离,直至超平面越过该点,使其被正确分类。
该算法在训练开始时需要选取一个初始分类超平面
(
ω
0
,
b
0
)
(\omega_0,b_0)
(ω0,b0),经过
k
k
k轮迭代后:
ω
k
=
ω
0
+
η
∑
i
=
1
k
−
1
y
i
x
i
b
k
=
b
0
+
η
∑
i
=
1
k
−
1
y
i
\begin{aligned} \omega _k &= \omega _0+\eta \sum_{i=1}^{k-1}{y_ix_i} \\ b_k &=b_0+\eta \sum_{i=1}^{k-1}{y_i} \end{aligned}
ωkbk=ω0+ηi=1∑k−1yixi=b0+ηi=1∑k−1yi
其中,
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi)为第
i
i
i轮迭代时随机选取的误分类点。当
(
ω
0
,
b
0
)
=
0
(\omega_0,b_0)=0
(ω0,b0)=0时,第
k
k
k轮迭代时的超平面方程为:
ω
k
x
+
b
k
=
0
⇒
η
∑
i
=
1
k
−
1
y
i
x
i
x
+
η
∑
i
=
1
k
−
1
y
i
=
0
⇒
∑
i
=
1
k
−
1
y
i
x
i
x
+
∑
i
=
1
k
−
1
y
i
=
0
(1)
\begin{aligned} &\quad\omega _k x+b_k=0 \\ \Rightarrow &\quad \eta\sum_{i=1}^{k-1}{y_ix_i}x+\eta \sum_{i=1}^{k-1}{y_i}=0 \\ \Rightarrow &\quad \sum_{i=1}^{k-1}{y_ix_i}x+\sum_{i=1}^{k-1}{y_i}=0 \end{aligned} \tag{1}
⇒⇒ωkx+bk=0ηi=1∑k−1yixix+ηi=1∑k−1yi=0i=1∑k−1yixix+i=1∑k−1yi=0(1)
可以看出,学习速率
η
\eta
η可以被约去,说明当
(
ω
0
,
b
0
)
=
0
(\omega_0,b_0)=0
(ω0,b0)=0时,算法收敛速度与
η
\eta
η无关。下面证明感知机训练算法收敛性,证明过程可进一步验证该结论。
2. 算法收敛性证明
证明感知机训练算法是收敛的,即证明训练过程可在有限轮迭代内完成,即迭代次数
k
k
k存在一个上界。
为了便于叙述,将偏置
b
b
b并入权重向量
ω
\omega
ω,记作
ω
^
=
(
ω
T
,
b
)
\hat{\omega}=(\omega^T,b)
ω^=(ωT,b),同时对输入向量
x
x
x进行扩充,记作
x
^
=
(
x
T
,
1
)
\hat{x}=(x^T,1)
x^=(xT,1),显然
ω
^
⋅
x
^
=
ω
⋅
x
+
b
\hat{\omega}\cdot \hat{x}=\omega\cdot x+b
ω^⋅x^=ω⋅x+b。
Novikoff定理:
设训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 , ⋯ , ( x N , y N ) } T=\lbrace(x_1,y_1),(x_2,y_2,\cdots,(x_N,y_N)\rbrace T={(x1,y1),(x2,y2,⋯,(xN,yN)}是线性可分的,其中, x i ∈ X = R n , y i ∈ Y = { + 1 , − 1 } , i = 1 , 2 , ⋯ , N x_i\in X=\R ^n,y_i\in Y=\lbrace+1,-1\rbrace,i=1,2,\cdots,N xi∈X=Rn,yi∈Y={+1,−1},i=1,2,⋯,N,令 R = max 1 ≤ i ≤ N ∣ ∣ x ^ i ∣ ∣ R=\max_{1\leq i\leq N}{||\hat{x}_i||} R=max1≤i≤N∣∣x^i∣∣,则感知机学习算法在训练数据集上的误分类次数 k k k满足不等式:
k ≤ ( R γ ) 2 ∥ ω ^ o p t ∥ 2 k\leq\left(\frac{R}{\gamma}\right)^2\Vert\hat{\omega}_{opt}\Vert^2 k≤(γR)2∥ω^opt∥2
其中 ω ^ o p t \hat{\omega}_{opt} ω^opt为该训练数据集的任一分离超平面的扩展系数向量。
证明:
训练数据集线性可分,则存在能将数据集完全正确分开的分离超平面,对任一满足要求的分离超平面
ω
^
o
p
t
⋅
x
^
=
0
\hat{\omega}_{opt}\cdot\hat{x}=0
ω^opt⋅x^=0,存在
γ
>
0
\gamma>0
γ>0,对所有
i
=
1
,
2
,
⋯
,
N
i=1,2,\cdots,N
i=1,2,⋯,N:
y
i
(
ω
^
o
p
t
⋅
x
^
i
)
≥
γ
(2)
y_i(\hat{\omega}_{opt}\cdot \hat{x}_i)\geq\gamma \tag{2}
yi(ω^opt⋅x^i)≥γ(2)
初始时,
ω
^
0
=
0
\hat{\omega}_0=0
ω^0=0,随机选取某样本,若被误分类,则更新权重。令
ω
^
k
−
1
\hat{\omega}_{k-1}
ω^k−1是第
k
k
k次迭代时的扩充权重向量,此次迭代随机选择的第
k
k
k个误分类样本满足条件:
y
i
(
ω
^
k
−
1
⋅
x
^
i
)
≤
0
(3)
y_i(\hat{\omega}_{k-1}\cdot\hat{x}_i)\leq 0 \tag{3}
yi(ω^k−1⋅x^i)≤0(3)
迭代时进行如下更新:
ω
^
k
=
ω
^
k
−
1
+
η
y
i
x
^
i
(4)
\hat{\omega}_k=\hat{\omega}_{k-1}+\eta y_i\hat{x}_i \tag{4}
ω^k=ω^k−1+ηyix^i(4)
联合(2)(4)式,有:
ω
^
k
⋅
ω
^
o
p
t
=
ω
^
k
−
1
⋅
ω
^
o
p
t
+
η
y
i
x
^
i
⋅
ω
^
o
p
t
≥
ω
^
k
−
1
⋅
ω
^
o
p
t
+
η
γ
≥
ω
^
k
−
2
⋅
ω
^
o
p
t
+
2
η
γ
⋯
≥
k
η
γ
(5)
\begin{aligned} \hat{\omega}_k\cdot\hat{\omega}_{opt} &=\hat{\omega}_{k-1}\cdot\hat{\omega}_{opt}+\eta y_i\hat{x}_i\cdot\hat{\omega}_{opt} \\ &\geq \hat{\omega}_{k-1}\cdot\hat{\omega}_{opt}+\eta \gamma \\ &\geq \hat{\omega}_{k-2}\cdot\hat{\omega}_{opt}+2\eta \gamma \\ &\cdots \\ &\geq k\eta \gamma \end{aligned} \tag{5}
ω^k⋅ω^opt=ω^k−1⋅ω^opt+ηyix^i⋅ω^opt≥ω^k−1⋅ω^opt+ηγ≥ω^k−2⋅ω^opt+2ηγ⋯≥kηγ(5)
联合(3)(4)式,有:
∥
ω
^
k
∥
2
=
∥
ω
^
k
−
1
+
η
y
i
x
^
i
∥
2
=
∥
ω
^
k
−
1
∥
2
+
2
η
y
i
ω
^
k
−
1
⋅
x
^
i
+
η
2
x
^
i
2
≤
∥
ω
^
k
−
1
∥
2
+
η
2
x
^
i
2
≤
∥
ω
^
k
−
1
∥
2
+
η
2
R
2
≤
∥
ω
^
k
−
2
∥
2
+
2
η
2
R
2
⋯
≤
k
η
2
R
2
(6)
\begin{aligned} \Vert\hat{\omega}_k\Vert^2&=\Vert\hat{\omega}_{k-1}+\eta y_i\hat{x}_i \Vert^2 \\ &=\Vert\hat{\omega}_{k-1}\Vert^2+2\eta y_i\hat{\omega}_{k-1}\cdot\hat{x}_i+\eta^2\hat{x}_i^2 \\ &\leq\Vert\hat{\omega}_{k-1}\Vert^2+\eta^2\hat{x}_i^2 \\ &\leq\Vert\hat{\omega}_{k-1}\Vert^2+\eta^2R^2 \\ &\leq\Vert\hat{\omega}_{k-2}\Vert^2+2\eta^2R^2 \\ &\cdots \\ &\leq k\eta^2R^2 \end{aligned} \tag{6}
∥ω^k∥2=∥ω^k−1+ηyix^i∥2=∥ω^k−1∥2+2ηyiω^k−1⋅x^i+η2x^i2≤∥ω^k−1∥2+η2x^i2≤∥ω^k−1∥2+η2R2≤∥ω^k−2∥2+2η2R2⋯≤kη2R2(6)
联合(5)(6)式,有:
k
η
γ
≤
ω
^
k
⋅
ω
^
o
p
t
≤
∥
ω
^
k
∥
∥
ω
^
o
p
t
∥
≤
k
η
R
∥
ω
^
o
p
t
∥
⇒
k
2
γ
2
≤
k
R
2
∥
ω
^
o
p
t
∥
2
⇒
k
≤
(
R
γ
)
2
∥
ω
^
o
p
t
∥
2
(7)
\begin{aligned} &k\eta \gamma \leq\hat{\omega}_k\cdot\hat{\omega}_{opt}\leq\Vert\hat{\omega}_k\Vert\Vert\hat{\omega}_{opt}\Vert\leq\sqrt{k}\eta R\Vert\hat{\omega}_{opt}\Vert \\ \Rightarrow &k^2\gamma ^2\leq kR^2 \Vert\hat{\omega}_{opt}\Vert^2 \\ \Rightarrow &k\leq\left(\frac{R}{\gamma}\right)^2\Vert\hat{\omega}_{opt}\Vert^2 \end{aligned} \tag{7}
⇒⇒kηγ≤ω^k⋅ω^opt≤∥ω^k∥∥ω^opt∥≤kηR∥ω^opt∥k2γ2≤kR2∥ω^opt∥2k≤(γR)2∥ω^opt∥2(7)
定理得证。
从(7)式可知,迭代次数
k
k
k存在上界,这说明当训练数据集线性可分时,感知机学习算法是收敛的。
进一步地,通过调整
η
\eta
η可以改变
∥
ω
^
o
p
t
∥
2
\Vert\hat{\omega}_{opt}\Vert^2
∥ω^opt∥2的取值。算法经过
k
k
k次迭代结束后得到分离超平面
ω
^
o
p
t
x
^
=
0
\hat{\omega}_{opt}\hat{x}=0
ω^optx^=0,由(1)式可知,
ω
^
o
p
t
=
η
∑
i
=
1
k
y
i
x
i
\hat{\omega}_{opt}=\eta\sum_{i=1}^{k}{y_ix_i}
ω^opt=η∑i=1kyixi,令
η
=
1
∥
∑
i
=
1
k
y
i
x
i
∥
\eta=\frac{1}{\Vert\sum_{i=1}^{k}{y_ix_i}\Vert}
η=∥∑i=1kyixi∥1,则可使得
∥
ω
^
o
p
t
∥
=
1
\Vert\hat{\omega}_{opt}\Vert=1
∥ω^opt∥=1,从而得到感知机迭代次数收敛上界的精简形式:
k
≤
(
R
γ
)
2
k\leq\left(\frac{R}{\gamma}\right)^2
k≤(γR)2
3. 附录
from sklearn.datasets import make_blobs
from matplotlib import pyplot as plt
import numpy as np
import random
X,Y=make_blobs(n_samples=100,
n_features=2,
centers=2,
cluster_std=2.5,
random_state=1)
Y[Y==0]=-1
fig=plt.figure(figsize=(7,5))
ax=fig.add_subplot(111)
plt.show()
ax.scatter(X[:,0],X[:,1],c=Y, s=5, cmap='rainbow')
w=np.zeros(2)
b=0
eta=0.1
watcher=True
i=0
while(watcher):
watcher=False
for k in range(100):
xk=X[k]
yk=Y[k]
if yk*(np.dot(w,xk)+b)>0:
continue
w=w+eta*yk*xk
b=b+eta*yk
i+=1
print('第%d个误分类样本,w=%s,b=%s'%(i,w,b))
watcher=True
x1=np.arange(-7.5,1,0.01)
x2=-(w[0]*x1+b)/w[1]
ax.plot(x1,x2)
plt.pause(0.01)