0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

小米在预训练模型的探索与优化

深度学习自然语言处理 来源:深度学习自然语言处理 作者:深度学习自然语言 2020-12-31 10:17 次阅读

导读:预训练模型在NLP大放异彩,并开启了预训练-微调的NLP范式时代。由于工业领域相关业务的复杂性,以及工业应用对推理性能的要求,大规模预训练模型往往不能简单直接地被应用于NLP业务中。本文将为大家带来小米在预训练模型的探索与优化。

01

预训练简介

87bfe21c-4a91-11eb-8b86-12bb97331649.png

预训练与词向量的方法一脉相承。词向量是从任务无关和大量的无监督语料中学习到词的分布式表达,即文档中词的向量化表达。在得到词向量之后,一般会输入到下游任务中,进行后续的计算,从而得到任务相关的模型。

但是,词向量的学习方法存在一个问题:不能对文档中的上下文进行建模,对于上面的例子“苹果”在两个句子中的表达意思是不一样的,而词向量的表达却是同一个,所以在表达能力的多样性上会有局限,这是一种静态的Word Embedding。

在后面的发展中,有了根据上下文建模的Word Embedding,比如,可以在学习上尝试使用双向LSTM模型,在非监督语料学习词向量,这比静态的词向量网络会复杂一些,最后可以通过隐层得到动态的词向量输入到下游任务中。

1. 序列建模方法

893daaa2-4a91-11eb-8b86-12bb97331649.png

在NLP中,一般使用序列建模的方法。之前比较常用的序列建模是LSTM递归神经网络,其问题是建模时,句子中两个远距离词之间的交互是间接的。

17年Transformer发布之后,在NLP任务中取得了很大的提升。这里面Self-Attention可以对任意词语间进行直接的交互,Multi-head Attention可以表达在不同类型的进行语义交互。

2. 预训练模型

8a1c167a-4a91-11eb-8b86-12bb97331649.png

在这之后,预训练模型开始流行起来。

首先是ELMO,依然使用的是双向LSTM,它将模型做的更深,并且在大规模的无监督语料中进行训练,使用的训练任务是语言模型。对于具体的任务,将从ELMO得到的词向量作为特征输入到下游任务中,ELMO这种的预训练属于Feature based Pretraining。

其次是GPT,它使用的是Transformer结构,训练任务是从左到右的语言模型,比较适合生成类的任务。

最后是BERT,依然使用的Transformer结构,训练任务换成了Mask Language Model,可以对词语的上下文进行建模。

3. BERT模型

8a6f92dc-4a91-11eb-8b86-12bb97331649.png

BERT是一种Pretrain和Finetune的训练方式,在Pretrain阶段使用海量的非监督语料训练出一个与任务无关的公共模型,在Finetune阶段可以使用少量的监督语料训练一个任务相关且效果更优的模型。

4. BERT效果

8ae1dc0c-4a91-11eb-8b86-12bb97331649.png

BERT可以灵活的适配下游任务,比如句对分类、文本分类、序列标注、QA等等。另一方面BERT的参数规模也是非常大的,BertBase有110M的参数,BertLarge有340M参数。

5. 预训练模型发展

8b1a0488-4a91-11eb-8b86-12bb97331649.png

在BERT之后,预训练模型的发展非常迅速,出现了很多新的预训练模型。这些模型的趋势是模型参数在不断的增大。

02

预训练落地挑战

我们以对话系统来介绍下预训练落地的一些挑战。对话系统的流程是将输入的语音通过ASR识别成文本Query,然后进行分词。由于语音的输入一般是连续的,所以需要进行语义的断句。接下来,进行意图分类将Query分类到天气/音乐/聊天……这些类别中,再根据Query来匹配到答案,其中匹配的方法可以是检索式也可以是生成式。

在整个对话系统中,预训练模型可以应用到很多任务中,遇到的挑战主要有以下几个方面:

挑战一:推理延时高、成本高

8b9c1b58-4a91-11eb-8b86-12bb97331649.png

第一个挑战是由于预训练模型的参数比较大,会引起推理的延时比较高以及单卡的吞吐比较低,所以推理延时高和成本高是一个通用的挑战。

挑战二:知识融入

8c2c8e18-4a91-11eb-8b86-12bb97331649.png

