1、深度神经网络(DNN)模型
深度神经网络(Deep Neural Networks, 如下简称DNN)是深度学习的基础,而要理解DNN,首先咱们要理解DNN模型,下面咱们就对DNN的模型与前向传播算法作一个总结。html
1.1 从感知机到神经网络
感知机的模型你们都比较熟悉,它是一个有若干输入和一个输出的模型,以下图:web
输出和输入之间学习到一个线性关系,获得中间输出结果:
z=i=1∑mwixi+b算法
接着是一个神经元激活函数:
sign(z)={−11z<0z≥0网络
从而获得咱们想要的输出结果1或者-1。app
这个模型只能用于二元分类,且没法学习比较复杂的非线性模型,所以在工业界没法使用。机器学习
而神经网络则在感知机的模型上作了扩展,总结下主要有三点:ide
1)加入了隐藏层,隐藏层能够有多层,加强模型的表达能力,以下图实例,固然增长了这么多隐藏层模型的复杂度也增长了好多。svg
2)输出层的神经元也能够不止一个输出,能够有多个输出,这样模型能够灵活的应用于分类回归,以及其余的机器学习领域好比降维和聚类等。多个神经元输出的输出层对应的一个实例以下图,输出层如今有4个神经元了。函数
3) 对激活函数作扩展,感知机的激活函数是
sign(z),虽然简单可是处理能力有限,所以神经网络中通常使用的其余的激活函数,好比咱们在逻辑回归里面使用过的Sigmoid函数,即:
f(z)=1+e−z1布局
还有后来出现的tanx, softmax,和ReLU等。经过使用不一样的激活函数,神经网络的表达能力进一步加强。对于各类经常使用的激活函数,我随后会整理一份资料。
1.2 DNN的基本结构
上一节咱们了解了神经网络基于感知机的扩展,而DNN能够理解为有不少隐藏层的神经网络。这个不少其实也没有什么度量标准, 多层神经网络和深度神经网络DNN其实也是指的一个东西,固然,DNN有时也叫作多层感知机(Multi-Layer perceptron,MLP), 名字实在是多。后面咱们讲到的神经网络都默认为DNN。
从DNN按不一样层的位置划分,DNN内部的神经网络层能够分为三类,输入层,隐藏层和输出层,以下图示例,通常来讲第一层是输入层,最后一层是输出层,而中间的层数都是隐藏层。
层与层之间是全链接的,也就是说,第
i层的任意一个神经元必定与第
i+1层的任意一个神经元相连。虽然DNN看起来很复杂,可是从小的局部模型来讲,仍是和感知机同样,即一个线性关系
z=∑wixi+b 加上一个激活函数
σ(z)。
因为DNN层数多,则咱们的线性关系系数
w和偏倚
b的数量也就是不少了。具体的参数在DNN是如何定义的呢?
首先咱们来看看线性关系系数
w的定义。如下图一个三层的DNN为例,第二层的第4个神经元到第三层的第2个神经元的线性系数定义为
w243。上标3表明线性系数
w所在的层数,而下标对应的是输出的第三层索引2和输入的第二层索引4。你也许会问,为何不是
w423, 而是
w243呢?这主要是为了便于模型用于矩阵表示运算,若是是
w423每次进行矩阵运算是
wTx+b,须要进行转置。将输出的索引放在前面的话,则线性运算不用转置,即直接为
wx+b。总结下,第
l−1层的第
k个神经元到第
l层的第
j个神经元的线性系数定义为
wjkl。注意,输入层是没有
w参数的。
再来看看偏倚
b的定义。仍是以这个三层的DNN为例,第二层的第3个神经元对应的偏倚定义为
b32。其中,上标2表明所在的层数,下标3表明偏倚所在的神经元的索引。输入层是没有偏倚参数
b的。
一样的道理,对于神经元的激活值而言,第3层的第1个神经元的激活值应该表示为
a13。
2、DNN前向传播算法
2.1 DNN前向传播算法数学原理
在上一节,咱们已经介绍了DNN各层线性关系系数
w和偏倚
b的定义。假设咱们选择的激活函数是
σ(z),隐藏层和输出层的输出值为
a,则对于下图的三层DNN,利用和感知机同样的思路,咱们能够利用上一层的输出计算下一层的输出,也就是所谓的DNN前向传播算法。
对于第二层的的输出
a12,a22,a32,咱们有:
a12=σ(z12)=σ(w112x1+w122x2+w132x3+b12)
a22=σ(z22)=σ(w212x1+w222x2+w232x3+b22)
a32=σ(z32)=σ(w312x1+w322x2+w332x3+b32)
对于第三层的的输出
a13,咱们有:
a13=σ(z13)=σ(w113a12+w123a22+w133a32+b13)
将上面的例子通常化,假设第
l−1层共有
m个神经元,则对于第
l层的第
j个神经元的输出
ajl,咱们有:
ajl=σ(zjl)=σ(k=1∑mwjklakl−1+bjl)
其中,若是
l=2,则对于的
ak1即为输入层的
xk。
从上面能够看出,使用代数法一个个的表示输出比较复杂,而若是使用矩阵法则比较的简洁。假设第
l−1层共有
m个神经元,而第
l层共有
n个神经元,则第
l层的线性系数
w组成了一个
n×m的矩阵
Wl, 第
l层的偏倚
b组成了一个
n×1的向量
bl , 第
l−1层的输出
a组成了一个
m×1的向量
al−1,第
l层的未激活前线性输出
z组成了一个
n×1的向量
zl, 第
l层的的输出
a组成了一个
n×1的向量
al。则用矩阵法表示,第
l层的输出为:
al=σ(zl)=σ(Wlal−1+bl)
这个表示方法简洁漂亮,后面咱们的讨论都会基于上面的这个矩阵法表示来。因此,应该时刻记住咱们符号的含义,不然在后面推导反向传播公式时会比较懵。
2.2 DNN前向传播算法
有了上一节的数学推导,DNN的前向传播算法也就不难了。所谓的DNN的前向传播算法也就是利用咱们的若干个权重系数矩阵
W和偏倚向量
b来和输入值向量
x进行一系列线性运算和激活运算,从输入层开始,一层层的向后计算,一直到运算到输出层,获得输出结果为止 。
输入: 总层数
L,全部隐藏层和输出层对应的矩阵
W,偏倚向量
b,输入值向量
x
输出:输出层的输出
aL
al=σ(zl)=σ(Wlal−1+bl)
最后的结果即为输出
aL。
2.3 DNN前向传播算法小结
单独看DNN前向传播算法,彷佛没有什么大用处,并且这一大堆的矩阵
W,偏倚向量
b对应的参数怎么得到呢?怎么获得最优的矩阵
W,偏倚向量
b呢?这个咱们在下一章讲DNN的反向传播算法时再讲。而理解反向传播算法的前提就是理解DNN的模型与前向传播算法。这也是咱们先讲前向传播算法的缘由。
3、DNN反向传播算法
3.1 DNN反向传播算法要解决的问题
在了解DNN的反向传播算法(Back Propagation,BP)前,咱们先要知道DNN反向传播算法要解决的问题,也就是说,何时咱们须要这个反向传播算法?
回到咱们监督学习的通常问题,假设咱们有
m个训练样本:
{(x1,y1),(x2,y2),...,(xm,ym)},其中
x为输入向量,特征维度为
nin,而
y为输出向量,特征维度为
nout。咱们须要利用这
m个样本训练出一个模型,当有一个新的测试样本
(xtest,?)来到时, 咱们能够预测
ytest向量的输出。
若是咱们采用DNN的模型,即咱们使输入层有
nin个神经元,而输出层有
nout个神经元。再加上一些含有若干神经元的隐藏层。此时咱们须要找到合适的全部隐藏层和输出层对应的线性系数矩阵
W和偏倚向量
b,让全部的训练样本输入计算出的输出尽量的等于或很接近样本输出。怎么找到合适的参数呢?
若是你们对传统的机器学习的算法优化过程熟悉的话,这里就很容易联想到咱们能够用一个合适的损失函数来度量训练样本的输出损失,接着对这个损失函数进行优化求最小化的极值,对应的一系列线性系数矩阵
W和偏倚向量
b即为咱们的最终结果。在DNN中,损失函数优化极值求解的过程最多见的通常是经过梯度降低法来一步步迭代完成的,固然也能够是其余的迭代方法好比牛顿法与拟牛顿法。
对DNN的损失函数用梯度降低法进行迭代优化求极小值的过程即为咱们的反向传播算法。
3.2 DNN反向传播算法的基本思路
在进行DNN反向传播算法前,咱们须要选择一个损失函数,来度量训练样本计算出的输出和真实的训练样本输出之间的损失。你也许会问:训练样本计算出的输出是怎么得来的?这个输出是随机选择一系列
W,b,用前向传播算法计算出来的。即经过一系列的计算:
al=σ(zl)=σ(Wlal−1+bl)。计算到输出层第
L层对应的
aL即为前向传播算法计算出来的输出。
回到损失函数,DNN可选择的损失函数有很多,为了专一算法,这里咱们使用最多见的均方差来度量损失。固然,针对不一样的任务,能够选择不一样的损失函数。即对于每一个样本,咱们指望最小化下式:
J(W,b,x,y)=21∣∣aL−y∣∣22
其中,
aL和
y为特征维度为
nout的向量,而
∣∣S∣∣2为
S的L2范数。
损失函数有了,如今咱们开始用梯度降低法迭代求解每一层的
W,b。
注:如下是BP算法推导的过程,是本文最核心,也是神经网络最基本的公式推导。
思路第一步:
首先是输出层第
L层。注意到输出层的
W,b知足下式:
aL=σ(zL)=σ(WLaL−1+bL)(1)
这样对于输出层的参数,咱们的损失函数变为:
J(W,b,x,y)=21∣∣aL−y∣∣22=21∣∣σ(WLaL−1+bL)−y∣∣22(2)
这样求解
W,b的梯度就简单了:
∂WL∂J(W,b,x,y)=∂zL∂J(W,b,x,y)∂WL∂zL=∂aL∂J(W,b,x,y)∂zL∂aL∂WL∂zL=(aL−y)⊙σ′(zL)(aL−1)T(3)
∂bL∂J(W,b,x,y)=∂zL∂J(W,b,x,y)∂bL∂zL=∂aL∂J(W,b,x,y)∂zL∂aL∂bL∂zL=(aL−y)⊙σ′(zL)(4)
注意上式中有一个符号
⊙,它表明Hadamard积,对于两个维度相同的向量
A(a1,a2,...an)T和
B(b1,b2,...bn)T,则
A⊙B=(a1b1,a2b2,...anbn)T。
对于公式(3)和(4),我在这里多解释一下为何是这样:
对于公式(3):前两项之因此是Hadamard积的形式,是由于
∂aL∂J(W,b,x,y)∂zL∂aL都是针对同一层的神经元。若是咱们考虑对于
L层的第
j个神经元,即
∂ajL∂J(W,b,x,y)σ′(zjL),那么整合这一层的神经元,天然是
(aL−y)⊙σ′(zL)这样Hadamard积的形式。那么
(aL−1)T为何在(3)中的最后呢?这涉及到矩阵求导的知识,不是咱们本文的重点。在这里,用到的知识是:若是
Y=WX+B
那么
∂W∂C=∂Y∂CXT
这样,便可推出公式(3)。公式(4)与公式(3)相似。
思路第二步:
咱们注意到在求解输出层的
W,b的时候,有公共的部分
∂zL∂J(W,b,x,y),所以咱们能够把公共的部分即对
zL先算出来,记为:
δL=∂zL∂J(W,b,x,y)=(aL−y)⊙σ′(zL)(5)
根据公式(3)(4),咱们能够把输出层的梯度算出来,那么如何计算上一层
L−1层的梯度,上上层
L−2层的梯度呢?这里咱们须要一步步的递推,注意到对于第
l层的未激活输出
zl,它的梯度能够表示为:
δl=∂zl∂J(W,b,x,y)=∂zL∂J(W,b,x,y)∂zL−1∂zL∂zL−2∂zL−1...∂zl∂zl+1(6)
若是咱们能够依次计算出第
l层的
δl,则该层的
Wl,bl很容易计算?为何呢?注意到根据前向传播算法,咱们有:
zl=Wlal−1+bl(7)
因此根据上式咱们能够很方便的计算出第
l层的
Wl,bl的梯度以下:
∂Wl∂J(W,b,x,y)=∂zl∂J(W,b,x,y)∂Wl∂zl=δl(al−1)T(8)
∂bl∂J(W,b,x,y)=∂zl∂J(W,b,x,y)∂bl∂zl=δl(9)
思路第三步:
那么如今问题的关键就是要求出
δl了。这里咱们用数学概括法,第
L层的
δL上面咱们已经求出, 假设第
l+1层的
δl+1已经求出来了,那么咱们如何求出第
l层的
δl呢?咱们注意到:
δl=∂zl∂J(W,b,x,y)=∂zl+1∂J(W,b,x,y)∂zl∂zl+1=δl+1∂zl∂zl+1(10)
可见,用概括法递推
δl+1和
δl的关键在于求解
∂zl∂zl+1。
而
zl+1和
zl的关系其实很容易找出:
zl+1=Wl+1al+bl+1=Wl+1σ(zl)+bl+1(11)
这样很容易求出:
∂zl∂zl+1=(Wl+1)T⊙nl+1
(σ′(zl),..,σ′(zl))(12)
公式(12)的意思就是
(Wl+1)T的每一列都Hadamard积
σ′(zl)。
将公式(12)代入公式(10)咱们获得:
δl=δl+1∂zl∂zl+1=((Wl+1)Tδl+1)⊙σ′(zl)(13)
公式(13)的推导过程为:
δl+1∂zl∂zl+1=∂zl∂(δl+1)Tzl+1=∂zl∂(δl+1)T(Wl+1σ(zl)+bl+1)=∂zl∂(δl+1)TWl+1σ(zl)=((δl+1)TWl+1)T⊙σ′(zl)==((Wl+1)Tδl+1)⊙σ′(zl)
如今咱们获得了
δl的递推关系式,只要求出了某一层的
δl,求解
Wl,bl的对应梯度就很简单。
总结:
其实,对于更新每一层的
Wl,bl的对应梯度,咱们仔细观察整个过程,发现只须要四个公式就能够完整地进行更新。这就是著名的反向传播的四个公式,即公式(5)、(13)、(8)、(9)。咱们稍加改动,使其能够应用到多种损失函数,即:
δL=∂aL∂J⊙σ′(zL)(BP1)δl=(Wl+1)Tδl+1⊙σ′(zl)(BP2)∂Wl∂J=δl(al−1)T(BP3)∂bl∂J=δl(BP4)
3. 3 DNN反向传播算法过程
如今咱们总结下DNN反向传播算法的过程。因为梯度降低法有批量(Batch),小批量(mini-Batch),随机三个变种,为了简化描述,这里咱们以最基本的批量梯度降低法为例来描述反向传播算法。实际上在业界使用最多的是mini-Batch的梯度降低法。不过区别仅仅在于迭代时训练样本的选择而已。
输入: 总层数
L,以及各隐藏层与输出层的神经元个数,激活函数,损失函数,迭代步长
α,最大迭代次数MAX与中止迭代阈值
ϵ,输入的
m个训练样本
{(x1,y1),(x2,y2),...,(xm,ym)}
输出:各隐藏层与输出层的线性关系系数矩阵
W和偏倚向量
b
1)初始化各隐藏层与输出层的线性关系系数矩阵
W和偏倚向量
b的值为一个随机值。
2)for iter to 1 to MAX:
2-1) for
i=1 to
m:
a) 将DNN输入
a1设置为
xi
b) for
l=2 to
L,进行前向传播算法计算
ai,l=σ(zi,l)=σ(Wlai,l−1+bl)
c) 经过损失函数计算输出层的
δi,L(BP1)
d) for
l=L−1 to
2, 进行反向传播算法计算
δi,l=(Wl+1)Tδi,l+1⊙σ′(zi,l)(BP2)
2-2) for
l=2 to
L,更新第
l层的
Wl,bl:
Wl=Wl−αi=1∑mδi,l(ai,l−1)T(BP3)
bl=bl−αi=1∑mδi,l(BP4)
2-3) 若是全部
W,
b的变化值都小于中止迭代阈值
ϵ,则跳出迭代循环到步骤3。
3) 输出各隐藏层与输出层的线性关系系数矩阵
W和偏倚向量
b。
3.4 DNN反向传播算法小结
有了DNN反向传播算法,咱们就能够很方便的用DNN的模型去解决各类监督学习的分类回归问题。固然DNN的参数众多,矩阵运算量也很大,直接使用会有各类各样的问题。有哪些问题以及如未尝试解决这些问题并优化DNN模型与算法,咱们会在其它博客里讲。
参考文献
【1】深度神经网络(DNN)模型与前向传播算法
【2】深度神经网络(DNN)反向传播算法(BP)
本文转自【1】【2】
【3】Neural Networks and Deep Learning
【4】数学-矩阵计算(4)两种布局
【5】Matrix calculus
【6】反向传播四:反向传播的4个公式
【7】机器学习中的矩阵、向量求导