感知机

一个简单的分类问题

感知机(perceptron)是机器学习中最简单最基础的模型。同时它也是构成神经网络的基础,
先来看一个数学问题,下图是一个二维平面图,上面分散了蓝色和红色两种颜色的点。
感知机

现在用一条直线把这两种颜色的点分开,就像下图一样
感知机

我们稍微逆时针旋转一下分割线可以发现它仍然能够分割两种颜色的点。因此,这样的分割线不止一条,实际上存在无数条。
我们人眼很容易用尺子对着平面图画出这样的一条分割线,但是如何让程序找出这样一条线呢?这就是我们要讨论的问题。

数学抽象化

讲解这样一个分类问题,避免不了引入一些数学符号。
我们是否还记得中学的时候,数学课本上用ax+by+c=0表示一条二维平面的直线。我们现在也用同样的方法表示要求的这条直线,但是为了和大部分教程的统一,表示的时候换下符号。我们用w1x1+w2x2+b=0表示这条直线,注意符号的意义变了,b变成了直线的截距(偏移),而原来的x,yx1,x2代替。

我们如果把任意一个红色点代入分割线函数中都会发现结果是大于0的(因为红色点在直线之上),反之蓝色的都是小于0的。因此为了区分不同颜色的点,我们用1表示红色,-1表示蓝色。这里我们暂不考虑点落在直线上的情况,也就是等于0的时候。

现在简化下表示的形式。我们用向量w表示[w1,w2]。我们用向量x表示[x1,x2]。用y表示它们的颜色,当然y取值范围为{1,-1}。
结合起来,表示某一点的信息如下:

(x(i),y(i))

上标表示第i个点。

我们很容易得到:

y(i)={11if wx(i)<0if wx(i)>0

我们可以引入一个符号函数使得式子更加简单:

sign(x)={11if x<0if x>0
y(i)=sign(wx(i)+b)

OK!如果此时我们平面新添加了一个点,如何判断它的颜色呢?我们可以把它的标点传给x(i),然后得到一个相应的y(i),依此可以判断它的颜色。

算法

到此我们理清楚了所要求出的分割线与平面中点的关系了。

如何求出这样一条直线呢,也就是如何求出式子中的w,b

如果我们分割线能正确区分开两种颜色点的话,那么对于红色点
wx(i)+b>0 而此时y(i)=1,因此y(i)(wx(i)+b)>0。对于蓝色的点,不难分析出式子也是成立的。于是我们可以得出这样一个结论:对于被正确分类的点来说,不管什么颜色,y(i)(wx(i)+b)>0,反过来,对于被错误分类的点来说,不管什么颜色 y(i)(wx(i)+b)<0y(i)(wx(i)+b)>0

我们不妨随机初始化w,b,得到一条任意的直线,这条直线来划分平面的话肯定会存在许多被它分错的点,我们称之为误分点。

来复习一个几何公式:

1wwx0+b

该式子表示某一点到直线的距离,这里w等于w1平方与w2平方和再开根号。
因此某一个误分点到直线的距离如下:
1wyi(wxi+b)

把所有误分点的距离加起来如下:
1wxiMyi(wxi+b)

这里M是所有误分点的集合。

我们的目的是调整w,b使得上面这个“距离和“为0,一旦为0就表示所有的点都被正确分割了。这里的1w不仅看上去别扭,也不指望它为0,所以干脆剔除了。得到:

L(w,b)=xiMyi(wxi+b)

OK!这个式子好看多了,这样一个“距离和“函数称之为损失函数,或者叫代价函数。
我们现在在损失函数的基础上换个花样,定义一下目标函数:
minL(w,b)=xiMyi(wxi+b)

这个函数的意思就是L取最小值的时,w,b的取值是什么。刚刚不是说要求L取0吗?!这里怎么改成最小值了!!原因是要考虑的两类不可分的情况。如下图,你无法用一条直线分开两种颜色的点。但我们可以尽量减小这个损失L,也就是说使得分割线尽可能分开它们。

感知机

现在需要点高等数学的姿势了,我们要极小话L,就需要未知参数沿着梯度的方向减小。对w,b进行求梯度

wL(w,b)=xiMyixibL(w,b)=xiMyi

对某一个误分点的话,w,b按照梯度减小的公式如下:
ww+ηyixibb+ηyi

η表示步长,也就是w,b的变化幅度。
好了!只要我们让w,b按照这样的方式去调整更新,最终得到的直线就能划分开不同颜色的点(这里暂不考虑不可划分的情况)。
w,b调整到什么时候为止呢?我们的算法什么时候停下来呢?那就是更新到所有的点都能满足y(i)(wx(i))>0的时候,也就是所有点能把分割线正确的分开了为止。
因此我们的核心算法十分十分简单!
while(y(i)(wx(i))<0)
{
ww+ηyixibb+ηyi
}
通俗地讲就是,只有还有一个点没分对,你就一直更新w,b

不难发现,我们对w,b初始化为不同的值时,最终得到的w,b也就不同了。这也和我们可以找出无数条这样的分割线的事实吻合了。

来看看程序是如何通过调正w,b,来不断减小L,从而找出一条理想的分割线的。程序刚开始画的线与最终理想的线相差很大,后来通过不断地学习,修正自己,达到最终的效果。(下图会循环播放)

感知机
Python代码实现戳这里

总结

我们这样一个在二维平面找分割线的模型就被称之为感知机,延伸到三维,我们找的不是分割线了而是分割面,延伸到多维,找的就是超平面了。多维相比二维只是在w,x上添加维度,其它都一样。