第二个挑战是一些任务除了使用原生的BERT模型之外,还需要融入一些外部的知识。比如意图分类的任务,Query中的歌手、歌曲名实体的融入可以帮助模型将Query更准确的分类到音乐类中。

挑战三:如何根据任务调整模型和训练

8cde37ee-4a91-11eb-8b86-12bb97331649.png

第三个挑战是我们发现一些任务需要在预训练模型的基础上进行调整——模型结构上或者训练方法上。比如分词任务,同样一句话我们可能同时需要粗粒度的分词或者细粒度的分词结果,对于原生BERT的序列标注任务需要一些适配。另外,像是对话生成类的任务,传统上使用Encoder和Decoder的模式,在原生BERT需要进行训练方法的改进。

03

预训练实践探索

1. 推理效率

前面我们已经提到,对于BERT的一个挑战是模型参数很大,针对这个问题我们很容易想到是不是可以对模型进行压缩,而知识蒸馏是一种常用的模型压缩方法。

①知识蒸馏

知识蒸馏是由一个大模型(teacher模型)通过蒸馏数据来生成一个小模型(student模型)。针对分类任务,蒸馏数据相对原始数据会变成soft label的形式,更利于小模型学习到模型中的知识。

8ec88d48-4a91-11eb-8b86-12bb97331649.png

前面说到预训练模型可以分为Pretrain阶段和Finetune阶段,对于知识蒸馏来说,也可以分别对Pretrain阶段和Finetune阶段进行蒸馏。其中,因为Pretrain阶段时间会很慢,蒸馏Pretrain也很慢,一般时间是周级别的。另一种方法是跳过Pretrain的阶段,使用小模型作为学生的初始模型,直接进行Finetune的蒸馏阶段。在实践中我们发现,这种方式可以得到一个效果不错的模型。好处是Finetune阶段比较快,天级别就可以完成一个蒸馏任务。

8f454a04-4a91-11eb-8b86-12bb97331649.png

我们发现多模型集成蒸馏对模型效果有一定的提升。多模型集成蒸馏是我们同时训练多个教师模型,每个教师模型会对数据生成一份蒸馏后的数据。比如分类任务,会生成多个logits这样概率的分布,然后通过教师集成为一个logits,最后用这个融合后的logits去优化最终的学生模型。

8fc5e600-4a91-11eb-8b86-12bb97331649.png

在蒸馏的效果上,以语义断句任务为例,我们做了三版的模型:

第一版使用单模型的BERT去蒸馏学生模型

第二版使用多模型进行蒸馏,这里面使用的集成策略也相对简单

第三版使用更多的教师模型且更复杂的集成策略来蒸馏学生模型

从效果上面看,准确率和召回率三版模型都有逐步的提升,尤其集成教师蒸馏的方法在召回率上的效果有了较大的提升。

②低精度推理

9156da2e-4a91-11eb-8b86-12bb97331649.png

我们都知道在模型训练时,参数一般都是以float32存储的。由于神经网络计算有一定的鲁棒性,使用float16半精度的表示也可以达到接近float32的效果。我们可以看到在GPU V100上,半精度算力可以达到单精度的两倍,在推理延时和吞吐上都具有优势。

91b4dd18-4a91-11eb-8b86-12bb97331649.png

具体的操作是将各个float32位的参数矩阵都转换成float16位的格式。在实际应用,如Query-Question相似度计算任务中,低精度推理的精度损失小于1%,而P99的延时从200ms降到了80ms,有一倍以上的推理速度降低。

③算子融合

92222030-4a91-11eb-8b86-12bb97331649.png

在推理速率上的提升,我们还尝试了另一种方法:算子融合。

它的初衷是,Transformer从结构上看每一层都有self-attention,add,layer-normalize,feed forward,sublayer等步骤。实际上,中间的每一步转化到具体的深度学习框架中都是非常长的算子步骤。比如像layer-normalize这一步需要tensorflow中6-7个甚至更多的算子计算序列来完成。这样在计算框架中OP粒度很小,而CPU在很多时间都是在等待OP的内存交换和调度,导致CPU大部分时间都是在空转,使得计算效率较低。

92ef632e-4a91-11eb-8b86-12bb97331649.png

