深度学习
什么是深度学习呢?我们总说,深度学习是机器学习的一个子集,说它是机器学习的进一步发展。为了说明深度学习比传统机器学习好在哪里,首先说明一下传统机器学习的两处不足。
(1)传统机器学习的两处不足:
决策边界
传统机器学习中有很重要的一步是选择算法模型,模型中会有一个学习函数。学习函数有很多参数,然后机器学习会使用算法,在诸多数据输入的基础上,利用统计理论,估计参数大小,完成模型建立。
当传统机器学习选择其学习函数后,其决策边界便基本已经确定,比如当你选择线性选择函数后,非线性问题此时便难以处理。而传统的机器学习并不能使用所有学习函数,对于非线性的、复杂的关系难以处理。
特征工程
机器学习中除了模型选择外,另外一个重要点就是输入特征的处理。是否选择?以何种形式选择?这些特征预处理是我们需要手动预操作的。然而模型的特征处理,其实是一个黑箱,对于不同的问题,特征的处理往往需要反复的尝试验证。
而当数据量巨大的时候,例如对于图像数据,一个像素就是RGB三个数据,对于10000×10000像素的一张图片,其数据总量瞬间达到了 3 × 1 0 8 3×10^8 3×108的量级,此时的特征选择采用人为的方式难度剧增。
那么如何解决这两个问题呢?为了解决这两个问题,人们研究了一种算法:人工神经网络。
(2)人工神经网络
人工神经网络(Arificial Neural Network),简称ANN,是从生物大脑受到启发,而对大脑的一种模拟。下面介绍ANN的几个重要概念。
人造神经元
人造神经元是ANN的基本组成单位。每个神经元可以视作一种简单的机器学习算法,它可以接受多个数值输入,再输出单一实数值。神经元中存在一个阈值,类似于生物神经元中的一个“激活电位”。当生物电高于电位时,生物神经元将“导通”(输出1),反之将“抑制”(输出0)。
对于一个有m个特征输入的人造线性神经元,一共有m+1个参数,分别是m个特征对应的权重和一个偏置
b
i
a
s
bias
bias。当属于一个样本
x
x
x时,线性单元输出为:
z
(
x
)
=
∑
i
=
1
m
ω
i
x
i
+
b
i
a
s
z(x)=\sum_{i=1}^m\omega_ix_i+bias
z(x)=i=1∑mωixi+bias
为表达方便通常令
b
i
a
s
=
ω
0
bias=\omega_0
bias=ω0,并为输入向量添加一个对应常数特征值1。变换输出为:
z
(
x
)
=
∑
i
=
0
m
ω
i
x
i
z(x)=\sum_{i=0}^m\omega_ix_i
z(x)=i=0∑mωixi
当
z
(
x
)
z(x)
z(x)值大于0时,我们称人造神经元为“导通”,小于等于0时,称为“抑制”。线性单元的输出值会送给下一级激活单元(激活函数)。
激活函数
激活函数是对线性单元输出结果的一种变换,即 f ( z ) f(z) f(z)。激活函数 f ( z ) f(z) f(z)本身是非线性的,它将把线性神经元的输出结果非线性地导入网络。如果没有激活函数,那么ANN将只能学习线性函数,激活函数是ANN得以学习复杂关系的基础。
理想情况下的激活函数为跃阶函数:
f
(
z
)
=
{
1
,
i
f
z
>
0
0
,
o
t
h
e
r
w
i
s
e
f(z)=\begin{cases} 1,if\ z>0\\ 0,otherwise \end{cases}
f(z)={1,if z>00,otherwise
然而间断函数难以优化,无法使用梯度下降法。最常引入的激活函数,是于跃阶函数相类似的sigmoid函数:
σ
(
z
)
=
1
1
+
e
−
z
\sigma(z)=\frac{1}{1+e^{-z}}
σ(z)=1+e−z1
它的一阶导数仍然为
σ
(
z
)
\sigma(z)
σ(z)的函数:
d
σ
(
z
)
d
z
=
σ
(
z
)
(
1
−
σ
(
z
)
)
\frac{d\sigma(z)}{dz}=\sigma(z)(1-\sigma (z))
dzdσ(z)=σ(z)(1−σ(z))
除了使用sigmoid函数为激活函数外,还有使用tanh、ReLu、SoftPlus作为激活函数,此处不再介绍,单纯使用sigmoid函数作为激活函数继续介绍ANN。
输入层、隐藏层、输出层
通常一个神经网络由输入层、隐藏层、输出层三层组成。输入和输出层仅有一层,隐藏层则可以有一个或多个,每个隐藏层之间连接方式相同。
如上图例中,若输入数据有3个特征,则输入层有三个输入节点,外加一个偏置项 x 0 x_0 x0对应的常数特征1。中间为隐藏层,仅有一层,有3个隐藏节点,外加一个偏置项。输出层有两个输出节点,例子中仅有两个分类结果,故是2个节点。
其中,隐藏层节点数的确定,则与训练的样本个数相关,一般训练样本个数是每层隐藏层节点个数的2-10倍。
反向传播算法(Back Propagation)
激活函数的非线性变换赋予了神经网络处理更复杂情况的能力,而反向传播算法(BP算法)就给予了ANN自动筛选特征的能力。
对于一个结构确定的ANN,其模型参数即为所有的权值
ω
i
j
\omega_{ij}
ωij。训练过程即为从权向量空间中搜索对应值
ω
\omega
ω使得训练误差最小。我们用均方误差来度量模型在训练集D上的误差:
M
S
E
(
ω
)
=
1
2
∑
d
∈
D
∑
k
∈
o
u
t
p
u
t
s
(
y
d
k
−
o
d
k
)
2
MSE(\omega)=\frac{1}{2}\sum_{d\in D}\sum_{k\in outputs}(y_{dk}-o_{dk})^2
MSE(ω)=21d∈D∑k∈outputs∑(ydk−odk)2
其中,d为数据集D的样本,outputs为输出节点的集合,
o
d
k
o_{dk}
odk为输出节点k的预测值,y_dk为实际值。就拿上图中的具体例子来说,假如训练集D中有10个样本,那么例子中对应的参数d则会将这10个样本遍历,并在最后的k=2个输出节点上呈现结果,其中
o
d
k
,
y
d
k
∈
{
0
,
1
}
o_{dk},y_{dk}\in \{0,1\}
odk,ydk∈{0,1}。
因为每个神经元的输出的 z ( x ) z(x) z(x)和到下一阶段的 f ( z ) f(z) f(z)都是连续可微的,因此 M S E ( ω ) MSE(\omega) MSE(ω)也是可微的,可以利用梯度下降法计算出 ω \omega ω。反向传播算法就是利用梯度下降法反向从输出层开始,到下一个隐藏层,到倒数第二个隐藏层这样更新网络中每个传递过程中的 ω i j \omega_{ij} ωij。而对于复杂的ANN,计算开销往往很大,因此通常使用随机梯度下降法进行训练,即每步只使用一个样本计算梯度更新权值。下面分两点介绍权值更新法则。
a.输出节点的权值更新
我们选择训练集D中,第d个样本训练,得到训练误差为:
M
S
E
d
(
ω
)
=
1
2
∑
k
∈
o
u
t
p
u
t
s
(
y
k
−
o
k
)
2
MSE_d(\omega)=\frac{1}{2}\sum_{k\in outputs}(y_k-o_k)^2
MSEd(ω)=21k∈outputs∑(yk−ok)2
若最后一层的隐藏层的节点
i
i
i,到输出层的节点
j
j
j,对应的权值为
w
i
j
w_{ij}
wij,计算梯度需要求偏导数
∂
M
S
E
d
∂
ω
i
j
\frac{\partial MSE_d}{\partial \omega_{ij}}
∂ωij∂MSEd,因此要考虑
w
i
j
w_{ij}
wij的变化如何影响
M
S
E
d
MSE_d
MSEd,具体如下:
1.输出节点 j j j的净输出 z j z_j zj,是 ω i j \omega_{ij} ωij为系数的线性函数,故 ω i j \omega_{ij} ωij的变化首先会导致 z j z_j zj的变化;
2.输出节点 o j o_j oj的输出是 f ( z j ) f(z_j) f(zj),是 z j z_j zj的函数,故 z j z_j zj的变化导致 o j o_j oj的变化;
3. M S E d MSE_d MSEd是 o j o_j oj的函数,故 o j o_j oj的变化导致 z j z_j zj的变化。
由以上推导,我们利用求导的链式法则计算
∂
M
S
E
d
∂
ω
i
j
\frac{\partial MSE_d}{\partial \omega_{ij}}
∂ωij∂MSEd得:
∂
M
S
E
d
∂
ω
i
j
=
∂
M
S
E
d
∂
z
j
∗
∂
z
j
∂
ω
i
j
=
∂
M
S
E
d
∂
o
j
∗
∂
o
j
∂
z
j
∗
∂
z
j
∂
ω
i
j
\begin{align} \frac{\partial MSE_d}{\partial \omega_{ij}} &=\frac{\partial MSE_d}{\partial z_j}*\frac{\partial z_j}{\partial \omega_{ij}}\\ &=\frac{\partial MSE_d}{\partial o_j}*\frac{\partial o_j}{\partial z_j}*\frac{\partial z_j}{\partial \omega_{ij}} \end{align}
∂ωij∂MSEd=∂zj∂MSEd∗∂ωij∂zj=∂oj∂MSEd∗∂zj∂oj∗∂ωij∂zj
分别计算上述三个偏导数为:
∂
M
S
E
d
∂
o
j
=
1
2
∗
∂
∑
k
∈
o
u
t
p
u
t
s
(
y
k
−
o
k
)
2
∂
o
j
=
−
(
y
j
−
o
j
)
∂
o
j
∂
z
j
=
∂
f
(
z
j
)
∂
z
j
=
o
j
(
1
−
o
j
)
∂
z
j
∂
ω
i
j
=
∂
∑
k
∈
o
u
t
p
u
t
s
ω
k
j
x
k
j
∂
ω
i
j
=
x
i
j
\begin{align} \frac{\partial MSE_d}{\partial o_j}&=\frac{1}{2}*\frac{\partial \sum_{k\in outputs}(y_k-o_k)^2}{\partial o_j}=-(y_j-o_j)\\ \frac{\partial o_j}{\partial z_j}&=\frac{\partial f(z_j)}{\partial z_j}=o_j(1-o_j)\\ \frac{\partial z_j}{\partial \omega_{ij}}&=\frac{\partial \sum_{k\in outputs}\omega_{kj}x_{kj}}{\partial \omega_{ij}}=x_{ij} \end{align}
∂oj∂MSEd∂zj∂oj∂ωij∂zj=21∗∂oj∂∑k∈outputs(yk−ok)2=−(yj−oj)=∂zj∂f(zj)=oj(1−oj)=∂ωij∂∑k∈outputsωkjxkj=xij
此处,我们令:
δ
j
=
−
∂
M
S
E
d
∂
z
j
=
−
∂
M
S
E
d
∂
o
j
∗
∂
o
j
∂
z
j
=
(
y
j
−
o
j
)
∗
o
j
∗
(
1
−
o
j
)
\delta_j=-\frac{\partial MSE_d}{\partial z_j}=-\frac{\partial MSE_d}{\partial o_j}*\frac{\partial o_j}{\partial z_j}=(y_j-o_j)*o_j*(1-o_j)
δj=−∂zj∂MSEd=−∂oj∂MSEd∗∂zj∂oj=(yj−oj)∗oj∗(1−oj)
于是,得到
∂
M
S
E
d
∂
ω
i
j
\frac{\partial MSE_d}{\partial \omega_{ij}}
∂ωij∂MSEd的计算公式为:
∂
M
S
E
d
∂
ω
i
j
=
−
δ
j
x
i
j
\frac{\partial MSE_d}{\partial \omega_{ij}}=-\delta_jx_{ij}
∂ωij∂MSEd=−δjxij
设随机梯度下降的学习率为
η
\eta
η,更新权值
ω
i
j
\omega_{ij}
ωij的增量为:
Δ
ω
i
j
=
η
δ
j
x
i
j
\Delta \omega_{ij}=\eta \delta_jx_{ij}
Δωij=ηδjxij
输出节点
j
j
j的权值
ω
i
j
\omega_{ij}
ωij的更新法则为:
ω
i
j
:
=
ω
i
j
+
Δ
ω
i
j
\omega_{ij}:=\omega_{ij}+\Delta \omega_{ij}
ωij:=ωij+Δωij
b.隐藏节点的权值更新
上述误差对于权值的偏导公式:
∂
M
S
E
d
∂
ω
i
j
=
∂
M
S
E
d
∂
o
j
∗
∂
o
j
∂
z
j
∗
∂
z
j
∂
ω
i
j
\frac{\partial MSE_d}{\partial \omega_{ij}}= \frac{\partial MSE_d}{\partial o_j}*\frac{\partial o_j}{\partial z_j}*\frac{\partial z_j}{\partial \omega_{ij}}
∂ωij∂MSEd=∂oj∂MSEd∗∂zj∂oj∗∂ωij∂zj
对于隐藏层中层与层之间的传导依然成立,并且其中:
∂
o
j
∂
z
j
=
∂
f
(
z
j
)
∂
z
j
=
o
j
(
1
−
o
j
)
∂
z
j
∂
ω
i
j
=
∂
∑
k
∈
o
u
t
p
u
t
s
ω
k
j
x
k
j
∂
ω
i
j
=
x
i
j
\begin{align} \frac{\partial o_j}{\partial z_j}&=\frac{\partial f(z_j)}{\partial z_j}=o_j(1-o_j)\\ \frac{\partial z_j}{\partial \omega_{ij}}&=\frac{\partial \sum_{k\in outputs}\omega_{kj}x_{kj}}{\partial \omega_{ij}}=x_{ij} \end{align}
∂zj∂oj∂ωij∂zj=∂zj∂f(zj)=oj(1−oj)=∂ωij∂∑k∈outputsωkjxkj=xij
依然成立。即隐藏层中,单层输出
o
j
o_j
oj依然仅取决于单层净输出结果
z
j
z_j
zj,单层净输出依然受
ω
i
j
\omega_{ij}
ωij直接影响。
但是,对于
∂
M
S
E
d
∂
o
j
\frac{\partial MSE_d}{\partial o_j}
∂oj∂MSEd来说,当隐藏层中的第
(
k
−
1
)
(k-1)
(k−1)层中的第
j
j
j个节点的输出确定为
o
j
o_j
oj时,网络会把这个结果投射到其后
k
k
k层开始的每一个神经元。因此后面每一个神经元的净输出
z
k
z_k
zk都是
o
j
o_j
oj的函数。因此
o
j
o_j
oj的变化先导致其后所有神经元的净输出,每个神经元的净输出
z
k
z_k
zk影响其对输出
o
k
o_k
ok,进而影响到
M
S
E
d
MSE_{d}
MSEd。我们假设downstream为k层的神经元的集合。则有:
∂
M
S
E
d
∂
o
j
=
∑
l
∈
d
o
w
n
s
t
r
e
a
m
∂
M
S
E
d
∂
z
l
∗
∂
z
l
∂
o
j
\frac{\partial MSE_d}{\partial o_j}=\sum_{l \in downstream} \frac{\partial MSE_d}{\partial z_l}*\frac{\partial z_l}{\partial o_j}
∂oj∂MSEd=l∈downstream∑∂zl∂MSEd∗∂oj∂zl
其中,
o
j
o_j
oj即为(k-1)层中节点j的输出,也为k层中,每一层的输入,因此对于第k层中第
l
l
l个节点,有
o
j
=
x
l
j
o_j=x_{lj}
oj=xlj。于是有:
∂
z
i
∂
o
j
=
∂
(
w
1
j
x
1
j
+
w
2
j
x
2
j
+
⋯
+
w
l
j
x
l
j
+
…
)
∂
x
l
j
=
ω
l
j
\frac{\partial z_i}{\partial o_j}= \frac{\partial (w_{1j}x_{1j}+w_{2j}x_{2j}+\dots+w_{lj}x_{lj}+\dots)}{\partial x_{lj}} =\omega_{lj}
∂oj∂zi=∂xlj∂(w1jx1j+w2jx2j+⋯+wljxlj+…)=ωlj
又因为
δ
j
=
−
∂
M
S
E
d
∂
z
j
=
−
∂
M
S
E
d
∂
o
j
∗
∂
o
j
∂
z
j
=
−
∂
M
S
E
d
∂
o
j
∗
o
j
(
1
−
o
j
)
=
o
j
(
1
−
o
j
)
∗
∑
l
∈
d
o
w
n
s
t
r
e
a
m
δ
l
ω
l
j
\begin{align} \delta_j &=-\frac{\partial MSE_d}{\partial z_j}\\ &=-\frac{\partial MSE_d}{\partial o_j}*\frac{\partial o_j}{\partial z_j}\\ &=-\frac{\partial MSE_d}{\partial o_j}*o_j(1-o_j)\\ &=o_j(1-o_j)*\sum_{l \in downstream}\delta_l\omega_{lj} \end{align}
δj=−∂zj∂MSEd=−∂oj∂MSEd∗∂zj∂oj=−∂oj∂MSEd∗oj(1−oj)=oj(1−oj)∗l∈downstream∑δlωlj
于是,
∂
M
S
E
d
∂
ω
i
j
\frac{\partial MSE_d}{\partial \omega_{ij}}
∂ωij∂MSEd的计算公式即为
∂
M
S
E
d
∂
ω
i
j
=
−
δ
j
x
i
j
\frac{\partial MSE_d}{\partial \omega_{ij}}=-\delta_jx_{ij}
∂ωij∂MSEd=−δjxij
设随机梯度下降法的学习率为
η
\eta
η,则更新权值的增量为
Δ
ω
i
j
=
η
δ
j
x
i
j
\Delta \omega_{ij}=\eta \delta_jx_{ij}
Δωij=ηδjxij
更新法则为
ω
i
j
:
=
ω
i
j
+
Δ
ω
i
j
\omega_{ij}:=\omega_{ij}+\Delta \omega_{ij}
ωij:=ωij+Δωij
对比隐藏层节点与输出层节点的的权值更新计算法则,其主要差别就在于
δ
j
\delta_j
δj。输出层节点的
δ
j
\delta_j
δj计算公式为
δ
j
=
(
y
j
−
o
j
)
∗
o
j
∗
(
1
−
o
j
)
\delta_j=(y_j-o_j)*o_j*(1-o_j)
δj=(yj−oj)∗oj∗(1−oj)
隐藏层节点计算依赖于其下一层的每一个节点对于的
δ
l
\delta_l
δl,公式为
δ
j
=
o
j
(
1
−
o
j
)
∗
∑
l
∈
d
o
w
n
s
t
r
e
a
m
δ
l
ω
l
j
\delta_j=o_j(1-o_j)*\sum_{l \in downstream}\delta_l\omega_{lj}
δj=oj(1−oj)∗l∈downstream∑δlωlj
所以,我们首先需要计算输出层所有节点对应的
δ
\delta
δ,然后倒序计算每一个节点对应的
δ
\delta
δ,这就是反向传播算法名称的由来。
(3)深度学习与人工神经网络的联系
深度学习的发展源自于人工神经网络,两者在结构上都采用了相似的分层结构,这其中包括输入层、隐藏层、输出层的分类和相邻层节点间的连接等。
但是人工神经网络本身也存在着一些问题,比如传统机器学习都容易发生的”过拟合“和”训练速度慢“问题。另外,人工神经网络采用了我们如上介绍的BP算法来更新和计算权值使得目标损失函数得到收敛,该算法当神经网络层数较多时,容易发生”梯度消失“和”梯度爆炸“的后果。
何为”梯度消失“和”梯度爆炸“呢?我们假设有一个2层隐藏层的ANN,则第三层为输出层,每个隐藏层的权值更新取决于
Δ
ω
i
j
=
η
δ
j
x
i
j
\Delta \omega_{ij}=\eta \delta_jx_{ij}
Δωij=ηδjxij,其中学习率和输入的训练样本均可视作常数,于是
Δ
ω
i
j
\Delta \omega_{ij}
Δωij的大小便主要取决于
δ
j
\delta_j
δj。此时第一层隐藏层的
δ
j
(
1
)
\delta_j^{(1)}
δj(1)计算公式为:
δ
j
(
1
)
=
o
j
(
1
)
(
1
−
o
j
(
1
)
)
∑
l
∈
d
o
w
n
s
t
r
e
a
m
2
δ
l
(
2
)
ω
l
j
(
2
)
=
o
j
(
1
)
(
1
−
o
j
(
1
)
)
∑
l
∈
d
o
w
n
s
t
r
e
a
m
2
{
o
l
(
2
)
(
1
−
o
l
(
2
)
)
∑
m
∈
d
o
w
n
s
t
r
e
a
m
3
δ
m
(
3
)
ω
m
j
(
3
)
}
ω
l
j
(
2
)
=
o
j
(
1
)
(
1
−
o
j
(
1
)
)
∑
l
∈
d
o
w
n
s
t
r
e
a
m
2
{
o
l
(
2
)
(
1
−
o
l
(
2
)
)
∑
m
∈
d
o
w
n
s
t
r
e
a
m
3
[
(
y
j
−
o
j
(
3
)
)
o
j
(
3
)
(
1
−
o
j
(
3
)
)
]
ω
m
j
(
3
)
}
ω
l
j
(
2
)
\begin{align} \delta_j^{(1)} &=o_j^{(1)}(1-o_j^{(1)})\sum_{l \in downstream2}\delta_l^{(2)}\omega_{lj}^{(2)}\\ &=o_j^{(1)}(1-o_j^{(1)})\sum_{l \in downstream2}\{o_l^{(2)}(1-o_l^{(2)})\sum_{m \in downstream3}\delta_m^{(3)}\omega_{mj}^{(3)}\}\omega_{lj}^{(2)}\\ &=o_j^{(1)}(1-o_j^{(1)})\sum_{l \in downstream2}\{o_l^{(2)}(1-o_l^{(2)})\sum_{m \in downstream3}[(y_j-o_j^{(3)})o_j^{(3)}(1-o_j^{(3)})]\omega_{mj}^{(3)}\}\omega_{lj}^{(2)} \end{align}
δj(1)=oj(1)(1−oj(1))l∈downstream2∑δl(2)ωlj(2)=oj(1)(1−oj(1))l∈downstream2∑{ol(2)(1−ol(2))m∈downstream3∑δm(3)ωmj(3)}ωlj(2)=oj(1)(1−oj(1))l∈downstream2∑{ol(2)(1−ol(2))m∈downstream3∑[(yj−oj(3))oj(3)(1−oj(3))]ωmj(3)}ωlj(2)
因此可以想象,当层数增多时,
δ
j
\delta_j
δj的变化将是不断嵌套累乘的。所以当ANN层数较多时,若
o
j
o_j
oj和
w
m
j
w_{mj}
wmj的乘积小于1时,其累乘会使得前部变化几乎为0,即梯度消失;若
o
j
o_j
oj和
w
m
j
w_{mj}
wmj的乘积大于1时,其累乘会使得前部变化趋向无穷,即梯度爆炸。因此传统的ANN其实无法具有太多的层数。
而深度学习,就是在ANN基础上,优化ANN算法的一类模式分析方法。其中包括循环神经网络、卷积神经网络、自编码神经网络、深度置信网络等诸多算法理论和思想。
参考文章
3.《Python机器学习算法原理、实现与案例》————刘硕