给定一个二类数据集的标签为正负1,如果存在某个超平面 S S S:
w x + b = 0 wx + b = 0 wx+b=0
将所有正负实例点完全正确地划分到超平面的两侧,即对 y = + 1 y = +1 y=+1的实例有: w x + b > 0 wx + b > 0 wx+b>0;即对 y = − 1 y = -1 y=−1的实例有: w x + b < 0 wx + b < 0 wx+b<0.
针对标签为正负1的二分类问题,感知机的判别函数为:
f ( x ) = s i g n ( w x + b ) f(x) = sign(wx + b) f(x)=sign(wx+b)
自然地想,损失函数应当是误分类的点的个数,但是这个函数是不可导的,所以优化起来比较困难。
考虑 R n R^n Rn空间中的任意一点 x 0 x_0 x0到超平面的距离为:
1 ∣ ∣ w ∣ ∣ 2 ( w x 0 + b ) \frac{1}{||w||_2}(wx_0 + b) ∣∣w∣∣21(wx0+b)
对应误分类集合 M M M中的点来说:
− y ∣ ∣ w ∣ ∣ 2 ( w x + b ) > 0 -\frac{y}{||w||_2}(wx + b) > 0 −∣∣w∣∣2y(wx+b)>0
所以最终选择的损失函数为:
L ( w , b ) = − ∑ x ∈ M y ( w x + b ) L(w, b) = -\sum_{x \in M}y(wx + b) L(w,b)=−x∈M∑y(wx+b)
目前学习的过程就变成使损失函数最小化的过程。
( w , b ) = arg min w , b L ( w , b ) ∂ L ∂ w = − ∑ x ∈ M y x ∂ L ∂ b = − ∑ x ∈ M y \begin{aligned} (w, b) &= \arg \min_{w, b}L(w, b) \\ \frac{\partial L}{\partial w} &= -\sum_{x \in M}yx \\ \frac{\partial L}{\partial b} &= -\sum_{x \in M}y \end{aligned} (w,b)∂w∂L∂b∂L=argw,bminL(w,b)=−x∈M∑yx=−x∈M∑y
通过梯度下降的方式,在每次迭代过程中以学习率 η \eta η更新 w , b w, b w,b的值,直到结果收敛或者达到指定的迭代次数为止。
w t = w t − 1 − η ∂ L ∂ w b t = b t − 1 − η ∂ L ∂ b w^t = w^{t - 1} - \eta\frac{\partial L}{\partial w} \\ b^t = b^{t - 1} - \eta\frac{\partial L}{\partial b} \\ wt=wt−1−η∂w∂Lbt=bt−1−η∂b∂L
下面证明当数据是线性可分的情况下,感知机准则是一定收敛的。通过两种方法来进行证明。
方便起见,令 a = ( w T , b ) T , z = ( x T , 1 ) T a = (w^T, b)^T, z = (x^T, 1)^T a=(wT,b)T,z=(xT,1)T。
设最优的权重解为: a ^ \hat{a} a^,一定满足 ∀ x i , a ^ T z y i > 0 \forall x_i, \hat{a}^Tzy_i > 0 ∀xi,a^Tzyi>0。
假设经过 t t t轮迭代之后的解为: a t a^t at,在这一轮中仍然被分错的向量集合为: E ( t ) = { z ∣ a T z y < 0 } E(t) = \lbrace z|a^Tzy < 0 \rbrace E(t)={z∣aTzy<0},根据上文描述的梯度下降的规则,在第 t + 1 t + 1 t+1轮中,权重应当被更新为:
a ( t + 1 ) = a t + ∑ x i ∈ E ( t ) y i z i a^{(t + 1)} = a^t + \sum_{x_i \in E(t)}y_iz_i a(t+1)=at+xi∈E(t)∑yizi
令
∑ x i ∈ E ( t ) y i a t T z i = e ( t ) < 0 \sum_{x_i \in E(t)}y_i{a^t}^Tz_i = e(t) < 0 xi∈E(t)∑yiatTzi=e(t)<0
∣ ∣ a ( t + 1 ) − α a ^ ∣ ∣ 2 = ∣ ∣ a t + ∑ x i ∈ E ( t ) y i z i − α a ^ ∣ ∣ 2 = ∣ ∣ a t − α a ^ ∣ ∣ 2 + 2 ( a t − α a ^ ) T ∑ x i ∈ E ( t ) y i z i + ∣ ∣ ∑ x i ∈ E ( t ) y i z i ∣ ∣ 2 = ∣ ∣ a t − α a ^ ∣ ∣ 2 + 2 e ( t ) − 2 α a ^ T ∑ x i ∈ E ( t ) y i z i + ∣ ∣ ∑ x i ∈ E ( t ) y i z i ∣ ∣ 2 ≤ ∣ ∣ a t − α a ^ ∣ ∣ 2 − 2 α a ^ T ∑ x i ∈ E ( t ) y i z i + ∣ ∣ ∑ x i ∈ E ( t ) y i z i ∣ ∣ 2 ( ⋆ ) D = ∑ x i ∈ E ( t ) ∣ ∣ y i z i ∣ ∣ ≥ ∑ x i ∈ E ( t ) ∣ ∣ y i z i ∣ ∣ ≥ ∣ ∣ ∑ x i ∈ E ( t ) y i z i ∣ ∣ ρ = min i y i a ^ T z i l e t α = D 2 ρ ( ⋆ ) ≤ ∣ ∣ a t − α a ^ ∣ ∣ 2 − 2 α ρ + D 2 = ∣ ∣ a t − α a ^ ∣ ∣ 2 − D 2 ≤ ∣ ∣ a 0 − α a ^ ∣ ∣ 2 − ( t + 1 ) D 2 s o ∃ t ^ s . t . a t ^ = α a ^ \begin{aligned} ||a^{(t + 1)} - \alpha \hat{a}||^2 &= ||a^t + \sum_{x_i \in E(t)}y_iz_i - \alpha \hat{a}||^2 \\ &= ||a^t - \alpha \hat{a}||^2 + 2(a^t - \alpha \hat{a})^T\sum_{x_i \in E(t)}y_iz_i + ||\sum_{x_i \in E(t)}y_iz_i||^2 \\ &=||a^t - \alpha \hat{a}||^2 + 2e(t) - 2\alpha\hat{a}^T\sum_{x_i \in E(t)}y_iz_i + ||\sum_{x_i \in E(t)}y_iz_i||^2 \\ &\le ||a^t - \alpha \hat{a}||^2 - 2\alpha\hat{a}^T\sum_{x_i \in E(t)}y_iz_i + ||\sum_{x_i \in E(t)}y_iz_i||^2 \qquad(\star)\\ D &= \sum_{x_i \in E(t)}||y_iz_i|| \ge \sum_{x_i \in E(t)}||y_iz_i|| \ge||\sum_{x_i \in E(t)}y_iz_i|| \\ \rho &=\min_i y_i\hat{a}^Tz_i \\ let \qquad \alpha &= \frac{D^2} {\rho} \\ (\star) &\le ||a^t - \alpha \hat{a}||^2 - 2\alpha\rho + D^2 \\ &= ||a^t - \alpha \hat{a}||^2 - D^2 \\ &\le ||a^0 - \alpha \hat{a}||^2 - (t + 1)D^2 \\ so \qquad \exists \hat{t} \quad s.t. \space a^{\hat{t}} &= \alpha \hat{a} \end{aligned} ∣∣a(t+1)−αa^∣∣2Dρletα(⋆)so∃t^s.t. at^=∣∣at+xi∈E(t)∑yizi−αa^∣∣2=∣∣at−αa^∣∣2+2(at−αa^)Txi∈E(t)∑yizi+∣∣xi∈E(t)∑yizi∣∣2=∣∣at−αa^∣∣2+2e(t)−2αa^Txi∈E(t)∑yizi+∣∣xi∈E(t)∑yizi∣∣2≤∣∣at−αa^∣∣2−2αa^Txi∈E(t)∑yizi+∣∣xi∈E(t)∑yizi∣∣2(⋆)=xi∈E(t)∑∣∣yizi∣∣≥xi∈E(t)∑∣∣yizi∣∣≥∣∣xi∈E(t)∑yizi∣∣=iminyia^Tzi=ρD2≤∣∣at−αa^∣∣2−2αρ+D2=∣∣at−αa^∣∣2−D2≤∣∣a0−αa^∣∣2−(t+1)D2=αa^
收敛性证毕。
设训练集 T = { ( x 1 , y 1 ) , . . . , ( x N , y N ) } T = \lbrace (x_1, y_1), ..., (x_N, y_N) \rbrace T={(x1,y1),...,(xN,yN)}是线性可分的,设 y i ∈ { + 1 , − 1 } , i = 1 , 2 , . . . , N y_i \in \lbrace +1, -1 \rbrace, i = 1, 2, ..., N yi∈{+1,−1},i=1,2,...,N,则
感知机的对偶形式为
f ( x ) = s i g n ( ∑ j = 1 N α j y j x j ⋅ x + ∑ i = 1 N α i y i ) f(x) = sign(\sum_{j = 1}^{N}\alpha_jy_jx_j \cdot x + \sum_{i = 1}^{N}\alpha_iy_i) f(x)=sign(j=1∑Nαjyjxj⋅x+i=1∑Nαiyi)
可以发现只是权值的变化了一种形式,这一点可以直接从梯度下降的递推公式中看出来。(默认初始权值都是1)。需要说明的是 α i \alpha_i αi表示的是第 i i i个数据在整个过程中被分错的次数。
对应的学习过程也就变成了改变 α \alpha α的过程,每当出现一个数据被分错了,就 α i = α i + η \alpha_i = \alpha_i + \eta αi=αi+η直到收敛为止。
另外还有一点就是整个训练的过程对于数据本身仅以内积的形式出现,可以预先计算好内积的矩阵,即Gram矩阵:
G = [ x i ⋅ x j ] N × N G = \lbrack x_i \cdot x_j \rbrack_{N \times N} G=[xi⋅xj]N×N
然后将数据转化为numpy
中的array
形式,并且设置标签为 { − 1 , + 1 } \lbrace -1, +1\rbrace {−1,+1},初始化权重都是 0 0 0.
data = np.vstack([data0, data1])
label = np.hstack([np.ones(data0.shape[0]) * -1.0, np.ones(data1.shape[0])]).reshape(len(data), 1)
data = np.c_[data, np.ones(len(data))]
随后是算法的主体——梯度下降。在梯度下降的过程中,碰到的最大的困难就是梯度过大,导致整个算法不停的抖动,在这里很简单地降低学习率,其实应用随即梯度下降等优化算法可能会更好一些。
w = np.array([0.0, 0.0, 0.0]).reshape(1, 3)
error = 1
epoch = 0
learning_rate = 0.000001
while error != 0.0:
res = np.multiply(np.dot(w, data.T), label.T)[0]
print(res)
error = 0
epoch = epoch + 1
for i in range(len(res)):
x = -data[i] * label[i]
if res[i] <= 1e-3:
w = w - learning_rate * x
error = error + 1
print("Error rate in epoch {} is {:.2f}%".format(epoch, error / len(data) * 100))
总共迭代了2651轮才最终收敛,最终的权值情况为:
[ 0.00027111 0.00135846 -0.091094 ]
[1] 李航 《统计学习方法》 第2章