首页 > 编程知识 正文

什么叫预训练模型,预训练模型提取特征

时间:2023-05-06 09:31:43 阅读:204949 作者:2407

目录

前言

数据集

预训练模型

(1)跨语言模型

(2)多模态语言模型

蒸馏

处理长文本问题

训练手段

fine-tuning

总结


前言

自2018年底,bert横空出世以来,预训练模型大放光彩,各种变种层出不穷,研究的方向也多种多样,这里大体总结一下目前预训练模型的一些研究方向和成果,只是一个抛砖引玉,更细节的还是去看相关论文和代码。

数据集

关于数据集,那就是要大!!!

例如百度的ERNIE2.0达到了700G,谷歌最新的T5也有700G,这些语料都是至关重要的,数据石油呀,本着开源的原则,如T5就公布了数据集,真的要致以感谢。

其实这部分是个人和小厂难以收集的,也是当前预训练模型发展的重要驱动。

预训练模型

预训练模型最能捣鼓和出论文的地方就是在pretrain的时候,设计各个任务,说白了就是Loss 的设计,从最开的bert的mask token ,到mask span(n-gram)再到中文上面ERNIE的mask实体(各种各样的实体折腾),再到后面发展出来的shuffle token ,shuffle 实体, shuffle sentence等等,还有最近研究的热点跨语言预训练模型(能够同时理解多种语言的模型),多模态预训练模型(能够同时理解文本,视频,图像等多种数据源形式的模型)。

这里其实是最重要的,是各个团队提出自己模型的立根之本,有很多有意思的idea, 怎么学习这些模型的想法呢?有几个评测数据集:

GLUE:这是一个英文数据集评测

GLUE Benchmark

CLUE: 这是一个中文数据集评测

https://github.com/CLUEbenchmark/CLUE

关于刷榜可以看看:

你刷我,我刷你,霸榜CLUE甜蜜蜜

当然啦,还有一些其他数据集评测,比如小样本数据集评测,跨语言数据集评测等等,这些数据集评测上面都会有各种领域的最新SOTA模型,基本都是开源的有论文有代码,学习即可。

本着抛砖引玉的目的,这里就简单实时更新一些最新的吧

(1)跨语言模型

ERNIE-M

这是百度最新的一篇SOTA模型,能够理解96种语言

论文:https://arxiv.org/pdf/2012.15674.pdf

中文解读:同时掌握96门语言,取得多项世界突破,百度发布预训练模型ERNIE-M

这里总结一下:

其实对于跨语言模型最难得是平行语料获取,为此提出了回译机制,具体来说就是两步走(以下本节图片均来自于上述连接):

(2)多模态语言模型

ERNIE-VIL

这是发表在AAAI2021的一篇跨模态模型即视觉语言预训练模型,其核心思想是通过融入场景图增加知识让模型学到更细粒度的对齐信息,具体来说就是设计了

Object predictions、Attribute Predictions  、relationship Predictions三个预测loss,更详细的论文作者已直播分享了

论文:https://arxiv.org/abs/2006.16934

直播:AAAI 2021 | 知识增强的视觉-预览预训练技术ERNIE-ViL_哔哩哔哩_bilibili

笔者也做了一个笔记:

多模态预训练模型_爱吃火锅的博客-CSDN博客_多模态预训练

蒸馏

该部分研究出现的背景是因为预训练模型太大了,比如bert-base 1亿参数, bert-large就有3亿参数。这么大的模型要部署上线基本无望,为此要瘦下来,即将大模型通过蒸馏手段使得模型轻量级达到可以部署的目的。

关于模型蒸馏的手段已有很多,开山之作就是

distilling the knowledge in a neural network

比较出名的就是Tinybert, albert也算是吧,双塔模型等等。

目前比较普遍认可的就是Tinybert这种teacher+student思路,当然啦,细节上可能会做各种小优化

比如笔者看过的:

bert蒸馏_爱吃火锅的博客-CSDN博客_bert蒸馏

这一块也比较重要,只要涉及到部署上线,这一块工作就必然要做!

处理长文本问题

这一块主要是说一般Bert处理的长度是512,不是开不大,是代价有点大,attention复杂度是n*2,且一般来说512够用了,但是还是有很多场景就是长文本这时候怎么办呢?

一些比较传统的方法是

(1)直接截断

(2)通过一些其他先验知识预处理一下,选出比较关键的句子给Bert

等等

还有比如

(3)修改Transformer 角度的:Transformer-XL , LongFormer等等

LongFormer就是说self-attention分为global attention 和 local attention,少部分token采用global attention的计算逻辑,与全量token计算self attention,而绝大多数使用local attention的方式只与周边一定窗口内token计算self-attention,因此大大降低了整体的计算量,让长文本预训练成为可能。

