深度学习之DNN与反向传播算法

我`一个人跳舞~
2个月前 阅读 10 点赞 0

前言

深度神经网络(DNN)模型与前向传播算法中,我们对DNN的模型和前向传播算法做了总结,这里我们更进一步,对DNN的反向传播算法(Back Propagation,BP)做一个总结。


反向传播需要解决的问题

在了解DNN的反向传播算法前,我们先要知道DNN反向传播算法要解决的问题,也就是说,什么时候我们需要这个反向传播算法? 


回到我们监督学习的一般问题,假设我们有m个训练样本:{(x1,y1),(x2,y2),...,(xm,ym)},其中x为输入向量特征维度为n_in,而y为输出向量,特征维度为n_out。我们需要利用这m个样本训练出一个模型,当有一个新的测试样本(xtest,?)来到时, 我们可以预测ytest向量的输出。 


如果我们采用DNN的模型,即我们使输入层有n_in个神经元,而输出层有n_out个神经元。再加上一些含有若干神经元的隐藏层。此时我们需要找到合适的所有隐藏层和输出层对应的线性系数矩阵W,偏倚向量b,让所有的训练样本输入计算出的输出尽可能的等于或很接近样本输出。怎么找到合适的参数呢?


如果大家对传统的机器学习的算法优化过程熟悉的话,这里就很容易联想到我们可以用一个合适的损失函数来度量训练样本的输出损失,接着对这个损失函数进行优化求最小化的极值,对应的一系列线性系数矩阵W,偏倚向量b即为我们的最终结果。在DNN中,损失函数优化极值求解的过程最常见的一般是通过梯度下降法来一步步迭代完成的,当然也可以是其他的迭代方法比如牛顿法与拟牛顿法。对DNN的损失函数用梯度下降法进行迭代优化求极小值的过程即为我们的反向传播算法。


反向传播的基本思路

在进行DNN反向传播算法前,我们需要选择一个损失函数,来度量训练样本计算出的输出和真实的训练样本输出之间的损失。DNN可选择的损失函数有不少,为了专注算法,这里我们使用最常见的均方差来度量损失。即对于每个样本,我们期望最小化下式:



其中,aL和y为特征维度为n_out的向量,而||S||2为S的L2范数。现在我们开始用梯度下降法迭代求解每一层的W,b。首先是输出层第L层。注意到输出层的W,b满足下式:



这样对于输出层的参数,我们的损失函数变为:



求解W,b的梯度:



现在我们把输出层的梯度算出来了,那么如何计算上一层L−1层的梯度,上上层L−2层的梯度呢?这里我们需要一步步的递推,注意到对于第l层的未激活输出zl,它的梯度可以表示为:



如果我们可以依次计算出第l层的δl,则该层的Wl,bl很容易计算?为什么呢?注意到根据前向传播算法,我们有:



可以很方便的计算出第l层的Wl,bl的梯度如下:



很容易求出:



将上式带入上面δl+1和δl关系式我们得到:



算法过程

由于梯度下降法有批量(Batch),小批量(mini-Batch),随机三个变种,为了简化描述,这里我们以最基本的批量梯度下降法为例来描述反向传播算法。实际上在业界使用最多的是mini-Batch的梯度下降法。不过区别仅仅在于迭代时训练样本的选择而已。


输入: 总层数L各隐藏层与输出层的神经元个数激活函数损失函数迭代步长α,最大迭代次数MAX停止迭代阈值ϵ

输出:各隐藏层与输出层的线性关系系数矩阵W和偏倚向量


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,进行前向传播算法计算

         c) 通过损失函数计算输出层的δi,L

d) for l= L to 2, 进行反向传播算法计算

    2-2) for l = 2 to L,更新第l层的Wl,bl:



    2-3) 如果所有W,b的变化值都小于停止迭代阈值ϵ,则跳出迭代循环到步骤3。

3)输出各隐藏层与输出层的线性关系系数矩阵W和偏倚向量b。


小结

有了DNN反向传播算法,我们就可以很方便的用DNN的模型去解决各种监督学习的分类回归问题。当然DNN的参数众多,矩阵运算量也很大,直接使用会有各种各样的问题。有哪些问题以及如何尝试解决这些问题并优化DNN模型与算法,我们在以后涉及。

| 0
评论 ( {{ comments.total }} )

还没有人发表评论...

{{ o.content }}
赞 {{ o.likes_count ? o.likes_count : '' }} 回复 {{ o.created_at }}