2-2 残差网络

残差网络(Residual Networks (ResNets))

非常非常深的神经网络是很难训练的,因为存在梯度消失和梯度爆炸问题。

跳跃连接( Skip connection),它可以从某一层网络层获取激活,然后迅速反馈给另外一层,甚至是神经网络的更深层。我们可以利用跳跃连接构建能够训练深度网络的 ResNets,有时深度能够超过 100 层。

ResNets 是由残差块( Residual block)构建的:

这是一个两层神经网络,在L层进行激活,得到${{\rm{a}}^{[l + 1]}}$ ,再次进行激活,两层之后得到${{\rm{a}}^{[l + 2]}}$,计算过程是从${{\rm{a}}^{[l]}}$ 开始,首先进行线性激活,根据这个公式:${{\rm{z}}^{[l + 1]}} = {W^{[l + 1]}}{a^{[l]}} + {b^{[l + 1]}}$ ,通过${{\rm{a}}^{[l]}}$ 算出${{\rm{z}}^{[l + 1]}}$ ,即${{\rm{a}}^{[l]}}$ 乘以权重矩阵,再加上偏差因子。然后通过 ReLU 非线性激活函数得到${{\rm{a}}^{[l + 1]}}$,${{\rm{a}}^{[l + 1]}} = g({{\rm{z}}^{[l + 1]}})$ 计 算 得 出 。 接 着 再 次 进 行 线 性 激 活 , 依 据 等 式${{\rm{z}}^{[l + 2]}} = {W^{[l + 2]}}{a^{[l + 1]}} + {b^{[l + 2]}}$,最后根据这个等式再次进行 ReLu 非线性激活,即${{\rm{a}}^{[l + 2]}} = g({{\rm{z}}^{[l + 2]}})$ 这里的g是指 ReLU 非线性函数,得到的结果就是${{\rm{a}}^{[l + 2]}}$ 。换句话说,信息流从${{\rm{a}}^{[l]}}$到${{\rm{a}}^{[l + 2]}}$ 要经过以上所有步骤,即这组网络层的主路径。

在残差网络中有一点变化,我们将${{\rm{a}}^{[l]}}$ 直接向后,拷贝到神经网络的深层,在 ReLU 非线性激活函数前加上${{\rm{a}}^{[l]}}$ ,这是一条捷径。${{\rm{a}}^{[l]}}$的信息直接到达神经网络的深层,不再沿着主路径传递,这就意味着最后这个等式${{\rm{a}}^{[l + 2]}} = g({{\rm{z}}^{[l + 2]}})$ 去掉了,取而代之的是另一个 ReLU 非线性函数,仍然对${{\rm{z}}^{[l + 2]}}$ 进行g函数处理,但这次要加上${{\rm{a}}^{[l]}}$ 即:

${{\rm{a}}^{[l + 2]}} = g({{\rm{z}}^{[l + 2]}} + {{\rm{a}}^{[l]}})$ 也就是加上的这个${{\rm{a}}^{[l]}}$ 产生了一个残差块。

除了捷径, 你还会听到另一个术语“跳跃连接”,就是指${{\rm{a}}^{[l]}}$ 跳过一层或者好几层,从而将信息传递到神经网络的更深层。

所以构建一个ResNet 网络就是通过将很多这样的残差块堆积在一起,形成一个很深神经网络:

这并不是一个残差网络,而是一个普通网络( Plain network)。

把它变成 ResNet 的方法是加上所有跳跃连接。每两层增加一个捷径,构成一个残差块。如图所示, 5 个残差块连接在一起构成一个残差网络。

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

但有了 ResNets 就不一样了,即使网络再深,训练的表现却不错,比如说训练误差减少,就算是训练深达 100 层的网络也不例外。有人甚至在 1000 多层的神经网络中做过实验,尽管目前我还没有看到太多实际应用。但是对x的激活,或者这些中间的激活能够到达网络的更深层。这种方式确实有助于解决梯度消失和梯度爆炸问题,让我们在训练更深网络的同时,又能保证良好的性能。也许从另外一个角度来看,随着网络越来深,网络连接会变得臃肿,但是 ResNet 确实在训练深度网络方面非常有效。

posted @ 2018-11-06 20:38  刘-皇叔  阅读(670)  评论(0编辑  收藏  举报