理解感知机模型

感知机是一种很传统和经典的分类算法了,现在机器学习的书基本上也很少详细讲了,大多还会简单介绍一下。看 ng 的机器学习课程,在讲 SVM 支持向量机的时候,从逻辑回归的代价函数直接修改到SVM的代价函数,实在难以理解,逻辑回归和SVM之间的关系和区别,还得好好想想

感知机模型有自身的局限性,它只能做线性分类。如果数据不是线性可分的,那还真没办法。但是了解感知机模型,对后面学习SVM很有帮助的

1. 感知机模型

感知机只能用来做线性分类,所谓线性分类是说,假设我们有一堆样本数据,我们必须找到一条线或者一个超平面,能把这堆样本划分到线的两边

preview

用数学的语言来说,如果我们有m个样本,每个样本对应于n维特征和一个二元类别输出,如下:

(x_1^{(0)}, x_2^{(0)}, ...x_n^{(0)}, y_0), (x_1^{(1)}, x_2^{(1)}, ...x_n^{(1)},y_1), ... (x_1^{(m)}, x_2^{(m)}, ...x_n^{(m)}, y_m)

我们的目标是找到这样一个超平面,即:

\theta_0 + \theta_{1}x_1 + ... + \theta_{n}x_{n} = 0

让其中一种类别的样本都满足\theta_0 + \theta_{1}x_1 + ... + \theta_{n}x_{n} > 0,让另一种类别的样本都满足\theta_0 + \theta_{1}x_1 + ... + \theta_{n}x_{n} < 0 ,从而得到线性可分。如果数据线性可分,这样的超平面一般都不是唯一的,也就是说感知机模型可以有多个解(而SVM模型就是要从这多个解里面找一个最好的)

我们可以把这个超平面简化成

f(x)=sign(w \cdot {x}+b)

其中w和x都是向量,b是超平面的偏移。因此,感知机的模型可以定义为:

sign(x)= \begin{cases} -1& {x<0}\\ 1& {x\geq 0} \end{cases}

对于wx + b > 0的样本,恒有y>=0,对于wx + b < 0的样本,恒有y<0

2. 损失函数

损失函数的一个自然选择是误分类点的总数,但是这样的损失函数不是参数w和b的连续可导函数,不易优化。另外一种选择是所有误分类点到超平面的总距离

备注:我对这个地方还是比较困惑的。为啥不是所有分类点到超平面的距离最小?只看误分类点计算出来的模型参数,未必是最优的吧。损失函数作为机器学习的目标,只看误分类点会不会有问题。但是目前看大家都是这么理解的,姑且先这么理解

超平面外的任意一个点到超平面的距离可以定义为 \frac{|w \cdot x_0 + b|}{||w||}

其中||w||是w的L2范数,也叫欧式距离,||w|| = \sqrt{w_0^2 + w_1^2 + ... + w_n^2}

假设我们把满足wx + b > 0的样本输出定义为1,把满足wx + b < 0的样本输出定义为-1。那么所有误分类点到超平面的距离之和为,M 是所有误分类点的集合:

J = \frac {{}-\sum_{x_i \in M} y_i(w*x_i + b)} {||x||}

这里面由于分子分母都含有w变量,并且分子的w和分母的||w||是具有正相关性的,因此对于求解最小代价函数来说,可以省略掉一边。传统的感知机模型,选择的是省略掉分母,而后来的SVM模型选择的是省略掉的分子

因此最终感知机模型的损失函数简化为:

J = -\sum_{x_i \in M} y_i(w*x_i + b)

这个损失函数就是感知学习机的经验风险函数。它是w,b的连续可导函数。显然它是非负函数。如果没有误分类点,则损失函数为0,而且误分类点越少,误分类点离超平面越近,损失函数越小。

3. 梯度下降求解

有了损失函数的定义,J = -\sum_{x_i \in M} y_i(w*x_i + b)

我们就很容易求得w,b变量各自的梯度

w的梯度是:\nabla_w J = -\sum_{x_i \in M} y_i*x_i

b的梯度是:\nabla_w J = -\sum_{x_i \in M} y_i

计算出梯度之后,随机梯度下降的过程就很简单了

  1. 选取初始值w0,b0
  2. 在训练集中选取数据x(i),y(i)
  3. 如果y(i)(w⋅x(i)+b)⩽0,则w←w+ηy(i)x(i),b←b+ηy(i)
  4. 转至步骤(2),直至训练集里面的每个点都不是误分类点,这个过程中训练集中的点可能会被重复的选中并计算。

4. 感知机的对偶模式

其实不知道为啥叫对偶模式。。看半天没搞清楚这个名字是怎么来的

感知机的对偶模式,其实是个非常简单的东西。你看前面梯度下降的时候,我们求偏导得到:

w的梯度是:\nabla_w J = -\sum_{x_i \in M} y_i*x_i

b的梯度是:\nabla_w J = -\sum_{x_i \in M} y_i

然后梯度下降的过程,就是这个不停的用这个偏导修正参数w,b。这个偏导不就是xy的内积么,那如果数据量比较小的时候,我们直接矩阵运算一把提前算好所有xy的内积,然后梯度下降的过程中直接查找表就可以了

完了

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注