算子融合的思路就是将这些相邻的算子尽可能融合成一个算子,这样就能让CPU最大限度的连续运行。上图就是将Transformer中的一个block进行了算子融合,将多个小的算子融合成大的算子。

94654df4-4a91-11eb-8b86-12bb97331649.png

我们可以看到通过加入算子融合,在低精度推理上,推理速度又降低了一倍。这样就可以将BERT这种大的模型推到线上落地。

2. 知识融合

①问题

94f52d52-4a91-11eb-8b86-12bb97331649.png

回顾一下之前的对话系统场景,在落地意图分类任务时,有一些类别包含领域相关的外部信息。比如音乐包含歌手名、歌曲名这样的信息,我们利用这些信息可以更容易地将query分到对应的类别上。

这样问题就可以抽象表达为如何将输入的原始序列和槽位的标签序列融合在一起用来做分类模型。一个简单的方法就是将标签序列也作为输入,输入到BERT中,但是BERT在训练中没有见到过这样的输入,这样分类的效果会差一些。

②方案

982723c2-4a91-11eb-8b86-12bb97331649.png

介绍下我们的知识融合方案:

首先引入槽位注意力机制,原始输入的Query会经过BERT计算输出一个隐层的表达,槽位的标签也会做一个嵌入的表达。考虑到同一个词语位置的地方会有多个槽位信息,我们对于这个多标签的情况可以做一个池化操作,融合为一个向量。之后做一个线性变换,将文本序列和标签序列映射到同一个空间,在同一个空间进行attention操作使两个序列进行交互,这样就可以得到原始特征和标签特征的融合特征表示。

9878a83c-4a91-11eb-8b86-12bb97331649.png

在这之后,我们加入了一个融合门控机制。一般提取出来的标签都会有一些噪声,我们通过外部知识获取的标签会有一些不准确的可能,所以我们需要确定有多少程度的标签信息可以加入到原始序列中。我们加入的是一个动态门控的机制,将文本特征和槽位特征进行一个动态的加权。在融合门控之后加入了一个多头注意力机制,它的作用是在融合之后的特征进行上下文交互来建模。

③效果对比

992bc96c-4a91-11eb-8b86-12bb97331649.png

综合上面这些方法的融合,在意图分类这个任务上对比单独使用BERT和融入槽位信息的BERT,融入了槽位信息之后准确率上会有一定量的提升。在上面的例子中,“想听说不出的秘密”和“我不想说出这个秘密”由于加入的外部知识能够很好的分类到相应的类别当中。

3. 任务适配

任务一:多粒度分词

①问题

998b8d02-4a91-11eb-8b86-12bb97331649.png

针对同一句话,我们会有粗细粒度不同的分词需求。比如:这是一家移动互联网公司,粗粒度:这/是/一家/移动互联网/公司,细粒度:这/是/一家/移动/互联网/公司,所以我们需要模型的调整来完成这样的需求。

分词任务可以看成是序列标注的任务,输入的是文本,输出是每个文字上各个标签的开始或者结束。一种简单的一种做法就是为粗/细粒度分别训练两版不同的模型,但是模型的维护成本和运行成本都比较高。

②方案

9a914d90-4a91-11eb-8b86-12bb97331649.png

我们的方法是构建一个统一的多粒度分词模型。它的思想是输入时将分词粒度的标签也加入到输入序列中,指导分词粒度的结果。比如上图中使用fine/coarse来分别代表细/粗粒度标签,模型的结果就根据这个标签来适配。

我们除了使用BERT模型网络外也加入了Bigram的向量特征进行融合,之后使用多头注意力机制对融合特征的上下文进行建模,最后进行MLP Decoder。除了分词本身的学习以外,分词类型也可以作为一个学习任务,两个任务共同训练这样一个网络。

③效果

9b7c6492-4a91-11eb-8b86-12bb97331649.png

如图中表格所示,我们使用的多粒度分词模型在很多任务上都有不错的效果。通过上面展示的示例可以看到,这种多粒度分词方法也是一种灵活的分词方式。

任务二:生成式对话

①问题

9c8b0474-4a91-11eb-8b86-12bb97331649.png

