DNN反向传播详解

目前的深度神经网络模型中,主要都是依赖传统BP的反向传播方式来计算梯度,由于tensorflow等牛逼框架的存在,目前梯度的计算方式被很多人都忽略掉了,本文旨在给大家详细推导下在不考虑dropout及特殊结构的情况下,全连接DNN模型是如何梯度下降的。

首先,给出深度神经网络的一般结构形式:


说明下推导过程中一些基本变量及参数的含义:

:表示第l层的第i个节点与第l-1层的第j个节点连接的权重w;

:表示第l层第i个节点的偏置;

:表示第l层第i个节点的输出;

:表示第l层第i个节点的输入

由全连接神经网络的前向传播的理论可以知道:


其中N表示第l-1层的节点的数量,delta表示节点使用的激活函数。

首先明确我们的目标,是得到参数矩阵w和b的梯度,即求解w和b在损失函数中的导数,一般采用对数损失函数来衡量,这里方便起见,用L表示DNN的损失函数。

熟悉的朋友应该知道,这里的计算会用到链式求导,为了简化表示,首先定义一个重要的中间变量:


我们期望的是,通过中间变量,来用传递的方式得到每层的相关参数的梯度,因此,我们希望的是每一层的中间变量之间有一定的关系,考虑第l-1层的中间变量:


首先来解释下这个等式,可能很多人不理解为什么不是直接链式求导,而是求导后还求了和,原因是第l层的第i个节点的输入和第l-1层输入之间的关系,不是一对一,而是第l-1层的每个输入都对第l层第i个输入有影响,具体通过神经网络图不难看出。为了计算上面的l-1层的中间变量,首先给出两层z之间的关系:


由(5)可知,第l-1层的中间变量:


这个等式计算的是每个单独的中间变量之间的关系,如果用矩阵形式,应该怎么表示呢,我们可以来具体深入探讨下,将(6)式最后的结果用矩阵的乘法表示为:


对于7式,我们将第l-1层的所有中间变量进行排列:


这样,我们就得到了关键的两层之间的中间变量的关系式,可以看到,只与上层的W矩阵和激活函数的导数有关,计算起来将非常方便。废话不多说,有了中间变量之间的关系,100层的DNN都不怕了,接下来我们就给出各个参数的梯度计算:

首先对于参数矩阵W(取其中的第l层的某个w):


同样的方法,将单个w推广到整个第l层的W矩阵有(借助矩阵乘法的思想):


再对于每层的偏置b而言:


同样推广到整层的偏执b:


由式10和12,我们就得到了DNN在训练中利用梯度下降法得到每层梯度的方法,而式8保证了可以通过传播的方式得到每一层的梯度。

最后:总结一下不考虑正则、dropout等细节的全连接深度神经网络的训练方法:


展开阅读全文

没有更多推荐了,返回首页