DNN的反向传播过程

DNN网络(全连接的网络)

在进行DNN反向传播算法前,我们需要选择一个损失函数,来度量训练样本计算出的输出和真实的训练样本输出之间的损失。输出计算公式:随机选择一系列W,b,用前向传播算法计算出来的。即通过一系列的计算:a^{l}=\sigma(z^{l})=\sigma(w^{l}a^{l-1}+b^{l})。计算得出最后的输出层L对应的a^{L}便是前向输出的结果。

损失函数的选择有很多,比如均方差、交叉熵。我们以交叉熵为例,介绍DNN的反向传播算法,计算公式如下:

J(W,b,x,y)=-(ylog\hat{y}+(1-y)log(l-\hat{y})),其中y为真实的标签(即网络最后一层的输出),\hat{y}为网络预测的标签。

我们反向传播的过程就是求出合适的W、b,使上面的公式最小化。

我们开始用梯度下降法求解每一层的W、b的变化。

首先的输出层L,输出层的计算公式

                                                                         a^{L}=\sigma(z^{L})=\sigma(W^{L}*a^{L-1}+b^{L})

对于输出层的参数,我们可以计算根据上面交叉熵公式计算损失函数:

 J(W,b,x,y)=-(ylog\hat{y}+(1-y)log(l-\hat{y}))=(yloga^{L}+(1-y)log(l-a^{L})),其中a^L将上面的公式带入

现在求解W,b的梯度:

\frac{\partial J}{\partial W^{L}}=\frac{\partial J}{\partial a^{L}}\sigma^{'}(z^L)\frac{\partial z^{L}}{\partial W^{L}}=(\hat{y}-y)(a^{L-1})^{T}=(a^{L}-y)(a^{L-1})^{T},其中\hat{y}a^{L}相同。

\frac{\partial J}{\partial b^{L}}=\frac{\partial J}{\partial a^{L}}\sigma^{'}(z^L)\frac{\partial z^{L}}{\partial b^{L}}=(\hat{y}-y)=(a^{L}-y)

我们可以看到计算W和b的梯度时,计算激活函数之前的描述是一样的,即 \frac{\partial J}{\partial z^{L}}=\frac{\partial J}{\partial a^{L}}\sigma^{'}(z^L)是一致的,所以可以把这一部分先计算出来。

现在我们计算输出层的前面层的梯度,假设为l层

(1)首先我们计算该层的未激活值z^l的梯度,即

                                                              \frac{\partial J}{\partial z^{l}}=\frac{\partial J}{\partial z^{L}}\frac{\partial z^{L}}{\partial z^{L-1}}\frac{\partial z^{L-1}}{\partial z^{L-2}}...\frac{\partial z^{l+1}}{\partial z^{l}}

其中每一个\frac{\partial z^l}{\partial z^{l-1}}的计算包括3个部分组成:前一层的激活前z^(l-1),前一层的激活后a^(l-1),当前层的激活前z^l。前向计算过程为:a^{l-1}=\sigma(z^{l-1})z^l = W^la^{l-1}+b^{l};反向计算过程为\frac{\partial z^l}{\partial z^{l-1}}=W^l{\sigma}'(z^{l-1})

(2)根据前向传播过程,z^{l}=W^{l}*a^{l-1}+b^{l},现在我们结合上述公式,可以很方便的求出W^l和b^l的梯度

                                                                         \frac{\partial J}{\partial w^{l}} = \frac{\partial J}{\partial z^l}(a^{l-1})^T

                                                                          \frac{\partial J}{\partial b^{l}} = \frac{\partial J}{\partial z^l}

 (3)现在只要求出某一层的\frac{\partial J}{\partial z^l},然后针对W和b的梯度就好求了。当前层的\frac{\partial J}{\partial z^l}和后面一层的\frac{\partial J}{\partial z^{l+1}}存在下面的关系

                                                                    \frac{\partial J}{\partial z^l}=\frac{\partial J}{\partial z^{l+1}}\frac{\partial z^{l+1}}{\partial z^l}=(W^{l+1})^T\frac{\partial J}{\partial z^{l+1}}.\sigma^{'}(z^l)

(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)通过损失函数计算出损失值,计算最后一层的\frac{\partial J}{\partial z^{L,i}}

            c)对于每一层l,通过反向梯度公式求出\frac{\partial J}{\partial z^l}=(W^{l+1,i})^T\frac{\partial J}{\partial z^{l+1,i}}.\sigma^{'}(z^{l,i})

2-2)然后对于每一层l,按照上面计算的结果进行批量更新W,b。batch的数据的梯度可以求和,也可以求平均值

                                                                      W^{l}=W^{l}-\alpha\sum_{i=1}^{m}\frac{\partial J}{\partial z^{l,i}}(a^{l-1,i})^T

                                                                        b^{l} =b^{l}-\alpha\sum_{i=1}^{m}\frac{\partial J}{\partial z^{l,i}}

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

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

二、影响DNN梯度下降的因素

1、激活函数的选择,后一层的权重值

层与层之间的梯度的变化的过程,第l层的\frac{\partial J}{\partial z^l}和网络后一层的\frac{\partial J}{\partial z^{l+1}}存在下面的递推关系

                                                     \frac{\partial J}{\partial z^l}=(W^{L+1})^T\frac{\partial J}{\partial z^{l+1}}\sigma^{'}(z^l)

由上面的计算过程看出,梯度的变化过程与权值、激活函数的导数存在关系,所以合理的选择激活函数和权重值的大小对于梯度变化很重要。产生梯度消失和膨胀的过程便与这个有关系。 

猜你喜欢

转载自blog.csdn.net/legend_hua/article/details/81584880