感知机确实是一个非常简单的模型,涉及到的数学知识也很简单。
但由于学习不扎实,还有几个痛点需要解决:
- 随机梯度下降
- 代码实现
感知机(perceptron)是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和−1二值。
感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型。感知机学习旨在求出将训练数据进行线性划分的分离超平面,为此,导入基于误分类的损失函数,利用梯度下降法对损失函数进行极小化,求得感知机模型。
感知机学习算法具有简单而易于实现的优点,分为原始形式和对偶形式。感知机预测是用学习得到的感知机模型对新的输入实例进行分类。
1.感知机模型
定义: 假设输入空间(特征空间)是X⊆Rn,输出空间是Y=+1,−1。输入x∈X表示实例的特征向量,对应于输入空间(特征空间)的点;输出y∈Y表示实例的类别。由输入空间到输出空间的如下函数:
f(x)=sign(w∙x+b)
称为感知机。其中,w和b为感知机模型参数,w∈Rn叫作权值(weight)或权值向量(weight vector),b∈R叫作偏置(bias),w⋅x表示w和x的内积。sign是符号函数,即
sign(x)={+1,x⩾0−1,x<0
感知机是一种线性分类模型,属于判别模型。感知机模型的假设空间是定义在特征空间中的所有线性分类模型(linear classification model)或线性分类器(linear classifier),即函数集合
(f∣f(x)=w⋅x+b)
感知机有如下几何解释:线性方程
w∙x+b=0
对应于特征空间Rn中的一个超平面S,其中w是超平面的法向量,b是超平面的截距。这个超平面将特征空间划分为两个部分。位于两部分的点(特征向量)分别被分为正、负两类。因此,超平面S称为分离超平面(separating hyperplane),如图2.1所示。

感知机学习,由训练数据集(实例的特征向量及类别)
T={(x1,y1),(x2,y2),⋯,(xN,yN)}
其中,xi∈X=Rn,yi∈Y=+1,−1,i=1,2,…,N,求得感知机模型,即求得模型参数w,b。感知机预测,通过学习得到的感知机模型,对于新的输入实例给出其对应的输出类别。
2. 感知机学习策略
(数据集的线性可分性) 给定一个数据集
T={(x1,y1),(x2,y2),⋯,(xN,yN)}
其中,xi∈X=Rn,yi∈Y=+1,−1,i=1,2,…,N,如果存在某个超平面S
w∙x+b=0
能够将数据集的正实例点和负实例点完全正确地划分到超平面的两侧,即对所有yi=+1的实例i,有w⋅xi+b>0,对所有yi=−1的实例i,有w⋅xi+b<0,则称数据集T为线性可分数据集(linearly separable data set);否则,称数据集T线性不可分。
2.1 感知机学习策略
假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练集正实例点和负实例点完全正确分开的分离超平面。为了找出这样的超平面,即确定感知机模型参数w,b,需要确定一个学习策略,即定义(经验)损失函数并将损失函数极小化。
损失函数的一个自然选择是误分类点的总数。但是,这样的损失函数不是参数w,b的连续可导函数,不易优化。损失函数的另一个选择是误分类点到超平面S的总距离,这是感知机所采用的。为此,首先写出输入空间Rn中任一点x0到超平面S的距离:
∥w∥1∣w∙x0+b∣
这里,‖w‖是w的L2范数。其次,对于误分类的数据(xi,yi)来说,
−yi(w∙xi+b)>0
成立。因为当w⋅xi+b>0时,yi=−1;而当w⋅xi+b<0时,yi=+1。因此,误分类点x_i到超平面S的距离是
−∥w∥1yi(w∙xi+b)
这样,假设超平面S的误分类点集合为M,那么所有误分类点到超平面S的总距离为
−∥w∥1xi∈M∑yi(w∙xi+b)
不考虑∥w∥1,就得到感知机学习的损失函数.
损失函数定义为:
L(w,b)=−xi∈M∑yi(w∙xi+b)
其中M为误分类点的集合。这个损失函数就是感知机学习的经验风险函数。
显然,损失函数L(w,b)是非负的。如果没有误分类点,损失函数值是0。而且,误分类点越少,误分类点离超平面越近,损失函数值就越小。一个特定的样本点的损失函数:在误分类时是参数w,b的线性函数,在正确分类时是0。因此,给定训练数据集T,损失函数L(w,b)是w,b的连续可导函数。感知机学习的策略是在假设空间中选取使损失函数式最小的模型参数w,b,即感知机模型。
3. 感知机学习算法
感知机学习问题转化为求解损失函数式的最优化问题,最优化的方法是随机梯度下降法。
3.1 感知机学习算法的原始形式
感知机学习算法是对以下最优化问题的算法。
给定一个训练集数据,求解损失函数极小化问题的解:
w,bminL(w,b)=−xi∈M∑yi(w⋆xi+b)(2.5)
感知机学习算法是误分类驱动的,具体采用随机梯度下降法(stochastic gradient descent)。首先,任意选取一个超平面w0,b0,然后用梯度下降法不断地极小化目标函数(2.5)。极小化过程中不是一次使M中所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降。假设误分类点集合M是固定的,那么损失函数L(w,b)的梯度由
∇wL(w,b)=−xi∈M∑yixi
∇bL(w,b)=−xi∈M∑yi
给出。
随机选取一个误分类点(xi,yi),对w,b进行更新:
w←w+ηyixib←b+ηyi
式中η(0<η≤1)是步长,在统计学习中又称为学习率(learning rate)。这样,通过迭代可以期待损失函数L(w,b)不断减小,直到为0。综上所述,得到如下算法:
算法2.1(感知机学习算法的原始形式)
输入:
训练数据集T=(x1,y1),(x2,y2),…,(xN,yN),其中xi∈X=Rn,yi∈Y=−1,+1,i=1,2,…,N;学习率η(0<η≤1);输出:w,b;感知机模型f(x)=sign(w⋅x+b)。
- 选取初值w0,b0;
- 在训练集中选取数据(xi,yi);
- 如果yi(w⋅xi+b)≤0,
w←w+ηyixib←b+ηyi
- 转至2,直至训练集中没有误分类点。
这种学习算法直观上有如下解释:当一个实例点被误分类,即位于分离超平面的错误一侧时,则调整w,b的值,使分离超平面向该误分类点的一侧移动,以减少该误分类点与超平面间的距离,直至超平面越过该误分类点使其被正确分类。
代码实现
import numpy as np
train_set = np.array([[2, 4, 1], [1, 6, 1], [13, 1, -1]])
w = np.array([0, 0])
b = 0
l = 1
def update(item):
global w, b
w += l * item[-1] * item[:-1]
b += l * item[-1]
print("w={},b={}".format(w, b))
def check():
flag = False
res = 0
for item in train_set:
res = (w * item[:-1]).sum() + b
res *= item[-1]
if res <= 0:
flag = True
update(item)
return flag
print("1")
if __name__ == "__main__":
flag = False
for i in range(100):
if not check():
flag = True
break
if flag:
print("100次迭代,可以完成正确分类!")
else:
print("100次迭代,不可完成正确分类!")
算法2.1是感知机学习的基本算法,对应于后面的对偶形式,称为原始形式。感知机学习算法简单且易于实现。
3.2 算法的收敛性
现在证明,对于线性可分数据集感知机学习算法原始形式收敛,即经过有限次迭代可以得到一个将训练数据集完全正确划分的分离超平面及感知机模型。
为了便于叙述与推导,将偏置b并入权重向量w,记作w^=(wT,b)T,同样也将输入向量加以扩充,加进常数1,记作x^=(xT,1)T。这样,x^∈Rn+1,w^∈Rn+1。显然,w^∙x^=w∙x+b。
定理2.1(Novikoff)设训练数据集是线性可分的,则:
- 存在满足条件∥w^opt∥=1的超平面
w^opt∙x^=wopt∙x+bopt=0将训练数据集完全正确分开;且存在γ>0,对所有i=1,2,…,N有:
yi(w^opt∙x^i)=yi(wopt∙xi+bopt)⩾γ
- 令R=max1⩽i⩽N∥x^i∥,则感知机算法2.1在训练数据集上的误差分类次数k满足不等式:k⩽(Rγ)2
γ=imin{yi(wopt∙xi+bopt)}
详细证明在统计学习方法第二版李航课本上。
定理表明,误分类的次数k是有上界的,经过有限次搜索可以找到将训练数据完全正确分开的分离超平面。也就是说,当训练数据集线性可分时,感知机学习算法原始形式迭代是收敛的。
但是例2.1说明,感知机学习算法存在许多解,这些解既依赖于初值的选择,也依赖于迭代过程中误分类点的选择顺序。为了得到唯一的超平面,需要对分离超平面增加约束条件。这就是第7章将要讲述的线性支持向量机的想法。当训练集线性不可分时,感知机学习算法不收敛,迭代结果会发生震荡。
3.3 感知机学习算法的对偶形式
感知机学习算法的原始形式和对偶形式与第7章中支持向量机学习算法的原始形式和对偶形式相对应。
对偶形式的基本想法是,将w和b表示为实例xi和标记yi的线性组合的形式,通过求解其系数而求得w和b。不失一般性,在算法2.1中可假设初始值w0,b0均为0。对误分类点(xi,yi)通过
w←w+ηyixib←b+ηyi
逐步修改w,b,设修改n次,则w,b关于(xi,yi)的增量分别是αiyixi和αiyi,这里αi=niη,ni是点(xi,yi)被误分类的次数。这样,从学习过程不难看出,最后学习到的w,b可以分别表示为
w=∑i=1Nαiyixib=∑i=1Nαiyi
这里,αi≥0,i=1,2,…,N,当η=1时,表示第i个实例点由于误分而进行更新的次数。实例点更新次数越多,意味着它距离分离超平面越近,也就越难正确分类。
换句话说,这样的实例对学习结果影响最大。下面对照原始形式来叙述感知机学习算法的对偶形式
算法2.2(感知机学习算法的对偶形式)
输入:线性可分的数据集,学习率η(0<η≤1)
f(x)=sign(j=1∑Nαjyjxj∙x+b)
输出:α,b;感知机模型,其中α=(α1,α2,…,αN)T。
- ←0,b←0;
- 在训练集中选取数据(xi,yi);
- 如果,yi(j=1∑Nαjyjxj∙xi+b)⩽0
αi←αi+ηb←b+ηyi
- 转至(2)直到没有误分类数据。
对偶形式中训练实例仅以内积的形式出现。为了方便,可以预先将训练集中实例间的内积计算出来并以矩阵的形式存储,这个矩阵就是所谓的Gram矩阵(Gram matrix)
G=[xi∙xj]N×N