问题动机
上周阅读的论文首次尝试了完全使用Transformer进行图像分类,但其中很重要的一点就是,几乎完全照搬了BERT任务下的Transformer架构,并尽量沿用原有参数,也就是说使用的是语言模型的架构、参数,没有专门对视觉Transformer进行优化。然而实际上,语言模型训练主要是用无监督预训练,而计算机视觉常使用监督预训练,两者方法截然不同。
其实语言架构下的不同规模的参数已经研究的非常透彻。但是在视觉Transformer下不同规模参数、数据集、训练时间下的性能变化暂未研究清楚,所以本文作者便着重研究在不同规模,不同比例下数据、模型、数据集、训练时间下视觉Transformer的性能,并对各种规模进行缩放调整,详细研究调整了超参数,改进了视觉Transformer体系结构和训练方法,最终在ImageNet上达到了最先进水平。
相关工作
更小的Vision Transformer
并不是所有人都有能力进行如此大规模的训练,不过作者揭示了缩放特征,方便其他人继续研究
规模规律
作者指出了数据、模型、计算性能之间的幂率,其他研究者可以将其应用到他们的领域之中
缩放其他视觉架构
可以将这种缩放的思路应用到比如卷积神经网络之中,进一步改进在超大规模数据集上的表现
核心思路
作者在30亿张弱标记图像上训练了多个ViT模型,为了评估预训练质量,作者使用了两种评估方式:
- 冻结预训练获得的权重,只通过少量样本训练线性分类器
-
同时增加计算时间、模型规模、数据集规模
一起放大这三样要素的规模显然可以提升精度,然而,在最大规模的情况下,模型开始饱和,幂次的训练时间的增加无法带来更多精度的增加,落后于幂律边界。
模型大小会对分类精度产生一定的影响。因为小模型的容量有限,所以可能无法从最大的数据及或者计算资源上受益,小模型在用大量图像训练仍趋向较高错误率。
大模型更受益于额外的大量数据。放大模型尺寸时,数据集大小可能是模型的瓶颈,即使是30M数据仍然无法让最大的模型饱和。在30M的基础上继续增加数据,大模型仍然可以获得精度改进
根据实验结果,在最前沿的组合表现了训练模型和训练时间之间的最优比率,也就是质量和训练时间的帕累托边界双饱和幂率
对于不同数量积的计算,计算时间和性能之间遵循幂率,从而在对数图像上形成直线。然而在计算谱的末端,观察到饱和,即即使无限规模的模型也无法获得零误差,这样的残差称之为不可约熵,根据该定律,该误差将会是一个常数,最后幂率为
在计算谱的前端,较小的模型饱和了,性能比最佳计算比的要好,是因为哪怕是小模型都可以获得非零误差,比如预测的精度和某一类在测试集中出现的频率相关,该饱和度意味着精度会有初始值,幂率为大模型样本效率更高
更大的模型样本效率更高,可以在看到较少图像的情况下,达到相同的错误率水平,同理,在看到同样多图像的情况下,大模型的准确率更高。在微调时,这样的情况更强烈,只需要少量的数据即可实现很高精度。
方法细节
作者针对Vision Transformer给出了很多改进,可以显著的简化训练过程,并提高内存利用率和模型质量。
“头部”权重衰减
作者分析了权重衰减在网络各层的影响,发现在最后的线性分类层和其他地方的权重应用不同的权重衰减会有更好的效果,权重衰退的本质是正则化,防止模型过拟合。作者尝试使用不同值,发现最佳性能在对角线处
评估方式1,即只用少量样本训练最后连接层时,对头部应用大权重衰退,而其他地方应用小权重衰退会获得最好结果
- 评估方式2,即预训练网络完整训练,头部的大权重衰退会影响低层训练结果,最佳结果是不分开设置权重衰减
融合类标签节约内存
上篇文章使用的小块分割法会将一张224×224的图像分成256个14×14的小块,最后还需记录类别,总共257维,然而当前的TPU一般只支持128的倍数,多出的一维额外消耗50%的内存,作者发现了记录类别的替代方法。
作者使用全局平均池化层和多头注 意力层来表示标签,为了进一步简化模型,作者将头数设置得和模型中其他注意力头数一样多,同时删除了最终预测层之前的非线性投影层,进行比较后,发现性能几乎没有下降,同时保持了模型的统一性,于是作者选择了多头注意力输出结果
使用更大更大的数据集
作者使用了比JFT-300M更大的JFT-3B数据集,有30亿张图片,作者发现,在更大规模的数据集上预训练,在微调训练ImageNet上可以获得更好结果,同时不用再担心出现过拟合和是否需要正则化
优化算法选择
数据规模更大,需要调整优化算法的选择,否则会出现巨量参数,如果使用Transformer常用的Adam优化器,可能会占据16G内存。作者尝试了两种方法优化Adma算法
- 将Adam中动量的精度减半,变为8位浮点数精度
- 使用Adafactor优化器,使用秩为1分解储存参数,同时降低精度,进一步减少消耗
学习率调度
作者使用了预热+退火学习率调度法,学习率初始为0,在前面的较短批次内快速线性升到峰值,然后再缓慢下降。这种方法的精度不是最好的,但是允许不确定会持续多久的训练,保证在长时间内都有着较高的学习率。
实验过程
模型选择
作者最后选择一个具有20亿参数的Vision Transformer,并在ImageNet上进行微调后输出结果。
实验结果
在ImageNet上进行试验,每个类别只有1个样本时,可以获得69.52%的准确率,在每个类别只有10个样本时达到84.86%,在完整数据集上实验时,作者获得了90.45%的最先进精度。
自己思考
作者在本文详细介绍了对Vision Transformer在超大规模上数据预训练的方法和实际表现,通过广泛的实验,给出了相当多的调参经验,给出了如何优化模型的训练速度,并使用Vision Transformer实现了目前的最高分类精度。
不过这两篇论文都使用了十分巨量的计算资源和越来越离谱的数据集,并没有解决Transformer架构的核心痛点,就是需要大量的数据去投喂,能不能使用较少数据去训练模型呢。
经过超大规模训练的Vision Transformer架构在图像分类上表现出色,不过该预训练能否顺利推广到其他任务上,移植到不同任务过程能不能有一种统一的模式或者相对规范化的方法,避免每次移植都需要进行这么大规模的测试和实验