11.5 ResNet
ResNet(残差神经网络)由何恺明等人于2015年提出,是深度学习领域里程碑式的工作。ResNet在2015年ILSVRC中以3.57%的top-5错误率夺冠,首次显著超越人类水平(5.1%)。其核心创新是残差学习,使得网络可以训练到极深的层次。在ResNet出现之前,一般的卷积神经网络只能达到30层,而有了ResNet之后,网络深度可以达到100多层,甚至1000层。
11.5.1 网络越深越好吗
之前我们讲过,同样的参数量,网络越深性能越好。因为神经网络可以逐层抽象特征,获取更好的拟合效果。
但是,在实际实验中,人们却发现,当网络到达一定深度后,随着网络深度的增加,训练误差反而上升。注意,这不是过拟合。过拟合是训练误差小,测试误差高。这里是训练误差会上升。这是因为深层网络难以优化导致的。
在ResNet的论文里作者也做了实验,对比一个20层的网络和56层的网络。他发现随着训练迭代(横轴),训练集上的错误率(下左图),测试集上的错误率(右下图)。20层的网络反而都优于56层的网络。
11.5.2 恒等映射
假设我们有一个神经网络(不论是全连接网络还是卷积神经网络),它的输出特征为X
我们在这个网络上增加一层,理论上这一层是可以学到一个恒等映射,它的输入是X,输出还是X。
即使之前的网络已经是最优解了,新增加的一层还是可以学习一个恒等映射的参数,让模型的训练Loss不增加。
那为什么网络还是学不到一个恒等映射呢?答案是训练时所有层都是一起训练的,从结构上每一层都是相同的,网络不可能规划出哪些层是学习有用的特征,哪些层是做恒等映射。最终的实验结果就是网络深度到达一定深度后,随着网络深度的增加,由于浅层网络参数的梯度需要经过更多的传递(导数的连乘),导致浅层网络参数的梯度值很小,监督信号弱。让浅层网络提取到的特征质量下降,导致最终训练误差不降反升。
11.5.3 残差连接
ResNet的作者提出一种新的网络结构,可以让网络从结构上更容易学到恒等连接。
之前,我们增加一层网络,是希望这一层能提取到更好的特征,提升网络性能。这一层的输入是x,我们希望学到一个函数,这个函数的输出就是新的特征。
ResNet作者的思想是,网络增加一层后的输出由两部分构成,一部分是输入x,一部分是新增加层对x做的修改。对x做的修改部分叫做残差部分,用表示。增加的这一层最终输出的特征为。期望。这种通过人为修改网络架构的方式,将对x的映射分为两部分:x本身和对x改变的部分,让模型更容易学到恒等映射。
有一点需要注意,残差连接可以跳过多层,如上图所示,它跳过了两层。上图中的结构被称为一个残差块。残差块里x绕过两层直接到达激活函数的这条路径被称为捷径连接(shortcut connection)。
残差连接还有一个好处,就是可以让梯度通过捷径直接传递到给网络的浅层,避免了梯度层层传递,带来的导数连乘让监督信号变弱。
上图展示对比了普通的卷积神经网络(plian)和增加了残差连接的卷积神经网络(ResNet)的对比,可以看到普通卷积神经网络,34层的错误率反而高于18层。而ResNet的34层错误率低于18层,让更深的网络取得了更好的表现。
下图是普通卷积神经网络34层和ResNet34层的网络结构图,可以发现ResNet增加了很多残差连接。