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

  即:

\begin{equation}
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]})
\end{equation}

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

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

图 3

图 3

  现在 $a^{[l+2]}$ 的计算变为:

\begin{equation}
a^{[l+2]} = g(z^{[l+2]} + a^{[l]}) \tag{1}
\end{equation}

  有时图 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]}$ 为:

\begin{align}
a^{[l+2]} & = g(z^{[l+2]} + a^{[l]}) \\
& = g(W^{[l+2]}a^{[l+1]} + b^{[l+2]} + a^{[l]}) \tag{2}
\end{align}

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

\begin{equation}
a^{[l+2]} = g(a^{[l]}) = a^{[l]}
\end{equation}

  因为使用 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]} \times n^{[l]}$ 的参数 $W_s$,使得 $W_sa^{[l]}$ 与 $z^{[l+2]}$ 的维度相同,即:

\begin{align}
a^{[l+2]} & = g(z^{[l+2]} + W_sa^{[l]})
\end{align}

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

2.3. ResNet 的结构

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

图 9

图 9

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