Deep Learning Note: 4-5 卷积神经网络案例分析(2)
Contents [show]
2. ResNet
由于存在梯度爆炸和梯度消失的问题,往往难以训练很深的神经网络。ResNet 通过将一层的激活值直接传递给更深的层,使得训练非常深(如超过 100 层)的神经网络成为可能。
2.1. Residual Block
ResNet 由 Residual Block 组成,为了说明 Residual Block 的结构,先看一个普通的两层网络结构,如图 1 所示:
其计算过程如图 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 所示:
现在 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。
理论上,网络层数越多,就越能更好地拟合训练集,训练错误应该随只网络层数的增加而下降,如图 6 左边的绿色曲线所示。而在实际中,如果在普通网络上使用如梯度下降等优化算法,通常会发现随网络层数的增加,训练错误先下降、后上升,如图 6 左边的蓝色曲线,因为随着网络层数的增加,优化算法对网络的训练变得越来越困难,网络层数过深时,其性能反而会下降。
而对于 ResNet,随着网络层数的增加,其训练错误持续下降,如图 6 右边蓝色曲线所示。Residual Block 中的 Short Cut 通过将前层的激活值跨层传递到网络深处,有助于解决梯度爆炸和梯度消失的问题,从而有助于训练更深(如 1000 层)的网络。
2.2. ResNet 的原理
下面通过一个例子说明可以通过 ResNet 训练非常深层的网络的原因。假设有一个很大的神经网络,其输入为 x,输出为 a[l],如图 7 所示:
现在在网络的最后追加一个 Residual Block,如图 8 所示:
此时网络输出 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 中带箭头的曲线即为 Skip Connection,由此构成 Residual Block。网络中有大量的 3×3、Same Padding 的卷积层,保证输入和输出具有相同的维度。该网络中也使用了多个卷积层后接一个池化层的结构,由于池化层导致数据的高度和宽度缩小,此时需要调整数据的维度(图 9 中虚线)。