这里记录一下学习机器学习课程的笔记,老师用的参考教材是李航的《机器学习方法》。
第一章 机器学习简介
第二章 感知机
第三章 支持向量机
第四章 朴素贝叶斯分类器
第五章 Logistic回归
第六章 线性回归和岭回归
第七章 多层感知机与反向传播【Python实例】
第八章 主成分分析【PCA降维】
第九章 隐马尔可夫模型
第十章 奇异值分解
感知机(PLA)在1957 年,由 Rosenblatt 提出,是神经网络和支持向量机的基础。PLA 全称是 Perceptron Linear Algorithm,即线性感知机算法,属于一种最简单的感知机模型。感知机是二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取值为+1和-1。
一、超平面
感知机的核心思想是用一个超平面来将数据集二分类,所以首先我们来介绍一下什么是超平面,超平面是具有下面形式的点的集合:
Ω
=
{
x
∣
a
T
x
=
b
}
,
其中
a
∈
R
n
,
a
≠
0
且
b
∈
R
.
\Omega=\{x|a^Tx=b\} ,其中 a\in R^n,a≠0 且 b\in R.
Ω={x∣aTx=b},其中a∈Rn,a=0且b∈R.超平面是关于
x
x
x的非平凡线性方程组的解空间。为了从几何上来直观理解,首先, 我们选取这样的一点
x
0
x_0
x0 , 使得
a
T
x
0
=
b
a^T x_0=b
aTx0=b(若不存在这样的
x
0
x_0
x0,
Ω
\Omega
Ω为空集),然后我们对原式做如下变换:
a
T
x
=
b
⇒
a
T
x
−
b
=
0
⇒
a
T
x
−
a
T
x
0
=
0
⇒
a
T
(
x
−
x
0
)
=
0
\begin{aligned} & a^T x=b \\ \Rightarrow\quad &a^T x-b=0 \\ \Rightarrow\quad& a^T x-a^T x_0=0 \\ \Rightarrow\quad& a^T\left(x-x_0\right)=0 \end{aligned}
⇒⇒⇒aTx=baTx−b=0aTx−aTx0=0aT(x−x0)=0
也就是说,
x
x
x 代表所有与
a
a
a 内积为 b 的向量组成的集合,
x
−
x
0
x−x_0
x−x0 代表所有与
a
a
a 内积为0的向量组成的集合。在二维条件下,我们先尝试构造出
x
−
x
0
x−x_0
x−x0 与
a
a
a 的几何表示:

橙色线上的点与原点构成的向量即为 x − x 0 x-x_0 x−x0(内积为0,相互垂直),那么 x = ( x − x 0 ) + x 0 x=(x-x_0 )+x_0 x=(x−x0)+x0(相对于黄色的线平移 x 0 x_0 x0),如下图所示:

