Reference:【机器学习】感知机原理详解_感知机算法原理-CSDN博客
感知机(perceptron)是二分类的线性分类模型,属于监督学习算法
- 感知机模型的输入是未知类型的特征向量,输出为该特征向量的类别(只能取正负类)
- 训练的输入是已知类型的特征向量,输出是一个超平面方程,能把训练数据集中的正实例点和负实例点毫无差错地分隔开来通过该方程,输入特征向量通过其是否大于0可分为正/负类(取+1和-1)。
- 为求得超平面,感知机基于误分类的损失函数,利用梯度下降法对损失函数进行最优化求解。
- 如果训练数据集是线性可分的,则感知机一定能求得分离超平面。如果是非线性可分的数据,则无法获得超平面。感知机分为原始形式和对偶形式
- 感知机是神经网络和支持向量机的基础。
下图中\(w\cdot x + b = 0\)为感知机训练完毕后输出的结果确定了最佳的参数w和b后的超平面方程,再外侧加上sign函数就变为感知机模型的方程
w 是权重向量(超平面的法向量) ,x 是样本特征向量 ,b 是偏置(超平面的截距) 。w 决定超平面的方向 ,b 决定超平面在特征空间中的位置 。这个超平面将样本点分为正负两类。
在数学里,\(\text{sign}\)函数即符号函数,定义为:
- \(x>0\)时,\(\text{sign}(x)=1\);
- \(x = 0\)时,\(\text{sign}(x)=0\);
- \(x<0\)时,\(\text{sign}(x)= – 1\) 。
超平面Hyperplane
在 \( n \) 维空间中,超平面是一个 \( n – 1 \) 维的线性子空间,其方程为: \[ \mathbf{w}^T \mathbf{x} + b = 0 \]
- w是法向量(垂直于超平面的向量),决定了超平面的方向。
- b是截距,决定了超平面到原点的距离。
- x是空间中的任意点
- 在二维空间(平面):超平面是一条直线,方程为 w1x1+w2x2+b=0。
- 在三维空间:超平面是一个平面,例如 w1x1+w2x2+w3x3+b=0。
- 更高维度:超平面是 n−1维的“平面”,用于分割 n维空间。
Q1:超平面和普通平面有什么区别?
A1:超平面是 nn 维空间中 n−1n−1 维的子空间,而“平面”通常特指三维空间中的二维平面。
Q2:如何找到最优超平面?
A2:通过优化算法(如梯度下降、SMO)最小化损失函数或最大化间隔。
感知机损失函数
为确定感知机模型中的参数\(\mathbf{w}\)(权重向量)和b(偏置 ),得先定义合适的(经验)损失函数,再通过极小化损失函数来求解参数
理论上,误分类点的总数似乎是损失函数的一个合理选择。但从优化角度看,这个函数不连续且不可导,难以用常见的基于梯度的优化方法去处理。因此,感知机选用误分类点到超平面的总距离作为损失函数 。
假设直线方程为 \( Ax + By + C = 0 \),点 \( P \) 的坐标为 \((x_0, y_0)\)。点到直线的距离公式为:\[
d = \frac{|A x_0 + B y_0 + C|}{\sqrt{A^2 + B^2}}
\]
我们假设超平面是 \( h = \mathbf{w} \cdot \mathbf{x} + b \),样本点 \( \mathbf{x}’ \) 到超平面的距离如下:\[
d = \frac{|\mathbf{w} \cdot \mathbf{x}’ + b|}{\|\mathbf{w}\|}
\]这里 \(\|w\|\) 是 w 的 \(L_2\) 范数。
对于误分类的数据 \((x_i, y_i)\) (无论是正例或负例),一定有:
\(y_i(\boldsymbol{w}\cdot\boldsymbol{x}_i + b) \leq 0\)。误分类点 \(x_i\) 到超平面 S 的距离添加负号使其为正: \(-\frac{1}{\|w\|}y_i(w\cdot x_i + b)\)
假设超平面 S 的误分类点集合为 M,那么所有误分类点到超平面 S 的总距离为: \(-\frac{1}{\|w\|}\sum_{x_i\in M}y_i(w\cdot x_i + b)\)
在感知机的学习算法中,损失函数的目标不是精确算距离所以不考虑距离的标准化项 \(\frac{1}{\|w\|}\) ,而只考虑是否错分和错分 “程度”,对错分的点进行“惩罚”,错得越多惩罚越大。于是得到感知机的损失函数(经验风险): \(L(w, b) = -\sum_{x_i\in M}y_i(w\cdot x_i + b)\)
只关心哪些点被分错了;
感知机学习算法
至此,感知机学习问题就转化为了求解损失函数L(w,b)的最优化问题。
由于感知机学习算法是误分类驱动的,这里基于随机梯度下降法(SGD)进行优化求解。即任意选取一个超平面w 0 b0,然后用梯度下降法不断地极小化损失函数。
这里不能使用基于所有样本的批量梯度下降(BGD)进行优化。这是因为我们的损失函数里面有限定,只有误分类的M集合里面的样本才能参与损失函数的优化。所以我们不能用最普通的批量梯度下降,只能采用随机梯度下降(SGD)或者小批量梯度下降(MBGD)
大致过程
损失函数梯度
- 梯度计算:损失函数\(L(\mathbf{w}, b)\)关于权重\(\mathbf{w}\)和偏置b的梯度分别为:
- \(\nabla_{\mathbf{w}}L(\mathbf{w}, b)=-\sum_{x_i\in M}y_ix_i\) ,这个梯度反映了权重\(\mathbf{w}\)在误分类点集合M上的变化趋势,负号表明更新方向是使损失函数减小的方向。
- \(\nabla_{b}L(\mathbf{w}, b)=-\sum_{x_i\in M}y_i\) ,它体现了偏置b在误分类点集合上的变化情况,同样负号指示了减小损失函数的更新方向。
输入部分
- 训练数据集:输入的训练数据集\(D = \{(x_i, y_i)\}_{i = 1}^{m}\) ,其中\(x_i\)是样本的特征向量,注意下面例题中给出的并不是数据集而只是特征向量,它属于n维实数空间\(\mathbf{R}^n\)的子集\(\mathbf{X}\) ,描述了样本的各种属性信息;\(y_i\)是样本对应的类别标签,取值只有\(+1\)和\(-1\)两种,分别代表不同类别 ,用来指示样本\(x_i\)的类别归属。
- 学习率:\(\eta\)为学习率,范围在\(0 < \eta \leq 1\) 。它控制着每次模型参数更新的幅度。学习率过小,模型收敛速度会很慢,需要更多迭代次数才能达到较好效果;学习率过大,可能导致参数更新时跳过最优解,出现震荡甚至不收敛的情况。
过程部分
- 初始化:选取初始的权重向量\(w_0\)和偏置\(b_0\) 。初始值的选取会影响算法收敛速度和最终得到的解,一般可随机选取或设为较小的值,但不同初值可能使算法最终找到不同的超平面来划分数据(因为感知机解不唯一 )。
- 样本选取:从训练数据集中随机挑选一个数据点\((x_i, y_i)\) 。这种随机选取方式,避免了对数据顺序的依赖,有助于更全面地遍历数据集来寻找最优解。
- 误分类判断:只要\(y_i(w\cdot x_i + b) \leq 0\) 成立,就可以确定样本点\(x_i\)是当前感知机模型的误分类点。\(w\cdot x_i + b\)计算的是样本点\(x_i\)到超平面\(w\cdot x + b = 0\)的带符号距离 。这里的 “带符号” 是说距离有正负之分。可以类比二维平面上点到直线的距离,在高维空间中进行了推广。
当样本真实标签\(y_i = +1\) (正类 )时,如果\(w\cdot x_i + b \leq 0\) ,意味着根据当前超平面计算,样本点\(x_i\)被预测为负类,和它真实的正类标签不符,所以是误分类。
当样本真实标签\(y_i = -1\) (负类 )时,如果\(w\cdot x_i + b \geq 0\) ,说明根据当前超平面,样本点\(x_i\)被预测为正类,和它真实的负类标签不符,也是误分类。 - 参数更新:如果判断为误分类点,就按照\(w \leftarrow w + \eta y_i x_i\)和\(b \leftarrow b + \eta y_i\)来更新权重w和偏置b 。从几何角度理解,w的更新是朝着使误分类点正确分类的方向调整超平面的法向量(权重向量w决定超平面方向 );b的更新是在调整超平面的位置(类似直线方程\(y = kx + b\)中b对直线位置的影响在高维的推广 )。w下降的方向xy和b下降的方向y为损失函数的梯度方向
- 迭代循环:重复步骤 3 和 4 ,不断从训练集中选点、判断误分类并更新参数,直到训练集中不存在误分类点,此时认为模型找到了能将训练数据分开的超平面。
输出部分-超平面方程
- 最终输出经过训练得到的权重w和偏置b (超平面),由它们确定感知机模型\(f(x) = \text{sign}(w \cdot x + b)\) 。对于新输入的样本x ,计算\(w \cdot x + b\)的值,若大于 0 ,\(\text{sign}\)函数输出\(+1\) ,判定为正类;若小于 0 ,输出\(-1\) ,判定为负类;若等于 0 ,一般可按约定归为某一类。 而由于初始值选取和误分类点选取顺序不同,感知机算法可能得到不同的w和b ,即解不唯一。
例题:
在感知机模型中 \(y_i\) 只能取\(-1\) 或 1 ,代表样本的类别(负类或正类 ) 。这里给出的 \(x_1=(3,3)^T\) 、\(x_2=(4,3)^T\) 只是样本的特征向量 ,描述样本在特征空间中的位置和属性等信息
- 注意\(w=(w^{(1)}, w^{(2)})^T\) 表示权重向量 ,之所以写成\(w^{(1)}\) 和\(w^{(2)}\) ,是因为样本特征向量\(x=(x^{(1)}, x^{(2)})^T\) 是二维的 。
- 正实例点还是负实例点,并不是代入公式计算得出的,而是在取样时人为设定的
- 上标通常表示向量的分量或维度。例如:\(x^{(1)}\) 表示特征向量 x 的第一个分量(维度)。\(x^{(2)}\) 表示特征向量 x 的第二个分量(维度)。对于二维向量 \(x = (3, 3)^T\),有 \(x^{(1)} = 3\),\(x^{(2)} = 3\)。
对偶形式
前面介绍了感知机算法的原始形式,下面要介绍的对偶形式是对算法执行速度的优化。感知机原始形式是直接对权重w和偏置b进行更新,对偶形式则是把w和b表示成训练样本的线性组合,因为不同样本对w和b更新的贡献不同,没被误分类过的样本贡献为0 ,被多次误分类的样本贡献大,从而减少计算量。
当w初始化为0向量时,最终\(w = \sum_{i = 1}^{n}\alpha_iy_ix_i\) ,\(b = \sum_{i = 1}^{n}\alpha_iy_i\) 。这样就将对w和b的更新转化为对\(\alpha_i\)的更新。
则对偶形式模型为:
\[
f(\mathbf{x}) = \mathrm{sign} \left( \sum_{j=1}^{N} \alpha_j y_j \mathbf{x}_j \cdot \mathbf{x} + \sum_{j=1}^{N} \alpha_j y_j \right)
\]
这样的话,在每一步判断误分类条件的地方,我们用 \(y_i (\mathbf{w} \cdot \mathbf{x}_i + b) \leq 0\) 的变种 \(y_i \left( \sum_{j=1}^n \alpha_j y_j \mathbf{x}_j \cdot \mathbf{x}_i + b \right) \leq 0\) 来判断误分类。
这个判断误分类的形式里面是计算两个样本 \(\mathbf{x}_i\) 和 \(\mathbf{x}_j\) 的内积,而且这个内积计算的结果在下面的迭代次数中可以重用。如果我们事先用矩阵运算计算出所有的样本之间的内积,那么在算法运行时,仅仅一次的矩阵内积运算比多次的循环计算省时。计算量最大的判断误分类这儿就省下了很多的时间,这也是对偶形式的感知机模型比原始形式优的原因。
对偶形式中训练实例仅以内积的形式出现,为了减少计算量,我们可以预先将训练集样本间的内积计算出来,也就是Gram矩阵: