🐳ResNet 残差网络
2021-11-30
| 2023-8-6
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 
一般认为,经过训练的深度神经网络能够将数据特征逐层抽象,最终提取出完成任务所需要的特征/表示,最终使用一个学习器,就可以完成最终任务——因此深度学习也被叫做表示/特征学习
在“层层抽象”的直觉下,很自然的想法就是,训练一个很深的前馈神经网路,来完成任务。直观上看,更深的神经网络,在非线性激活函数的加持下,拥有更大的假设空间,因此当然“更有可能”包含了一个最优解。但是在实际使用时,训练又成了一个难题。除了过拟合问题以外,更深的神经网络会遇到如下两个难题,我姑且按照物理史的比喻将其称为深度神经网络的“两朵乌云”:梯度弥散/爆炸和网络退化问题。
梯度弥散/爆炸问题导致模型训练难以收敛,但是这个问题很大程度上已经被标准初始化和中间层正规化方法有效控制了,这些方法使得深度神经网络可以收敛。深度神经网络面临的另一朵乌云是网络退化问题:
在神经网络可以收敛的前提下,随着网络深度增加,网络的表现先是逐渐增加至饱和,然后迅速下降
也许可以对网络单元进行一定的改造,来改善退化问题?这也就引出了残差网络的基本思路。
 

函数类

假设有一类特定的神经网络架构,包括学习速率和其他超参数设置。对于所有,存在一些参数集(例如权重和偏置),这些参数可以通过在合适的数据集上进行训练而获得。 现在假设是真正想要找到的函数,如果是,那我们可以轻而易举的训练得到它,但通常不会那么幸运。 相反,我们将尝试找到一个函数,这是我们在中的最佳选择。 例如,给定一个具有特性和标签的数据集,我们可以尝试通过解决以下优化问题来找到它:
那么,怎样得到更近似真正的函数呢? 唯一合理的可能性是,我们需要设计一个更强大的架构。换句话说,我们预计“更近似”。 然而,如果,则无法保证新的体系“更近似”。 事实上, 可能更糟:
notion image
如图所示,对于非嵌套函数(non-nested function)类,较复杂的函数类并不总是向“真”函数靠拢(复杂度由 递增),虽然 更接近,但 却远了。对于右侧的嵌套函数(nested function)类可以避免这问题
因此,只有当较复杂的函数类包含较小的函数类时才能确保提高它们的性能。 对于深度神经网络,如果能将新添加的层训练成恒等映射(identity function),新模型和原模型将同样有效。 同时,由于新模型可能得出更优的解来拟合训练数据集,因此添加层似乎更容易降低训练误差。
针对这一问题,何恺明等人提出了残差网络(ResNet)它在2015年的ImageNet图像识别挑战赛夺魁,并深刻影响了后来的深度神经网络的设计。
残差网络的核心思想是:每个附加层都应该更容易地包含原始函数作为其元素之一,于是残差块(residual blocks)便诞生了。
 

残差块

如图所示,假设原始输入为,而希望学出的理想映射为(作为上方激活函数的输入)。左图虚线框中的部分需要直接拟合出该映射,而右图虚线框中的部分则需要拟合出残差映射。 残差映射在现实中往往更容易优化。 以恒等映射作为我们希望学出的理想映射,我们只需将右图虚线框内上方的加权运算(如仿射)的权重和偏置参数设成0,那么即为恒等映射。 实际中,当理想映射极接近于恒等映射时,残差映射也易于捕捉恒等映射的细微波动。右图是ResNet的基础架构–残差块(residual block)。 在残差块中,输入可通过跨层数据线路更快地向前传播。
notion image
ResNet沿用了VGG完整的卷积层设计。 残差块里首先有2个有相同输出通道数的 卷积层。 每个卷积层后接一个批量规范化层和ReLU激活函数。 然后通过跨层数据通路,跳过这2个卷积运算,将输入直接加在最后的ReLU激活函数前。 这样的设计要求2个卷积层的输出与输入形状一样,从而使它们可以相加。 如果想改变通道数,就需要引入一个额外的1×1卷积层来将输入变换成需要的形状后再做相加运算。 残差块的实现如下:
此代码生成两种类型的网络: 一种是当use_1x1conv=False时,应用ReLU非线性函数之前,将输入添加到输出。 另一种是当use_1x1conv=True时,添加通过卷积调整通道和分辨率
notion image
查看输入和输出形状一致的情况
也可以在增加输出通道数的同时,减半输出的高和宽
 

集成学习的角度

Andreas Veit等人提出了一种不同的视角。他们将残差网络展开,以一个三层的ResNet为例,将得到下面的树形结构:
notion image
这样,残差网络就可以被看作是一系列路径集合组装而成的一个集成模型,其中不同的路径包含了不同的网络层子集。
notion image
Andreas Veit等人展开了几组实验,在测试时,删去残差网络的部分网络层(即丢弃一部分路径)、或交换某些网络模块的顺序(改变网络的结构,丢弃一部分路径的同时引入新路径)。实验结果表明,网络的表现与正确网络路径数平滑相关(在路径变化时,网络表现没有剧烈变化),这表明残差网络展开后的路径具有一定的独立性和冗余性,使得残差网络表现得像一个集成模型。
作者还通过实验表明,残差网络中主要在训练中贡献了梯度的是那些相对较短的路径,从这个意味上来说,残差网络并不是通过保留整个网络深度上的梯度流动来抑制梯度弥散问题,一定程度上反驳了何恺明等的观点。
可以类比集成学习的网络架构方法不仅有残差网络,Dropout机制也可以被认为是隐式地训练了一个组合的模型。
 
 
 

ResNet模型

notion image
每个模块有4个卷积层(不包括恒等映射的1×1卷积层)。 加上第一个7×7卷积层和最后一个全连接层,共有18层。 因此,这种模型通常被称为ResNet-18。 通过配置不同的通道数和模块里的残差块数可以得到不同的ResNet模型,例如更深的含152层的ResNet-152。 虽然ResNet的主体架构跟GoogLeNet类似,但ResNet架构更简单,修改也更方便。这些因素都导致了ResNet迅速被广泛使用
notion image
notion image
notion image
notion image
 
 
 
 
 
  • PyTorch
  • 批量归一化DenseNet 稠密连接网络
    目录