感知机算法最初是由科学家从脑细胞的神经凸起联想而来。如下图,我们拥有三个初始 x x x值, x 1 , x 2 , x 0 x_1,x_2,x_0 x1,x2,x0。其中 x 0 = 1 x_0=1 x0=1为一个初始的常量,专业上称作“偏置”。每个 x x x的值都会乘上一个权重值 w w w,再线性组合生成一个多项式,这个多项式经过一个分类函数 f f f生成 y y y。这个分类函数的作用就是将类别转化成 0 , 1 0,1 0,1或者 − 1 , 1 -1,1 −1,1。绿色和蓝色的圆就像是一个个神经元,中间连接 w w w就像是神经元用来传递信号的凸起。
从直观上理解,数据集可分的概念就是一个数据集可以通过一个超平面将不同的类别的数据样本点完全分开。
如上图,黄色的线可以将黄色三角形和红色圆形完全分开,不会有黄色三角形在红色圆形的区域,也不会有红色圆形在黄色三角形区域。这样一个数据集就是可分的。
重新回到一开始那个图。假设现在我们有一些数据集 X X X,有 { x 10 , x 20 } \{x_{10},x_{20}\} {x10,x20}这两个特征值。我们还有个超平面 y = w 1 x 1 + w 2 x 2 y=w_1x_1+w_2x_2 y=w1x1+w2x2。现在我们将这两个特征值输入,会得到下式:
w 1 x 10 + w 2 x 20 + w 0 x 0 = w 1 x 10 + w 2 x 20 + w 0 = w T x 0 + w 0 w_1x_{10}+w_2x_{20}+w_0x_0=w_1x_{10}+w_2x_{20}+w_0=w^Tx_0+w_0 w1x10+w2x20+w0x0=w1x10+w2x20+w0=wTx0+w0
根据超平面的性质:如果数据点在超平面之上,则 w T x 0 + w 0 > 0 w^Tx_0+w_0>0 wTx0+w0>0,如果数据点在超平面之下,则 w T x 0 + w 0 < 0 w^Tx_0+w_0<0 wTx0+w0<0。
根据书写习惯,我们将 w 0 w_0 w0换成 b b b,单纯换个符号,方便后面区分理解。
但是,对于不同的样本点,其 x 1 , x 2 x_1,x_2 x1,x2值不相同,所计算出来的 w T x + b w^Tx+b wTx+b肯定也不相同。那我们如何去区分这两个类别呢?
最直观的一种想法就是,让不同的类别对应其特殊的一个常数,比如类别1对应的是0,类别2对应的是1。这就涉及到一个问题,就是要将之前 w T x + b w^Tx+b wTx+b的值转化成0和1。而这一步就是 f f f的作用了。
f f f称为激活函数,就是将 w T x + b w^Tx+b wTx+b转化成0,1。激活函数有很多,我们这使用的是sign函数:
s i g n ( x ) = { + 1 , x > 0 − 1 , x < 0 sign(x)=\begin{cases} +1,&x>0\\ -1,&x<0 \end{cases} sign(x)={+1,−1,x>0x<0
在上面我们提到超平面的性质,如果点在超平面之上,那么 w T x + b > 0 w^Tx+b>0 wTx+b>0,此时正好对应sign函数中的+1,点在超平面之下同理。这也是为什么sign函数能达到分类的目的。于是我们得到感知机的分类函数:
y i = s i g n ( w T x 0 + b ) y_i=sign(w^Tx_0+b) yi=sign(wTx0+b)
在模型训练的过程中,仅仅有一个分类函数是远远不够的。我们需要有一个损失函数,用来不断优化分类函数中 w w w的权重值。
我们或许可以直接想到,误分类点个数可以作为损失函数的标准:误分类点数目越少,分类越准确。但是这有两个问题:
上面两个问题我们可以通过如下方式进行解决:
首先第一个问题,损失函数需要能够衡量误分类点距离超平面的远近距离。已知点到直线的距离公式为:
d = ∣ w T x 0 + b ∣ ∣ ∣ w ∣ ∣ d=\frac{|w^Tx_0+b|}{||w||} d=∣∣w∣∣∣wTx0+b∣
对于同一条直线, ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣是不会发生变化的,所以可以省去。此外我们可以考虑下误分类点的状况:
无论是哪一种情况,都满足 y i ( w T x + b ) < 0 y_i(w^Tx+b)<0 yi(wTx+b)<0。所以如果我们使用 − y i ( w T x + b ) -y_i(w^Tx+b) −yi(wTx+b)作为损失函数就可以解决第一个问题,而第二个问题也可以顺便解决。由于要考虑到是多个误分类点,所以我们还要加上 ∑ \sum ∑。
这里之所以要填符号是因为我们希望损失函数越小,超平面分类越准确。
所以分类函数为:
L ( w i , w 0 ) = − ∑ x i ∈ M y i ( w T x + b ) L(w_i,w_0)=-\sum_{x_i∈M}y_i(w^Tx+b) L(wi,w0)=−xi∈M∑yi(wTx+b)
有了损失函数之后,我们就可以通过梯度下降进行参数更新,不断优化使分离超平面分类更加准确。
根据梯度下降算法,我们需要对损失函数求偏导:
∇ w L ( w i T , b ) = − ∑ x i ∈ M y i x i ∇ b L ( w i T , b ) = − ∑ x i ∈ M y i \nabla_wL(w^T_i,b)=-\sum_{x_i∈M}y_ix_i \\\nabla_bL(w^T_i,b)=-\sum_{x_i∈M}y_i ∇wL(wiT,b)=−xi∈M∑yixi∇bL(wiT,b)=−xi∈M∑yi
然后就可以进行参数更新了:
w T → w T + η y i x i b → b + η y i w^T\to w^T+\eta y_ix_i \\b\to b+\eta y_i wT→wT+ηyixib→b+ηyi
其中 η \eta η为学习率。
所以我们得到了感知机算法:
输入:训练集 T T T,学习率 η \eta η
输出: w T , b w^T,b wT,b
感知机模型: f ( x ) = s i g n ( w T ∗ x + b ) f(x)=sign(w^T∗x+b) f(x)=sign(wT∗x+b)
步骤流程:
(1) 初始化 w 0 , b 0 w_0,b_0 w0,b0。
(2) 在训练集中选取数据 ( x i , y i ) (x_i,y_i) (xi,yi)
(3) 若 y i ( w T ∗ x i + b ) ≤ 0 y_i(w^T∗x_i+b)≤0 yi(wT∗xi+b)≤0 (误分类点),则进行参数更新:
w T → w + η y i x i w^T\to w+ηy_ix_i wT→w+ηyixi
b T → b + η y i b^T\to b+ηy_i bT→b+ηyi
(4) 转至(2),直到训练集没有误分类点。
上面我们提到,利用梯度下降进行参数更新:
w T → w T + η y i x i b → b + η y i w^T\to w^T+\eta y_ix_i \\b\to b+\eta y_i wT→wT+ηyixib→b+ηyi
如果我们假设样本点 ( x i , y i ) (x_i,y_i) (xi,yi)在更新过程中被使用了 n i n_i ni次,也就是进行了 n i n_i ni次迭代,所以我们可以得到 w T 和 b w^T和b wT和b的表达式。
w T = ∑ i = 1 N n i η y i x i b = ∑ i = 1 N n i η y i w^T=\sum_{i=1}^N n_i\eta y_ix_i \\b=\sum_{i=1}^N n_i\eta y_i wT=i=1∑Nniηyixib=i=1∑Nniηyi
将其代入到原始感知机模型当中,
f ( x ) = s i g n ( w T ∗ x + b ) = s i g n ( ∑ i = 1 N n i η y i x i ⋅ x + ∑ i = 1 N n i η y i ) f(x)=sign(w^T∗x+b)=sign(\sum_{i=1}^N n_i\eta y_ix_i·x+\sum_{i=1}^N n_i\eta y_i) f(x)=sign(wT∗x+b)=sign(i=1∑Nniηyixi⋅x+i=1∑Nniηyi)
此时学习目标就是 n i n_i ni
输入:训练集 T T T,学习率 η \eta η
输出: n i n_i ni
感知机模型: f ( x ) = s i g n ( ∑ i = 1 N n i η y i x i ⋅ x + ∑ i = 1 N n i η y i ) f(x)=sign(\sum_{i=1}^N n_i\eta y_ix_i·x+\sum_{i=1}^N n_i\eta y_i) f(x)=sign(∑i=1Nniηyixi⋅x+∑i=1Nniηyi)
步骤流程:
(1) 初始化 $n_i $。
(2) 在训练集中选取数据 ( x i , y i ) (x_i,y_i) (xi,yi)
(3) 若 y i ( ∑ i = 1 N n i η y i x i ⋅ x + ∑ i = 1 N n i η y i ) ≤ 0 y_i(\sum_{i=1}^N n_i\eta y_ix_i·x+\sum_{i=1}^N n_i\eta y_i)≤0 yi(∑i=1Nniηyixi⋅x+∑i=1Nniηyi)≤0 (误分类点),则进行参数更新:
n i → n i + 1 n_i\to n_i+1 ni→ni+1
(4) 转至(2),直到训练集没有误分类点。
也有另外一种写法:
输入:训练集 T T T,学习率 η \eta η
输出: α i , b \alpha_i,b αi,b( α i = n i η \alpha_i=n_i\eta αi=niη)
感知机模型: f ( x ) = s i g n ( ∑ i = 1 N α i y i x i ⋅ x + b ) f(x)=sign(\sum_{i=1}^N\alpha_i y_ix_i·x+b) f(x)=sign(∑i=1Nαiyixi⋅x+b)
步骤流程:
(1) 初始化 n i n_i ni。
(2) 在训练集中选取数据 ( x i , y i ) (x_i,y_i) (xi,yi)
(3) 若 y i ( ∑ i = 1 N n i η y i x i ⋅ x + b ) ≤ 0 y_i(\sum_{i=1}^N n_i\eta y_ix_i·x+b)≤0 yi(∑i=1Nniηyixi⋅x+b)≤0 (误分类点),则进行参数更新:
α i → α i + η \alpha_i\to \alpha_i+\eta αi→αi+η
b → b + η y i b\to b+\eta y_i b→b+ηyi
(4) 转至(2),直到训练集没有误分类点。