前言
本人纯小白一个,文章很有可能出错,欢迎指正。
Resnet
Resnet提出之前,深层网络的表现往往不如浅层网络——当网络深度达到一定程度后,梯度消失、爆炸等问题会使深度网络更加难以训练、更难找到一个flat minima。
在kaiming那个时代,人们通过堆积网络层数,在cv的图片分类领域取得了不错的成绩,而且人们发现,随着网络层数逐渐加深,网络在imagenet数据集上的表现越来越好,加深网络以提高准确率似乎成为了共识。
那么,简单的加深网络,真的能够有效的提升准确率吗?即便按照当时的思维,随着网络的加深,梯度的消失、爆炸都必然出现的更加频繁——事实确实如此,越深层的网络,更新梯度时,更新的晚的参数层(如靠近输入层的层),越容易出现连续乘小于1或者大于1的数,而出现梯度g变为 或者 的情况。然而,当时的解决办法是SGD,,通过随机梯度下降,避免梯度在更新时连续乘以一个小于1或者大于1的数,从而避免梯度消失或爆炸的情况。
此时暴露出来另一个问题,随着网络的加深,网络的准确率开始饱和——退化,且网络越深,退化越严重。然而通过实验可以发现,这种退化不是由于网络过拟合导致的(过拟合的现象是"高方差,低偏差",即测试误差大而训练误差小)——如下图,56层的更深的网络,无论是training error还是test error,都弱于20层的网络。
同时可以看出,如果深层网络真的能够找到一个更好的解,那么56层的网络完全可以按照20层网络的参数,后面的36层做恒等映射,即可达到20层网络的准确度——然而56层的网络并没有这么做,或者无法这样做。为什么?因为神经网络的每一个层难以做到这样的精确变换[参见解释一]。
那么有没有这样一种可能,通过让56层网络多出来的层,不仅让前面一层传来的参数作为输入,而且让前n层的参数传过来作为输入呢?这种想法现在看来很直观,既然56层多出来的层无法构造一个恒等映射,那么通过网络学习前n层的参数构造,可以达到一个近似恒等映射的映射,使深层能够学习到浅层的信息。
这种想法也并不是毫无来由,当时的VLAD就是类似的残差结构,并且是一种很成功的提取图像特征、进而对图像分类的办法——图3中 , 为第i个局部特征, 为第i个聚类中心(kmeans),通过计算特征与最近的聚类中心的距离,可以得到所谓的残差,之后再做正则化操作。除了vlad,在计算PDE时用到的multi-grad也用到了残差,这意味着通过把残差作为一个信息,输入到未知解的层当中,能够优化这些层对信息的处理能力。除此之外,Shortcut Connections的研究也表明,通过添加一个从网络输入连接到输出的线性层作为辅助层,可以解决消失/爆炸梯度。
与resnet的工作同时,出现了一个highway netework的工作,通过在辅助层添加一个门控装置,使其能够学习辅助层存在的重要性,也取得了不错的效果。
17年有一篇文章,The Shattered Gradients Problem: If resnets are the answer, then what is the question? 在这里,作者认为,resnet优秀的特点,在于其能够保持梯度相关性,而传统的深层网络的梯度在一步步传回去时,相关性越来越差,最后接近白噪声,基本等同于随机扰动。
ResNeXt
kaiming参与的作品
与resnet的结构对比:
inception
inception被提出来时,面临这样几种困境(参考百度百科):
- 参数太多,容易过拟合,若训练数据集有限;
- 网络越大计算复杂度越大,难以应用;
- 网络越深,梯度越往后穿越容易消失(梯度弥散),难以优化模型
对于图片识别,同一个对象在每一个图片里面的大小是不同的,如果用相同的卷积核显然不合常理,而Inception的解决办法就是将多个卷积或池化操作放在一起组装成一个单元,用单元去组装整个网络结构。左边是作者提出的native版本,右边是inception v1, 显然,右边的可以减少计算量。通过精心、手动设计网络的拓扑结构,inception可以在特定类型的数据集上达到不错的效果。
关于inception为什么有效,可以参看:
如何解析深度学习 Inception 从 v1 到 v4 的演化? - 运筹OR帷幄的回答 - 知乎 https://www.zhihu.com/question/66396783/answer/761129942
我觉得下面一句很有道理:
其实不管是Inception还是ResNet,都是在强调“信息直路”对于深层卷积网络训练的重要性。
可以看看这个:
inception的解读
Resnext
相较于inception,resnext则在所有路径共享相同的拓扑结构的前提下(resnet),结合inception的先低维后高维的操作。
引用ResNeXt的分类效果为什么比Resnet好? - 丶favor的回答 - 知乎的一句话:
ResNeXt的精妙之处在于,该思路沿用到nlp里就有了multi-head attention (其实是一个思路,大家细品一下,head和cardinality是不是本质上一样?),进而有了Transformer,接着横扫nlp各大任务。
multi-path的不同路径,实际上就是不同的子空间,这不仅能够更多样的表示同一个特征,还起到了正则化的作用,在通过1*1的卷积,flops也没有增加,自然效果比resnet好。
SKNet
sknet主要做了两件事,
- resnext减少计算量,提高了精度,那么在减少的计算量小于resnext的情况下,精度是否可以提高更多
- attention is all you need
即split-fuse-select
split
首先分割输入:
其中, 采用 的卷积核, 采用 卷积核
fuse
第一步求和, ,
之后全局平均池化,
最后全连接,
select
先做soft attention,
最后根据attention的weights做出计算即可,
ResNeSt
2020年的文章,2022的CVPR,作者有李沐大神
但是这篇文章是有争议的,比如文章用的各种tricks,以及文章本身novel不够等,时隔两年才从arxiv转移到cvpr本身就能说明问题了,具体可以看:
如何评价ResNeSt:Split-Attention Networks? - 知乎 https://www.zhihu.com/question/388637660/answer/1245680817
引用该回答的部分文字:
所以,一个trick拉满刷一堆SOTA却号称novelty的工作其实有时候反而会让学界的人反感。因为这其中建立起的算力壁垒是很多苦心钻研的“小作坊”望而却步的。
对比前面的网络,resnest实质上就是把attention做到了resnext的group level。
HS-Resnet
- resnetv2中,不同的感受野,能够增加特征的丰富性,
- ghostnet中,部分特征图可以在已有特征图上经过卷积操作得到
hs-resnet则将两者结合
首先,要增加特征丰富性,就要有不同的卷积核;其次,模仿ghostnet的方式,将特征图生成的特征图拼接到特征图上,减少了特征图的冗余,在利用resnet的residual思想,组合一下,即hs-resnet
SCNet
亮点在于Self-Calibrated Convolutions,作者认为,传统网络输出的卷积特征的感受野比较有限,所学习的特征模式具有相似性,进而会导致所学习的特征具有较少的判别能力,而通过将输入X划分为一个常规卷积部分 以及自校正部分 ,对于 做操作来获得输出特征更大的感受野。
下采样:在数据量分布不均衡的情况下,直接拿这样的数据建模容易出问题
直接拿原始数据建模的问题在于数量少的类别容易被分错,而下采样就是在数量多的类别中采取一部分数据作为训练数据去建模。常见的下采样方法有EasyEnsemble (数量多的类别划分为n个子集,之后集成)、 BalanceCascade(多数类样本中抽样得来的子集与少数类样本结合起来训练一个基学习器H,训练完后多数类中能被H正确分类的样本会被剔除。在接下来的第n 1轮中,从被剔除后的多数类样本中产生子集用于与少数类样本结合起来训练,最后将不同的基学习器集成起来)以及nearmiss(启发式算法)
上采样则往往可以是插值等方式。
对于 ,下采样后的较小的潜在空间,由于其视野较大,可以作为指导原始特征空间中的特征变换过程,在与未做下采样、卷积的原始信息sum后,通过sigmoid进行自校正,product后在卷积,与 contact
Tricks
看名字就知道,Bag of Tricks for Image Classification with Convolutional Neural Networks,里面详细对比了一些trick,非常solid的work
这篇文章和resnest的作者几乎是同一批人,都是amazon的工作,以resnet为baseline。
- Linear scaling learning rate
对于large batch traning,增大batch会减小方差,降低梯度的噪声,而增加学习率则可以用更大的步长去学习,适合大的batch情况下,噪声小的特点。
- Learning rate warmup && Cosine Learning Rate Decay
warmup,先线性增大学习率,在指数式衰减学习率,能够避免模型一开始因为参数的初始化问题造成的模型不稳定
- Zero
将所有residual blocks中的最后一个batch norm层的 和 参数设置为0,也即residual block的输出和输入相等,可以使模型在初始阶段更容易训练
- No bias decay
不对bias做正则化,可以防止过拟合
- Label Smoothing
one-hot编码无法输出每一个类别的概率信息,通过对标签进行平滑的处理,能够增加模型的泛化能力
- Mixup
典,太经典了
- Knowledge Distillation
教师、学生模型
除此之外,还有针对flops的操作,但对于“小作坊”,意义似乎不大,至少对我意义不大,此处不再介绍
Explanation
解释一
为什么神经网络无法做到精确的变换?
知乎上,经常可以看到这样一个问题,神经网络能否用于预测奇偶数?答案显然是能的。但是奇偶数的预测本质上可以用一个精确的函数去解释,为什么神经网络在这里又可以做到精确变换呢?因为这个问题下的答主都用到了极强的先验知识:能否使用神经网络来判断奇偶数? - 谢凌曦的回答 - 知乎 https://www.zhihu.com/question/364113452/answer/2433177276
神经网络的作用,在于平滑的拟合训练集,他的一层多个参数的特点,决定了他的解空间必然是在训练过程中试图拟合所有训练集的,在没有硬编码的情况下,训练集输入的顺序、方式都会影响最终的结果。假如把神经网络的结构设计成可以输出正交的解空间,那么在不加入强先验知识的情况下,预测奇偶数的准确率应该会高一点。事实上,参考Continual learning of context-dependent processing in neural networks可以发现,通过加入lstm的结构以及线性的投影方式,网络事实上构建了正交的数据空间,在小数据集上也取得了不错的效果。