Fork me on GitHub

模型预热之两阶段训练(少样本优化)

以下文章来源于 https://zhuanlan.zhihu.com/p/587292812



一、前言

迁移学习一直是针对少样本优化的重要方向,cv领域中新出的sota骨干模型都是在imagenet上进行训练之后提供相应的权重加载,给后续的算法工程师和算法研究员在自己的数据集上微调,imagenet一共包含了 14,197,122 张图片,共1000个类别,有些是猫狗等动物的图片。这里就有个疑问了,为啥在大量猫狗等动物图片预训练的模型权重在下游任务微调会比直接微调效果好不少且模型更容易收敛?因为cnn网络在大量图片中学习时上层的模型层学到是图像中更底层的信息,在下游任务中微调也是至关重要的信息。说完cv也来谈谈nlp,Bert的出现是nlp伟大的革新,其实transformer结构比较早就出来了,但是用的地方不多,主要有以下几个原因,一是当时算力不够transformer复杂度太高,二是transformer结构需要大量数据微调才容易收敛不然很容易过拟合。所以Bert创新在他预训练方面利用了迁移学习,在大量无监督语料中进行mlm让Bert先收敛之后可用于下游任务的微调当中取得优秀的效果。下接结构都是从零开始训练会和Bert主体有一个gap,需要通过数据来调和这个gap,Bert如果微调数据少时,可能需要跑很多个epoch来调和这个gap,还不一定效果会好,下面会介绍一个通过两阶段微调来比较好调节下接结构和Bert主体的gap方法。


二、大众点评搜索相关性计算应用

美团算法技术团队在大众点评搜索中除了对query理解做了大量工作之外,在相关性计算模型上也做了很多工作。美团业务数据语料和谷歌开源的Bert预训练正规语料会有很大gap,所以美团利用自己大数据语料预训练出来MT-Bert更加适合美团业务场景。

让模型更好地适配点评搜索相关性计算任务包含两层含义:大众点评搜索场景下的文本信息与MT-BERT预训练模型使用的语料在分布上存在着一定的差异;预训练模型的句间关系任务与Query和POI的相关性任务也略有不同,需要对模型结构进行改造。经过不断探索,美团算法团队采用基于领域数据的两阶段训练 方案,结合训练样本构造,使预训练模型更适配点评搜索场景的相关性任务;并提出了基于多相似矩阵的深度交互相关性模型,加强Query和POI的交互,提升模型对复杂的Query和POI信息的表达能力,优化相关性计算效果。

为了有效利用海量用户点击数据,并使预训练模型MT-BERT更适配点评搜索相关性任务,美团算法团队借鉴百度搜索相关性的思想,引入多阶段训练方法,采用用户点击和负采样数据进行第一阶段领域适配的预训练(Continual Domain-Adaptive Pre-training),采用人工标注数据进行第二阶段训练(Fine-Tune)。
基于点击及人工标注数据的两阶段训练模型结构

基于点击数据的第一阶段训练

引入点击数据作为第一阶段训练任务的直接原因是在点评搜索场景下存在着一些特有的问题,例如"开心"和"高兴"两个词在通用场景下是几乎完全同义的词,但是在点评搜索的场景下"开心烧烤"和"高兴烧烤"却是两家完全不同的品牌商户,因此点击数据的引入能够帮助模型学习到搜索场景下的一些特有知识。但是直接将点击样本用于相关性判断会存在较大噪声,因为用户点击某个商户可能是由于排序较为靠前导致的误点击,而未点击某个商户也可能仅仅是因为商户距离较远,而并不是因为相关性问题,因此美团算法团队引入了多种特征和规则来提高训练样本自动标注的准确率。

在构造样本时,通过统计是否点击、点击位次、最大点击商户距用户的距离等特征筛选候选样本,将曝光点击率大于一定阈值的Query-POI对作为正例,并根据业务特点对不同类型商户调整不同的阈值。在负例的构造上,Skip-Above采样策略将位于点击商户之前且点击率小于阈值的商户才做为负样本。此外,随机负采样的方式可以为训练样本补充简单负例,但考虑随机负采样时也会引入一些噪声数据,因此美团算法团队利用人工设计的规则对训练数据进行降噪:当Query的类目意图与POI的类目体系较为一致时或者与POI名高度匹配时,则将其从负样本中剔除。

基于人工标注数据的第二阶段训练

经过第一阶段训练后,考虑到无法完全清除掉点击数据中的噪音,以及相关性任务的特点,因此需要引入基于人工标注样本的第二阶段训练来对模型进行纠偏。除了随机采样一部分数据交给人工去标注外,为了尽可能提升模型的能力,美团算法团队通过难例挖掘和对比样本增强方式生产大量高价值样本交给人工去标注。

美团用户量庞大,在日常app产生的数据也是非常巨大的完全可以称为海量数据,第一阶段的训练要求并不需要对最终任务目标要匹配或者精确,在相关语料中让整个模型收敛,减少Bert与下接结构的gap,第二阶段再在标注的下游任务语料中微调,调节整个模型的向量分布空间,第二阶段会收敛加快且效果会好于直接微调。
两阶段训练效果对比

从上图看对于负类的精确率和召回率都有一定的提升效果。

三、针对于两阶段训练的灵活应用改进

像我们平时做比赛或者企业算法项目时,标注数据刚开始也不会标注大量数据,一般都是先尝试标注少量数据看看效果,而且我们如果不背靠搜广推这种自带很多标签数据的场景下,我们第一阶段微调的数据来源比较有限。大概有两个来源途径:

1、网上找相似领域的数据,采样对齐下游标注类别数量。

2、通过大量伪标签数据作为第一阶段微调数据。

第二种方法远比第一种方法来源更加简单,如果标注数据较少的情况下,第一阶段训练作用就显得尤为重要了。一般伪标签利用的方法是直接和标注数据一起训练或者是给伪标签数据在训练loss较低一点的权重,这样伪标签质量不高的情况下可能会对模型预测带来偏向。

有了少量标注数据就可以轻易获取大量伪标签数据,虽然这些伪标签中噪声可能很多。但两阶段训练主要是通过第一阶段收敛模型,第二阶段进行模型纠偏。效果会优于直接使用伪标签和标签数据一起训练的方法。
两阶段训练流程


四、总结

在数据量比较大的时候,两阶段提升可能没那么明显,数据少的时候使用两阶段训练可以大幅加快模型收敛速度减少模型过拟合风险,并且一定程度上提升效果。在业务场景下和比赛情况下,伪标签都是比较容易获得的数据,这样整个操作流程就会简单很多,如果是搜广推这种自带海量标注数据场景下,效果可能会提升更加明显一些,不仅仅是相关性预测能用到两阶段训练,现在许多任务都是可以使用两阶段预训练来减少下接结构和Bert主体gap情况从而提升整体下游任务的效果,也是迁移学习很好的应用之一。


五、参考文献

1、大众点评搜索相关性技术探索与实践

2、凉爽的安迪:一文入门元学习(Meta-Learning)(附代码)

3、炸炸呼呼:元学习Meta learning深入理解(全)


本文地址:https://www.6aiq.com/article/1677516661839
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出