更多关于Transformer变种:

Transformer的变体_爱吃火锅的博客-CSDN博客_transformer变体

(4)最新的比如CogLTX,是将长文本划分为一个一个块,然后用一个Bert去打分,选出比较关键额句子送到下游,所以总的来说是两个Bert模型,

笔者也对代码解读过:CogLTX : bert处理长文本代码解析_爱吃火锅的博客-CSDN博客_cogltx

训练手段

这部分其实是开发人员在实现的时候有时候需要考虑的一些问题,以下部分话来源于(荔枝诞生记:腾讯看点预训练模型LICHEE登顶CLUE)

(1)GPU资源不够,batch_szie开不大,可以使用时间换空间的做法,具体就是在网络前向的时候,我们一般要保存所有中间结果(反向更新梯度的时候要用这些中间结果),这些保存导致了memory溢出,那我们可以保存一部分关键节点的(比如每一层transformer最后输出的位置),在反向更新梯度需要一些中间的结果时依据这些关键点再前向计算一遍,相当于牺牲时间来换取空间。

(2) LAMB优化器:

关键思想:多层网络中,不同层梯度值区别很大,用相同的学习率并不合适,因此改进为自适应学习率来解决这个问题,再配合超大batch, 原始基线BERT-Large模型需要100万次迭代才能完成预训练,而batch size为65536或者32768的只需要8599次迭代,大大减少了迭代次数,从而耗时由3天缩减为76.19分钟。

原论文:

Reducing BERT Pre-Training Time from 3 Days to 76 Minutes

(3) 混合精度:

这是百度的一篇论文

只有在master weight update时候才会使用FP32,其余均是使用FP16。因为Weight Update = Weight Grad * Learning rate,该参数会非常的小,如果update使用FP16会有一部分参数由于溢出变成0,导致梯度没有办法更新,另一个原因是Weight update相对于Weight本身是小的,如果用FP16,依然会使update变成0.使用混合精度以后,对于内存的消耗会明显减少,在相同硬件的情况下,batch_size可以设置的更大,与LAMB一样,会加速收敛速度,从而缩短训练周期。

(4)多任务训练

在预训练的时候也看到了(其实多任务fintune也有这个问题),各种各样的任务,输出不一样,我们需要设计一个多任务学习,一般来说是两种,串行和并行。

串行:就是先task1,再task2等等,但是这有一个问题,那就是会越来越遗忘前面的任务,偏向后面的任务。

并行:输出不一样难以并行。

为此可以想到的是,循环batch,比如第一个batch是task1, 第二个batch是task2,第三个batch是task3, 第四个batch回到task1 ......

这可以解决,但是又有一个问题就是我们必须提前预知道有哪些任务,假设去年我有三个任务,训练了一个模型,今年突然又想加一个任务,那难道我们要重新训练吗?百度ERNIE2.0给出了持续性学习的方案,那就是在去年的模型上面接着训练当前的task4,但是要取之前的3个task的batch也参与训练,这样才不能导致模型的偏爱,要公平嘛!

fine-tuning

在预训练后,就是将其迁移到自己领域,即finetuning, 当前在该方向的研究进展也是多种多样,关于这方面已经有部分文章总结的非常好了,笔者就不再重述,参考下面:

预训练语言模型fine-tuning近期进展概述

2021年如何科学的“微调”预训练模型?

这里值得说一下的是刚流行起来的一种新finetuning:

通过设计prefix/prompt(提示),让模型通过这个prefix来区分不同的任务,即转化为seq2seq

这个其实就是进一步匹配了MLM,最大限度的利用和pretrain一样的形式,值得研究个关注一下。

关于prefix/prompt(提示)可以看看

https://kexue.fm/archives/8295

更新

最新的paper

EMNLP 2021中预训练模型最新研究进展

总结

(1)学术方面:其实比较重要的就是预训练部分的那块,可以看得出,大家的基石都还是用的transformer模型,很少有团队去动这个东西,我们就是这个流派的,但是可以设计各种loss,给模型引入更多的知识,让其学习。也是容易出成果的一个方向,GLUE、CLUE等榜单更新很快,说明大家的模型还一直在优化。

(2)工程方面:蒸馏这一块涉及到落地,研究的也比较多,也比较有意义。

(3)发展前景:预训练模型还能走多远,还有多少方向和成果,笔者能力有限,不好预测,总之在下一个技术性突然风口到来之前,这一流派依然是百花齐放

笔者github:

https://github.com/Mryangkaitong

欢迎关注笔者微信公众号,定期更新一些trick和前言技术


​​​​​​​

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。