1 什么是预训练模型?为什么咱们须要预训练模型?
预训练模型是晋升深度学习算法性能的一种罕用伎俩。所谓预训练模型,能够概括为是某种深度学习的网络架构,并且蕴含这个网络架构在海量数据上训练好的一组权重。有了网络架构和权重后,咱们就能够用它作为某一具体视觉工作的骨干网络,并提供初始化参数。这样一来,具体的上游工作就有了一个较好的训练终点,在缩小摸索空间的同时,还可能实现更好的算法性能。
那么咱们为什么须要预训练模型呢?在这里做一个比喻,如果把深度学习算法比作武侠的话,那预训练模型就是他的内功,有了扎实的内功根底,就可能更容易、更疾速的把握各种文治招式,并施展其最大效用。预训练模型的过程就是深度学习算法修炼内功的过程。
2 OPPO自研大规模cv预训练模型
2.1 概述
之所以要自研预训练模型次要是两点起因:首先,以后数据科学家们应用的预训练模型都是网上开源的,每年都有变动,最新的一些钻研往往不开源,无奈保障成果最优;其次就是网上开源的预训练模型,都是基于开源数据集数据集训练失去的,比方大家熟知的imagenet。没有充分利用公司自有数据的劣势。因而,自研预训练模型是非常有意义的。
OPPO自研大规模cv预训练模型技术计划次要包含以下三大部分:
- 网络架构翻新:次要是钻研以后cv界支流模型架构如CNN,Transformer和MLP等,对不同构造以后SOTA的网络架构进行组合、优化的摸索,尽可能的失去性能最优的网络架构作为预训练模型的骨干网络。
- 自监督学习训练:次要是心愿可能充分利用oppo自有的海量无标注数据,在海量无标注数据下进行预训练,从而失去更加通用的特色表白,让模型可能更好地克服OOD(与训练集散布不同)状况,失去更加鲁棒的预训练模型。
- 有监督微调训练:当利用具体的工作数据集(标注样本)对预训练模型的网络参数进行微调训练时,应用适合的训练方法及正则办法,能够使模型在具体上游工作达到最优成果。
2.2 关键技术
2.2.1 网络架构设计
在网络架构方面,咱们的指标是设计适合的网络架构,放大特色摸索空间,晋升网络性能。为了可能更适宜接入不同的浓密场景视觉工作,咱们的网络架构须要设计成一种多阶段的层次结构来提供多尺度的特色图,并且咱们的网络要易于拓展成不同参数量级的变体模型,以满足不同业务场景的需要同时要在参数量和浮点数计算量更低的条件下尽可能的晋升网络的性能。
以后计算机视觉畛域三大支流模型架构包含卷积神经网络CNN,Transfomer以及多层感知机MLP。其中CNN多年来始终是计算机视觉工作中占据主导地位的网络架构,CNN善于提取部分细节特色,并且具备形变、平移及缩放不变性等长处。Transformer在NLP畛域获得了微小的胜利,去年首次在CV界亮相开始引领新的趋势,Transformer的长处是善于捕捉全局信息, 具备更大的模型容量,且其运作机制更靠近人类。在Transformer崛起的同时,一部分钻研聚焦于MLP代替Transformer组件构建网络的钻研,开拓了另一个钻研方向,MLP 在小的模型规模下能够实现靠近Transformer的性能,但当规模扩充时,它就会受到重大的过拟合影响。
通过对这三种支流模型架构进行钻研剖析后,咱们失去了以下一些论断:对于MLP 来说,它的钻研聚焦在替换 Transformer组件来取得绝对有竞争力的后果,然而实际效果并没有超过基于transformer的办法,这系列工作只是肯定水平上开辟了一个新的思路。CNN中的卷积操作善于提取图片的部分信息,而Transformer通过结构图像tokens提取到图片的全局示意,因而CNN和Transformer在肯定水平上能够造成良好的互补。还有就是Transformer 在三种架构中具备最大的模型容量,更适宜做大规模预训练模型。因而,Transformer 加 CNN的架构或者是最优的解决方案。
既然咱们要聚焦于Transformer办法,咱们就先要对Transformer的基本原理有肯定的理解,以便对其进行改良。所以接下来我先对Transformer进行简略介绍。Transformer构造是google在17年的Attention Is All You Need论文中提出的,在NLP的多个工作上获得了十分好的成果。它最大特点是整个网络结构齐全是由Self-Attention机制组成。如图一所示,Transformer采纳Encoder-Decoder构造,输出通过 embedding后,要做地位编码,而后是多头自注意力机制,再通过Feed Forward,每个子层有残差连贯,最初要通过Linear和softmax输入概率。
其中:
- 残差构造是为了解决梯度隐没问题,能够减少模型的复杂性。
- 其中的Norm指的是LayerNorm操作,LayerNorm是为了对attention层的输入进行散布归一化。计算机视觉中常常会用的batchNorm是对一个batchsize中的样本进行一次归一化,而LayerNorm则是对一层进行一次归一化,二者的作用是一样的,只是针对的维度不同。
- Feed Forward是两层全连贯加激活函数的构造。是为了应用非线性函数来拟合数据。其中第一层全连贯用来进行非线性性函数拟合,第二层全连贯用于调整输入维度。
- 退出地位编码(Positional Encoding)次要是因为self-attention机制没法捕获地位信息,因而须要通过地位编码来改善。
Transformer构造中咱们最须要关注的是self Attention机制的原理,所谓Self Attention就是句子中的某个词对于句子自身的所有词做一次Attention。当以一个词为核心进行Self Attention时,每个词都要通过三个矩阵Wq, Wk, Wv进行一次线性变换,一分为三,生成每个词本人的query, key, value三个向量,也就是公式中的大Q,K,V,而后通过如下公式进行计算,作为这个词的输入。最终每个Self Attention承受n个词向量的输出,输入n个聚合的向量。这么做的目标是保留关注词的value值,减弱非相干词的value值。
而Multi-Head self- Attention就是将上述的Attention做h遍,而后将h个输入进行concat失去最终的输入。Transformer的工程实现中,为了进步Multi-Head的效率,将W扩充了h倍,而后通过reshape和transpose操作将雷同词的不同head的Q、K、V排列在一起进行同时计算,实现计算后再次通过reshape和transpose实现拼接,相当于对于所有的head进行了一个并行处理。到此为止咱们对Transformer构造有了初步的理解。
在20年,提出的ViT是首个基于纯Transformer的构造来做图像分类工作的网络,算是transformer在图像上利用的开山之作,后续所有基于Transformer的网络架构都是基于此模型进行的革新。
ViT的构造如图二所示,它就是后面讲到的一个典型的Transformer构造:
首先将一张的图像,分成互不交叠相等大小图像块,而后将每个图块进行展平并对每一个展平后的图块向量做一个线性变换进行降维,作为Transformer的输出。这里的每一个图块就是一个Token,也就是NLP中句子中的一个词。
ViT给输出的Token追加了一个分类向量,用于Transformer训练过程中的类别信息学习,与其余图块向量一起输出到Transformer编码器中,最初取第一个向量作为类别预测后果。
为了放弃输出图像块之间的空间地位信息,对图像块中增加一个地位编码向量,这种在进行self-attention之前就退出了地位信息的形式叫做相对地位编码,前面还会对地位编码进行一些介绍,此处不再赘述。
因为ViT是一个非层次结构的网络,不适宜用于浓密场景的视觉工作,并且计算复杂度绝对较高。在后续的钻研中,研究者们用各种方法去从不同的角度对他进行改良。
那么咱们是如何做的呢?
第一点,咱们心愿失去一种更通用的骨干网络架构,而不是针对不同的视觉工作设计不同的网络,因而要设计一种层次结构的网络,能够提供多尺度的特色图。实现层次结构的形式能够采纳pixelShuffle, 卷积降采样等伎俩,来调整特色图尺度与输入维度,从而失去多个阶段的层次结构网络;
第二点,咱们要对对注意力机制进行革新。原始的Transformer在计算注意力机制时须要计算一个Token与其余所有Token之间的关系,计算复杂度为Token数量的二次型。为了能更高效的建模,局部钻研对注意力机制的计算进行了革新,次要包含:halo,shifted window,CrossShape等;
第三点就是将Transformer与CNN进行无效的交融。视觉工作中部分特色建模是十分无效且至关重要的,而部分特色建模是CNN所善于的。已有钻研证实,以适当的形式叠加卷积层和Transformer层,能够无效地晋升网络的整体性能。也有钻研将卷积融入到Transformer中,用卷积代替线性变换来计算Q,K,V矩阵,能够使Transformer对部分特色的建模能力失去晋升。最初是对地位编码的改良。因为自注意力机制具备排列不变性,即不同排列的输入后果是一样的。为了补救这个缺点。如图三(a)所示,相对地位编码是在进行Self-attention之前就退出了地位信息。图三(b)所示为绝对地位编码,是在计算权重矩阵的过程中退出绝对地位信息。图三(c)所示为地位加强编码,它间接将地位信息退出到Value中,具体实现是用一个Depth-wise Conv对value进行卷积,而后将后果退出到了self attention的后果中。
对于咱们的网络架构,能够看做是一个四个阶段的体系结构:
首先通过一组卷积序列对图像进行分块操作生成Tokens,为了产生档次示意,相邻的两个阶段之间咱们采纳另一组卷积序列是Tokens数量减半,通道维数加倍。这样就产生了多阶段的层次结构,可提供多尺度特色图,不便作为骨干网络接入到浓密场景视觉工作中。
从与CNNs联合的角度去看,能够看做是一个多阶段Transformer模块与一个EfficientNetV2-like的构造嵌套组合而成,实现了卷积与Transfomer的无效交融,在模型参数量和浮点数计算量更低的状况了大幅晋升了网络性能。
在计算多头自注意力时,咱们应用改良的计算机制,shifted-window + conv 和CrossShape两种办法,晋升Trasnformer计算效率的同时,网络性能也失去了进一步晋升。
对于地位编码局部咱们应用了绝对地位编码和部分加强地位编码两种形式,经试验验证这两种地位编码方式在分类工作上根本无差别,但在浓密场景工作(如检测、宰割等)时,部分加强地位编码性能更优。
最初咱们通过不同的深度或宽度的配置,设计了三组不同量级的模型架构:Tiny模型,Small模型 和 Base模型,以适应不同业务场景的须要。
表1是咱们的网络架构在Imagenet数据集上的体现,咱们别离与不同参数量级下最新的网络架构进行了比照,能够看到咱们设计的网络架构在参数量更低、计算量更小的状况下,三种量级的变体模型都能获得最优的问题。
2.2.2 自监督学习
接下来介绍预训练模型的另一个关键技术自监督学,所谓自监督学习就是无监督学习的一种。在第 43 届国内信息检索年会深度学习之父上Hinton 提出下一代人工智能属于无监督比照学习。对于三种学习工作Hinton的得意弟子Yann LeCun将其比作蛋糕,强化学习仅仅是蛋糕上的一颗樱桃,有监督学习可比作蛋糕上的奶油,而无监督学习是蛋糕胚,以示其基础性的作用和重要性。
以咱们人类为例,当咱们看到一个货色的时候,所有的知觉都耳濡目染地在给咱们灌输海量的数据,供咱们学习,推理和判断。咱们遇到的“题目”很多,无时无刻不在承受信息,然而咱们的“答案”却很少。咱们可能看过,各种各样的动物,直到某一天才有人用3个字通知咱们,“这是猫”。可能毕生中,他人给你指出这是猫的次数,都是比比皆是的。然而,仅仅通过这一两次提醒,你就能在毕生中记得这些概念。甚至他人从不通知这是猫,你也晓得这应该不是狗或者其余动物,这种没有答案的学习就是无监督学习,他人通知了咱们答案的学习就是有监督学习,可见无监督学习的基础性是如许重要。因为监督学习重大依赖于人工标注数据,而咱们心愿神经网络可能在大量无标注数据中学习到更多内容,从而进步数据学习效率以及模型泛化能力,因而将基于自监督学习的预训练改良作为重点方向之一。
自监督学习能够分为基于Pretext Task的办法、基于Contrastive Learning的办法、基于Clustering的办法和基于Contrastive + Cluster的办法。基于Pretext Task的办法让神经网络去解决一个pretext task,在这个过程中模型可能学习到丰盛的特色示意,而后用于上游工作然而只靠单个前置工作来学习特色示意将不是最好的抉择并且不同前置工作之间的设计差别十分大,难度也不雷同。基于Contrastive Learning的办法通过将数据别离与正例样本和负例样本在特色空间进行比照,来学习样本的特色示意,因为须要显示的去对pair对进行feature级别比照导致计算量十分大。基于Clustering的办法在特色空间进行聚类,看下哪些图片在特色空间上是相像的,特色聚类 + 预测集群调配,依据image feature在全副数据集做cluster(codes),在一个训练step中会对很多image views做cluster,这种办法通常须要扫很多遍数据集。咱们次要基于facebook的最新钻研SwAV办法对模型进行自监督学习预训练改良,它是一种基于Contrastive + Cluster的办法。
SwAV办法与之前的一些比照学习办法的不同之处,次要就是在features比照,SwAV应用了一个codes去表白features进而来放弃一致性。
通常基于clustering法个别是依据image feature在全副数据集做cluster(codes),在一个训练step中会对很多image views做cluster。而Swav办法并不思考用codes作为指标,而是通过一张图片不同的views的codes须要保持一致来进行学习,能够了解为是一张图片的多个不同views须要对应雷同的code而不是间接用他们feature来做。
训练次要包含两局部:
z(features)如何通过c(prototypes)映通过射失去Q(codes);
有了 z 和 q 之后,实践上同一张图片不同view所产生的 z 和 q 也能够互相预测,于是作者便定义了新的loss如公式所示。
其中z是feature,q是codes,s和t下标示意通过不同的augmentations对image进行转换的,而分项loss的计算公式为:
咱们次要采纳SwAV办法对咱们的设计的网络架构进行自检自监督学习预训练。并尝试“分阶段训练”的形式,将学习过程合成为逐渐实现的相干子工作,逐渐将信息注入网络,以便在训练的初级阶段捕捉数据的“粗尺度”特色,而在后续阶段学习“细尺度”特色,并且每个阶段的训练后果都能够作为下一阶段的先决条件,这样会产生正则化成果并加强泛化能力。目前这一部分的工作目前还在进行中,性能统计后果行将到来。
2.2.3 有监督微调
视觉模型的性能是网络架构、训练方法和正则办法的综合后果,在做具体任务时,有监督微调旨在利用其标注样本对预训练网络的参数进行调整。加载网络结构并利用预训练好的权重去初始化网络后须要设置正当的超参配置、优化办法、数据加强办法、和正则办法等。新的网络架构往往是促成诸多停顿的根底,与新网络架构同时呈现的通常还有更加先进的训练方法、数据加强办法和正则办法等。此处仅对一些过来和近期新呈现的办法进行列举,针对具体的视觉工作,可依据本人教训或别人已有的教训进行配置。
3 业务利用
目前咱们寻找了两个外部已有业务,尝试应用咱们的预训练模型对齐进行优化降级,次要包含主题资源格调全场景打标和PGC小视频一二级分类。在主题资源格调全场景打标业务中,应用了咱们的tiny预训练模型来做主题格调多标签分类工作;与原始基于EfficientNet的版本相比,模型的参数量和浮点数运算量仅小幅减少的状况下,打标准确率由87.7%晋升到95%,大幅晋升了7.3%。另外在PGC小视频一二级分类业务应用base预训练模型+BERT来做多模态交融分类;
小视频一二级分类精度与原办法相比均失去了晋升,一级精度由86.5%晋升到89.7%,晋升了3.2%;二级精度61.6%晋升到75.4%,晋升了13.8%。充沛的验证了咱们预训练模型的有效性及业务价值。
4 总结
预训练模型是深度学习网络架构 + 海量数据上训练好的权重,是晋升某一具体任务算法性能的一种罕用伎俩。预训练模型的关键技术包含:网络架构、自监督预训练和有监督微调,各局部都有很多值得钻研的中央。另外,不同业务场景须要的预训练模型规模往往不同,须要设计多种变体模型别离进行预训练,以实现预训练模型利用到更多的业务当中实现更多的价值。
5 参考文献
[1] Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N Gomez, Łukasz Kaiser, and Illia Polosukhin. Attention is all you need. In Advances in neural information processing systems, pages 5998–6008, 2017.
[2] Alexey Dosovitskiy, Lucas Beyer, Alexander Kolesnikov, Dirk Weissenborn, Xiaohua Zhai, Thomas Unterthiner, Mostafa Dehghani, Matthias Minderer, Georg Heigold, ylvain Gelly, et al. An image is worth 16x16 words: Transformers for image recognition at scale. arXiv preprint arXiv:2010.11929, 2020.
[3] Mathilde Caron, Ishan Misra, Julien Mairal, Priya Goyal, Piotr Bojanowski, and Armand Joulin. Unsupervised learningof visual features by contrasting cluster assignments.arXiv preprint arXiv:2006.09882, 2020.
作者简介
Darren OPPO高级算法工程师
深耕计算机视觉算法畛域多年,目前专一于cv模型架构与训练方法钻研。
获取更多精彩内容,请扫码关注[OPPO数智技术]公众号