一、综述
感知器(英语:Perceptron)是Frank Rosenblatt在1957年就职于康奈尔航空实验室(Cornell Aeronautical Laboratory)时所发明的一种人工神经网络。它可以被视为一种最简单形式的前馈神经网络,是一种二元线性分类器。
Frank Rosenblatt给出了相应的感知机学习算法,常用的有感知机学习、最小二乘法和梯度下降法。譬如,感知机利用梯度下降法对损失函数进行极小化,求出可将训练数据进行线性划分的分离超平面,从而求得感知机模型。
在人工神经网络领域中,感知机也被指为单层的人工神经网络,以区别于较复杂的多层感知机(Multilayer Perceptron)。作为一种线性分类器,(单层)感知机可说是最简单的前向人工神经网络形式。尽管结构简单,感知机能够学习并解决相当复杂的问题。感知机主要的本质缺陷是它不能处理线性不可分问题。
在神经网络、支持向量机等算法盛行的当下,感知机模型应用得并不多,但其却是神经网络和支持向量机的基础,所以还是很有必要学习一下的,本文接下来的内容将从感知机数学描述、损失函数、两个方面详细介绍感知机。
二、模型介绍
1.数学定义
对于给定的训练集 D = { ( x i , y i ) } i = 1 m , x i ∈ X ⊆ R n D=\{(x_{i},y_{i})\}_{i=1}^{m},x_{i}\in X\subseteq R^{n} D={(xi,yi)}i=1m,xi∈X⊆Rn表示训练样本的特征向量, y i ∈ Y = { + 1 , − 1 } y_{i}\in Y=\{+1,-1\} yi∈Y={+1,−1}表示样本类别,它们之间有如下关系:
y = f ( x ) = s i g n ( w x + b ) y=f(x)=sign(wx+b) y=f(x)=sign(wx+b)
这称为感知机。 w ∈ R n w\in R^{n} w∈Rn称为感知机的权值系数或权值向量, b ∈ R b\in R b∈R称为偏置,sign是符号函数:
s i g n = { + 1 , x ≥ 0 − 1 , x < 0 sign=\left\{ \begin{array}{lr} +1,x\ge0\\ - 1,x<0 \end{array} \right. sign={+1,x≥0−1,x<0
通过上式不难看出,感知机最终既是对 w , b w,b w,b的求解。从几何上来看,空间即被 w x + b = 0 wx+b=0 wx+b=0分成了两个区域,因此它可以做到二元线性分类。大家可以以二维空间为例来想象一下,在确定 w , b w,b w,b之后,直线 w x + b = 0 wx+b=0 wx+b=0随之确定,当一个样本 ( x 0 , y 0 ) (x_{0},y_{0}) (x0,y0)位于直线上方时,此时 s i g n ( w x + b ) sign(wx+b) sign(wx+b)容易看出为 + 1 +1 +1,反之,为 − 1 -1 −1,由此它便做到了分类。此外,这里要注意这条直线并不唯一,即 w , b w,b w,b并非唯一。
2.损失函数
为了求解参数 w w w和 b b b,确定最终的分割超平面, 就需要定义一个目标函数,或称为损失函数,通过最小化这个函数来达到目的。在感知机模型中,以误分类的样本对象与分割超平面间的距离之和最为损失函数。
由点到平面距离公式,可推出误分类点 x i x_{i} xi到超平面的距离为:
d = ∣ w x i + b ∣ ∣ ∣ w ∣ ∣ d=\frac{|wx_{i}+b|}{||w||} d=∣∣w∣∣∣wxi+b∣
其中, ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣是 w w w的 L 2 L_{2} L2范数。由于点 x i x_{i} xi是误分类点,故 y i y_{i} yi与 w x i + b wx_{i}+b wxi+b的值正负相反,且 y i y_{i} yi为 + 1 +1 +1或 − 1 -1 −1,因此
− y i ∗ ( w x i + b ) > 0 -y_{i}*(wx_{i}+b)>0 −yi∗(wxi+b)>0
所以
− y i ∗ ( w x i + b ) = ∣ w x i + b ∣ -y_{i}*(wx_{i}+b)=|wx_{i}+b| −yi∗(wxi+b)=∣wxi+b∣
于是, ( x i , y i ) (x_{i},y_{i}) (xi,yi)到超平面的距离可化为:
d = − y i ∗ ( w x i + b ) ∣ ∣ w ∣ ∣ d=\frac{-y_{i}*(wx_{i}+b)}{||w||} d=∣∣w∣∣−yi∗(wxi+b)
由于在求取误差点到平面的距离时,||w||是个定值,因此在设计损失函数时,可将其忽略,毕竟这里需要的不是真正的求距离。
这是我们就确定了损失函数为:
L ( w , b ) = ∑ x i ∈ M ( − y i ∗ ( w x i + b ) ) L(w,b)=\sum_{xi\in M}(-y_{i}*(wx_{i}+b)) L(w,b)=∑xi∈M(−yi∗(wxi+b))
三、优化方法
前面讨论了损失函数的推导过程,下面介绍对其优化方法。对于感知机模型,有两种优化方式原始形式和对偶形式,下面主要介绍原始形式。原始形式采用的是梯度下降法来求解,这里先说说什么是梯度下降法。
一个直观的解释是比如我们在一座大山上的某处位置,由于我们不知道怎么下山,于是决定走一步算一步,也就是在每走到一个位置的时候,求解当前位置的梯度,沿着梯度的负方向,也就是当前最陡峭的位置向下走一步,然后继续求解当前位置梯度,向这一步所在位置沿着最陡峭最易下山的位置走一步。这样一步步的走下去,一直走到觉得我们已经到了山脚。当然这样走下去,有可能我们不能走到山脚,而是到了某一个局部的山峰低处。
从上述描述可看出,采用梯度下降法并不能确保我们找到全局最优解,我们也可能找到的是局部最优解。
梯度下降算法大体步骤:
- 确定当前位置的损失函数梯度,对于函数
f
(
a
1
,
a
2
,
.
.
.
,
a
n
)
f(a_{1},a_{2},...,a_{n})
f(a1,a2,...,an)中
a
i
a_{i}
ai的梯度表达式如下:
∂ f ( a 1 , a 2 , . . . , a n ) ∂ a i \frac{\partial f(a_{1},a_{2},...,a_{n})}{\partial a_{i}} ∂ai∂f(a1,a2,...,an) - 用步长 l l l乘以损失函数的梯度得到当前位置下降的距离,即 l ∗ ∂ f ( a 1 , a 2 , . . . , a n ) ∂ a i l*\frac{\partial f(a_{1},a_{2},...,a_{n})}{\partial a_{i}} l∗∂ai∂f(a1,a2,...,an),以对应与前面讲到的登山中的某一步
- 确定是否所有的 a i a_{i} ai,梯度下降的距离都小于 ε \varepsilon ε,如果小于 ε \varepsilon ε则算法停止,当前的 a 1 , a 2 , . . . , a n a_{1},a_{2},...,a_{n} a1,a2,...,an即为所求的结果否则进入下一步
- 更新所有的
a
a
a,对于
a
i
a_{i}
ai,其更新表达式如下:
a i = a i − l ∗ ∂ f ( a 1 , a 2 , . . . , a n ) ∂ a i a_{i}=a_{i}-l*\frac{\partial f(a_{1},a_{2},...,a_{n})}{\partial a_{i}} ai=ai−l∗∂ai∂f(a1,a2,...,an)
更新完毕转入步骤一。
这里回到正题,对损失函数
L
(
w
,
b
)
=
∑
x
i
∈
M
(
−
y
i
∗
(
w
x
i
+
b
)
)
L(w,b)=\sum_{xi\in M}(-y_{i}*(wx_{i}+b))
L(w,b)=∑xi∈M(−yi∗(wxi+b))求偏导:
∂
L
(
w
,
b
)
∂
w
=
−
∑
x
i
∈
M
y
i
∗
x
i
\frac{\partial L(w,b)}{\partial w}=-\sum_{xi\in M}y_{i}*x_{i}
∂w∂L(w,b)=−∑xi∈Myi∗xi
∂
L
(
w
,
b
)
∂
b
=
−
∑
x
i
∈
M
y
i
\frac{\partial L(w,b)}{\partial b}=-\sum_{xi\in M}y_{i}
∂b∂L(w,b)=−∑xi∈Myi
据此可知
w
w
w的梯度下降迭代公式为:
w = w + l ∗ ∑ x i ∈ M y i ∗ x i w=w+l*\sum_{xi\in M}y_{i}*x_{i} w=w+l∗∑xi∈Myi∗xi
偏置 b b b的梯度下降 迭代公式为:
b = b + l ∗ ∑ x i ∈ M y i b=b+l*\sum_{xi\in M}y_{i} b=b+l∗∑xi∈Myi
感知机模型中,一般采用随机梯度下降法进行优化,每次使用一个误分类样本点进行梯度更新。假设 ( x i , y i ) (x_{i},y_{i}) (xi,yi)是 M M M中一个误分类点,进行梯度更新:
w = w + l ∗ y i ∗ x i w=w+l*y_{i}*x_{i} w=w+l∗yi∗xi
b = b + l ∗ y i b=b+l*y_{i} b=b+l∗yi
整体步骤如下:
- 初始化 w 0 , b 0 ; w_{0},b_{0}; w0,b0;
- 在 D D D中选取任意点 ( x i , y i ) ; (x_{i},y_{i}); (xi,yi);
- 通过 y i ∗ ( w ∗ x i + b ) y_{i}*(w*x_{i}+b) yi∗(w∗xi+b)的值判断是否为误分类点,如果是,进行梯度更新
- 更新参数,返回至第二步直至准确率满足要求。
对偶形式是原始形式在执行效率上的优化,在这里便不作介绍。