ML-感知机

55 阅读9分钟

感知机确实是一个非常简单的模型,涉及到的数学知识也很简单。

但由于学习不扎实,还有几个痛点需要解决:

  1. 随机梯度下降
  2. 代码实现

感知机(perceptron)是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和−1二值。

感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型。感知机学习旨在求出将训练数据进行线性划分的分离超平面,为此,导入基于误分类的损失函数,利用梯度下降法对损失函数进行极小化,求得感知机模型。

感知机学习算法具有简单而易于实现的优点,分为原始形式和对偶形式。感知机预测是用学习得到的感知机模型对新的输入实例进行分类。

1.感知机模型

定义: 假设输入空间(特征空间)是XRnX⊆R^n,输出空间是Y=+1,1Y={+1,−1}。输入xXx∈X表示实例的特征向量,对应于输入空间(特征空间)的点;输出yYy∈Y表示实例的类别。由输入空间到输出空间的如下函数:

f(x)=sign(wx+b)f(x)=\mathrm{sign}(w\bullet x+b)

称为感知机。其中,wwbb为感知机模型参数,wRnw∈R^n叫作权值(weight)或权值向量(weight vector),bRb∈R叫作偏置(bias),wxw·x表示wwxx的内积。signsign是符号函数,即

sign(x)={+1,x01,x<0\operatorname{sign}(x)=\left\{\begin{array}{cc}+1,&x\geqslant0\\ &-1,&x<0\end{array}\right.

感知机是一种线性分类模型,属于判别模型。感知机模型的假设空间是定义在特征空间中的所有线性分类模型(linear classification model)或线性分类器(linear classifier),即函数集合

(ffx=wx+b){{(f|f(x)=w·x+b)}}

感知机有如下几何解释:线性方程

wx+b=0 w\bullet x+b=0

对应于特征空间RnR^n中的一个超平面SS,其中ww是超平面的法向量,b是超平面的截距。这个超平面将特征空间划分为两个部分。位于两部分的点(特征向量)分别被分为正、负两类。因此,超平面S称为分离超平面(separating hyperplane),如图2.1所示。

image.png

感知机学习,由训练数据集(实例的特征向量及类别)

T={(x1,y1),(x2,y2),,(xN,yN)}T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\}

其中,xiX=RnyiY=+1,1i=1,2,,Nx_i∈X=R_n,y_i∈Y={+1,−1},i=1,2,…,N,求得感知机模型,即求得模型参数w,b。感知机预测,通过学习得到的感知机模型,对于新的输入实例给出其对应的输出类别。

2. 感知机学习策略

(数据集的线性可分性) 给定一个数据集

T={(x1,y1),(x2,y2),,(xN,yN)}T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\}

其中,xiX=RnyiY=+1,1i=1,2,,Nx_i∈X=R_n,y_i∈Y={+1,−1},i=1,2,…,N,如果存在某个超平面SS

wx+b=0 w\bullet x+b=0

能够将数据集的正实例点和负实例点完全正确地划分到超平面的两侧,即对所有yi=+1y_i=+1的实例ii,有wxi+b>0w·x_i+b>0,对所有yi=1y_i=−1的实例ii,有wxi+b<0w·x_i+b<0,则称数据集T为线性可分数据集(linearly separable data set);否则,称数据集T线性不可分。

2.1 感知机学习策略

假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练集正实例点和负实例点完全正确分开的分离超平面。为了找出这样的超平面,即确定感知机模型参数wbw,b,需要确定一个学习策略,即定义(经验)损失函数并将损失函数极小化。

损失函数的一个自然选择是误分类点的总数。但是,这样的损失函数不是参数wbw,b的连续可导函数,不易优化。损失函数的另一个选择是误分类点到超平面SS的总距离,这是感知机所采用的。为此,首先写出输入空间RnR^n中任一点x0x_0到超平面SS的距离:

1wwx0+b\frac{1}{\|w\|}|w\bullet x_{0}+b|

这里,w‖w‖wwL2L_2范数。其次,对于误分类的数据xi,yi(x_i,y_i)来说,

yi(wxi+b)>0-y_i(w\bullet x_i+b)>0\quad\text{}

成立。因为当wxi+b>0w·x_i+b>0时,yi=1y_i=−1;而当wxi+b<0w·x_i+b<0时,yi=+1y_i=+1。因此,误分类点x_i到超平面SS的距离是

1wyi(wxi+b)\begin{aligned}-\frac{1}{\|w\|}y_i(w\bullet x_i+b)\end{aligned}

这样,假设超平面SS的误分类点集合为MM,那么所有误分类点到超平面SS的总距离为

1wxiMyi(wxi+b)-\dfrac{1}{\|w\|}\sum\limits_{x_i\in M}y_i(w\bullet x_i+b)

