Processing math: 100%

【深度学习基础】第三十课:残差网络ResNets

ResNets

188 Views | 1159 Words

Posted by x-jeff on July 25, 2020

【深度学习基础】系列博客为学习Coursera上吴恩达深度学习课程所做的课程笔记。
本文为原创文章,未经本人允许,禁止转载。转载请注明出处。

1.前言

在深度学习中,随着网络层数的增多一般会伴随着下面几个问题:

  1. 计算资源的消耗。
  2. 模型容易过拟合。
  3. 梯度消失/梯度爆炸问题的产生。

问题1通过提升硬件即可解决;问题2可以采用正则化方法,例如添加正则项、使用dropout等;问题3可以通过BatchNorm避免。

既然这些问题都可以解决,并且从理论上来说,网络越深,效果应该越好,那么我们一味的加深网络深度是否就可以获得更好的效果呢?答案是否定的。随着网络层数的增加,网络发生了退化(degradation)的现象:随着网络层数的增多,训练集loss逐渐下降,然后趋于饱和,当再增加网络深度的话,优化算法很难训练,训练错误会越来越多,训练集loss反而会增大。

当网络退化时,浅层网络能够达到比深层网络更好的训练效果,这时如果我们把低层的特征传到高层,那么效果应该至少不比浅层的网络效果差。而残差网络(Residual Networks,ResNets)的主要思想就是将浅层特征直接映射到深层,从而解决了更深层次神经网络的训练问题,也使网络准确率得到显著提升。

2.残差网络的结构

首先介绍下什么是残差块。假设下图是神经网络中的两层:

前向传播的计算过程为(g()表示激活函数,一般为ReLU函数):

  1. z[l+1]=W[l+1]a[l]+b[l+1]
  2. a[l+1]=g(z[l+1])
  3. z[l+2]=W[l+2]a[l+1]+b[l+2]
  4. a[l+2]=g(z[l+2])

这条传播路径称为“main path”,在残差网络中,我们额外增加一条路径,称为“short cut”或“skip connection”:

将前向传播的计算过程改为:

  1. z[l+1]=W[l+1]a[l]+b[l+1]
  2. a[l+1]=g(z[l+1])
  3. z[l+2]=W[l+2]a[l+1]+b[l+2]
  4. a[l+2]=g(z[l+2]+a[l])

在第4行公式中额外加上的a[l]便产生了一个残差块

构建一个ResNets就是通过很多这样的残差块堆积在一起,形成一个深度神经网络。

接下来我们一起来看下如何将一个“plain network”(如下图所示,即普通的神经网络)改造成ResNets:

添加所有的“skip connection”,得到ResNets:

3.代码地址

  1. ResNets

4.参考资料

  1. 详解残差网络(作者:大师兄)

0 comments
Anonymous
Markdown is supported

Be the first person to leave a comment!