[Deep Learning] 感知器(perceptron)

感知器(Perceptron)


感知器的概念

感知器是人工神经网络中的一种典型结构,它的主要的特点是结构简单,对所能解决的问题存在着收敛算法,并能从数学上严格证明,从而对神经网络研究起了重要的推动作用。

它可以被视为一种最简单形式的前馈式人工神经网络,是一种二元线性分类器

那么什么是二元线性分类器呢?

首先要先理解什么是线性分类器——在机器学习领域,分类的目标是指将具有相似特征的对象聚集。而一个线性分类器则透过特征的线性组合来做出分类决定,以达到此种目的。对象的特征通常被描述为特征值,而在向量中则描述为特征向量。
[Deep Learning] 感知器(perceptron)
对于一个二元分类问题——可以设想成是将一个线性分类利用超平面划分高维空间的情况:在超平面一侧的所有点都被分类成“是”,另一侧则分成“否”。
[Deep Learning] 感知器(perceptron)

感知器的作用

感知器是二类分类的线性分类模型,它的思想很简单,在一个二维空间中,就是寻找一条直线将红点和蓝点分开(图3),类比到高维空间中,感知器尝试寻找一个超平面,将所有二元类别分开(图4)。
[Deep Learning] 感知器(perceptron)

图3 二维空间

[Deep Learning] 感知器(perceptron)

图4 三维空间


注意:无论是在二维空间中寻找线、三维空间中寻找平面还是高维空间中寻找超平面,这里所说的空间是指特征空间

如果我们找不到一条直线的话怎么办?找不到的话那就以为着类别线性不可分(图5),也就意味着感知器模型不适合该类的数据的分类。使用感知器一个最大的前提,就是数据需要是线性可分的
[Deep Learning] 感知器(perceptron)

图5 不可分数据

感知器的模型

[Deep Learning] 感知器(perceptron)
如果我们有n个样本,每个样本有m维空间和一个二元输出类别:
((x11,x21,...,xm11,xm1,y1),(x12,x22,...,xm12,xm2,y2),...,(x1n,x2n,...,xm1n,xmn,yn)((x_1^1,x_2^1,...,x_{m-1}^1,x_m^1,y_1),(x_1^2,x_2^2,...,x_{m-1}^2,x_m^2,y_2),...,(x_1^n,x_2^n,...,x_{m-1}^n,x_m^n,y_n)
感知器的目标是找到一个超平面
ω1x1+ω2x2+...+ωmxm+b=0\omega_1x_1+\omega_2x_2+...+\omega_mx_m+b=0
让其中一个类别的样本满足ω1x1+ω2x2+...+ωmxm+b>0\omega_1x_1+\omega_2x_2+...+\omega_mx_m+b>0,而另一类样本满足ω1x1+ω2x2+...+ωmxm+b<0\omega_1x_1+\omega_2x_2+...+\omega_mx_m+b<0,从而实现样本线性可分。但这样的超平面不是唯一的,感知器模型采取不同的初始值(ω0,b0)(\vec{\omega_0},b_0)解可能会不同。

我们用向量方式对上式进行表达:ωx+b=0\vec{\omega}\cdot\vec{x}+b=0,由此感知器模型可以定义为:
y=f(ωx+b)y=f(\vec{\omega}\cdot\vec{x}+b)

注意:感知器的**函数可以有很多选择,这里我们选择阶跃函数ff来作为**函数:
f(z)={1          z>00   otherwisef(z) = \left\{\begin{aligned} 1 \ \ \ \ \ \ \ \ \ \ z>0 \\ 0 \ \ \ otherwise \end{aligned}\right.

例如:将一个新的样本xn+1=(x1n+1,x2n+1,...,xm1n+1,xmn+1)\vec{x}^{n+1}=(x_1^{n+1},x_2^{n+1},...,x_{m-1}^{n+1},x_m^{n+1})代入训练好的模型ωx+b\vec{\omega}\cdot\vec{x}+b,当ωxn+1+b>0\vec{\omega}\cdot\vec{x}^{n+1}+b>0时,xn+1\vec{x}^{n+1}被分为1类,当ωxn+1+b0\vec{\omega}\cdot\vec{x}^{n+1}+b\leq0时,xn+1\vec{x}^{n+1}被分为0类。

感知器的训练过程

找到一个合适函数的过程就是感知器的训练过程,对下面具体的公式来说,就是找到一组合适的权重和偏置项,使得样本的输出与预期的结果接近,最好是完全一样。

一般情况下,需要对加权求和做一个偏置运算,这样训练感知器的时候,更加方便。感知器本质是一个线性函数,线性函数就是一条直线(不是准确说法,只是方便大家理解,二维空间下是直线,三维空间下是平面,高维空间下是超平面),所谓训练感知器就是调整直线,调整直线就是调整直线的斜率和截距。其中最后一项,作为加权求和的偏置项。
y=factivity(ω1x1+ω2x2+...+ωmxm+b)y = f_{activity}(\omega_1x_1+\omega_2x_2+...+\omega_mx_m+b)

感知器训练过程如下:

  • 随机初始化一组权重ω\vec{\omega}和偏置bb
  • 每次从训练数据中取出一个样本的输入向量x\vec{x},使用感知器模型计算其输出y^\hat{y}
  • 根据计算输出y^\hat{y},与样本实际值y,通过下面的感知器规则计算ω\vec{\omega}的调整值Δω\Delta\omega以及b的调整值Δb\Delta b
  • 根据上一步计算出来的调整值Δω\Delta\omegaΔb\Delta b,调整ω\vec{\omega}和b
  • 继续第二步,经过多轮迭代(即全部的训练数据被反复处理多轮),就可以训练出感知器的权重和偏置

ωiωi+Δωi\omega_i \leftarrow\omega_i+\Delta\omega_i
bb+Δbb \leftarrow b+\Delta b
其中:
Δωi=η(y^y)xi\Delta\omega_i = \eta(\hat{y}-y)x_i
Δb=η(y^y)\Delta b = \eta (\hat{y}-y)

以上感知器规则是由梯度下降法得来的,对于撸代码来说,知道这套规则就可以了,如果想知道具体的数学推导过程,可以自行了解一下,我也会在之后的文章中写关于梯度下降相关的内容。
若有错误,欢迎大家留言指正!谢谢!