不考虑1w\dfrac{1}{\|w\|},就得到感知机学习的损失函数.

损失函数定义为:

L(w,b)=xiMyi(wxi+b)L(w,b)=-\sum\limits_{x_i\in M}y_i(w\bullet x_i+b)

其中MM为误分类点的集合。这个损失函数就是感知机学习的经验风险函数。

显然,损失函数Lw,bL(w,b)是非负的。如果没有误分类点,损失函数值是00。而且,误分类点越少,误分类点离超平面越近,损失函数值就越小。一个特定的样本点的损失函数:在误分类时是参数wbw,b的线性函数,在正确分类时是00。因此,给定训练数据集TT,损失函数Lw,bL(w,b)wbw,b的连续可导函数。感知机学习的策略是在假设空间中选取使损失函数式最小的模型参数w,bw,b,即感知机模型。

3. 感知机学习算法

感知机学习问题转化为求解损失函数式的最优化问题,最优化的方法是随机梯度下降法。

3.1 感知机学习算法的原始形式

感知机学习算法是对以下最优化问题的算法。 给定一个训练集数据,求解损失函数极小化问题的解:

minw,bL(w,b)=xiMyi(wxi+b)(2.5)\min\limits_{w,b}L(w,b)=-\sum\limits_{x_i\in M}y_i(w\star x_i+b)\quad\quad\quad(2.5)

感知机学习算法是误分类驱动的,具体采用随机梯度下降法(stochastic gradient descent)。首先,任意选取一个超平面w0,b0w_0,b_0,然后用梯度下降法不断地极小化目标函数2.5(2.5)。极小化过程中不是一次使MM中所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降。假设误分类点集合MM是固定的,那么损失函数Lw,bL(w,b)的梯度由

wL(w,b)=xiMyixi\begin{aligned}\nabla_w L(w,b)=-\sum_{x_i\in M}y_ix_i\end{aligned}
bL(w,b)=xiMyi\nabla_bL(w,b)=-\sum\limits_{x_i\in M}y_i

给出。

随机选取一个误分类点xi,yi(xi,yi),对w,bw,b进行更新:

ww+ηyixibb+ηyi\begin{array}{l}w\leftarrow w+\eta y_ix_i\\ b\leftarrow b+\eta y_i\end{array}

式中η0<η1η(0<η≤1)是步长,在统计学习中又称为学习率(learning rate)。这样,通过迭代可以期待损失函数Lw,bL(w,b)不断减小,直到为00。综上所述,得到如下算法:

算法2.1(感知机学习算法的原始形式)

输入: 训练数据集T=x1,y1,x2,y2,,xN,yN,其中xiX=RnyiY=1,+1i=1,2,,N;学习率η0<η1);输出:wb;感知机模型fx=signwx+b训练数据集T={(x1,y1),(x2,y2),…,(xN,yN)},其中x_i∈X=R^n,y_i∈Y={−1,+1},i=1,2,…,N;学习率η(0<η≤1);输出:w,b;感知机模型f(x)=sign(w·x+b)

  1. 选取初值w0,b0w_0,b_0
  2. 在训练集中选取数据xi,yi(x_i,y_i)
  3. 如果yiwxi+b0y_i(w·x_i+b)≤ 0
ww+ηyixibb+ηyi\begin{array}{l}{w\leftarrow w+\eta y_{i}x_{i}}\\ {b\leftarrow b+\eta y_{i}}\\ \end{array}
  1. 转至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和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:
        # 计算w*xi+b
        res = (w * item[:-1]).sum() + b
        # 计算yi(w*xi+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(): # check返回False,表示无错误分类点
            flag = True
            break
        #有错误分类点,则迭代继续
    if flag:
        print("100次迭代,可以完成正确分类!")
    else:
        print("100次迭代,不可完成正确分类!")

算法2.1是感知机学习的基本算法,对应于后面的对偶形式,称为原始形式。感知机学习算法简单且易于实现。

3.2 算法的收敛性

现在证明,对于线性可分数据集感知机学习算法原始形式收敛,即经过有限次迭代可以得到一个将训练数据集完全正确划分的分离超平面及感知机模型。

为了便于叙述与推导,将偏置b并入权重向量w,记作w^=(wT,b)T{\hat{w}}=(w^{\mathrm{T}},b)^{\mathrm{T}},同样也将输入向量加以扩充,加进常数1,记作x^=(xT,1)T{\hat{x}}=(x^{\mathrm{T}},1)^{\mathrm{T}}。这样,x^Rn+1,w^Rn+1{\hat{x}}\in\mathbf{R}^{n+1},{\hat{w}}\in\mathbf{R}^{n+1}。显然,w^x^=wx+b\hat{w}\bullet\hat{x}=w\bullet x+b

