感知机原理

前言

感知机是1957年,由Rosenblatt提出会,是神经网络和支持向量机的基础。

感知机的原理

感知机的思想很简单,比如我们在一个平台上有很多的男孩女孩,感知机的模型就是尝试找到一条直线,能够把所有的男孩和女孩隔离开。

感知机是二分类的线性模型,其输入是实例的特征向量,输出的是事例的类别,分别是+1和-1,属于判别模型。
image

感知机模型

感知机从输入空间到输出空间的模型如下:
\[ f(x)=sign(w\centerdot{x}+b) \]
\[ sign(x)= \begin{cases} -1& {x<0}\\ 1& {x\geq 0} \end{cases} \]

感知机的损失函数

我们首先定义对于样本\((x_i,y_i)\),如果\(w\centerdot{x_i}+b>0\)则记\(y_i=+1\),如果\(w\centerdot{x_i}+b<0\)则记\(y_i=-1\)

这样取y的值有一个好处,就是方便定义损失函数。因为正确分类的样本满足\(y_i(w\centerdot{x_i}+b)>0\),而错误分类的样本满足\(y_i(w\centerdot{x_i}+b)<0\)。我们损失函数的优化目标,就是期望使误分类的所有样本,到超平面的距离之和最小

所以损失函数定义如下:
\[ L(w,b)=-\frac{1}{||w||}\sum_{i\in{M}}y_i(w\centerdot{x_i}+b) \]
其中M集合是误分类点的集合。

不考虑\(\frac{1}{||w||}\),就得到感知机模型的损失函数:
\[ L(w,b)=-\sum_{i\in{M}}y_i(w\centerdot{x_i}+b) \]

为什么可以不考虑\(\frac{1}{||w||}\)

网上有人说\(\frac{1}{||w||}\)是个定值,但是个人觉得平面不唯一,这个值肯定也会变。通过参考他人观点结合思考,觉得原因可以列为以下两点。

  1. \(\frac{1}{||w||}\)不影响\(y_i(w\centerdot{x_i}+b)\)正负的判断,即不影响学习算法的中间过程。因为感知机学习算法是误分类驱动的,这里需要注意的是所谓的“误分类驱动”指的是我们只需要判断\(-y_i(w\centerdot{x_i}+b)\)的正负来判断分类的正确与否,而\(\frac{1}{||w||}\)并不影响正负值的判断。所以\(\frac{1}{||w||}\)对感知机学习算法的中间过程可以不考虑。
  2. \(\frac{1}{||w||}\)不影响感知机学习算法的最终结果。因为感知机学习算法最终的终止条件是所有的输入都被正确分类,即不存在误分类的点。则此时损失函数为0. 对应于\(-\frac{1}{||w||}\sum_{i\in{M}}y_i(w\centerdot{x_i}+b)\),即分子为0.则可以看出\(\frac{1}{||w||}\)对最终结果也无影响。

综上所述,即使忽略\(\frac{1}{||w||}\),也不会对感知机学习算法的执行过程产生任何影响。反而还能简化运算,提高算法执行效率。

感知机学习算法

感知机学习算法是对上述损失函数进行极小化,求得w和b。但是用普通的基于所有样本的梯度和的均值的批量梯度下降法(BGD)是行不通的,原因在于我们的损失函数里面有限定,只有误分类的M集合里面的样本才能参与损失函数的优化。所以我们不能用最普通的批量梯度下降,只能采用随机梯度下降(SGD)。目标函数如下:
\[ \min L(w,b)=-\sum\limits_{{{x}_{i}}\in{M}}{{{y}_{i}}(w\centerdot{{x}_{i}}+b)} \]

原始形式算法

输入:训练数据集\(T={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)}\)\(y_i\in{\{-1,+1\}}\),学习率\(\eta(0<\eta<1)\)

输出:\(w,b\);感知机模型\(f(x)=sign(w\centerdot{x}+b)\)

  1. 赋初值 \(w_0,b_0\)
  2. 选取数据点\((x_i,y_i)\)
  3. 判断该数据点是否为当前模型的误分类点,即判断若\(y_i(w\centerdot{x_i}+b)<=0\)则更新
    \[ w\leftarrow{w+\eta{y_ix_i}} \]
    \[ b\leftarrow{b+\eta{y_i}} \]
  4. 转到2,直到训练集中没有误分类点

对偶形式算法

输入:训练数据集\(T={(x_1,y_1),(x_2,y_2),...,(x_N,y_N)}\)\(y_i\in{\{-1,+1\}}\),学习率\(\eta(0<\eta<1)\)

输出:\(\alpha,b\);感知机模型\(f(x)=sign(\sum_{j=1}^n\alpha_jy_jx_j\centerdot{x}+b)\)

其中\(\alpha=(\alpha_1,\alpha_2,...,\alpha_n)^T\)

  1. 赋初值 \(\alpha_0,b_0\)
  2. 选取数据点\((x_i,y_i)\)
  3. 判断该数据点是否为当前模型的误分类点,即判断若\(y_i(\sum_{j=1}^n\alpha_jy_jx_j\centerdot{x}+b)<=0\)则更新
    \[ \alpha_i\leftarrow{\alpha_i+\eta} \]
    \[ b\leftarrow{b+\eta{y_i}} \]
  4. 转到2,直到训练集中没有误分类点

为了减少计算量,我们可以预先计算式中的内积,得到Gram矩阵

\[ G=[x_i,x_j]_{N×N} \]

原始形式和对偶形式的选择

  • 在向量维数(特征数)过高时,计算内积非常耗时,应选择对偶形式算法加速。
  • 在向量个数(样本数)过多时,每次计算累计和就没有必要,应选择原始算法

小结

感知机算法是一个简单易懂的算法,自己编程实现也不太难。前面提到它是很多算法的鼻祖,比如支持向量机算法,神经网络与深度学习。因此虽然它现在已经不是一个在实践中广泛运用的算法,还是值得好好的去研究一下。感知机算法对偶形式为什么在实际运用中比原始形式快,也值得好好去体会。

猜你喜欢

转载自www.cnblogs.com/huangyc/p/9706575.html