由图可知红色直线上的点到 a a a向量方向的投影 ∣ x ∣ cos θ |x|\cos\theta ∣x∣cosθ为一个定值,故 < a , x > = ∣ a ∣ ∣ x ∣ cos θ = b <a,x>=|a||x|\cos\theta=b <a,x>=∣a∣∣x∣cosθ=b。通过以上的介绍,我们知道在二维空间中,超平面是一条直线。在三维空间中则是一个平面,更高维空间则称之为超平面。
二、感知机定义
下面我们先给出感知机的定义,本质就是一个分类函数的模型。
定义(感知机)
假设输入空间(特征空间)是 X ⊆ R n \mathcal{X}\subseteq R^n X⊆Rn, 输出空间是 Y = { + 1 , − 1 } \mathcal{Y}=\{+1,-1\} Y={+1,−1}。输入 x ∈ X x\in\mathcal{X} x∈X 表示实例的特征向量,对应于输入空间(特征空间)的点;输出 y ∈ Y y\in\mathcal{Y} y∈Y 表示实例的类别。由输入空间到输出空间的如下函数
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 ∈ R n w\in R^n w∈Rn 叫作权值, b ∈ R b\in R b∈R 叫作偏置;
- w ⋅ x w\cdot x w⋅x 表示 w w w 和 x x x 的内积;
- sign 是符号函数,即 sign ( x ) = { + 1 , x ≥ 0 , − 1 , x < 0. \operatorname{sign}(x)=\begin{cases}+1,\quad x\geq0, \\ -1,\quad x < 0. \end{cases} sign(x)={+1,x≥0,−1,x<0.
- 感知机对应的超平面 w x + b = 0 wx+b=0 wx+b=0称为分离超平面;
也就是说,我们想用一个超平面将两类点分开,如下图所示,黑色点和红色点是两类标签取值不同的点,
x
(
1
)
,
x
(
2
)
x^{(1)},x^{(2)}
x(1),x(2)是数据的特征,我们可以用直线将其“分开”.
感知机是受生物学上的启发创造的,可以类比我们大脑的神经元。神经元通过树突、轴突等接受信号、处理信号,然后将信号在输出。为了模拟机器来实现这样一个过程,那么感知机就构建了一个类似的结构:

上面的神经元的激活函数取符号函数(sign),便得到感知机模型。而在神经网络结构里,前馈神经网络也是由这样一个个神经元构成,只不过激活函数一般取sigmoid函数、tanh函数等。(见多层感知机与反向传播)
三、学习策略和学习算法
1 线性可分
在二维空间上,如果两类点可以被一条直线(高维空间叫超平面)完全分开叫做线性可分。

严格的数学定义是:
设 D 0 D_{0} D0 和 D 1 D_{1} D1 是 n \mathrm{n} n 维欧氏空间中的两个点集,如果存在 n \mathrm{n} n 维向量 w \mathrm{w} w 和实数 b \mathrm{b} b, 使得:
- 所有属于 D 0 D_{0} D0 的点 x i x_{i} xi 都有 w x i + b > 0 w x_{i}+b>0 wxi+b>0
- 而对于所有属于 D 1 D_{1} D1 的点 x j x_{j} xj 则有 w x j + b < 0 w x_{j}+b<0 wxj+b<0, 则我们称 D 0 D_{0} D0 和 D 1 D_{1} D1 线性可分
- 从二维扩展到多维空间中时, 将 D 0 D_{0} D0 和 D 1 D_{1} D1 完全正确地划分开的 w x + b = 0 w x+b=0 wx+b=0 就成了一个超平面。
如果数据不是线性可分的,那么便不能用感知机进行分类,见第四节的讨论(感知机不能表示异或函数)。
2 损失函数定义
假设数据集是线性可分的,接下来需要定义损失函数,我们注意到:
- 当 x i x_i xi被 ( w , b ) (w,b) (w,b)正确分类,则 y i ( w ⋅ x i + b ) > 0. y_i(w\cdot x_i+b)>0. yi(w⋅xi+b)>0.(给定 w w w和 b b b很容易判断误分类点)
- 对误分类的数据
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi):
− y i ( w ⋅ x i + b ) > 0 -y_i(w\cdot x_i+b)>0 −yi(w⋅xi+b)>0可以作为 x i x_i xi 被误分类的损失.
设误分类的点集为M,则考虑:
∑
x
i
∈
M
−
y
i
(
w
⋅
x
i
+
b
)
.
\sum\limits_{x_i\in M}-y_i(w\cdot x_i+b).
xi∈M∑−yi(w⋅xi+b). 感知机
f
(
x
)
=
sign
(
w
⋅
x
+
b
)
f(x)=\operatorname{sign}(w\cdot x+b)
f(x)=sign(w⋅x+b)学习的损失函数定义为:
L
(
w
,
b
)
=
−
∑
x
i
∈
M
y
i
(
w
⋅
x
i
+
b
)
.
L(w,b)=-\sum_{x_i\in M}y_i(w\cdot x_i+b).
L(w,b)=−xi∈M∑yi(w⋅xi+b).由这个定义我们知:
- 损失函数是非负的(因为只计算误分类点);
- 若没有误分类点,损失函数为0,所以一个自然的想法就是最小化损失函数。
有了损失函数,感知机的学习问题转化为如下最优化问题,给定训练数据集
D
=
{
(
x
i
,
y
i
)
}
i
=
1
N
,
D=\left\{\left(x_i, y_i\right)\right\}_{i=1}^N,
D={(xi,yi)}i=1N,
求参数
w
w
w 和
b
b
b 使之为如下优化问题的解:
min
w
,
b
L
(
w
,
b
)
.
\min _{w, b} L(w, b).
w,bminL(w,b).
3 优化算法—SGD
由上面对感知机问题的分析知,感知机模型的求解是一个无约束优化问题,可以采用随机梯度下降法。梯度下降法的基本思想是:负梯度方向是函数值下降最快的方向.若误分类的点集
M
M
M固定,
L
(
w
,
b
)
L(w,b)
L(w,b)的梯度由如下给出:
∇
w
L
=
−
∑
x
i
∈
M
y
i
x
i
∇
b
L
=
−
∑
x
i
∈
M
y
i
.
\begin{aligned} \nabla_wL &=-\sum_{x_i\in M}y_ix_i\\ \nabla_bL &=-\sum_{x_i\in M}y_i. \end{aligned}
∇wL∇bL=−xi∈M∑yixi=−xi∈M∑yi.随机梯度下降法(SGD)的核心思想是随机选取一个误分类点
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi),对参数进行更新:
w
=
w
−
η
∇
w
L
,
b
=
b
−
η
∇
b
L
,
=
w
+
η
y
i
x
i
.
=
b
+
η
y
i
.
\begin{aligned} w &= w-\eta\nabla_wL,& b &=b-\eta\nabla_bL,\\ &=w+\eta y_ix_i .& &=b+\eta y_i. \end{aligned}
w=w−η∇wL,=w+ηyixi.b=b−η∇bL,=b+ηyi.其中
η
(
0
<
η
≤
1
)
\eta(0<\eta\leq1)
η(0<η≤1)是步长 (或学习率)。通过迭代,使
L
(
w
,
b
)
L(w,b)
L(w,b)不断减小,直至为0.
由学习算法知,迭代次数主要和误分类点有关,下面给出这个算法的收敛性分析。
4 算法收敛性
为了表述方便,令 w + = ( w T , b ) T , x + = ( x T , 1 ) T . w^+=(w^T,b)^T,x^+=(x^T,1)^T. w+=(wT,b)T,x+=(xT,1)T.下面给出收敛性定理,证明见参考资料.
Novikoff定理
设训练数据集 D = { ( x i , y i ) } i = 1 N D=\left\{\left(x_i, y_i\right)\right\}_{i=1}^N D={(xi,yi)}i=1N 是线性可分的,其中 x i ∈ X = R n , y i ∈ Y = { + 1 , − 1 } x_i \in \mathcal{X}=\mathrm{R}^n, y_i \in \mathcal{Y}=\{+1,-1\} xi∈X=Rn,yi∈Y={+1,−1}, 则
- 存在满足 ∥ w o p t + ∥ = 1 \left\|w_{o p t}^{+}\right\|=1 wopt+ =1 的超平面 w o p t + ⋅ x + = 0 w_{o p t}^{+} \cdot x^{+}=0 wopt+⋅x+=0 将训练数据集完全正确分开;
- 存在 γ > 0 \gamma>0 γ>0 ,对所有 i ≥ 1 , y i w o p t + ⋅ x i + ≥ γ i \geq 1, y_i w_{o p t}^{+} \cdot x_i^{+} \geq \gamma i≥1,yiwopt+⋅xi+≥γ;
- 令 R = max 1 ≤ i ≤ N ∥ x i + ∥ R=\max\limits_{1 \leq i \leq N}\left\|x_i^{+}\right\| R=1≤i≤Nmax xi+ , 则感知机算法在训练集上的误分类次数 k k k 满足: k ≤ ( R γ ) 2 k \leq\left(\frac{R}{\gamma}\right)^2 k≤(γR)2.
上述定理表明,误分类次数有上界,所以算法会在有限次迭代后终止。
四、感知机的缺点
Minsky 与Papert指出: 因为感知机是线性模型,所以不能表示复杂的函数,如异或函数 。
这里给出证明,我们考虑只有两个变量的情况,异或 ⊕ \oplus ⊕运算的规则如下:
x 1 x_1 x1 | x 2 x_2 x2 | x 1 ⊕ x 2 x_1\oplus x_2 x1⊕x2 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
其实在图上画出异或函数的四个点,很明显能看出不能用一条线分开这两类点:
为了严谨给出严格的数学证明。考虑如下的感知机模型:
f
(
x
)
=
sign
(
w
T
x
+
b
)
f(\boldsymbol{x}) = \operatorname{sign}(\boldsymbol{w}^T\boldsymbol{x} + b)
f(x)=sign(wTx+b)
其中
x
=
(
x
1
,
x
2
)
T
\boldsymbol{x} = (x_1,x_2)^T
x=(x1,x2)T,
w
=
(
w
1
,
w
2
)
T
\boldsymbol{w} = (w_1,w_2)^T
w=(w1,w2)T,
sign
(
x
)
=
{
1
,
x
≥
0
−
1
,
x
<
0
\operatorname{sign}(x) = \begin{cases} 1, & x \geq 0 \\ -1, & x < 0 \end{cases}
sign(x)={1,−1,x≥0x<0.接下来我们证明感知机不能表示异或。
反证法.假设感知机可以模拟异或运算,则必须满足:
- 当 x = ( 0 , 0 ) T \boldsymbol{x}=(0,0)^T x=(0,0)T时,有 f ( x ) = 0 f(\boldsymbol{x}) = 0 f(x)=0,从而 b < 0 b<0 b<0;
- 当 x = ( 1 , 0 ) T \boldsymbol{x}=(1,0)^T x=(1,0)T时,有 f ( x ) = 1 f(\boldsymbol{x}) = 1 f(x)=1,从而 w 1 > − b > 0 w_1>-b>0 w1>−b>0;
- 当 x = ( 0 , 1 ) T \boldsymbol{x}=(0,1)^T x=(0,1)T时,有 f ( x ) = 1 f(\boldsymbol{x}) = 1 f(x)=1,从而 w 2 > − b > 0 w_2>-b>0 w2>−b>0;
- 但是,当 x = ( 1 , 1 ) T \boldsymbol{x}=(1,1)^T x=(1,1)T时,有: f ( x ) = sign ( w 1 + w 2 + b ) = 1 f(\boldsymbol{x}) = \operatorname{sign}(w_1+w_2+b) = 1 f(x)=sign(w1+w2+b)=1,与 x 1 ⊕ x 2 = 0 x_1\oplus x_2=0 x1⊕x2=0矛盾。
因此,原假设不成立,感知机无法模拟异或逻辑运算。
这也是为什么在神经网络里面,要引入非线性的激活函数,使得模型更复杂,表达能力更强。
参考资料
- 李航. 机器学习方法. 清华大学出版社, 2022.