1 模型的基本描述
感知机模型是二类分类的线性分类模型,是神经网络和支持向量机的基础,有原始形式和对偶形式两种,最终目的是求出将训练数据进行线性划分的分离超平面。它的输出只有正类+1和负类-1两种类别,用的是基于误分类的损失函数,利用梯度下降法对损失函数进行极小化,从而求得感知机模型:
f
(
x
)
=
s
i
g
n
(
w
•
x
+
b
)
=
{
+
1
,
w
•
x
+
b
⩾
0
−
1
,
w
•
x
+
b
<
0
f(x)=sign(w•x+b)=\left\{ \begin{aligned} +1 & , & w•x+b\geqslant0 \\ -1 & , & w•x+b<0 \end{aligned} \right.
f(x)=sign(w•x+b)={+1−1,,w•x+b⩾0w•x+b<0
w•x+b=0对应着一个超平面S,S把所有的样本分成正负两类,求感知机模型相当于求超平面S的参数w和b。
其中,b为超平面的截距,w为超平面的法向量,维度与x的维度保持一致,比如x={x(1),x(2),x(3)},那么w={w1,w2,w3}。w•x不是两个数值简单相乘,而是两个向量的内积,最终函数 f(x) = w•x+b = w1x(1)+w2x(2)+w3x(3)+b。
2 感知机的学习策略
- 确定一个学习策略,定义损失函数并极小化损失函数,损失函数通常是误分类点(就是分错的点)到超平面S的总距离。
- 推导感知机的损失函数:
首先,我们学过初中数学,点(x0,y0,z0)到超平面Ax+By+Cz+D=0的距离为:
∣ A x 0 + B y 0 + C z 0 + D ∣ A 2 + B 2 + C 2 \frac{|Ax_0+By_0+Cz_0+D|}{\sqrt{A^2+B^2+C^2}} A2+B2+C2∣Ax0+By0+Cz0+D∣
这里面的A,B,C相当于w1,w2,w3,x0,y0,z0相当于x(1),x(2),x(3),D相当于b,那么样本点到超平面S的距离为:
∣ w 1 x ( 1 ) + w 2 x ( 2 ) + w 3 x ( 3 ) + b ∣ w 1 2 + w 2 2 + w 3 2 \frac{|w_1x^{(1)}+w_2x^{(2)}+w_3x^{(3)}+b|}{\sqrt{w_1^2+w_2^2+w_3^2}} w12+w22+w32∣w1x(1)+w2x(2)+w3x(3)+b∣
以上是三维空间的计算,推广到n维,点(x(1),x(2),…,x(n))到超平面S = w1x(1)+w2x(2)+,…,+wnx(n)+b的距离为:
∣ w 1 x ( 1 ) + w 2 x ( 2 ) + . . . + w n x ( n ) + b ∣ w 1 2 + w 2 2 + . . . + w n 2 \frac{|w_1x^{(1)}+w_2x^{(2)}+...+w_nx^{(n)}+b|}{\sqrt{w_1^2+w_2^2+...+w_n^2}} w12+w22+...+wn2∣w1x(1)+w2x(2)+...+wnx(n)+b∣
此处科普一下, w 1 2 + w 2 2 + . . . + w n 2 \sqrt{w_1^2+w_2^2+...+w_n^2} w12+w22+...+wn2就是法向量w的模,一般简记为w的L2范数||w||。
为了计算方便,我们还需要将分子中的绝对值去掉:
当一个正类样本xi分对成正类时,w•xi+b>0且yi=+1 > 0;
当一个负类样本xi分对成负类时,w•xi+b<0且yi=-1 < 0;
当一个正类样本xi分错成负类时,w•xi+b>0但yi=-1 < 0;
当一个负类样本xi分错成正类时,w•xi+b<0但yi=+1 > 0;
感知机所求的损失函数只计算分错的样本们到超平面的总距离,并追求距离为0或接近0的情况,所以这里我们只研究后两种分错的情况,可以很容易的看出来,对于后两种情况,-yi(w•xi+b) > 0成立,至此,计算样本到超平面的距离便不用再考虑绝对值。
将所有误分类点到超平面S的距离加起来,便得到总距离:
− ∑ x i ∈ M y i ( w • x i + b ) ∣ ∣ w ∣ ∣ -\frac{\sum_{x_i\in{M}}y_i(w•x_i+b)}{||w||} −∣∣w∣∣∑xi∈Myi(w•xi+b)
其中M是误分类点的集合。
我们进一步发现,在每个样本的计算过程中,分母都是相同的二范式||w||,且与样本无关,不影响最终结果,因此为了降低计算量,去掉分母,得到最终的损失函数计算公式:
L ( w , b ) = − ∑ x i ∈ M y i ( w • x i + b ) ⩾ 0 L(w,b) = -{\sum_{x_i\in{M}}y_i(w•x_i+b)} \geqslant0 L(w,b)=−xi∈M∑yi(w•xi+b)⩾0
误分类点越少,损失函数值越小,说明选择的超平面越好。
当没有误分类点时,损失函数为0,当有误分类点时,损失函数为关于w和b的线性函数,故损失函数是连续可导的。而连续可导这一性质就为用梯度下降法求解参数w,b提供了前提条件。
还是不懂的话,可以看一下吴恩达老师讲解的梯度下降法 - 最终学习策略为,从假设空间中选择使损失函数最小的参数w,b,得到参数w和b对应的超平面S=sign(w•x+b),使S分类后的误分类点个数为0或接近0。
3 感知机学习算法——梯度下降法
感知机算法的原始形式
- 输入训练数据集 T = {(x1,y1),(x2,y2),…,(xN,yN)},学习率 η ( 0 < η ≤ 1 ) \eta(0<\eta\le1) η(0<η≤1)(决定了下山时一步跨多大,太大可能会越过最低点,太小可能会循环次数过多,所以选择一个合适的学习率很重要)。
- 选取初值w0和b0。
- 从训练集中选取样本点(xi,yi),计算该点的损失函数值 yi(w0•xi+b0)。
- 如果yi(w0•xi+b0) > 0,说明该点是正确分类,不需要更新w和b;
如果yi(w0•xi+b0) < 0,说明该点是误分类点,根据以下公式更新w和b:
w = w + η y i x i b = b + η y i w = w+\eta y_ix_i \\ b = b + \eta y_i w=w+ηyixib=b+ηyi
此处大部分人都会对公式中的yixi和yi不解,大学高数学的求偏导还记得吧,这两部分其实就是损失函数L(w,b)分别对w和b求偏导得到的结果。每更新一次,都相当于向最值又靠近了一步。如果还是不解的话,建议搭配吴恩达老师的学习视频食用。
传送门:https://www.bilibili.com/video/BV164411b7dx?p=9 - 重复步骤3,4,直到训练集中没有误分类点。
- 输出参数w,b 和感知机模型 f ( x ) = s i g n ( w • x + b ) f(x) = sign(w•x+b) f(x)=sign(w•x+b)。
经过定理证明(证明过程略),有限次搜索后一定可以找到能将训练数据完全正确分开的超平面。同时需要注意,感知机学习算法的解不一定唯一,其解依赖于初值的选择,也依赖于误分类点的选择顺序。
对超平面加上约束条件后,会得到唯一的超平面,也就是支持向量机SVM。
传送门:SVM扩展知识
感知机算法的对偶形式
- 输入训练数据集 T = {(x1,y1),(x2,y2),…,(xN,yN)},学习率 η ( 0 < η ≤ 1 ) \eta(0<\eta\le1) η(0<η≤1)。
- 选取初值 α \alpha α0 = 0 和 b0 = 0。
- 从训练集中选取样本点(xi,yi),计算该点的损失函数值 y i ( ∑ j = 1 N α j y j x j • x + b ) y_i({\sum_{j=1}^{N}\alpha _jy_jx_j•x+b}) yi(∑j=1Nαjyjxj•x+b)。
- 如果
y
i
(
∑
j
=
1
N
α
j
y
j
x
j
•
x
+
b
)
y_i({\sum_{j=1}^{N}\alpha _jy_jx_j•x+b})
yi(∑j=1Nαjyjxj•x+b) > 0,说明该点是正确分类,不需要更新
α
\alpha
α和b;
如果 y i ( ∑ j = 1 N α j y j x j • x + b ) y_i({\sum_{j=1}^{N}\alpha _jy_jx_j•x+b}) yi(∑j=1Nαjyjxj•x+b) < 0,说明该点是误分类点,根据以下公式更新 α \alpha α和b:
α i = α i + η b = b + η y i \alpha_i = \alpha_i+\eta \\ b = b + \eta y_i αi=αi+ηb=b+ηyi
这里的 α i = n i η , n i \alpha_i = n_i\eta,n_i αi=niη,ni表示点(xi,yi)被误分类的次数, η \eta η=1时, α i \alpha_i αi表示第i个实例点由于误分而进行更新的次数。更新次数较多的实例,对学习影响结果较大,距离超平面较近,也就较难正确分类,容易反复横跳。 - 重复步骤3,4,直到训练集中没有误分类点。
- 输出参数 α \alpha α,b 和感知机模型 f ( x ) = s i g n ( ∑ j = 1 N α j y j x j • x + b ) f(x) = sign({\sum_{j=1}^{N}\alpha _jy_jx_j•x+b}) f(x)=sign(∑j=1Nαjyjxj•x+b)。
在对偶形式中,实例仅以内积的形式出现,为了避免重复计算,可以预先将训练集中实例间的内积计算出来,并存储到Gram矩阵中。
G
=
[
x
i
•
x
j
]
N
∗
N
G = [x_i•x_j]_{N*N}
G=[xi•xj]N∗N
扩展学习方法:口袋算法、表决感知机、带边缘感知机等。