感知机可以说是最古老的分类方法之一了,在1957年就已经提出。今天看来它的分类模型在大多数时候泛化能力不强,但是它的原理却值得好好研究。因为研究透了感知机模型,学习支持向量机的话会降低不少难度。同时如果研究透了感知机模型,再学习神经网络,深度学习,也是一个很好的起点。这里对感知机的原理做一个小结。
1. 感知机模型
感知机的思想很简单,比如我们在一个平台上有很多的男孩女孩,感知机的模型就是尝试找到一条直线,能够把所有的男孩和女孩隔离开。放到三维空间或者更高维的空间,感知机的模型就是尝试找到一个超平面,能够把所有的二元类别隔离开。当然你会问,如果我们找不到这么一条直线的话怎么办?找不到的话那就意味着类别线性不可分,也就意味着感知机模型不适合你的数据的分类。使用感知机一个最大的前提,就是数据是线性可分的。这严重限制了感知机的使用场景。它的分类竞争对手在面对不可分的情况时,比如支持向量机可以通过核技巧来让数据在高维可分,神经网络可以通过激活函数和增加隐藏层来让数据可分。
用数学的语言来说,如果我们有m个样本,每个样本对应于n维特征和一个二元类别输出,如下:
我们的目标是找到这样一个超平面,即:
让其中一种类别的样本都满足
为了简化这个超平面的写法,我们增加一个特征
而感知机的模型可以定义为:
2. 感知机模型损失函数
为了后面便于定义损失函数,我们将满足
由于
其中
我们假设所有误分类的点的集合为M,则所有误分类的样本到超平面的距离之和为:
这样我们就得到了初步的感知机模型的损失函数。
我们研究可以发现,分子和分母都含有
题外话,如果大家了解过支持向量机,就发现支持向量机采用的是固定分子为1,然后求
3. 感知机模型损失函数的优化方法
上一节我们讲到了感知机的损失函数:
但是用普通的基于所有样本的梯度和的均值的批量梯度下降法(BGD)是行不通的,原因在于我们的损失函数里面有限定,只有误分类的M集合里面的样本才能参与损失函数的优化。所以我们不能用最普通的批量梯度下降,只能采用随机梯度下降(SGD)或者小批量梯度下降(MBGD)。
感知机模型选择的是采用随机梯度下降,这意味着我们每次仅仅需要使用一个误分类的点来更新梯度。
损失函数基于
由于我们采用随机梯度下降,所以每次仅仅采用一个误分类的样本来计算梯度,假设采用第i个样本来更新梯度,则简化后的
其中
4. 感知机模型的算法
前两节我们谈到了感知机模型,对应的损失函数和优化方法。这里我们就对感知机模型基于随机梯度下降来求\theta向量的算法做一个总结。
算法的输入为m个样本,每个样本对应于n维特征和一个二元类别输出1或者-1,如下:
输出为分离超平面的模型系数
算法的执行步骤如下:
- 定义所有
为1。选择 向量的初值和步长 的初值。可以将 向量置为0向量,步长设置为1。要注意的是,由于感知机的解不唯一,使用的这两个初值会影响 向量的最终迭代结果。 - 在训练集里面选择一个误分类的点
, 用向量表示即 ,这个点应该满足: - 对
向量进行一次随机梯度下降的迭代: - 检查训练集里是否还有误分类的点,如果没有,算法结束,此时的
向量即为最终结果。如果有,继续第2步。
5. 感知机模型的算法对偶形式
上一节的感知机模型的算法形式我们一般称为感知机模型的算法原始形式。对偶形式是对算法执行速度的优化。具体是怎么优化的呢?
通过上一节感知机模型的算法原始形式
其中
每一个样本
由于步长
在每一步判断误分类条件的地方,我们用
样本的内积矩阵称为Gram矩阵,它是一个对称矩阵,记为
这里给出感知机模型的算法对偶形式的内容。
算法的输入为m个样本,每个样本对应于n维特征和一个二元类别输出1或者-1,如下:
输出为分离超平面的模型系数
算法的执行步骤如下:
定义所有
为1,步长 初值,设置 的初值0。可以将 设置为1。要注意的是,由于感知机的解不唯一,使用的步长初值会影响 向量的最终迭代结果。计算所有样本内积形成的Gram矩阵G。
在训练集里面选择一个误分类的点
,这个点应该满足: , 在检查是否满足时可以通过查询Gram矩阵的 的值来快速计算是否小于0。对
向量的第 个分量进行一次更新:检查训练集里是否还有误分类的点,如果没有,算法结束,此时的
向量最终结果为下式。如果有,继续第2步。其中
为 向量的第j个分量。
6. 小结
感知机算法是一个简单易懂的算法,自己编程实现也不太难。前面提到它是很多算法的鼻祖,比如支持向量机算法,神经网络与深度学习。因此虽然它现在已经不是一个在实践中广泛运用的算法,还是值得好好的去研究一下。感知机算法对偶形式为什么在实际运用中比原始形式快,也值得好好去体会。