ResNet反向传播公式推导

ResNet残差网络结构在深层网络中训练效率会提高,为什么呢,我们下面用公式解释一下。我们先回顾全连接网络和卷积网络反向传播的过程,细节推导见我的博客

一、DNN结构反向传播

1、l层全连接层的反向传播的W的梯度公式

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

2、l层全连接层的反向传播的b的梯度公式

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

3、层与层之间的梯度传播依靠\frac{\partial J}{\partial z^{l}}\frac{\partial J}{\partial z^{l-1}}的过渡

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

二、CNN结构反向传播

同全连接类似

1、l层全连接层的反向传播的W的梯度公式,l层输入和l层误差的卷积

              \frac{\partial J}{\partial w^l}=a^{l-1}*\frac{\partial J}{\partial z^l}

2、l层全连接层的反向传播的W的梯度公式

             \frac{\partial J}{\partial b^l}=\sum_{u,v}(\frac{\partial J}{\partial z^l})_{u,v}

3、层与层之间的梯度传播依靠\frac{\partial J}{\partial z^{l}}\frac{\partial J}{\partial z^{l-1}}的过渡

            \frac{\partial J}{\partial z^{l-1}}=\frac{\partial J}{\partial z^{l}}*rot180(W^l)\sigma^{'}(z^{l-1})

三、ResNet结构反向

ResNet结构的计算公式为a^l=g(z^{l}+a^{l-1})=g(w^la^{l-1}+b^{l}+a^{l-1})=g((w^l+1)a^{l-1}+b^l)

当前网络层l的输出等于正常网络的输出z^l与网络输入a^{l-1}的和,然后再经过激活函数。

只是增加了输入到输出的直连这一项,怎么可以实现深层网络高效率的训练呢。我们从反向传播的误差的传播入手,假设从l层到l-1层,按照全连接层考虑,常规公式为

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

但是我们激活函数中内容变成了增加了一个a^{l-1}的项,通过反向求导公式,可以求出来,此时的反向转化过程为

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

其中增加了一项1,这个有什么好处呢?我们常说网络变深了,网络前面的就训练的慢了,因为很大程度上,此时由于受W权值的正则化的影响,W已经变得非常小,再加上多层级联的关系,到达该层的梯度变化已经非常小了,但是如果我们加上一项1,反而能提高一点梯度,使网络更容易训练起来。

四、ResNet结构反向

增加一点ResNet正向的过程,如果使用L2正则化或权重衰减,它会压缩w的值。如果对b应用权重衰减也可达到同样的效果,尽管实际应用中,你有时会对应用权重衰减,有时不会。这里的是关键项,如果w,为方便起见,假设w,b,这几项就没有了,因为它们的值为0。最后,因为我们假定使用ReLU激活函数,并且所有激活值都是非负的,是应用于非负数的ReLU函数,所以残差块的输出l的值基本由输入l-1决定(残差块可能不止一层网络层,此处只是举例)。

结果表明,残差块学习这个恒等式函数并不难,跳跃连接使我们很容易得出。这意味着,即使给神经网络增加了这两层,它的效率也并不逊色于更简单的神经网络,因为学习恒等函数对它来说很简单。尽管它多了两层,也只把a[l-1]的值赋值给a[l]。所以给大型神经网络增加两层,不论是把残差块添加到神经网络的中间还是末端位置,都不会影响网络的表现。

当然,我们的目标不仅仅是保持网络的效率,还要提升它的效率。想象一下,如果这些隐藏层单元学到一些有用信息,那么它可能比学习恒等函数表现得更好。而这些不含有残差块或跳跃连接的深度普通网络情况就不一样了,当网络不断加深时,就算是选用学习恒等函数的参数都很困难,所以很多层最后的表现不但没有更好,反而更糟。

猜你喜欢

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