目录
简介
感知机算法是最简单最基础的机器学习算法,可以用于处理最简单的二分类任务,并且模型和学习算法都十分简单。感知机1957年由Rosenblatt提出,是神经网络与支持向量机的基础。
感知机模型
感知机是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1二值。感知机模型对应于特征空间中的一个分离超平面。
模型的数学表示
感知机其实是一个由输入空间\(\mathcal{X} \subset \mathbb{R}^n\)到输出空间\(\mathcal{Y}=\{+1, -1\}\)的函数:
\[f(x) = \mathop{sign}(w·x+b)\\ sign(x) = \left\{\begin{array} {cc}+1, & x \ge 0 \\-1, & x < 0\end{array}\right.\]
其中\(w,b\)是感知机模型的参数,\(w \in \mathbb{R}^n\)叫做权值(weight)或权值向量(weight vector),\(b \in \mathbb{R}\)叫做偏置(bias)。
感知机模型的假设空间是定义在特征空间中的所有线性分类模型(linear classification model)或线性分类器(linear classifier),即函数集合\(\{f\mid f(x) = w·x + b\}\)。
几何解释
由感知机的定义可以知道,对于数据\(x\),如果\(w·x+b>0\)那\(x\)对应的标签为+1,如果\(w·x+b<0\)那么\(x\)对应的标签为-1。故感知机实际上定义了一个超平面\(w·x+b=0\),这个超平面将特征空间划分为两个部分。位于两部分的点(特征向量)分别被分为正、负两类,如下图所示:
感知机学习策略
首先感知机是一个线性分类器(二分类),我们先考虑训练数据集线性可分的情形。
数据集线性可分的定义:
对于一个给定的数据集\(T = \{(x_1, y_1), (x_2,y_2), ···,(x_N,y_N)\},\) 如果存在某个超平面S:\(w·x+b=0\)能够将数据集的正实例点和负实例点完全正确地划分到超平面的两侧,即对于所有\(y_i=+1\)的实例\(i\) ,有\(w·x_i+b > 0\),对于所有\(y_i=-1\)的实例\(i\),有\(w·x_i+b<0\),则称数据集\(T\)为线性可分数据集(linearly separable data set);否则,称数据集\(T\)线性不可分。
假设训练数据集是线性可分的,感知机需要学习一个分离超平面将所有的数据正确分类。为了找出这样的超平面我们需要定义一个损失函数并将损失函数极小化。
损失函数的定义
既然我们想要把所有的点都分类正确,那么一个自然的想法是直接使用误分类点的总数作为损失函数
\[\begin{align}L_1(w,b) &= \sum_{i=1}^{N}-y_i*f(x_i)\ (when\ \ y_i*f(x_i)<0) \\&=\sum_{i=1}^N-y_i*sign(w·x_i+b)\ (when\ \ y_i*sign(w·x_i+b)<0) \\\end{align}\]
但是函数sign不可导,所以\(L_1(w,b)\)并不是\(w,b\)的连续可导函数,不易优化。
因为直接使用误分类点的总数不太好优化,感知机算法选择了误分类点到超平面S的总距离作为损失函数,首先对于特征空间的任意点\(x_0\),其到超平面S(w,b)的距离为:
\[\frac{1}{||w||}|w·x_0+b|\]
所以,新的损失函数的定义如下:
\[\begin{align}L_2(w,b) &= \sum_{i=1}^N \frac{1}{||w||}|w·x_i+b| \ (when\ \ y_i*(w·x_i+b)<0) \\&=-\frac{1}{||w||}\sum_{i=1}^N y_i*(w·x_i+b)\ (when\ \ y_i*(w·x_i+b)<0)\ 注:|y_i*(w·x_i+b)| = |w·x_i+b|\end{align}\]
不考虑系数\(\frac{1}{||w||}\)就是感知机学习的损失函数。
感知机损失函数的另一种理解:
因为最自然的使用误分类点的总数作为损失函数会因为sign函数的存在而无法很好的优化,所以直接去掉sign函数,使用\(-y_i*(w·x_i+b)\) 作为误分类点的损失,这样感知机的损失函数就可以写为:
\[L_3(w,b) = -\sum_{i=1}^N y_i*(w·x_i+b)\ \ (when\ \ y_i*(w·x_i+b)<0)\]
这样对于一个特定的样本点,损失函数\(L_3(w,b)\)是\(w,b\)的连续可导函数。
感知机学习算法
到此为止,我们已经把感知机学习问题转化为求解损失函数\(L_3(w,b)\)的最优化问题。
\[\mathop{min}_{w,b} L(w,b) = -\sum_{x_i \in M}y_i(w·x_i+b)\]
原始形式
感知机学习算法是误分类驱动的,可以采用随机梯度下降法(stochastic gradient descent)。对于训练中的某一时刻,误分类点集合\(M\)是固定的,那么损失函数\(L(w,b)\)的梯度为:
\[\bigtriangledown_wL(w,b) = -\sum_{x_i\in M}y_ix_i \\\bigtriangledown_bL(w,b) = -\sum_{x_i\in M}y_i\]
随机选取一个误分类点\((x_i, y_i)\),对\(w,b\)进行更新:
\[w \leftarrow w + \eta\Delta w \\\Delta w = - \frac{\partial L(w,b)}{\partial w} \\w \leftarrow w + \eta y_ix_i \\b \leftarrow b + \eta y_i\]
算法
对学习率\(\eta\)的一点说明:
在感知机算法中,最终的标签只与\(w\cdot x+b\)的符号相关,所以将\(w,b\)变为\(\alpha w, \alpha b\)对于最终的标签预测没有影响。那么学习率\(\eta\) 对于最后感知机的效果没有影响,感知机只与初始值和SGD的顺序有关(在一个epoch中数据的先后顺序)。
感知机原始算法实现
中文分词器github
垃圾邮件分类器github
算法收敛性证明
以后有机会书写
对偶形式
对偶形式的基本想法是,将w和b表示为实例\(x_i\)和标记\(y_i\)的线性组合的形式,通过求解其系数而求得\(w,b\)。
\[w = \sum_{i=1}^N\alpha_iy_ix_i \\b = \sum_{i=1}^N\alpha_iy_i\]
对于对偶形式的感知机学习算法,只需要判定\(y_i(\sum_{j=1}^N\alpha_jy_jx_jx_i + b) \le 0\)是否为真就行了,其中\(x_jx_i\)的值可以通过计算Gram矩阵很容易得到。
感知机预测
感知机模型主要是\(w,b\)的取值,对于新的数据点\(x\),只需要计算\(f(x)\)就可以得到x的标签了。
感知机变体
在普通的感知机的基础上,经过一些简单的变换还能够得到一些使用也特别广泛的感知机的变体。
多分类感知机
多分类感知机主要的想法是:为每一个类别\(i\)维护一个感知机\(w_i, b_i\),然后对于每个实例\(x_i\),分别计算得到n个类别的得分,取得分最高的类别为预测类别。
更新参数的时候如果类别预测错误,则把正确类别的所有参数+1,预测的错误类别的所有参数-1;如果预测正确则不进行参数更新。
结构化感知机(Structured Perceptron)(又名平均感知机)
结构化感知机是感知机用于序列标注任务的一个变体,具体的内容见下一次博客。