Coursera 笔记

Module 02 · Deep Convolutional Models: Case Studies

ResNets残差网络

Coursera ↗

深度神经网络(DNN)在训练时常常面临“梯度消失(Vanishing Gradient)”和“梯度爆炸(Exploding Gradient)”的问题,这使得训练非常深的网络变得非常困难。在本视频中,您将学习如何使用跳跃连接(Skip Connections),这使得您可以将某一层的激活值直接传递到网络中更深的层,进而训练出非常深的网络,甚至可以达到100层以上的网络。我们将重点介绍**残差网络(ResNet)**的原理和构建方法。


残差块(Residual Block)基础

传统神经网络的计算过程

考虑一个简单的神经网络,包括两个层:

  • 在第一个层,我们从激活值 a[l] 开始,经过线性运算得到 z[l+1],并通过激活函数 ReLU 获得 a[l+1]:
  • 然后,重复相同的步骤,应用线性变换和激活函数,得到最终的激活 a[l+2]:
    这样,信息从 a[l] 传递到 a[l+2] 时,必须经过所有的计算步骤,我们称之为“主路径(Main Path)”。

残差网络(ResNet)与跳跃连接

在残差网络中,我们对这种计算做了改变。具体来说,我们将激活值 a[l] 复制并直接加到更深的层级中,形成跳跃连接。具体步骤如下:

  1. 通过复制 a[l],将其“跳过”主路径,直接传递到更深的层,添加到该层的输出中。
  2. 激活函数的计算公式发生变化:

在此公式中,a[l] 被加到了输出中,形成了残差块。这种连接方式显著减缓了梯度消失和爆炸的问题,使得深度网络能够得到更好的训练效果。

跳跃连接与残差块

“跳跃连接”(Skip Connection)和“快捷连接”(Shortcut Connection)是指激活值 a[l] 可以跳过一层或多层,直接加到更深层的激活值中。通过这种方式,网络能够更深层地传递信息,避免了信息在层级中逐渐丢失的现象。


如何构建残差网络(ResNet)

残差网络的构建

要构建一个残差网络(ResNet),您需要通过多个**残差块(Residual Block)**将它们堆叠起来,形成一个深度网络。假设您有一个普通的网络,称为“平坦网络(Plain Network)”,如下图所示:

  • 这个平坦网络没有残差块,也没有跳跃连接。

将平坦网络转换为残差网络

通过在网络的每两层之间添加跳跃连接,您可以将其转换为一个残差网络。每个残差块都由两层组成,跳跃连接会被添加到每两个层之间,如下图所示:

  • 每个残差块的构建包括:
    1. 线性变换
    2. 激活函数(ReLU)
    3. 跳跃连接

通过这种方式,我们可以堆叠多个残差块,形成一个深度的残差网络。


深度网络训练的挑战

没有残差块的网络问题

在没有残差块的平坦网络中,当层数增加时,训练误差会呈现出先下降后上升的趋势。理论上,深度的神经网络应该能在训练集上获得更好的表现,但实际中,深度网络的训练会变得更加困难,优化算法很难找到良好的参数,导致训练误差反而变大。

残差网络的优势

然而,在残差网络中,即使网络层数增加,训练误差依然能够持续下降。这是因为通过跳跃连接,网络能够在更深的层之间传递信息,有效避免了梯度消失和爆炸的问题。即便是超过100层的网络,也能顺利训练,获得较好的表现。

目前,有些研究尝试训练超过1000层的网络,尽管这种情况在实际应用中还不多见。通过在网络中加入这些跳跃连接,您可以训练非常深的神经网络,而不会有明显的性能下降。


总结

  • **残差网络(ResNet)**通过引入跳跃连接(Skip Connections),使得训练非常深的神经网络变得可行,避免了传统深度网络中的梯度消失和爆炸问题。
  • **残差块(Residual Block)**是构建ResNet的核心,它允许信息绕过一些层,直接传递到更深的层,从而有效提升训练的效果。
  • 通过堆叠多个残差块,您可以构建非常深的网络,甚至能够训练超过100层的网络,且训练误差持续减少。

在本周的编程作业中,您将能够亲自实现这些概念,并观察其如何在实际中工作。🚀


希望通过这个介绍,您对残差网络的工作原理有了更清晰的理解,并且对其在深度神经网络中的应用有了更深入的洞察。在下一期视频中,我们将进一步探讨为什么残差网络能够如此有效,并为您提供更深入的直观理解。