感知机(Perceptron)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了感知机(Perceptron)相关的知识,希望对你有一定的参考价值。

参考技术A

在之前的文章中我们已经讲过了逻辑回归分类器,现在趁热打铁总结一下与逻辑回归非常相似的感知机模型。感知机模型是一个非常古老的分类算法,现在很少会单独使用它,但是它的原理简单有效,很值得学习和理解,从原理上来说,感知机模型是神经网络和支持向量机的基础,理解了感知机有利于理解支持向量机和神经网络的原理。

在 广义线性模型(4)逻辑回归 中我们说逻辑回归可以视为包含一个线性回归和一个值域映射两个过程,如果拿逻辑回归与感知机作比较的话,可以说感知机也同样包括这两个过程,只不过它的值域映射比逻辑回归简单很多,感知机直接将线性模型的输出映射为+1和-1,即需要预测的两个类别上,正可谓简单粗暴。所以说,感知机也是线性模型,用来处理线性可分的二分类问题,同样属于判别模型。

感知机假设数据线性可分的,希望通过学习得到一个线性的决策边界,将训练数据集正样本点和负样本点完全正确分开的分离,在决策边界一侧为正样本,另一侧为负样本,这个思路跟逻辑回归是一样的。

感知机模型可以表示为下式,其中 函数将线性模型的输出映射为预测类别:

由点到超平面的距离计算方法可知: 代表了样本点到决策边界的距离(文章没有用 的形式,抛弃了常数项的问题,其实是不准确的,若有看官,还请不要介意);

同时我们可知, 的样本类别输出值取为1,满足 的样本类别输出值取为-1,因此正确分类的样本满足 ,而错误分类的样本满足 , 表示了错误分类的样本到决策超平面的距离,感知机损失函数的优化目标,就是期望使错误分类的所有样本到超平面的距离之和最小(正样本+1,负样本-1这样的定义方式使得定义损失函数变得很方便),损失函数为:

式中,M为样本中所有错误分类样本点的集合。实际上,我们会把损失函数中参数的L2正则项 扔掉,认为它不会影响优化结果,即得到损失函数:

为什么可以不考虑 呢? 搜索解空间的时候, 会一直在变化啊?我觉得这个挺难理解的,根据资料及猜测,我觉得勉强能接受的原因为:

确定了损失函数的形式,接下来就要进行损失函数的优化,还是使用梯度下降,由于损失函数中只有错误分类的样本点才参与计算,所以不需要使用普通的批量梯度下降了,我们选择使用 随机梯度下降 每次迭代只使用一个错误分类的样本来对参数进行更新

感知机的学习算法的原始形式即直接使用梯度下降,其学习过程为:

可以发现,在原始形式中,每一轮迭代都需要判断各个样本点是不是错误分类点,既对于每个样本点 都需要计算 ,向量内积 的时间复杂度为 ,因此总的时间复杂度为 ,其中N为样本点数量,k为迭代次数(虽然每次迭代不需要全部遍历N个样本,不过表达时间复杂度时可以去掉因子保留变量,表示成 ),这个时间复杂度还是比较高的,有没有更快捷的计算方法呢?我们来看看感知机的学习算法的对偶形式。

什么叫对偶形式?这里的对偶可不是“三尺剑,六钧弓”的意思,优化理论中的对偶问题是指每一个线性规划问题(称为原始问题)有一个与它对应的对偶线性规划问题(称为对偶问题),原始问题与对偶问题的解是对应的,得出一个问题的解,另一个问题的解也就得到了,可以简单的理解为从不同角度看待同一个问题,通过改变这个问题的形式使得我们更好求解。

根据感知机学习算法的原始形式可知,只有错误分类的样本点才会用于梯度下降计算,对于被 次误分类而更新的样本 ,它参与 迭代的次数同样为 。如果令参数 初始值为 , 这样我们的 的表达式可以写为:

表示对全部样本 中的每个个样本点进行 次梯度下降,其中没被错误分类过的样本点 。引用知乎上一个答案对 的理解:

这样参数 的学习问题就转变成了样本错误分类次数 的学习问题,此之谓“对偶”也。这样做的好处是什么呢?原始形式的痛点在于 中的内积运算,在对偶问题中转变为:

由内积 转变为内积 ,区别是 是已知的,可以提前通过矩阵运算得到Gram矩阵保存下来重用,样本循环和迭代的时间复杂度不变, 个 维向量的内积计算提前,所以时间复杂度大概可以表示为 ,与 倒不太好比较,不过这里按矩阵运算的时间复杂度完全没有优化来计算的,实际肯定比这小得多,并且工程上矩阵运算都是高度优化过的,非常快,所以对偶形式在使用效率上是很有优势的。

对偶形式的学习过程为:

感知机算法原理很简单,但其中很多思路很棒,所以由它发展出了神经网络、支持向量机这样的更复杂、更准确的算法,搞懂了感知机模型的基本原理,接下来我们就来写一写跟它很相似的支持向量机~



主要参考

《统计学习方法》 李航
感知机的损失函数为什么可以采用函数间隔(忽略1/||w||)?
如何理解感知机学习算法的对偶形式?

