卷积神经网络进阶用法---残差网络如何解决梯度消失问题
前言
道路千万条,好用第一条
残差网络和跳跃连接
梯度消失问题
残差网络的原理
DenseNet网络
前言
我在三个月前写了关于卷积神经网络的系列文章,受到了很大的关注,深感荣幸。说明当前读者对深度学习的关注度是相当高的,之前的系列文章主要是关于卷积神经网络的基础概念介绍。其实实际工作中,卷积神经网络有很多的变形和进化,作者通过阅读大量的文献,整理出来一些心得,写在这里与诸君分享。如有错误,还请诸位大神指正。

以下为我之前写的关于CNN卷积神经网络的文章链接:
CNN卷积神经网络原理详解(上)
CNN卷积神经网络原理详解(中)
CNN卷积神经网络原理详解(下)

言归正传,下面开始今天的正文。

道路千万条,好用第一条
看过我上述博客的读者,或者对卷积神经网络有基本概念的读者应该都知道,神经网络是当前人工智能解决图像识别、语义识别等课题重要的手段之一。卷积神经网络如此重要,但是在它刚出现的时候,却存在很多缺陷,尤其是当网络较深时候会发生梯度消失/爆炸等问题。为了解决这些问题,科研工作者后来在经典卷积网络的基础上又进行了大量的优化工作。
在这里插入图片描述

图一
上图中提到的就是一些应用较为广泛的改进策略。本系列博文拟打算从原理上对这些方法策略进行逐一说明,考虑到篇幅原因,这些策略的实际应用会单独另开博客,本文不提。
本文重点介绍残差网络的内容,希望通过本文的介绍,让大家对残差网络有一个直观的理解。通过阅读本文,您会了解:1,残差网络解决了哪些问题;2,残差网络为何会有作用。

残差网络和跳跃连接
梯度消失问题
深度学习之所以叫深度学习,就是因为理论上网络越深,效果越好。当然,这是理论上的说法。实际情况却是:(1)随着网络的加深,增加了大量的参数,导致计算性能严重下降;(2)在网络优化的过程中,出现梯度消失或者梯度爆炸等现象。

这一小节跟大家介绍的残差网络则很好的解决了梯度消失的问题。
本节主要内容:
1,为何会出现梯度消失现象?
2,残差网络如何解决梯度消失问题?

关于为何出现梯度消失现象,大家不妨先来看一组动图。
在这里插入图片描述

图二

在这里插入图片描述

图三

在这里插入图片描述

图四

在这里插入图片描述

在这里插入图片描述

图六
图六是针对上述问题改进的一个网络结构,我们在这个block的旁边加了一条“捷径”(如图六橙色箭头),也就是常说的“skip connection”。假设左边的上一层输入为 x ,虚线框的输出为 F(x),上下两条路线输出的激活值相加为 h(x),即 h(x)=F(x)+x,得出的 h(x)再输入到下一层。
下面我们来具体说一下这么做的原因。

残差网络的原理
什么是残差网络呢?我之前有一篇文章深度学习:白话解释ResNet残差网络,里面对残差网络的基本概念做了解释。
这里我们再回顾一下。
在这里插入图片描述

上图就是残差网络的设计思想。通过在一个浅层网络基础上叠加  y=x 的层(称identity mappings,恒等映射),可以让网络随深度增加而不退化。如图中曲线所示,将浅层的输入值直接连接到端部位置,这样就避免了在层层映射过程中,由于权重小于1而最终导致的梯度消失的现象。

该网络学习的残差函数可以表示为 F(x)=H(x)+x(有些博客也会把它写作 F(x)=H(x)−x)。当 F(x)=0时,该网络变成恒等映射,考虑到实际情况 F(x)的取值是趋近与0而不是0,因此,该网络可以看作是恒等映射的一个逼近情况。

我们观察这个网络可以发现,残差网络并不会引入额外的参数也不会增加计算的复杂度。

残差网络的由来
作为一个经典的残差网络Resnet,它最初的灵感是为了解决这样一个问题:随着网络的不断加深,准确率会出现先增长后下降的趋势。导致这个的原因不是过拟合,因为不仅测试集会出现这种情况,训练集也会出现这种情况。
现在我们假设有一个浅层的网络达到了饱和的准确率,此时我们在网络的后面增加几个 y=x的恒等映射,那么不管增加多少层,误差都不会继续增加,因为我们将映射直接从前一层传递到了最后一层。这就是Resnet的灵感来源。
我们假设某段神经网络的输入是 x,期望输出为 H(x),如果我们直接把 x传递到输出端,那么我们要学习的目标就是 F(x)=H(x)−x,此时目标相当于发生了变更,我们称之为残差。

在这里插入图片描述

图七

在这里插入图片描述

图八
上图(图七和图八)是对普通神经网络和残差网络的结构做了对比,并介绍了残差网络的传递过程。

DenseNet网络
ResNet正是有了这样的Skip Connection,梯度能畅通无阻地通过各个Res blocks,该网络唯一影响深度的就是内存不足,因此只要内存足够,上千层的残差网络也都能实现。
这个问题在DenseNet网络中得到了很好的解决。DenseNet的skip connection不仅仅只连接上下层,直接实现了跨层连接,每一层获得的梯度都是来自前面几层的梯度加成。
在这里插入图片描述

DenseNet在增加深度的同时,加宽每一个DenseBlock的网络宽度,能够增加网络识别特征的能力,而且由于DenseBlock的横向结构类似 Inception block的结构,使得需要计算的参数量大大降低。因而此论文获得了CVPR2017最佳论文奖项!

总结
纸上得来终觉浅,得知此事须躬行。
想要深入了解残差网络的原理,我们还需要通过代码实现的方式做一段实际的学习。关于用代码实现残差网络,我会在之后的博客中为大家整理更新,如果您觉得本文有用,欢迎关注,博主会持续更新关于深度学习的相关内容。

后续还会为大家介绍开头图片里面提到的可变形卷积、分组卷积等内容。

本文参考文章:
可变形卷积网络:计算机新‘视’界
如何理解空洞卷积(dilated convolution)?
为什么ResNet和DenseNet可以这么深?一文详解残差块为何有助于解决梯度弥散问题。
极深网络(ResNet/DenseNet): Skip Connection为何有效及其它
深度学习——残差神经网络ResNet在分别在Keras和tensorflow框架下的应用案例
基于深度卷积神经网络和跳跃连接的图像去噪和超分辨
梯度弥散与梯度爆炸
Group Convolution分组卷积,以及Depthwise Convolution和Global Depthwise Convolution