感知机是二分类线性分类模型,输入为实例的特征,输出为实例类别,实例类别取+1和-1。感知机是属于判别模型,因为其求出分离超平面直接将输入实例划分为正例和负例。
感知机的数学表达式可以由下列式子进行表达:
f = s i g n ( w ⋅ x + b ) f=sign(w·x+b) f=sign(w⋅x+b),
其中, s i g n ( x ) sign(x) sign(x)是一个记号函数,表示
当 x > = 0 , s i g n ( x ) = + 1 x>=0, sign(x)=+1 x>=0,sign(x)=+1;
当 x < 0 , s i g n ( x ) = − 1 x<0, sign(x)=-1 x<0,sign(x)=−1;
几何意义是将几何坐标系上的点通过分离超平面将其划分为两个类别:正例和负例。【对于二维坐标系来说】
如果是多维坐标系,相当于是一个多维面了。比如,二维空间是一条线,三维空间是一个面等等。
感知机的目标是:在训练数据集线性可分的假设前提下,求得一个能够将训练集中的正负样本实例点完全正确分开的分离超平面。
看到这,有人说,训练数据集线性可分啥意思啊,听不懂啊,其实就是针对所有正实例 y = + 1 y=+1 y=+1, w ⋅ x + b > 0 w·x+b>0 w⋅x+b>0;
对所有负实例 y = − 1 y=-1 y=−1, w ⋅ x + b < 0 w·x+b<0 w⋅x+b<0;
一张图表示其实就是这个样子的:
这个数据集就是可分的,中间一条虚线即为超平面,将整个数据集分为虚线右上和左下部分。
通常意义上来说,损失函数我们可以看误分类点的个数。但是这样来看,误分类点的个数不是参数 w w w和 b b b的连续可导函数,不易优化。因此,选择另一种形式的损失函数:
误分类点到超平面的总距离。
而平面上一点 ( x 0 , y 0 ) (x_0, y_0) (x0,y0)到超平面 S S S的距离 d i s t a n c e 0 distance_0 distance0为:
1 ∣ ∣ w ∣ ∣ ∣ w ⋅ x 0 + b ∣ \frac{1}{||w||}|w·x_0+b| ∣∣w∣∣1∣w⋅x0+b∣
其中, ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣为2范数。
对于误分类点有两种情况:
(1)对于原本 y i = − 1 y_i=-1 yi=−1的情况误分类成了 y i = 1 y_i=1 yi=1,这种情况下 1 w ⋅ x 0 + b \frac{1}{w·x_0+b} w⋅x0+b1乘积表示真实样本的数值,为负。而 d i s t a n c e distance distance为正,因此 ∣ w ⋅ x 0 + b ∣ = − ( w ⋅ x 0 + b ) = − y i ∗ ( w ⋅ x 0 + b ) |w·x_0+b| = -(w·x_0+b)=-y_i*(w·x_0+b) ∣w⋅x0+b∣=−(w⋅x0+b)=−yi∗(w⋅x0+b)。
(2)对于原本 y i = 1 y_i=1 yi=1的情况误分类成了 y i = − 1 y_i=-1 yi=−1,这种情况下 1 w ⋅ x 0 + b \frac{1}{w·x_0+b} w⋅x0+b1乘积表示真实样本的数值,为正。而 d i s t a n c e distance distance为正,因此 ∣ w ⋅ x 0 + b ∣ = ( w ⋅ x 0 + b ) = − y i ∗ ( w ⋅ x 0 + b ) |w·x_0+b| = (w·x_0+b)= -y_i*(w·x_0+b) ∣w⋅x0+b∣=(w⋅x0+b)=−yi∗(w⋅x0+b)。
因此,从整体误分类上来说,假设误分类点集合为 M M M,误分类点超平面总距离为:
d i s t a n c e = ∑ ( x i , y i ) ∈ M d i s t a n c e i = ∑ ( x i , y i ) ∈ M [ − y i ∗ ( w ∗ x i + b ) ∗ 1 ∣ ∣ w ∣ ∣ ] distance = \sum_{(x_i, y_i)\in M}distance_i =\sum_{(x_i, y_i)\in M}[-y_i*(w*x_i+b)*\frac{1}{||w||}] distance=∑(xi,yi)∈Mdistancei=∑(xi,yi)∈M[−yi∗(w∗xi+b)∗∣∣w∣∣1]
目前,感知机的优化方法采用的是梯度下降的方法,也就是我们所熟知的随机梯度下降或者批量梯度下降。因为感知机有原始形式和对偶形式两种方式,故而分开来说。
原始形式的目标函数为:
m i n w , b L ( w , b ) = − ∑ i ∈ M y i ∗ ( w ∗ x i + b ) min_{w,b} L(w,b) = -\sum_{i\in M} {y_i * (w*x_i+b)} minw,bL(w,b)=−∑i∈Myi∗(w∗xi+b)
其中 M M M是误分类点的集合。
目标函数需要对 w , b w, b w,b求解最优解,因此我们先对 w , b w,b w,b进行求偏导,然后再更新 w , b w,b w,b。
对 w w w求偏导: ∂ L ∂ w = − ∑ i ∈ M x i ∗ y i \frac{\partial L}{\partial w} = -\sum_{i\in M} { x_i*y_i} ∂w∂L=−∑i∈Mxi∗yi
对 b b b求偏导: ∂ L ∂ b = − ∑ i ∈ M y i \frac{\partial L}{\partial b} = -\sum_{i\in M} { y_i} ∂b∂L=−∑i∈Myi
随机选取一个误分类点 ( x i , y i ) (x_i, y_i) (xi,yi)对 w , b w,b w,b进行更新, η \eta η为学习率:
w = w + ∂ L ∂ w = w + ( − x i ∗ y i ) = w + η ∗ x i ∗ y i w = w + \frac{\partial L}{\partial w}= w+ ( -{ x_i*y_i}) = w + \eta *x_i*y_i w=w+∂w∂L=w+(−xi∗yi)=w+η∗xi∗yi
b = b + ∂ L ∂ b = b + ( − y i ) = b + η ∗ y i b = b + \frac{\partial L}{\partial b}= b + (-{ y_i}) = b + \eta * y_i b=b+∂b∂L=b+(−yi)=b+η∗yi
随机选取一类误分类点集合, ( x i , y i ) ∈ M (x_i, y_i)\in M (xi,yi)∈M对 w , b w,b w,b进行更新, η \eta η为学习率:
w = w + ∂ L ∂ w = w + ( − ∑ i ∈ M x i ∗ y i ) = w + η ∗ ∑ i ∈ M x i ∗ y i w = w + \frac{\partial L}{\partial w}= w+ ( -\sum_{i\in M} { x_i*y_i}) = w + \eta *\sum_{i\in M} {x_i*y_i} w=w+∂w∂L=w+(−∑i∈Mxi∗yi)=w+η∗∑i∈Mxi∗yi
b = b + ∂ L ∂ b = b + ( − ∑ i ∈ M y i ) = b + η ∗ ∑ i ∈ M y i b = b + \frac{\partial L}{\partial b}= b + (-\sum_{i\in M} { y_i}) = b + \eta * \sum_{i\in M} y_i b=b+∂b∂L=b+(−∑i∈Myi)=b+η∗∑i∈Myi
但是对于批量梯度下降来说,需要选取的是误分类点里的"批量",而不是全量数据集上的"批量"。
这一点在李航大大的书上并没有提及,只是根据笔者自己理解来说明原因。主要是从时间复杂方向来考虑。
假设我们有 m m m个样本【准确来说,这里说 m m m个误分类样本更为合适,但是对于我们来说,我们需要对所有样本进行判断,如果误分类,更新 w w w和 b b b。如果不是误分类,那么不更新。其实,判断误分类样本的过程也相当于遍历整个样本】,每个样本有 n n n维特征向量,我们来分别计算在该场景下的时间复杂度。
我们写一下伪代码:
for i in range(0, m+1):
if y[i] * (w*x[i]+b) < 0:
更新w, b
else:
w, b不更新
这里时间复杂度相当于是 样本数*更新w,b的时间复杂度。
因此, 对于随机梯度下降来说,每次随机选取一个误分类样本进行更新,样本数为1,其计算的时间复杂度为 O ( n ) O(n) O(n),
而对于批量梯度下降来说,每次需要对所有误分类点进行求和更新,每一个样本更新 w , b w,b w,b的时间复杂度为 O ( n ) O(n) O(n),那么对于 m m m个样本来说,时间复杂度为 O ( m ∗ n ) O(m*n) O(m∗n)。
我们分3种情况分别讨论不同情况下的时间复杂度情况:
1)当样本量特别少的时候,即 n > > m n>>m n>>m时,其实两者时间复杂度应该差不多。如果更在意精度的话,建议选择批量梯度下降,因为其更新信息是利用全局误分类点信息,精度相对于随机梯度下降更高一些,更新方向更接近全局解。
2)当样本量特别特别大的时候,即 m > > n m>>n m>>n,此时批量梯度下降的更新时间的劣势凸显更为明显一些,时间复杂度陡增。在可以适当舍弃精度的同时,建议选择随机梯度下降。
3)当样本量与特征维度近似时,这个时候批量梯度下降的时间复杂度约为随机梯度下降的一倍。需要进行准确性和性能两个方面的综合考量。
综上所述,整体上来说,从工程和性能两个方面考虑来说,可以以牺牲较小的准确性为代价,选择随机梯度下降。
我们回顾下 w , b w,b w,b的更新方式【这里只看随机梯度下降方式】:
w = w + η ∗ x i ∗ y i w = w + {\eta*x_i*y_i} w=w+η∗xi∗yi
b = b + η ∗ y i b = b + {\eta * y_i} b=b+η∗yi
这里是每次通过修改误分类点来更新下 w , b w,b w,b,这里可以这么来考虑,我们通过修改次数来表达 w , b w,b w,b的更新。
我们每次改动 w , b w,b w,b时, w , b w,b w,b都会有一个增量,假设第 i i i个样本学习次数为 n i n_i ni,做 α i = n i ∗ η \alpha_i=n_i*\eta αi=ni∗η,那么第 i i i个样本 w , b w,b w,b的变化量为 Δ w i = α i ∗ x i ∗ y i \Delta w_i = \alpha_i*x_i*y_i Δwi=αi∗xi∗yi, Δ b i = α i ∗ y i \Delta b_i = \alpha_i*y_i Δbi=αi∗yi。假设整个样本空间里有 N N N个样本,那么 w , b w,b w,b可以采用另一种表示方法:
w = ∑ i = 1 N α i ∗ x i ∗ y i w = \sum_{i=1}^N{\alpha_i*x_i*y_i} w=∑i=1Nαi∗xi∗yi
b = ∑ i = 1 N α i ∗ y i b = \sum_{i=1}^N{\alpha_i*y_i} b=∑i=1Nαi∗yi
其中, α i ≥ 0 , i = 1 , 2 , 3... , N \alpha_i\geq0,i=1,2,3...,N αi≥0,i=1,2,3...,N。 n i n_i ni更新的频率越高,表明该点 ( x i , y i ) (x_i,y_i) (xi,yi)离分割面越近,越难以正确分类,对最后模型的学习影响也越大。
这个建议先看完对偶形式的这个小节再回头来看原因,当然,如果对原始形式和对偶形式都非常熟悉的话,也可以直接看。
既然有了原始形式,而且用随机梯度下降也能达到较好的效果,那么为什么还要考虑对偶形式,对偶形式的优势具体体现在什么地方呢?
我们对比下原始形式和对偶形式的 w , b w,b w,b更新形式:
原始形式:
w = w + η ∗ x i ∗ y i w = w + \eta*x_i*y_i w=w+η∗xi∗yi
b = b + η ∗ y i b = b + \eta*y_i b=b+η∗yi
对于目标函数 f ( x ) = s i g n ( w ∗ x + b ) f(x)=sign(w*x+b) f(x)=sign(w∗x+b)来说,每一次新来一个样本点,都要重新更新一次 w , b w,b w,b,