- 本文为《深度学习入门 – 基于 Python 的理论与实现》、《统计学习方法》的读书笔记
目录
感知机模型 (perceptron)
感知机 (线性分类模型)
- 假设输入空间 (特征空间) 是
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)=\text{sign}(w\cdot x+b) f(x)=sign(w⋅x+b) b b b 称为偏置 (bias), w w w 称为权重向量 (weight vector). 其中 sign \text{sign} sign 为符号函数,也可以看作是感知机的激活函数
感知机是神经网络和支持向量机的基础
几何解释
- 线性方程
w
⋅
x
+
b
=
0
w\cdot x+b=0
w⋅x+b=0 对应于特征空间
R
n
\R^n
Rn 中的一个超平面
S
S
S, 其中
w
w
w 是超平面的法向量,
b
b
b 是超平面的截距。这个超平面将特征空间划分为两个部分。位于两部分的点 (特征向量) 分别被分为正、负两类。因此,超平面
S
S
S 称为分离超平面 (separating hyperplane)
感知机学习策略
数据集的线性可分性
- 如果存在某个超平面
S
S
S
w ⋅ x + b = 0 w\cdot x+b=0 w⋅x+b=0能够将数据集的正实例点和负实例点完全正确地划分到超平面的两侧,则称数据集 T T T 为线性可分数据集 (linearly separable data set)
感知机学习策略
损失函数定义
- 假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练集正实例点和负实例点完全正确分开的分离超平面。为了找出这样的超平面,即确定感知机模型参数
w
w
w,
b
b
b,需要确定一个学习策略,即定义 (经验) 损失函数并将损失函数极小化
- 可将损失函数定义为误分类点到超平面 S S S 的总距离
损失函数表示
- 我们先写出任一点
x
0
x_0
x0 到超平面
S
S
S 的距离:
- 证明:设
x
0
x_0
x0 在超平面上的投影为
x
′
x'
x′,则
d
=
x
0
−
x
′
d=x_0-x'
d=x0−x′ 平行于
w
w
w,因此
∣ d ⋅ w ∣ = ∣ ∣ d ∣ ∣ ⋅ ∣ ∣ w ∣ ∣ ( 1 ) |d\cdot w|=|| d||\cdot|| w||\ \ \ \ \ \ (1) ∣d⋅w∣=∣∣d∣∣⋅∣∣w∣∣ (1)又因为
d ⋅ w = x 0 ⋅ w − x ′ ⋅ w = x 0 ⋅ w + b ( 2 ) d\cdot w=x_0\cdot w-x'\cdot w=x_0\cdot w+b\ \ (2) d⋅w=x0⋅w−x′⋅w=x0⋅w+b (2)两式联立可得
∣ ∣ d ∣ ∣ = ∣ w ⋅ x 0 + b ∣ ∣ ∣ w ∣ ∣ || d||=\frac{|w\cdot x_0+b|}{|| w||} ∣∣d∣∣=∣∣w∣∣∣w⋅x0+b∣
- 证明:设
x
0
x_0
x0 在超平面上的投影为
x
′
x'
x′,则
d
=
x
0
−
x
′
d=x_0-x'
d=x0−x′ 平行于
w
w
w,因此
- 对于误分类的数据
(
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 到超平面 S S S 的距离是
假设超平面 S S S 的误分类点集合为 M M M,那么所有误分类点到超平面 S S S 的总距离为
不考虑 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} ∣∣w∣∣1 就得到感知机学习的损失函数 (即使用函数间隔而非几何间隔)
该损失函数非负且是 w , b w,b w,b 的连续可导函数
为什么可以不考虑 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} ∣∣w∣∣1?
Ref: 感知机的损失函数为什么可以采用函数间隔
- 感知机只适用于数据集线性可分的情况,因此我们的目的就是使感知机能正确分类所有的点,而正确分类所有的点时无论加不加 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} ∣∣w∣∣1 损失函数均为 0,因此这里可以不考虑 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} ∣∣w∣∣1
感知机学习算法
感知机学习算法的原始形式
- 感知机学习算法采用随机梯度下降法。假设误分类点集合
M
M
M 是固定的,那么损失函数
L
(
w
,
b
)
L(w,b)
L(w,b) 的梯度为
随机选取一个误分类点 ( x i , y i ) (x_i,y_i) (xi,yi) 对 w , b w,b w,b 进行更新 (其中 η \eta η 为学习率):
感知机学习算法的原始形式
- 感知机学习算法存在许多解,这些解既依赖于初值的选择,也依赖于迭代过程中误分类点的选择顺序。为了得到唯一的超平面,需要对分离超平面增加约束条件。这就是线性支持向量机的想法
算法的收敛性
- 现在证明,对于线性可分数据集感知机学习算法原始形式收敛, 即经过有限次迭代可以得到一个将训练数据集完全正确划分的分离超平面及感知机模型
Notation
- 为了便于叙述与推导,设
w
^
=
(
w
T
,
b
)
T
,
x
^
=
(
x
T
,
1
)
T
\hat w=(w^T,b)^T,\hat x=(x^T,1)^T
w^=(wT,b)T,x^=(xT,1)T,感知机即为
f ( x ) = w ^ ⋅ x ^ f(x)=\hat w\cdot\hat x f(x)=w^⋅x^
定理 2.1 (Novikoff)
- 设训练数据集
T
=
{
(
x
1
,
y
1
)
,
.
.
.
,
(
x
N
,
y
N
)
}
T = \{(x_1,y_1),..., (x_N ,y_N)\}
T={(x1,y1),...,(xN,yN)} 是线性可分的,其中
x
i
∈
R
n
x_i\in\R^n
xi∈Rn,
y
i
∈
{
−
1
,
+
1
}
y_i\in\{-1,+1\}
yi∈{−1,+1},
i
=
1
,
.
.
.
,
N
i =1,..., N
i=1,...,N,则
- (1) 存在满足条件
∣
∣
w
^
o
p
t
∣
∣
=
1
||\hat w_{opt}||=1
∣∣w^opt∣∣=1 的超平面
w
^
o
p
t
⋅
x
^
=
0
\hat w_{opt}\cdot\hat x=0
w^opt⋅x^=0 将训练数据集完全正确分开; 且存在
γ
>
0
\gamma> 0
γ>0,对所有
i
=
1
,
2
,
.
.
.
,
N
i = 1, 2,...,N
i=1,2,...,N
y i ( w ^ o p t ⋅ x ^ i ) ≥ γ y_i(\hat w_{opt}\cdot\hat x_i)\geq\gamma yi(w^opt⋅x^i)≥γ - (2) 令
R
=
max
1
≤
i
≤
N
∣
∣
x
^
i
∣
∣
R=\max_{1\leq i\leq N}||\hat x_i||
R=max1≤i≤N∣∣x^i∣∣,则原始感知机算法在训练数据集上的误分类次数
k
k
k 满足不等式
k ≤ ( R γ ) 2 k\leq\bigg(\frac{R}{\gamma}\bigg)^2 k≤(γR)2
- (1) 存在满足条件
∣
∣
w
^
o
p
t
∣
∣
=
1
||\hat w_{opt}||=1
∣∣w^opt∣∣=1 的超平面
w
^
o
p
t
⋅
x
^
=
0
\hat w_{opt}\cdot\hat x=0
w^opt⋅x^=0 将训练数据集完全正确分开; 且存在
γ
>
0
\gamma> 0
γ>0,对所有
i
=
1
,
2
,
.
.
.
,
N
i = 1, 2,...,N
i=1,2,...,N
证明
- (1) 由于数据集线性可分,因此必存在满足条件
∣
∣
w
^
o
p
t
∣
∣
=
1
||\hat w_{opt}||=1
∣∣w^opt∣∣=1 的超平面
w
^
o
p
t
⋅
x
^
=
0
\hat w_{opt}\cdot\hat x=0
w^opt⋅x^=0 将训练数据集完全正确分开;进而有
y i ( w ^ o p t ⋅ x ^ i ) > 0 y_i(\hat w_{opt}\cdot\hat x_i)>0 yi(w^opt⋅x^i)>0所以取 γ = min i { y i ( w ^ o p t ⋅ x ^ i ) } \gamma=\min_i\{y_i(\hat w_{opt}\cdot\hat x_i)\} γ=mini{yi(w^opt⋅x^i)} 即可 - (2) 感知机算法从
w
0
=
0
w_0= 0
w0=0 开始,如果实例被误分类,则更新权重。令
w
k
−
1
w_{k-1}
wk−1 是第
k
k
k 个误分类实例之前的扩充权重向量。若
(
x
i
,
y
i
)
(x_i, y_i)
(xi,yi) 是被
w
^
k
−
1
\hat w_{k-1}
w^k−1 误分类的数据,则
即
- 下面推导
w
^
k
⋅
w
^
o
p
t
≥
k
η
γ
\hat w_k\cdot \hat w_{opt}\geq k\eta \gamma
w^k⋅w^opt≥kηγ:
w ^ k ⋅ w ^ o p t = ( w ^ k − 1 + η y i x ^ i ) ⋅ w ^ o p t = w ^ k − 1 ⋅ w ^ o p t + η y i x ^ i ⋅ w ^ o p t ≥ w ^ k − 1 ⋅ w ^ o p t + η γ \begin{aligned} \hat w_k\cdot \hat w_{opt}&=(\hat w_{k-1}+\eta y_i\hat x_i)\cdot\hat w_{opt} \\&=\hat w_{k-1}\cdot\hat w_{opt}+\eta y_i\hat x_i\cdot\hat w_{opt} \\&\geq \hat w_{k-1}\cdot\hat w_{opt}+\eta \gamma \end{aligned} w^k⋅w^opt=(w^k−1+ηyix^i)⋅w^opt=w^k−1⋅w^opt+ηyix^i⋅w^opt≥w^k−1⋅w^opt+ηγ由此递推可得 w ^ k ⋅ w ^ o p t ≥ k η γ \hat w_k\cdot \hat w_{opt}\geq k\eta \gamma w^k⋅w^opt≥kηγ - 下面推导
∣
∣
w
^
k
∣
∣
2
≤
k
η
2
R
2
||\hat w_k||^2\leq k\eta^2R^2
∣∣w^k∣∣2≤kη2R2
∣ ∣ w ^ k ∣ ∣ 2 = ∣ ∣ w ^ k − 1 + η y i x ^ i ∣ ∣ 2 = ∣ ∣ w ^ k − 1 ∣ ∣ 2 + 2 η y i w ^ k − 1 ⋅ x ^ i + η 2 ∣ ∣ x ^ i ∣ ∣ 2 ≤ ∣ ∣ w ^ k − 1 ∣ ∣ 2 + η 2 ∣ ∣ x ^ i ∣ ∣ 2 ≤ ∣ ∣ w ^ k − 1 ∣ ∣ 2 + η 2 R 2 \begin{aligned} ||\hat w_k||^2&=||\hat w_{k-1}+\eta y_i\hat x_i||^2 \\&=||\hat w_{k-1}||^2+2\eta y_i\hat w_{k-1}\cdot\hat x_i+\eta^2||\hat x_i||^2 \\&\leq||\hat w_{k-1}||^2+\eta^2||\hat x_i||^2 \\&\leq||\hat w_{k-1}||^2+\eta^2R^2 \end{aligned} ∣∣w^k∣∣2=∣∣w^k−1+ηyix^i∣∣2=∣∣w^k−1∣∣2+2ηyiw^k−1⋅x^i+η2∣∣x^i∣∣2≤∣∣w^k−1∣∣2+η2∣∣x^i∣∣2≤∣∣w^k−1∣∣2+η2R2由此递推可得 ∣ ∣ w ^ k ∣ ∣ 2 ≤ k η 2 R 2 ||\hat w_k||^2\leq k\eta^2R^2 ∣∣w^k∣∣2≤kη2R2 - 由上面推导的两式可知
k η γ ≤ w ^ k ⋅ w ^ o p t ≤ ∣ ∣ w ^ k ∣ ∣ ∣ ∣ w ^ o p t ∣ ∣ ≤ k η R k\eta \gamma\leq \hat w_k\cdot \hat w_{opt}\leq ||\hat w_k||\ || \hat w_{opt}||\leq\sqrt k\eta R kηγ≤w^k⋅w^opt≤∣∣w^k∣∣ ∣∣w^opt∣∣≤kηR于是
k ≤ ( R γ ) 2 k\leq\bigg(\frac{R}{\gamma}\bigg)^2 k≤(γR)2
- 下面推导
w
^
k
⋅
w
^
o
p
t
≥
k
η
γ
\hat w_k\cdot \hat w_{opt}\geq k\eta \gamma
w^k⋅w^opt≥kηγ:
当训练集线性不可分时,感知机学习算法不收敛, 迭代结果会发生震荡
感知机学习算法的对偶形式
感知机学习算法的原始形式和对偶形式与支持向量机学习算法的原始形式和对偶形式相对应
- 对偶形式的基本想法是,将
w
w
w 和
b
b
b 表示为实例
x
i
x_i
xi 和标记
y
i
y_i
yi 的线性组合的形式,通过求解其系数而求得
w
w
w 和
b
b
b。不失一般性,在原始算法中可假设初始值
w
0
,
b
w_0,b
w0,b 均为 0。对误分类点
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi) 通过
逐步修改 w , b w,b w,b。设修改 n n n 次,则 w , b w,b w,b 关于 ( x i , y i ) (x_i,y_i) (xi,yi) 的增量分别是 α i y i x i α_iy_ix_i αiyixi 和 α i y i α_iy_i αiyi,这里 α i = n i η \alpha_i=n_iη αi=niη, n i n_i ni 为 ( x i , y i ) (x_i,y_i) (xi,yi) 更新的次数,实例点更新次数越多,意味着它距离分离超平面越近,也就越难正确分类。换句话说,这样的实例对学习结果影响最大。这样,从学习过程不难看出,最后学习到的 w , b w,b w,b 可以分别表示为
Trick:
- 对偶形式中训练实例仅以内积的形式出现。为了方便,可以预先将训练集中实例间的内积计算出来并以矩阵的形式存储,即 Gram matrix
多层感知机
利用感知机实现与门,与非门以及或门
import numpy as np
def perceptron(x, w, b):
val = np.sum(x * w) + b
return 0 if val <= 0 else 1
# 使用装饰器来测试各种门,在原有的门的基础上进行一些打印输出
def test_gate(test = False):
def decorator(gate):
def wrapper(*args, **kargs):
if test == True:
print(gate.__name__, ':')
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = gate(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
return gate(*args, **kargs)
return wrapper
return decorator
@test_gate(True)
def and_gate(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
return perceptron(x, w, -0.75)
@test_gate(True)
def nand_gate(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
return perceptron(x, w, 0.75)
@test_gate(True)
def or_gate(x1, x2):
x = np.array([x1, x2])
w = np.array([1, 1])
return perceptron(x, w, -0.5)
if __name__ == '__main__':
and_gate(0, 0)
nand_gate(0, 0)
or_gate(0, 0)
代码输出:
and_gate :
(0, 0) -> 0
(1, 0) -> 0
(0, 1) -> 0
(1, 1) -> 1
nand_gate :
(0, 0) -> 1
(1, 0) -> 1
(0, 1) -> 1
(1, 1) -> 0
or_gate :
(0, 0) -> 0
(1, 0) -> 1
(0, 1) -> 1
(1, 1) -> 1
感知机的局限性
- 单层感知机无法分离非线性空间
利用感知机实现异或门
感知机通过叠加层实现异或门
- 感知机的绝妙之处在于它可以“叠加层”,组成多层感知机来分离非线性空间,进行非线性的表示。多层感知机即是一种多层结构的神经网络。已有研究证明,2 层感知机(严格地说是激活函数使用了非线性的
s
i
g
m
o
i
d
sigmoid
sigmoid 函数的感知机,可以表示任意函数
@test_gate(True)
def xor_gate(x1, x2):
s1 = nand_gate(x1, x2)
s2 = or_gate(x1, x2)
return and_gate(s1, s2)
if __name__ == '__main__':
xor_gate(0, 0)
代码输出:
xor_gate :
(0, 0) -> 0
(1, 0) -> 1
(0, 1) -> 1
(1, 1) -> 0