Processing math: 100%

Deep Learning Note: 4-5 卷积神经网络案例分析(2)

2. ResNet

  由于存在梯度爆炸和梯度消失的问题,往往难以训练很深的神经网络。ResNet 通过将一层的激活值直接传递给更深的层,使得训练非常深(如超过 100 层)的神经网络成为可能。

2.1. Residual Block

  ResNet 由 Residual Block 组成,为了说明 Residual Block 的结构,先看一个普通的两层网络结构,如图 1 所示:

图 1

图 1

  其计算过程如图 2 所示:

图 2

图 2

  即:

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

  上式中的 g(z) 为 ReLU 激活函数。

  Residual Block 对上面的结构进行了修改,除了上面的计算流程,还将 a[l] 直接引入到了第二层线性模块之后,此时网络中有两条计算路径,Main Path 和 Short Cut,如图 3 所示:

图 3

图 3

  现在 a[l+2] 的计算变为:

a[l+2]=g(z[l+2]+a[l])

  有时图 3 中的 Short Cut 也称为 Skip Connection,即 a[l] 跳过(Skip)了接近两层网络,直接传递给了更深层的网络。

  在图 4 所示的普通网络(Plane Network)中加入 Short Cut,即可得到如图 5 所示的 ResNet。

图 4

图 4

图 5

图 5

  理论上,网络层数越多,就越能更好地拟合训练集,训练错误应该随只网络层数的增加而下降,如图 6 左边的绿色曲线所示。而在实际中,如果在普通网络上使用如梯度下降等优化算法,通常会发现随网络层数的增加,训练错误先下降、后上升,如图 6 左边的蓝色曲线,因为随着网络层数的增加,优化算法对网络的训练变得越来越困难,网络层数过深时,其性能反而会下降。

图 6

图 6

  而对于 ResNet,随着网络层数的增加,其训练错误持续下降,如图 6 右边蓝色曲线所示。Residual Block 中的 Short Cut 通过将前层的激活值跨层传递到网络深处,有助于解决梯度爆炸和梯度消失的问题,从而有助于训练更深(如 1000 层)的网络。

2.2. ResNet 的原理

  下面通过一个例子说明可以通过 ResNet 训练非常深层的网络的原因。假设有一个很大的神经网络,其输入为 x,输出为 a[l],如图 7 所示:

图 7

图 7

  现在在网络的最后追加一个 Residual Block,如图 8 所示:

图 7

图 7

  此时网络输出 a[l+2] 为:

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

  假设使用 ReLU 作为激活函数 g(z),当 W[l+2]b[l+2] 都为 0 时,式 (2) 变为:

a[l+2]=g(a[l])=a[l]

  因为使用 ReLU 作为激活函数,各层激活值均不小于 0,ReLU 函数在大于 0 的区间为恒等函数,故有上式的 g(a[l])=a[l],此时新添加的 Residual Block 完全没有作用。

  对于图 8 中添加的 Residual Block,它可以很容易地通过学习变成了一个恒等函数(W[l+2]b[l+2] 都为 0),则图 8 中的网络就相当于图 7 中的网络,性能不会比不添加 Residual Block 的网络差;如果添加的 Residual Block 通过训练学习到了一些知识,则会提高网络的性能。而对于普通的网络,随着层数的增加,网络会越来越难以学习到恒等函数,层数过多时性能反而会下降。

  值得注意的是,式 (2) 中计算 z[l+2]+a[l] 的前提是 z[l+2]a[l] 具有相同的维度,ResNet 中通常使用 Same Padding 来保证 Residual Block 的输入和输出具有相同的维度。如果 z[l+2]a[l] 具有不同的维度,则可以引入一个大小为 n[l+2]×n[l] 的参数 Ws,使得 Wsa[l]z[l+2] 的维度相同,即:

a[l+2]=g(z[l+2]+Wsa[l])

  Ws 的值可以通过学习得到,也可以设置为固定值,比如只对 a[l] 补零。

2.3. ResNet 的结构

  ResNet 的论文中给出的一个 ResNet 结构如图 9 所示:

图 9

图 9

  图 9 中带箭头的曲线即为 Skip Connection,由此构成 Residual Block。网络中有大量的 3×3、Same Padding 的卷积层,保证输入和输出具有相同的维度。该网络中也使用了多个卷积层后接一个池化层的结构,由于池化层导致数据的高度和宽度缩小,此时需要调整数据的维度(图 9 中虚线)。