针对生成式对话这样的场景,一般输入一个Question,输出为一个Reply。通常我们会在互联网社区获取大量Q/R的数据作为训练语料来训练模型。传统来说,这是一个序列到序列的生成任务,跟翻译模型的训练过程比较相近。

传统的seq2seq模型使用Encoder和Decoder进行建模,问题是没有预训练的过程。

另一种方法是使用类似GPT的预训练方式,将Q和R在一起建模,中间使用[SEP]进行分割,局限是在学习的过程中只能看到文本左边的内容,而不能对整个文本上下文进行建模。

②方案

9d2787fe-4a91-11eb-8b86-12bb97331649.png

我们采用的是一种多任务的训练方法。先使用一个基础的预训练模型(BERT-Base)来初始化生成式模型的参数,接下来就对话任务进行多任务的训练,比如MLM、PLM、Mask Pos Predict等语言模型训练任务,最终在解码阶端可以采用通用的自回归方式生成。

③效果

9e0afdb8-4a91-11eb-8b86-12bb97331649.png

从实验对比来看,跟传统的seq2seq、GPT相比,加入多任务训练的方式在针对回复相关性上有很明显的提升。从上图右边示例中可以看到,随着语料数据不断的增大和模型多任务的学习,生成的回复有很好的连贯性和相关性。

04

总结与展望1. 总结

本文主要介绍了推理效率、知识融入和任务适配。

推理效率:在知识蒸馏方面使用多教师模型集成蒸馏是一种可以将模型压缩更小,保证模型效果的方法;而推理加速方面使用低精度推理和算子融合的方法可以帮助推理速度有几倍的提升。

知识融入:在对话系统意图识别任务中,通过在原始序列中加入槽位信息序列,使用attention的方法将两个特征序列融合成一个序列。

任务适配:多粒度分词任务是在输入上加入适配的标签来指导输出的一种自适应的改变。生成式对话采用联合多任务训练的方式能够集成预训练和序列到序列的生成模型。

2. 展望

轻量级模型

知识融入

预训练平台

原文标题:小米在预训练模型的探索与优化

文章出处:【微信公众号:深度学习自然语言处理】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模型
    +关注

    关注

    1

    文章

    2701

    浏览量

    47656
  • 小米
    +关注

    关注

    68

    文章

    14122

    浏览量

    141688
  • nlp
    nlp
    +关注

    关注

    1

    文章

    463

    浏览量

    21812

原文标题:小米在预训练模型的探索与优化

