2.3 残差网络 Residual Networks (ResNets)

非常非常深的NN是很难训练的,因为存在梯度消失和梯度爆炸问题。这节课我们学习跳跃连接(Skip connection),它可以从某一层网络层获取激活,然后迅速反馈给另外一层,甚至是NN的更深层。我们可以利用跳跃连接构建能够训练深度网络的ResNets,有时深度能够超过100层,让我们开始吧。

ResNets是由 残差块(Residual block) 构建的,首先我解释一下什么是残差块。

resnet视频数据增强_网络层

如上图。这是一个两层NN,在 resnet视频数据增强_resnet视频数据增强_02 层进行激活,得到resnet视频数据增强_ooc_03,再次进行激活,两层之后得到resnet视频数据增强_深度学习_04

计算过程是从resnet视频数据增强_ooc_05开始,

  • 首先进行线性激活,根据这个公式:resnet视频数据增强_github_06,通过resnet视频数据增强_github_07算出resnet视频数据增强_github_08,即resnet视频数据增强_github_07乘以权重矩阵,再加上偏差因子。
  • 然后通过ReLU非线性激活函数得到resnet视频数据增强_深度学习_10resnet视频数据增强_网络层_11计算得出。
  • 接着再次进行线性激活,依据等式resnet视频数据增强_深度学习_12
  • 最后根据上面这个等式再次进行ReLu非线性激活,即resnet视频数据增强_网络层_13,这里的resnet视频数据增强_github_14是指ReLU非线性函数,得到的结果就是resnet视频数据增强_github_15

换句话说,信息流从resnet视频数据增强_ooc_05resnet视频数据增强_深度学习_04需要经过以上所有步骤,即这组网络层的主路径。

resnet视频数据增强_resnet视频数据增强_18

观察上图,在残差网络中有一点变化,我们将resnet视频数据增强_ooc_05直接向后,拷贝到NN的深层,在ReLU非线性激活函数前加上resnet视频数据增强_ooc_05,这是一条捷径 short cut。resnet视频数据增强_ooc_05的信息直接到达NN的深层,不再沿着主路径传递,这就意味着最后这个等式(resnet视频数据增强_resnet视频数据增强_22)去掉了,取而代之的是另一个ReLU非线性函数,仍然对resnet视频数据增强_github_23进行函数resnet视频数据增强_网络层_24处理,但这次要加上resnet视频数据增强_ooc_05,即:resnet视频数据增强_github_26,也就是加上的这个resnet视频数据增强_ooc_05产生了一个残差块

resnet视频数据增强_网络层_28

在上面这个图中,我们也可以画一条捷径,直达第二层。实际上这条捷径是在进行ReLU非线性激活函数之前加上的,而这里的每一个节点都执行了线性函数和ReLU激活函数。所以插入的时机是在线性激活之后,ReLU激活之前。

除了捷径short cut,你还会听到另一个术语“跳跃连接”skip connection,就是指跳过一层或者好几层,从而将信息传递到NN的更深层。

ResNet的发明者是何凯明(Kaiming He)、张翔宇(Xiangyu Zhang)、任少卿(Shaoqing Ren)和孙剑(Jiangxi Sun),他们发现使用残差块能够训练更深的NN。所以构建一个ResNet网络就是通过将很多类似上图这样的残差块堆积在一起,形成一个很深神经网络,我们来看看这个网络。

resnet视频数据增强_ooc_29

上图这并不是一个残差网络,而是一个普通网络(Plain network),这个术语来自ResNet论文。

把它变成ResNet的方法是加上所有跳跃连接,正如前面中看到的,每两层增加一个捷径,构成一个残差块。

resnet视频数据增强_深度学习_30

如上图所示,5个残差块连接在一起构成一个残差网络。

resnet视频数据增强_深度学习_31

如上面左图,如果我们使用标准优化算法训练一个普通网络(Plain network),比如说梯度下降法,或者其它热门的优化算法。如果没有残差,没有这些捷径或者跳跃连接,凭经验你会发现随着网络深度的加深,训练错误会先减少,然后增多(蓝色线)。而理论上,随着网络深度的加深,应该训练得越来越好才对(绿色线)。也就是说,理论上网络深度越深越好。但实际上,如果没有残差网络,对于一个普通网络来说,深度越深意味着用优化算法越难训练。实际上,随着网络深度的加深,训练错误会越来越多。

如上面右图,有了ResNets就不一样了,即使网络再深,训练的表现却不错,比如说训练误差减少,就算是训练深达100层的网络也不例外。有人甚至在1000多层的NN中做过实验,尽管目前我还没有看到太多实际应用。但是对resnet视频数据增强_网络层_32的激活,或者这些中间的激活能够到达网络的更深层。

这种方式确实有助于解决梯度消失和梯度爆炸问题,让我们在训练更深网络的同时,又能保证良好的性能。也许从另外一个角度来看,随着网络越来深,网络连接会变得臃肿,但是ResNet确实在训练深度网络方面非常有效。