【转载】Rethinking ImageNet Pre-training 论文笔记

本文转自:https://blog.youkuaiyun.com/u014380165/article/details/84557356
相关链接:
知乎-如何评价何恺明等 arxiv 新作 Rethinking ImageNet Pre-training?

论文:Rethinking ImageNet Pre-training
论文链接:https://arxiv.org/abs/1811.08883

Kaiming He这篇文章以计算机视觉中的目标检测、实例分割和人体关键点检测领域为例,思考预训练模型是否真的那么重要,最后基于实验结果得出结论:基于随机初始化的网络参数(train from scratch)训练模型的效果并不比基于ImageNet数据集的预训练模型效果差。具体而言主要有以下几个发现:
1、采用基于ImageNet的预训练模型参数可以加快模型的收敛速度,尤其是在训练初期,而基于随机初始化网络结构参数训练模型时在采用合适的归一化方式且迭代足够多的次数后也能够达到相同的效果,可以参考Figure1的结果。在Figure1中作者以训练Mask-RCNN算法为例,采用组归一化(group normalization,缩写为GN,参考博客:Group Normalization算法笔记)训练不同参数初始化的网络并对比效果,可以看出模型在训练初期的收敛速度存在较大差异,但是在训练迭代次数足够多时,随机初始化网络结构参数能够达到采用预训练模型参数相同的效果。
图1
这里要强调一下选择合适的归一化算法对从头开始训练检测算法的重要性,忽略归一化方式的选择容易产生目标检测算法难以在随机初始化网络结构参数的情况下训练的错觉。目前BN(batch normalization)是图像分类算法中最常用的归一化层,当在目标检测任务中使用基于ImageNet的预训练模型,因为相比之下目标检测任务的输入图像更大、网络结构更加复杂等原因,因此目标检测任务的batch size参数比图像分类任务要小(尤其是Faster RCNN这种two stage类型的检测算法),而BN层的计算在batch size较小时受batch size参数影响较大,batch size越小,参数的统计信息越不可靠(可以参考group normalization那篇文章,另外这里讨论的是单卡计算BN层参数,不包括跨卡的BN层参数计算),因此如果直接fine tune模型,效果会受到一定影响,不过可以在fine tune的时候固定BN层的参数,这样就避免了BN层的影响。但是如果采用随机方式初始化网络参数,因为没有预训练模型的BN参数,这就使得BN层在一定程度上限制了从随机初始化开始训练检测模型的效果,因此作者做了2个重要实验,一个是采用GN(group normalization)代替BN层,因为GN层的参数计算不依赖batch size的大小,因此就不存在参数计算不准确的问题。另一个是采用跨卡的BN层(synchronized batch normalization),跨卡BN层是传统BN层的优化版,表示BN层参数的计算是基于多个GPU的批次数据进行的,举个例子,假设某个检测模型的单卡batch size设置为8,那么传统的BN层在计算参数时不管你的训练GPU有多少块,都是基于8个样本来计算的;而跨卡BN层的参数计算和训练的GPU数量相关,假设有4块GPU,那么BN层的参数就基于4*8=32个样本计算,这样计算得到的数值相比基于8个样本要可靠得多。作者发现不管是采用GN层还是跨卡的BN层替换原有的BN层,都能成功训练基于随机初始化网络参数的检测网络。Figure4是采用跨卡BN时的模型收敛曲线,可以和FIgure1(采用GN层)的模型收敛曲线对比,效果基本是差不多的。
图4
补充一下Figure1和Figure4中曲线跳跃的含义,常规的Mask-RCNN算法使用预训练模型参数进行初始化,然后fine tune 90k次得到结果。而Figure1或Figure4中的5次跳跃分别表示迭代次数是90k的2倍、3倍、4倍、5倍、6倍时模型第一次修改学习率(倒数第60k次迭代)的效果跳跃,因此实际上Figure1或Figur4是将5张收敛曲线合并在一起的情况。其次,在每次跳跃后,曲线在平缓上升阶段还有1次明显的上升,那是第2次改变学习率(倒数第20k次迭代)时模型效果的提升。举个例子,比如迭代次数是90k的2倍时(一共迭代180k)的这条收敛曲线,曲线在第120k(倒数第60k)时学习率缩小为原来的1/10,因此效果有个明显的上升,然后在第160k(倒数第20k)是学习率再次缩小为当前值得1/10时,效果上还有一个上升。另外4条迭代次数分别是270k、360k、450k、540k的曲线也是同理。