[笔记-统计学习方法]感知机 perceptron

前几天认把感知机这一章读完了,顺带做了点笔记
现在把笔记做第三次的整理
(不得不说博客园的LaTex公式和markdown排版真的不太舒服,该考虑在服务器上建一个博客了)

零、总结

  1. 适用于具有线性可分的数据集的二分类问题,可以说是很局限了
  2. 感知机本质上是一个分离超平面
  3. 在向量维数(特征数)过高时,选择对偶形式算法
    在向量个数(样本数)过多时,应选择原始算法
  4. 批量梯度下降和随机梯度下降的区别和优势
    参考链接:随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )的公式对比、实现对比
  • 批量梯度下降(BGD, Batch Gradient Descent)
    $ \theta \leftarrow \theta + \eta \sum \frac{\partial L}{\partial \theta}$
    即多次做全局样本的参数更新
    缺点:计算耗时
    优点:可以趋向全局最优,受数据噪音影响少
  • 随机梯度下降(SGD, Srochastic Gradient Descent)
    $ \theta \leftarrow \theta + \eta \frac{\partial L}{\partial \theta}$
    即多次做单个样本的参数更新
    缺点:训练耗时较短
    优点:不一定趋向全局最优(往往是最优/较优,单峰问题除外),受数据噪音影响大

一、模型

输入空间 $ \mathcal{X} \subseteq R^n $
输出空间 $ \mathcal{Y} \subseteq {-1, +1} $
假设空间 $ \mathcal{F} \subseteq {f|f(x) = \omega \cdot x + b} $
参数 $ \omega \in R^n, b \in R $
模型 $ f(x) = sign(\omega \cdot x + b) $

其中
符号函数为
\[ sign(x)=\left\{\begin{matrix} +1 , x \geqslant 0\\ -1 , x \geqslant 0 \end{matrix}\right. \]

线性方程
$ \omega \cdot x + b $
可以表示为特征空间 $ R^n $中的一个分离超平面

二、策略

(定义的损失函数,并极小化损失函数)
(注意损失函数非负的性质)

为了使损失函数更容易优化,我们选择误分类点到超平面的距离作为损失函数
任意向量\(x \in R^n\)距分离超平面的距离为
$ S=\frac{1}{|\omega|}|\omega \cdot x + b| $

接下来优化一下这个距离,让它更好的成为一个损失函数

  1. 为了连续可导,去绝对值
    $ S=-\frac{1}{|\omega|} y_i(\omega \cdot x + b) $
  2. 去掉不相关的系数(避免浪费计算),得到
    $ L(\omega, b)=-\sum_{x_i \in M} y_i(\omega \cdot x + b) $
    其中$ M $为误分类点集合

三、算法

(如何实现最优化问题)
注意最终训练出的模型参数的值取决于初值和误分类点的选取,所以一般值不同

为了极小化损失函数,我们采用梯度下降的方法

  1. 原始形式算法
  • 赋初值 $ \omega \leftarrow 0 , b \leftarrow 0 $
  • 选取数据点 $ (x_i, y_i) $
  • 判断该数据点是否为当前模型的误分类点,即判断若$ y_i(\omega \cdot x + b) <=0 $
    则更新
    \[ \begin{matrix} \omega &\leftarrow \omega + \eta n_ix_iy_i \\ b &\leftarrow b + \eta n_iy_i \end{matrix}\]
  1. 对偶形式算法
    注意到原始形式算法中,最终训练好的模型参数是这样的,其中$ n_i $表示在第i个数据点上更新过几次
    \[ \begin{matrix} \omega &= \eta \sum_i n_ix_iy_i \\ b &= \eta \sum_i n_iy_i \end{matrix} \]
    于是我们可以作出以下简化
  • 赋初值 $ n \leftarrow 0, b \leftarrow 0 $
  • 选取数据点 $ (x_i, y_i) $
  • 判断该数据点是否为当前模型的误分类点,即判断若$ y_i(\eta \sum n_iy_ix_i \cdot x + b) <=0 $
    则更新
    \[ \begin{matrix} n_i &\leftarrow n_i + 1 \\ b &\leftarrow b + \eta y_i \end{matrix}\]
    为了减少计算量,我们可以预先计算式中的内积,得到Gram矩阵
    $ G=[x_i, x_j]_{N \times N} $
  1. 原始形式和对偶形式的选择
    相见知乎如何理解感知机学习算法的对偶形式?
    在向量维数(特征数)过高时,计算内积非常耗时,应选择对偶形式算法加速
    在向量个数(样本数)过多时,每次计算累计和(对偶形式中的\(\omega\))就没有必要,应选择原始算法

以上是关于感知机(Perceptron)的主要内容,如果未能解决你的问题,请参考以下文章

感知机(Perceptron)

感知机(Perceptron)

matlab 实现感知机线性二分类算法(Perceptron)

感知机算法(Perceptron Learning Algorithm)

[机器学习]感知机(Perceptron)算法的MATLAB实现

Numpy实现Perceptron(感知机)