DNN网络(全连接的网络)
在进行DNN反向传播算法前,我们需要选择一个损失函数,来度量训练样本计算出的输出和真实的训练样本输出之间的损失。输出计算公式:随机选择一系列W,b,用前向传播算法计算出来的。即通过一系列的计算:。计算得出最后的输出层L对应的便是前向输出的结果。
损失函数的选择有很多,比如均方差、交叉熵。我们以交叉熵为例,介绍DNN的反向传播算法,计算公式如下:
,其中y为真实的标签(即网络最后一层的输出),为网络预测的标签。
我们反向传播的过程就是求出合适的W、b,使上面的公式最小化。
我们开始用梯度下降法求解每一层的W、b的变化。
首先的输出层L,输出层的计算公式
对于输出层的参数,我们可以计算根据上面交叉熵公式计算损失函数:
,其中a^L将上面的公式带入
现在求解W,b的梯度:
,其中和相同。
我们可以看到计算W和b的梯度时,计算激活函数之前的描述是一样的,即 是一致的,所以可以把这一部分先计算出来。
现在我们计算输出层的前面层的梯度,假设为l层
(1)首先我们计算该层的未激活值z^l的梯度,即
其中每一个的计算包括3个部分组成:前一层的激活前z^(l-1),前一层的激活后a^(l-1),当前层的激活前z^l。前向计算过程为:,;反向计算过程为
(2)根据前向传播过程,,现在我们结合上述公式,可以很方便的求出W^l和b^l的梯度
(3)现在只要求出某一层的,然后针对W和b的梯度就好求了。当前层的和后面一层的存在下面的关系
(4)循环迭代的过程是:
输入的m个训练样本{(x1,y1),(x2,y2),...,(xm,ym)},总层数L,迭代次数MAX,迭代步长,停止迭代阈值。
1) 初始化各隐藏层与输出层的线性关系系数矩阵W和偏倚向量的值为一个随机值;
2)for iter from 1 to MAX:
2-1) for i = 1 to m:
a)计算每一个数据的前向过程,并保留每一层的激活函数的值a^l,i
b)通过损失函数计算出损失值,计算最后一层的;
c)对于每一层l,通过反向梯度公式求出
2-2)然后对于每一层l,按照上面计算的结果进行批量更新W,b。batch的数据的梯度可以求和,也可以求平均值
2-3)如果所有W,b的变化值都小于停止迭代阈值ϵ,则跳出迭代循环到步骤3。
3)输出各隐藏层与输出层的线性关系系数矩阵W和偏倚向量b
二、影响DNN梯度下降的因素
1、激活函数的选择,后一层的权重值
层与层之间的梯度的变化的过程,第l层的和网络后一层的存在下面的递推关系
由上面的计算过程看出,梯度的变化过程与权值、激活函数的导数存在关系,所以合理的选择激活函数和权重值的大小对于梯度变化很重要。产生梯度消失和膨胀的过程便与这个有关系。