定理2.1(Novikoff)设训练数据集是线性可分的,则:

  • 存在满足条件w^opt=1\|\hat{w}_{\mathrm{opt}}\|=1的超平面 w^optx^=woptx+bopt=0\hat{w}_\mathrm{opt}\bullet\hat{x}=w_\mathrm{opt}\bullet x+b_\mathrm{opt}=0将训练数据集完全正确分开;且存在γ>0,对所有i=1,2,,Nγ>0,对所有i=1,2,…,N有:
yi(w^optx^i)=yi(woptxi+bopt)γy_i(\hat{w}_{\text{opt}}\bullet\hat{x}_i)=y_i(w_{\text{opt}}\bullet x_i+b_{\text{opt}})\geqslant\gamma
  • R=max1iNx^iR=\max_{1\leqslant i\leqslant N}\|\hat{x}_{i}\|,则感知机算法2.1在训练数据集上的误差分类次数k满足不等式:k(Rγ)2k\leqslant\begin{pmatrix}R\\ \overline{\gamma}\end{pmatrix}^2
γ=mini{yi(woptxi+bopt)}\gamma=\min\limits_i\{y_i(w_{\mathrm{opt}}\bullet x_i+b_{\mathrm{opt}})\}

详细证明在统计学习方法第二版李航课本上。

定理表明,误分类的次数k是有上界的,经过有限次搜索可以找到将训练数据完全正确分开的分离超平面。也就是说,当训练数据集线性可分时,感知机学习算法原始形式迭代是收敛的。

但是例2.1说明,感知机学习算法存在许多解,这些解既依赖于初值的选择,也依赖于迭代过程中误分类点的选择顺序。为了得到唯一的超平面,需要对分离超平面增加约束条件。这就是第7章将要讲述的线性支持向量机的想法。当训练集线性不可分时,感知机学习算法不收敛,迭代结果会发生震荡。

3.3 感知机学习算法的对偶形式

感知机学习算法的原始形式和对偶形式与第7章中支持向量机学习算法的原始形式和对偶形式相对应。

对偶形式的基本想法是,将wwbb表示为实例xix_i和标记yiy_i的线性组合的形式,通过求解其系数而求得wwbb。不失一般性,在算法2.1中可假设初始值w0,b0w_0,b_0均为0。对误分类点xi,yi(x_i,y_i)通过

ww+ηyixibb+ηyi\begin{aligned}&w\leftarrow w+\eta y_ix_i\\ &b\leftarrow b+\eta y_i\end{aligned}

逐步修改wbw,b,设修改nn次,则wbw,b关于xi,yi(x_i,y_i)的增量分别是αiyixiα_iy_ix_iαiyiαiyi,这里αi=niη,niα_i=n_iη,ni是点xi,yi(x_i,y_i)被误分类的次数。这样,从学习过程不难看出,最后学习到的w,bw,b可以分别表示为

w=i=1Nαiyixib=i=1Nαiyi\begin{array}{l}w=\sum_{i=1}^{N}\alpha_iy_ix_i\\ b=\sum_{i=1}^{N}\alpha_iy_i\end{array}

这里,αi0i=1,2,,Nα_i≥0,i=1,2,…,N,η=1η=1时,表示第i个实例点由于误分而进行更新的次数。实例点更新次数越多,意味着它距离分离超平面越近,也就越难正确分类。

换句话说,这样的实例对学习结果影响最大。下面对照原始形式来叙述感知机学习算法的对偶形式

算法2.2(感知机学习算法的对偶形式)

输入:线性可分的数据集,学习率η0<η1η(0<η≤1)

f(x)=sign(j=1Nαjyjxjx+b)f(x)=\operatorname{sign}\left(\sum\limits_{j=1}^N\alpha_j y_j x_j\bullet x+b\right)

输出:α,bα,b;感知机模型,其中α=α1,α2,,αNTα=(α_1,α_2,…,α_N)^T

  1. ←0,b←0;
  2. 在训练集中选取数据xi,yi(x_i,y_i)
  3. 如果,yi(j=1Nαjyjxjxi+b)0y_i\left(\sum\limits_{j=1}^N\alpha_j y_j x_j\bullet x_i+b\right)\leqslant0
αiαi+ηbb+ηyi\begin{array}{c}\alpha_i\leftarrow\alpha_i+\eta\\ b\leftarrow b+\eta y_i\end{array}
  1. 转至(2)直到没有误分类数据。

对偶形式中训练实例仅以内积的形式出现。为了方便,可以预先将训练集中实例间的内积计算出来并以矩阵的形式存储,这个矩阵就是所谓的Gram矩阵(Gram matrix)

G=[xixj]N×N\boldsymbol{G}=[x_{i}\boldsymbol{\bullet}x_{j}]_{N\times N}