1. 感知机概述
感知机(perceptron)
是二分类的线性分类模型,属于监督学习算法。输入为实例的特征向量,输出为实例的类别(取+1和-1)。感知机旨在求出将输入空间中的实例划分为两类的分离超平面。为求得超平面,感知机导入了基于误分类的损失函数,利用梯度下降法对损失函数进行最优化求解。
如果训练数据集是线性可分的,则感知机一定能求得分离超平面。如果是非线性可分的数据,则无法获得超平面。
感知机具有简单而易于实现的优点,分为原始形式
和对偶形式
。感知机预测是用学习得到的感知机模型对新的实例进行预测的,因此属于判别模型。感知机是神经网络和支持向量机的基础。
2. 感知机模型
假设训练数据集为
D
=
{
(
x
i
,
y
i
)
}
i
=
1
m
D=\left\{\left(x_i, y_i\right)\right\}_{i=1}^m
D={(xi,yi)}i=1m ,其中,
x
i
∈
X
⊆
R
n
,
y
i
∈
Y
=
{
+
1
,
−
1
}
x_i \in \mathbf{X} \subseteq \mathbf{R}^n , y_i \in \mathbf{Y}=\{+1,-1\}
xi∈X⊆Rn,yi∈Y={+1,−1} 。
感知机模型为:
f
(
x
)
=
sign
(
w
⋅
x
+
b
)
(1)
\tag{1} f(x)=\operatorname{sign}(w \cdot x+b)
f(x)=sign(w⋅x+b)(1)
其中,
w
w
w 和
b
b
b 称为感知机模型参数,
w
∈
R
n
w \in R^n
w∈Rn 叫做权值或者权值向量,
b
∈
R
b \in R
b∈R 叫做偏置。
w
⋅
x
w \cdot x
w⋅x 表示
w
w
w 和
x
x
x 的内积。sign函数是符号函 数:
sign
(
x
)
=
{
+
1
,
x
≥
0
−
1
,
x
<
0
(2)
\tag{2} \operatorname{sign}(x)= \begin{cases}+1, & x \geq 0 \\ -1, & x<0\end{cases}
sign(x)={+1,−1,x≥0x<0(2)
感知机模型的其中一个超平面是:
w
⋅
x
+
b
=
0
(3)
\tag{3} w \cdot x+b=0
w⋅x+b=0(3)
其中
w
w
w 是超平面的法向量,
b
b
b 是超平面的截距。这个超平面将样本点分为正负两类。即对所有
y
i
=
+
1
y_i=+1
yi=+1 的样本,都有
w
⋅
x
i
+
b
>
0
w \cdot x_i+b>0
w⋅xi+b>0 时;对所有
y
i
=
−
1
y_i=-1
yi=−1 的样本,都有
w
⋅
x
i
+
b
<
0
w \cdot x_i+b<0
w⋅xi+b<0 。
3. 感知机损失函数
假设训练数据集是线性可分的,为了找出一个能够将训练数据集正实例点和负实例点完全正确分开的超平面,即确定感知机模型参数
w
、
b
w 、 b
w、b ,需要确定一个学习策略,即定义 (经验) 损失函数,并将损失函数极小化。
损失函数的一个自然选择是误分类点的总数,但是这样的函数不是连续可导函数,不易优化。因此感知机采用的损失函数是误分类点到超平面的总距离
。
假设直线方程为
A
x
+
B
y
+
C
=
0
A x+B y+C=0
Ax+By+C=0 ,点
P
P
P 的坐标为
(
x
0
,
y
0
)
(x_0, y_0)
(x0,y0) 。点到直线的距离公式为:
d
=
A
x
0
+
B
y
0
+
C
A
2
+
B
2
d=\frac{A x_0+B y_0+C}{\sqrt{A^2+B^2}}
d=A2+B2Ax0+By0+C
我们假设超平面是
h
=
w
⋅
x
+
b
h=w \cdot x+b
h=w⋅x+b ,样本点
x
′
x^{\prime}
x′ 到超平面的距离如下:
d
=
w
⋅
x
′
+
b
∥
w
∥
d=\frac{w \cdot x^{\prime}+b}{\|w\|}
d=∥w∥w⋅x′+b
任意一个样本点
x
i
x_i
xi 到超平面
S
S
S 的距离为:
∣
w
⋅
x
i
+
b
∣
∥
w
∥
\frac{\left|w \cdot x_i+b\right|}{\|w\|}
∥w∥∣w⋅xi+b∣
这里
∥
w
∥
\|w\|
∥w∥ 是
w
w
w 的
L
2
L_2
L2 范数(平方和开根号)。
对于误分类的数据
(
x
i
,
y
i
)
\left(x_i, y_i\right)
(xi,yi) 来说,
−
y
i
(
w
⋅
x
i
+
b
)
=
∣
w
⋅
x
i
+
b
∣
>
0
-y_i\left(w\cdot x_i+b\right)=\left|w \cdot x_i+b\right|>0
−yi(w⋅xi+b)=∣w⋅xi+b∣>0
误分类:原本 y i = 1 y_i=1 yi=1,实际输出 y i = − 1 y_i=-1 yi=−1,即 ( w ⋅ x i + b ) (w \cdot x_i+b) (w⋅xi+b)与实际 y i y_i yi异号,故 − y i ( w ⋅ x i + b ) > 0 -y_i\left(w\cdot x_i+b\right)>0 −yi(w⋅xi+b)>0
因此,误分类点
x
i
x_i
xi 到超平面
S
S
S 的距离是:
−
1
∥
w
∥
y
i
(
w
⋅
x
i
+
b
)
-\frac{1}{\|w\|} y_i\left(w \cdot x_i+b\right)
−∥w∥1yi(w⋅xi+b)
假设超平面
S
S
S 的误分类点集合为
M
M
M ,那么所有误分类点到超平面
S
S
S 的总距离为:
−
1
∥
w
∥
∑
x
i
∈
M
y
i
(
w
⋅
x
i
+
b
)
-\frac{1}{\|w\|} \sum_{x_i \in M} y_i\left(w \cdot x_i+b\right)
−∥w∥1xi∈M∑yi(w⋅xi+b)
不考虑
1
∥
w
∥
\frac{1}{\| w \|}
∥w∥1 ,就得到感知机学习的损失函数:
L
(
w
,
b
)
=
−
∑
x
i
∈
M
y
i
(
w
⋅
x
i
+
b
)
L(w, b)=-\sum_{x_i \in M} y_i\left(w \cdot x_i+b\right)
L(w,b)=−xi∈M∑yi(w⋅xi+b)
这个损失函数就是感知机学习的经验风险函数。
为什么可不考虑 1 ∣ w ∣ ? \frac{1}{|w|} ? ∣w∣1?
这是因为,偏置 b b b 可以定义为 b = w 0 x 0 b=w_0 x_0 b=w0x0 ,其中 x 0 = 1 x_0=1 x0=1 ,将 b b b 吸收进 w w w 里面。这样我们再来看总距离就变成了 − 1 ∥ w ∥ ∑ x i ∈ M y i w ⋅ x i -\frac{1}{\|w\|} \sum_{x_i \in M} y_i w \cdot x_i −∥w∥1∑xi∈Myiw⋅xi
分子和分母都含有 w w w, 当分子的 w w w 扩大 N \mathrm{N} N 倍时,分母的 L \mathrm{L} L 范数也佘扩大 N \mathrm{N} N 倍。也就是说,分子和分母有固定的倍数关系。那么我们 可以固定分子或者分母为 1 ,然后求分母的倒数或者分子自己的最小化作为损失函数,这样可以简化我们的损失函数。在感知机模型 中,我们采用的是保留分子。
4. 感知机学习算法
4.1原始形式
感知机学习问题就转化为了求解损失函数的最优化问题。
由于感知机学习算法是误分类驱动的,这里基于随机梯度下降法 (SGD) 进行优化求解。即任意选取一个超平面 w 0 w_0 w0, b 0 b_0 b0 ,然后用梯度下降法不断地极小化损失函数。极小化过程中不是一次使 M M M 中的所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降。
这里不能使用基于所有样本的批量梯度下降 (BGD) 进行优化。这是因为我们的损失函数里面有限定,只有误分类的 M M M集合里面的样本才能参与损失函数的优化。所以我们不能用最普通的批量梯度下降,只能采用随机梯度下降 (SGD) 或者小批量梯度下降 (MBGD)。
损失函数
L
(
w
,
b
)
L(w, b)
L(w,b) 的梯度为:
∇
w
L
(
w
,
b
)
=
−
∑
x
i
∈
M
y
i
x
i
∇
b
L
(
w
,
b
)
=
−
∑
x
i
∈
M
y
i
\begin{gathered} \nabla_w L(w, b)=-\sum_{x_i \in M} y_i x_i \\ \nabla_b L(w, b)=-\sum_{x_i \in M} y_i \end{gathered}
∇wL(w,b)=−xi∈M∑yixi∇bL(w,b)=−xi∈M∑yi
梯度下降
w
,
b
w,b
w,b调整
w
←
w
+
η
∂
L
(
w
,
b
)
∂
w
b
←
b
+
η
∂
L
(
w
,
b
)
∂
b
w \leftarrow w+\eta \frac{\partial{L(w,b)}}{\partial{w}}\\ b \leftarrow b+\eta \frac{\partial{L(w,b)}}{\partial{b}}
w←w+η∂w∂L(w,b)b←b+η∂b∂L(w,b)
随机选取一个误分类点
(
x
i
,
y
i
)
,
\left(x_i, y_i\right) ,
(xi,yi), 对
w
,
b
w , b
w,b 进行更新:
w
←
w
+
η
y
i
x
i
b
←
b
+
η
y
i
\begin{gather*} w \leftarrow w+\eta y_i x_i\\ b \leftarrow b+\eta y_i \end{gather*}
w←w+ηyixib←b+ηyi
4.2 感知机原始形式算法描述
输入: 训练数据集
D
=
{
(
x
i
,
y
i
)
}
i
=
1
m
D=\left\{\left(x_i, y_i\right)\right\}_{i=1}^m
D={(xi,yi)}i=1m ,其中,
x
i
∈
X
⊆
R
n
,
y
i
∈
Y
=
{
+
1
,
−
1
}
x_i \in \mathbf{X} \subseteq \mathbf{R}^n , y_i \in \mathbf{Y}=\{+1,-1\}
xi∈X⊆Rn,yi∈Y={+1,−1} ;学习率
η
(
0
<
η
≤
1
)
\eta(0<\eta \leq 1)
η(0<η≤1) 。 过程:
(1) 选取初值
w
0
,
b
0
w_0 , b_0
w0,b0 ;
(2) 在训练数据集中选取数据
(
x
i
,
y
i
)
\left(x_i, y_i\right)
(xi,yi) ;
(3) 判断该数据点是否为当前模型的误分类点,即判断
y
i
(
w
⋅
x
i
+
b
)
≤
0
y_i\left(w \cdot x_i+b\right) \leq 0
yi(w⋅xi+b)≤0 ,如果恒成立则是误分类点,进行更新:
w
←
w
+
η
y
i
x
i
b
←
b
+
η
y
i
\begin{gather*} w \leftarrow w+\eta y_i x_i\\ b \leftarrow b+\eta y_i \end{gather*}
w←w+ηyixib←b+ηyi
(4)转到第 (2) 步,直到训练集中没有误分类点。
输出:
w
、
b
w 、 b
w、b ;感知机模型
f
(
x
)
=
sign
(
w
⋅
x
+
b
)
f(x)=\operatorname{sign}(w \cdot x+b)
f(x)=sign(w⋅x+b) 。
感知机学习算法由于采用不同的初值或选取不同的误分类点,解可以不同。
4.3 对偶形式
对偶形式是对算法执行速度的优化。
每次梯度的迭代都是选择的一个样本来更新
w
w
w 和
b
b
b 向量。最终经过若干次的迭代得到最终的结果。对于从来都没有误分类过的样本, 它选择参与
w
w
w 和
b
b
b 迭代修改的次数是 0 ,对于被多次误分类而更新的样本
i
i
i,它参与
w
w
w 和
b
b
b 迭代修改的次数假设为
n
i
n_i
ni 。 以分别表示为:
w
=
∑
x
i
∈
M
η
y
i
x
i
=
∑
i
=
1
n
α
i
y
i
x
i
b
=
∑
x
i
∈
M
η
y
i
=
∑
i
=
1
n
α
i
y
i
w=\sum_{x_i \in M} \eta y_i x_i=\sum_{i=1}^n \alpha_i y_i x_i\\ b=\sum_{x_i \in M} \eta y_i=\sum_{i=1}^n \alpha_i y_i
w=xi∈M∑ηyixi=i=1∑nαiyixib=xi∈M∑ηyi=i=1∑nαiyi
其中
α
i
=
n
i
η
\alpha_i=n_i\eta
αi=niη,这样的话,在每一步判断误分类条件的地方,我们用
y
i
(
w
⋅
x
i
+
b
)
≤
0
y_i\left(w \cdot x_i+b\right) \leq 0
yi(w⋅xi+b)≤0 的变种
y
i
(
∑
j
=
1
n
α
j
y
j
x
j
⋅
x
i
+
b
)
≤
0
y_i\left(\sum_{j=1}^n \alpha_j y_j x_j \cdot x_i+b\right) \leq 0
yi(∑j=1nαjyjxj⋅xi+b)≤0 来判断误分类。
这个判断误分类的形式里面是计算两个样本
x
i
x_i
xi 和
x
j
x_j
xj 的内积,而且这个内积计算的结果在下面的迭代次数中可以重用。如果我们事先用矩阵运算计算出所有的样本之间的内积,那么在算法运行时,仅仅一次的矩阵内积运算比多次的循环计算省时。计算量最大的判断误分类这儿 就省下了很多的时间,这也是对偶形式的感知机模型比原始形式优的原因。
对偶形式中训练实例仅以内积的形式出现,为了减少计算量,我们可以预先将训练集样本间的内积计算出来,也就是
G
r
a
m
Gram
Gram矩阵:
G
=
[
x
i
,
x
j
]
m
×
m
G=\left[x_i, x_j\right]_{m \times m}
G=[xi,xj]m×m
4.4 感知机原始形式算法描述
输入: 训练数据集
D
=
{
(
x
i
,
y
i
)
}
i
=
1
m
D=\left\{\left(x_i, y_i\right)\right\}_{i=1}^m
D={(xi,yi)}i=1m ,其中,
x
i
∈
X
⊆
R
n
,
y
i
∈
Y
=
{
+
1
,
−
1
}
x_i \in \mathbf{X} \subseteq \mathbf{R}^n , y_i \in \mathbf{Y}=\{+1,-1\}
xi∈X⊆Rn,yi∈Y={+1,−1} ;学习率
η
(
0
<
η
≤
1
)
\eta(0<\eta \leq 1)
η(0<η≤1) 。
过程:
(1) 选取初值
α
=
0
,
b
=
0
\alpha=0 , b=0
α=0,b=0 ;
(2) 在训练数据集中选取数据
(
x
i
,
y
i
)
\left(x_i, y_i\right)
(xi,yi) ;
(3) 判断该数据点是否为当前模型的误分类点,即判断
y
i
(
∑
j
=
1
n
α
j
y
j
x
j
⋅
x
i
+
b
)
≤
0
y_i\left(\sum_{j=1}^n \alpha_j y_j x_j \cdot x_i+b\right) \leq 0
yi(∑j=1nαjyjxj⋅xi+b)≤0 ,如果不等式成立则是误分类点,进行更新:
α
i
=
α
i
+
η
b
=
b
+
η
y
i
\alpha_i=\alpha_i+\eta\\ b=b+\eta y_i
αi=αi+ηb=b+ηyi
(4) 转到第 (2) 步,直到训练集中没有误分类点。
输出:
α
、
b
\alpha 、 b
α、b ;感知机模型
f
(
x
)
=
sign
(
∑
j
=
1
n
α
j
y
j
x
j
⋅
x
+
b
)
f(x)=\operatorname{sign}\left(\sum_{j=1}^n \alpha_j y_j x_j \cdot x+b\right)
f(x)=sign(∑j=1nαjyjxj⋅x+b) 。
4.5
4.5
4.5 原始形式和对偶形式的选择
- 如果特征数过高,计算内积非常耗时,应选择对偶形式算法加速。
- 如果样本数过多,每次计算細计和就没有必要,应选择原始算法。