Table1是2种参数初始化方式的训练效果在具体指标上的对比,可以看出基于预训练模型参数训练的Mask RCNN在迭代次数达到原来6倍时,在效果上和基于随机初始化网络参数进行训练的模型差不多。
表1
2、采用基于ImageNet的预训练模型参数训练得到的模型泛化能力不如基于随机初始化网络结构训练得到的模型,前者更容易出现过拟合,因此需要选择合适的超参数训练模型,从而尽可能减少过拟合风险(前提是数据量足够大,比如10K以上的COCO数据集)。这部分的实验参考Figure7,在Figure7中一共有3个图表,在左边和中间图表中,训练数据集采用原来COCO训练数据集1/3左右的数据,右边图表的训练数据集采用原来COCO训练数据集1/10左右的数据。
在左边图表中,除了减少了训练数据量,其他模型训练相关的超参数都不变,可以看出在学习率变化时模型效果出现了下降,说明出现了过拟合,此时超参数需要重新选择。
中间图表和左边图表的不同点在于基于预训练模型参数进行初始化训练时,超参数做了修改,降低其出现过拟合的风险,而基于随机初始化参数进行训练的模型超参数也采用修改后的超参数,可以看出2种初始化在模型的最终收敛情况上基本差不多。
右边图表除了数据量和左边图表不一样外,其他都一样,同样可以看到2种初始化在模型的最终收敛情况上基本差不多。
图7
这部分有一个实验比较有意思,那么就是数据足够少时的情况是否这两种初始化方式结果还是类似?答案是否定的。一方面作者采用1K的COCO训练数据进行训练,发现损失函数如下所示:
图8
在损失函数上没有什么问题,随机初始化方式在迭代足够次数后其损失值甚至比采用预训练模型还要低,但是在测试AP指标时发现随机初始化方式的AP仅有3.4,远小于采用预训练模型的9.9AP。同时在Pascal VOC数据集(训练数据15K左右,但是每张图像的检测框和类别数较少)上的训练结果也类似,随机初始化方式仅有77,6的mAP,而采用预训练模型可以达到82.7mAP。作者在文中也解释了出现这种现象的原因是检测框数量和类别数较少,此时出现这种基于初始化方式训练的模型效果难以达到基于预训练模型训练的模型效果的可能性较大。一直以来我们使用预训练模型的原因就是为了避免模型在小数据集上训练过拟合,因此这篇文章的研究结果并不否定预训练模型的这个效果,只不过受迁移数据集的量级、类别数等影响而已

3、当迁移任务的目标对空间位置信息比较敏感时(比如目标检测、人体关键点检测任务),采用基于ImageNet的预训练模型并不会有太大的帮助。训练目标存在差异的话,在算法优化的后期是容易存在瓶颈的,而且这个瓶颈必须要通过最小化差异来解决。以目标检测领域为例,采用基于ImageNet数据集的预训练模型是比较常用的做法,但是图像分类的目标和目标检测的目标还是存在一些差别的,比如前者在乎的是图像中有没有某类别的物体,而后者还需要输出物体的具体位置,这也是最近几年目标检测领域的部分论文研究采用随机初始化网络结构(比如ICCV2017的DSOD、ECCV2018的DetNet和CornerNet)的原因,不过这几篇文章在特征提取网络设计上做了一定的改进,换句话说就是设计更加贴合目标检测任务的特征提取网络,而Kaiming He的这篇文章研究的是网络结构相同的情况下,采用预训练模型参数初始化与随机初始化的差异。

### Few-shot 3D点云语义分割的研究与方法 Few-shot学习是一种机器学习范式,旨在通过少量样本训练模型来完成特定任务。对于3D点云语义分割而言,这一领域面临的主要挑战在于如何有效提取几何特征以及适应新类别时的数据稀缺问题。 #### 数据增强与元学习 为了应对数据不足的问题,一些研究引入了基于元学习的方法。这些方法通常会构建一个基础网络,在大量已知类别的支持下进行预训练,并通过优化算法快速适配到新的未知类别上。例如,有工作提出了一种原型网络框架,该框架能够通过对不同类别的平均嵌入向量计算距离来进行分类决策[^1]。 #### 图神经网络的应用 由于3D点云本质上是非结构化数据形式,传统卷积操作并不适用。因此,近年来图神经网络(GNNs)被广泛应用于处理此类数据集。具体来说,可以先建立K近邻(KNN)图表示点之间的关系,再利用GNN实现消息传递机制更新节点特征直至收敛后再做最终预测。这种方法充分利用了局部区域内的空间关联特性从而提高了泛化能力尤其适合于few-shot场景下的应用需求。 另外值得注意的是Mask R-CNN虽然主要用于图像实例分割但在某些变体版本里也被扩展到了三维物体检测当中去比如PointRCNN它结合了pointnet++ backbone 和rcnn head共同完成了端到端的目标定位加mask生成过程尽管如此这类两阶段pipeline架构可能不太容易直接迁移到极低标注率条件下所以还需要进一步改进才能满足few-shot setting的要求[^2]. ```python import torch from torch_geometric.nn import GCNConv class SimpleGCN(torch.nn.Module): def __init__(self, input_dim, hidden_dim, output_dim): super(SimpleGCN, self).__init__() self.conv1 = GCNConv(input_dim, hidden_dim) self.conv2 = GCNConv(hidden_dim, output_dim) def forward(self, data): x, edge_index = data.x, data.edge_index x = self.conv1(x, edge_index) x = torch.relu(x) x = self.conv2(x, edge_index) return x ``` 上述代码展示了一个简单的图卷积网络(Graph Convolutional Network),它可以用于处理点云中的邻居关系并进行特征传播,这是许多Few-shot 3D点云语义分割方法的基础组件之一。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值