文章出处:【微信号:zenRRan,微信公众号:深度学习自然语言处理】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于NVIDIA Megatron Core的MOE LLM实现和训练优化

    本文将分享阿里云人工智能平台 PAI 团队与 NVIDIA Megatron-Core 团队在 MoE (Mixture of Experts) 大语言模型(LLM)实现与训练优化上的创新工作。
    的头像 发表于 03-22 09:50 145次阅读
    基于NVIDIA Megatron Core的MOE LLM实现和<b class='flag-5'>训练</b><b class='flag-5'>优化</b>

    【书籍评测活动NO.30】大规模语言模型:从理论到实践

    。国内的文心一言就属于这一类。 垂直大模型,聚焦解决垂直领域问题,是通用大模型的基础上训练行业专用模型,应用到金融、医疗、教育、养老、交通
    发表于 03-11 15:16

    谷歌模型训练软件有哪些?谷歌模型训练软件哪个好?

    谷歌在模型训练方面提供了一些强大的软件工具和平台。以下是几个常用的谷歌模型训练软件及其特点。
    的头像 发表于 03-01 16:24 253次阅读

    如何优化深度学习模型?

    因为大部分人使用的模型都是预训练模型,使用的权重都是在大型数据集上训练好的模型,当然不需要自己去初始化权重了。只有没有预
    发表于 01-29 14:25 183次阅读
    如何<b class='flag-5'>优化</b>深度学习<b class='flag-5'>模型</b>?

    在线研讨会 | 大模型时代语音 AI 模型训练优化与应用

    通过业界领先的技术,帮助企业能够快速部署定制化 AI 智能语音端到端流程。 2023 年 12 月 19 日和 21 日 晚间 ,来自 NVIDIA 和 Kaldi 项目的技术专家将做客 Datafun 社区直播间 ,为您介绍如何有针对性的在语音模型训练、推理、部署全流
    的头像 发表于 12-15 15:50 245次阅读
    在线研讨会 | 大<b class='flag-5'>模型</b>时代语音 AI <b class='flag-5'>模型</b>的<b class='flag-5'>训练</b>、<b class='flag-5'>优化</b>与应用

    NVIDIA Merlin 助力陌陌推荐业务实现高性能训练优化

    和 GPU 下,显著提高了陌陌大规模深度多目标精排模型训练性能。在不影响模型效果的前提下,模型整体吞吐提升了 5 倍以上 ,再结合通信和 IO 等进一步
    的头像 发表于 11-09 10:45 136次阅读
    NVIDIA Merlin 助力陌陌推荐业务实现高性能<b class='flag-5'>训练</b><b class='flag-5'>优化</b>

    【KV260视觉入门套件试用体验】Vitis AI 通过迁移学习训练自定义模型

    :这种方法是训练模型的基础上,修改最后一层或几层,并且对整个网络进行微调训练。这种方法适用于新数据集和原数据集相似度较高,且新数据集规模
    发表于 10-16 15:03

    训练大语言模型带来的硬件挑战

    生成式AI和大语言模型(LLM)正在以难以置信的方式吸引全世界的目光,本文简要介绍了大语言模型训练这些模型带来的硬件挑战,以及GPU和网络行业如何针对
    的头像 发表于 09-01 17:14 1090次阅读
    <b class='flag-5'>训练</b>大语言<b class='flag-5'>模型</b>带来的硬件挑战

    使用OpenVINO优化并部署训练好的YOLOv7模型

    在《英特尔锐炫 显卡+ oneAPI 和 OpenVINO 实现英特尔 视频 AI 计算盒训推一体-上篇》一文中,我们详细介绍基于英特尔 独立显卡搭建 YOLOv7 模型训练环境,并完成了 YOLOv7 模型
    的头像 发表于 08-25 11:08 912次阅读
    使用OpenVINO<b class='flag-5'>优化</b>并部署<b class='flag-5'>训练</b>好的YOLOv7<b class='flag-5'>模型</b>

    训练好的ai模型导入cubemx不成功怎么解决?

    训练好的ai模型导入cubemx不成功咋办,试了好几个模型压缩了也不行,ram占用过大,有无解决方案?
    发表于 08-04 09:16

    如何使用TensorFlow将神经网络模型部署到移动或嵌入式设备上

    使用TensorFlow的transform_graph工具生成一个优化的8位模型,该模型效率更高,但精度较低。 4.设备上对优化
    发表于 08-02 06:43

    DeepSpeed结合Megatron-LM训练GPT2模型笔记

    本文基于DeepSpeedExamples仓库中给出的Megatron相关例子探索一下训练GPT2模型的流程。主要包含3个部分,第一个部分是基于原始的Megatron如何训练GPT2
    的头像 发表于 06-19 14:45 1885次阅读
    DeepSpeed结合Megatron-LM<b class='flag-5'>训练</b>GPT2<b class='flag-5'>模型</b>笔记

    训练Pytorch模型使用OpenVINO™优化并部署在AI爱克斯开发板

    本文章将依次介绍如何将 Pytorch 自训练模型经过一系列变换变成 OpenVINO IR 模型形式,而后使用 OpenVINO Python API 对 IR 模型进行推理,并将推
    的头像 发表于 05-26 10:23 612次阅读
    自<b class='flag-5'>训练</b>Pytorch<b class='flag-5'>模型</b>使用OpenVINO™<b class='flag-5'>优化</b>并部署在AI爱克斯开发板

    NVIDIA AI 技术助力 vivo 文本预训练模型性能提升

    vivo AI 团队与 NVIDIA 团队合作,通过算子优化,提升 vivo 文本预训练模型训练速度。在实际应用中, 训练提速 60%
    的头像 发表于 05-26 07:15 442次阅读
    NVIDIA AI 技术助力 vivo 文本预<b class='flag-5'>训练</b>大<b class='flag-5'>模型</b>性能提升

    什么是预训练AI模型

    训练 AI 模型是为了完成特定任务而在大型数据集上训练的深度学习模型。这些模型既可以直接使用,也可以根据不同行业的应用需求进行自定义。
    的头像 发表于 05-25 17:10 629次阅读