其他机器学习系列文章见于专题:机器学习进阶之路——学习笔记整理,欢迎大家关注。
感知机(perceptron)是二分类的线性分类模型,属于监督学习算法。输入为实例的特征向量,输出为实例的类别(取+1和-1)。感知机旨在求出将输入空间中的实例划分为两类的分离超平面。为求得超平面,感知机导入了基于误分类的损失函数,利用梯度下降法对损失函数进行最优化求解。
如果训练数据集是线性可分的,则感知机一定能求得分离超平面。如果是非线性可分的数据,则无法获得超平面。
感知机具有简单而易于实现的优点,分为原始形式和对偶形式。感知机预测是用学习得到的感知机模型对新的实例进行预测的,因此属于判别模型。感知机是神经网络和支持向量机的基础。
假设训练数据集为 D = { ( x i , y i ) } i = 1 m D = \left\{ \left( x _ { i } , y _ { i } \right) \right\} _ { i = 1 } ^ { m } D={(xi,yi)}i=1m,其中, x i ∈ X ⊆ R n x _ { i } \in \mathcal { \mathbf X } \subseteq \mathbf { R } ^ { n } xi∈X⊆Rn, y i ∈ Y = { + 1 , − 1 } y _ { i } \in \mathcal { \mathbf Y } = \left\{ +1 , -1 \right\} yi∈Y={+1,−1}。
感知机模型为:
(1) f ( x ) = s i g n ( w ⋅ x + b ) f(x)=sign(w⋅x+b)\tag{1} f(x)=sign(w⋅x+b)(1)
其中, w w w和 b b b称为感知机模型参数, w ∈ R n w∈ R^n w∈Rn叫做权值或者权值向量, b ∈ R b∈R b∈R叫做偏置。 w ⋅ x w \cdot x w⋅x表示 w w w和 x x x的内积。 s i g n sign sign函数是符号函数:
(2) sign ( x ) = { + 1 , x ≥ 0 − 1 , x < 0 \operatorname { sign } ( x ) = \left\{ \begin{array} { l l } { + 1 , } & { x \geq 0 } \\ { - 1 , } & { x < 0 } \end{array} \right.\tag{2} sign(x)={+1,−1,x≥0x<0(2)
感知机模型的其中一个超平面是:
(3) w ⋅ x + b = 0 w⋅x+b=0\tag{3} w⋅x+b=0(3)
其中 w w w是超平面的法向量, b b b是超平面的截距。这个超平面将样本点分为正负两类。即对所有 y i = + 1 y_i=+1 yi=+1的样本,都有 w ⋅ x i + b > 0 w \cdot x_i + b > 0 w⋅xi+b>0时;对所有 y i = − 1 y_i=-1 yi=−1的样本,都有 w ⋅ x i + b < 0 w \cdot x_i + b < 0 w⋅xi+b<0。
假设训练数据集是线性可分的,为了找出一个能够将训练数据集正实例点和负实例点完全正确分开的超平面,即确定感知机模型参数 w w w、 b b b,需要确定一个学习策略,即定义(经验)损失函数,并将损失函数极小化。
损失函数的一个自然选择是误分类点的总数,但是这样的函数不是连续可导函数,不易优化。因此感知机采用的损失函数是误分类点到超平面的总距离。
假设直线方程为 A x + B y + C = 0 Ax+By+C=0 Ax+By+C=0,点 P P P的坐标为 ( x 0 , y 0 ) (x0,y0) (x0,y0)。点到直线的距离公式为:
d = A x 0 + B y 0 + C A 2 + B 2 d = \frac { A x _ { 0 } + B y _ { 0 } + C } { \sqrt { A ^ { 2 } + B ^ { 2 } } } d=A2+B2Ax0+By0+C
我们假设超平面是 h = w ⋅ x + b h = w \cdot x + b h=w⋅x+b,样本点 x ′ x′ x′到超平面的距离如下:
d = w ⋅ x ′ + b ∥ w ∥ d = \frac { w \cdot x ^ { \prime } + b } { \| w \| } d=∥w∥w⋅x′+b
任意一个样本点 x i x_i xi到超平面 S S S的距离为:
∣ w ⋅ x i + b ∣ ∥ w ∥ \frac { \left| w \cdot x _ { i } + b \right| } { \| w \| } ∥w∥∣w⋅xi+b∣
这里 ∥ w ∥ { \| w \| } ∥w∥是 w w w的 L 2 L_2 L2范数。
对于误分类的数据 ( x i , y i ) \left( x _ { i } , y _ { i } \right) (xi,yi)来说,
− y i ( w , x i + b ) = ∣ w ⋅ x i + b ∣ > 0 -{y_i}\left( {w,{x_i} + b} \right) = \left| {w \cdot {x_i} + b} \right| > 0 −yi(w,xi+b)=∣w⋅xi+b∣>0
因此,误分类点 x i x_i xi到超平面 S S S的距离是:
− 1 ∥ w ∥ y i ( w ⋅ x i + b ) -\frac { 1 } { \| w \| } y _ { i } \left( w \cdot x _ { i } + b \right) −∥w∥1yi(w⋅xi+b)
假设超平面 S S S的误分类点集合为 M M M,那么所有误分类点到超平面 S S S的总距离为:
− 1 ∥ w ∥ ∑ x i ∈ M y i ( w ⋅ x i + b ) -\frac { 1 } { \| w \| } \sum _ { x _ { i } \in M } y _ { i } \left( w \cdot x _ { i } + b \right) −∥w∥1xi∈M∑yi(w⋅xi+b)
不考虑 1 ∥ w ∥ \frac { 1 } { \| w \| } ∥w∥1,就得到感知机学习的损失函数:
L ( w , b ) = − ∑ x i ∈ M y i ( w ⋅ x i + b ) L ( w , b ) = - \sum _ { x _ { i } \in M } y _ { i } \left( w \cdot x _ { i } + b \right) L(w,b)=−xi∈M∑yi(w⋅xi+b)
这个损失函数就是感知机学习的经验风险函数。
为什么可不考虑 1 ∥ w ∥ \frac { 1 } { \| w \| } ∥w∥1?
这是因为,偏置 b b b可以定义为 b = w 0 x 0 b = w _ { 0 }x_{ 0 } b=w0x0,其中 x 0 = 1 x_0=1 x0=1,将 b b b吸收进 w w w里面。这样我们再来看总距离就变成了 − 1 ∥ w ∥ ∑ x i ∈ M y i w ⋅ x i - \frac { 1 } { \| w \| } \sum _ { x _ { i } \in M } y _ { i } w \cdot x _ { i } −∥w∥1∑xi∈Myiw⋅xi。
分子和分母都含有 w w w,当分子的 w w w扩大N倍时,分母的L2范数也会扩大N倍。也就是说,分子和分母有固定的倍数关系。那么我们可以固定分子或者分母为1,然后求分母的倒数或者分子自己的最小化作为损失函数,这样可以简化我们的损失函数。在感知机模型中,我们采用的是保留分子。
至此,感知机学习问题就转化为了求解损失函数的最优化问题。
由于感知机学习算法是误分类驱动的,这里基于随机梯度下降法(SGD)进行优化求解。即任意选取一个超平面 w 0 w_0 w0, b 0 b_0 b0,然后用梯度下降法不断地极小化损失函数。极小化过程中不是一次使 M M M中的所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降。
这里不能使用基于所有样本的批量梯度下降(BGD)进行优化。这是因为我们的损失函数里面有限定,只有误分类的 M M M集合里面的样本才能参与损失函数的优化。所以我们不能用最普通的批量梯度下降,只能采用随机梯度下降(SGD)或者小批量梯度下降(MBGD)。
损失函数 L ( w , b ) L ( w , b ) L(w,b)的梯度为:
∇ w L ( w , b ) = − ∑ x i ∈ M y i x i \nabla _ { w } L ( w , b ) = - \sum _ { x _ { i } \in M } y _ { i } x _ { i } ∇wL(w,b)=−xi∈M∑yixi
∇ b L ( w , b ) = − ∑ x i ∈ M y i \nabla _ { b } L ( w , b ) = - \sum _ { x _ { i } \in M } y _ { i } ∇bL(w,b)=−xi∈M∑yi
随机选取一个误分类点 ( x i , y i ) \left( x _ { i } , y _ { i } \right) (xi,yi),对 w w w, b b b进行更新:
w ← w + η y i x i w \leftarrow w + \eta y _ { i } x _ { i } w←w+ηyixi
b ← b + η y i b \leftarrow b + \eta y _ { i } b←b+ηyi
输入:训练数据集 D = { ( x i , y i ) } i = 1 m D = \left\{ \left( x _ { i } , y _ { i } \right) \right\} _ { i = 1 } ^ { m } D={(xi,yi)}i=1m,其中, x i ∈ X ⊆ R n x _ { i } \in \mathcal { \mathbf X } \subseteq \mathbf { R } ^ { n } xi∈X⊆Rn, y i ∈ Y = { + 1 , − 1 } y _ { i } \in \mathcal { \mathbf Y } = \left\{ +1 , -1 \right\} yi∈Y={+1,−1};学习率 η ( 0 < η ≤ 1 ) \eta ( 0 < \eta \leq 1 ) η(0<η≤1)。
过程:
(1)选取初值 w 0 w_0 w0, b 0 b_0 b0;
(2)在训练数据集中选取数据 ( x i , y i ) \left( x _ { i } , y _ { i } \right) (xi,yi);
(3) 判断该数据点是否为当前模型的误分类点,即判断 y i ( w ⋅ x i + b ) ≤ 0 {y_i}\left( {w \cdot {x_i} + b} \right) \le 0 yi(w⋅xi+b)≤0,如果陈耿立则是误分类点,进行更新:
w ← w + η y i x i w \leftarrow w + \eta y _ { i } x _ { i } w←w+ηyixi
b ← b + η y i b \leftarrow b + \eta y _ { i } b←b+ηyi
(4)转到第(2)步,直到训练集中没有误分类点。
输出: w w w、 b b b;感知机模型 f ( x ) = sign ( w ⋅ x + b ) f ( x ) = \operatorname { sign } ( w \cdot x + b ) f(x)=sign(w⋅x+b)。
感知机学习算法由于采用不同的初值或选取不同的误分类点,解可以不同。
前面介绍了感知机算法的原始形式,下面要介绍的对偶形式是对算法执行速度的优化。
每次梯度的迭代都是选择的一个样本来更新 w w w和 b b b向量。最终经过若干次的迭代得到最终的结果。对于从来都没有误分类过的样本,它选择参与 w w w和 b b b迭代修改的次数是0,对于被多次误分类而更新的样本,它参与 w w w和 b b b迭代修改的次数假设为 n i {n _i} ni。
则 w w w和 b b b关于 ( x i , y i ) \left( x _ { i } , y _ { i } \right) (xi,yi)的增量分别为 α i y i x i \alpha _ { i } y _ { i } x _ { i } αiyixi和 α i y i \alpha _ { i } y _ { i } αiyi,这里 α i = n i η \alpha _ { i } = n _ { i } \eta αi=niη。如果令 w w w向量初始值为0向量, 这样我们最后学习到的的 w w w和 b b b可以分别表示为:
w = ∑ x i ∈ M η y i x i = ∑ i = 1 n α i y i x i w = \sum _ { x _ { i } \in M } \eta y _ { i } x _ { i } = \sum _ { i = 1 } ^ { n } \alpha _ { i } y _ { i } x _ { i } w=xi∈M∑ηyixi=i=1∑nαiyixi
b = ∑ x i ∈ M η y i = ∑ i = 1 n α i y i b = \sum _ { x _ { i } \in M } \eta y _ { i } = \sum _ { i = 1 } ^ { n } \alpha _ { i } y _ { i } b=xi∈M∑ηyi=i=1∑nαiyi
这样的话,在每一步判断误分类条件的地方,我们用 y i ( w ⋅ x i + b ) ≤ 0 y _ { i } \left( w \cdot x _ { i } + b \right) \leq 0 yi(w⋅xi+b)≤0的变种 y i ( ∑ j = 1 n α j y j x j ⋅ x i + b ) ≤ 0 y _ { i } \left( \sum _ { j = 1 } ^ { n } \alpha _ { j } y _ { j } x _ { j } \cdot x _ { i } + b \right) \leq 0 yi(∑j=1nαjyjxj⋅xi+b)≤0来判断误分类。这个判断误分类的形式里面是计算两个样本 x i x_i xi和 x j x_j xj的内积,而且这个内积计算的结果在下面的迭代次数中可以重用。如果我们事先用矩阵运算计算出所有的样本之间的内积,那么在算法运行时, 仅仅一次的矩阵内积运算比多次的循环计算省时。计算量最大的判断误分类这儿就省下了很多的时间,这也是对偶形式的感知机模型比原始形式优的原因。
对偶形式中训练实例仅以内积的形式出现,为了减少计算量,我们可以预先将训练集样本间的内积计算出来,也就是Gram矩阵:
G = [ x i , x j ] m × m G = \left[ x _ { i } , x _ { j } \right] _ { m \times m } G=[xi,xj]m×m
输入:训练数据集 D = { ( x i , y i ) } i = 1 m D = \left\{ \left( x _ { i } , y _ { i } \right) \right\} _ { i = 1 } ^ { m } D={(xi,yi)}i=1m,其中, x i ∈ X ⊆ R n x _ { i } \in \mathcal { \mathbf X } \subseteq \mathbf { R } ^ { n } xi∈X⊆Rn, y i ∈ Y = { + 1 , − 1 } y _ { i } \in \mathcal { \mathbf Y } = \left\{ +1 , -1 \right\} yi∈Y={+1,−1};学习率 η ( 0 < η ≤ 1 ) \eta ( 0 < \eta \leq 1 ) η(0<η≤1)。
过程:
(1)选取初值 α = 0 \alpha=0 α=0, b = 0 b=0 b=0;
(2)在训练数据集中选取数据 ( x i , y i ) \left( x _ { i } , y _ { i } \right) (xi,yi);
(3) 判断该数据点是否为当前模型的误分类点,即判断 y i ( ∑ j = 1 n α j y j x j ⋅ x i + b ) ≤ 0 y _ { i } \left( \sum _ { j = 1 } ^ { n } \alpha _ { j } y _ { j } x _ { j } \cdot x _ { i } + b \right) \le 0 yi(∑j=1nαjyjxj⋅xi+b)≤0,如果陈耿立则是误分类点,进行更新:
α i = α i + η \alpha _ { i } = \alpha _ { i } + \eta αi=αi+η
b = b + η y i b = b + \eta y _ { i } b=b+ηyi
(4)转到第(2)步,直到训练集中没有误分类点。
输出: α \alpha α、 b b b;感知机模型 f ( x ) = sign ( ∑ j = 1 n α j y j x j ⋅ x + b ) f ( x ) = \operatorname { sign } \left( \sum _ { j = 1 } ^ { n } \alpha _ { j } y _ { j } x _ { j } \cdot x + b \right) f(x)=sign(∑j=1nαjyjxj⋅x+b)。
线性可分的感知机训练过程:
线性不可分的感知机训练过程:
参考文献:
- 《统计学习方法》第二章感知机——李航
- 感知机原理小结
- 感知机原理(Perceptron)