小米 AI 实验室 NLP 团队作者

BERT适应业务遇难题?这是小米NLP的实战探索

一项技术在落地应用时,总会遇见各种各样的难题。以 BERT 为例,在适应业务需求时,需要工程师们根据具体场景进行各种调整。本文介绍了小米 NLP 团队在应用 BERT 时的实战探索。


近年来,预训练模型在自然语言处理(Natural Language Processing, NLP)领域大放异彩,其中最重要的工作之一就是 Google 于 2018 年发布的 BERT 预训练模型 [1]。自被发布以来,BERT 预训练模型就在多项自然语言理解任务上取得了优异的效果,并开启了预训练-微调的 NLP 范式时代,启发了 NLP 领域后续一系列的预训练模型工作。与此同时,BERT 模型在 NLP 相关工业领域也得到了广泛应用,并取得了良好的效果。但由于工业领域相关业务的数据格式的复杂性,以及工业应用对推理性能的要求,BERT 模型往往不能简单直接地被应用于 NLP 业务之中,需要根据具体场景和数据对 BERT 模型加以调整和改造,以适应业务的现实需求。

小米 AI 实验室 NLP 团队自创建以来,就积极探索 NLP 前沿领域,致力于将先进的 NLP 技术应用于公司的核心业务中,支撑信息流、搜索推荐、语音交互等业务对 NLP 技术的需求。近期,我们对 BERT 预训练模型在各项业务中的应用进行了探索研究工作,使用各项深度学习技术利用和改造强大的 BERT 预训练模型,以适应业务的数据形态和性能需求,取得了良好的效果,并应用到了对话理解、语音交互、NLP 基础算法等多个领域。下面,我们将具体介绍 BERT 在小米 NLP 业务中的实战探索,主要分为三个部分:第一部分是 BERT 预训练模型简介,第二部分是 BERT 模型实战探索,第三部分是总结与思考。

BERT 预训练模型简介

BERT 预训练模型 [1] 的全称是基于 Transformer 的双向编码表示(Bidirectional Encoder Representations from Transformers, BERT),其主要思想是:采用 Transformer 网络 [2] 作为模型基本结构,在大规模无监督语料上通过掩蔽语言模型和下句预测两个预训练任务进行预训练(Pre-training),得到预训练 BERT 模型。再以预训练模型为基础,在下游相关 NLP 任务上进行模型微调(Fine-tuning)。BERT 预训练模型能够充分利用无监督预训练时学习到的语言先验知识,在微调时将其迁移到下游 NLP 任务上,在 11 项下游自然语言处理任务上取得了优异的效果,开启了自然语言处理的预训练新范式。

BERT 模型的模型结构主要由三部分构成:输入层、编码层和任务相关层。输入层包括词嵌入(token embedding)、位置嵌入(position embedding)段嵌入(segment embedding),并将三者相加得到每个词的输入表示。编码层直接使用了 Transformer 编码器 [2] 来编码输入序列的表示。BERT 模型的任务相关层则根据下游任务不同而有所不同,如对于文本分类任务,任务相关层通常为带 softmax 的线性分类器

BERT 模型采用了两个预训练任务:一是掩蔽语言模型(Masked Language Model, MLM),二是下句预测(Next Sentence Prediction, NSP)。通过这两个预训练任务,BERT 模型能够学习到先验的语言知识,并在后面迁移给下游任务。第一个预训练任务掩蔽语言模型(MLM)的原理是:随机选取输入序列中的一定比例(15%)的词,用掩蔽标记 [MASK] 替换,然后根据双向上下文的词预测这些被掩蔽的词。第二个预训练任务下句预测(NSP)任务的主要目标是:根据输入的两个句子 A 和 B,预测出句子 B 是否是句子 A 的下一个句子。

经过预训练的 BERT 模型可以用于下游的自然语言处理任务。在使用时,主要是在预训练 BERT 模型的基础上加入任务相关层,再在特定任务上进行微调(fine-tuning)。通常,我们取出 BERT 模型最后一层的向量表示,送入任务相关层中,就可以得到任务所要建模的目标概率。例如,在文本分类任务中,我们取出最后一层 [CLS] 标记对应的向量表示,再进行线性变换和 softmax 归一化就可以得到分类概率。在微调时,BERT 模型和任务相关层的所有参数都一起更新,最优化当前下游任务的损失函数

基于预训练-微调范式的 BERT 模型具有许多优点。通过在大规模无监督语料上的预训练,BERT 模型可以引入丰富的先验语义知识,为下游任务提供更好的初始化,减轻在下游任务上的过拟合,并降低下游任务对大规模数据的依赖。同时,BERT 模型使用的深层 Transformer 编码层具有很强的表征能力,因此下游任务不需要太复杂的任务相关层,这简化了下游任务的模型设计,为各项不同的自然语言处理任务提供一个统一的框架。

BERT 模型实战探索

在 BERT 模型的实际应用中,往往需要根据具体业务形态对 BERT 模型进行调整。原始的 BERT 模型只能对文本序列进行建模,缺乏对其他特征的建模能力;同时 BERT 模型的参数过多,推理速度较慢,不能满足业务上线性能需求;另外,BERT 模型需要针对每个细分任务都各自进行微调,缺乏通用性,也不能很好地利用任务之间的共享信息。在实践过程中,我们使用了特征融合、注意力机制集成学习知识蒸馏多任务学习等多种深度学习技术对 BERT 模型进行增强或改造,将 BERT 模型应用到了多项具体任务之中,取得了良好的业务效果。下面,我们主要介绍 BERT 模型在对话系统意图识别、语音交互 Query 判不停、小米 NLP 平台多粒度分词这三项业务中的实战探索。

对话系统意图识别

意图识别是任务型对话系统的重要组成部分,对于用户对话的自然语言理解起着非常重要的作用。给定一个用户 Query,意图识别模块能够将用户所要表达的意图识别出来,从而为后续的对话反馈提供重要的意图标签信息。但在意图识别的过程中,由于实体槽位知识稀疏性的问题,完全基于用户 Query 文本的意图识别模型很难进一步提升效果。在对 Query 文本进行建模时,如果能够融合槽位知识特征,模型的意图识别效果可能会得到进一步提升。因此,我们构建的意图识别模块的输入是用户 Query 文本和槽位标签,输出是意图类别,如下面的例子所示。
  • Query 文本/槽位标签:播 放 张/b-music_artist/b-mobileVideo_artist 杰/i-music_artist/i-mobileVideo_artist 的 歌

  • 意图类别:music


不同于一般的意图识别只有 Query 文本特征,我们的融合槽位特征的意图识别模型输入还包括槽位标签特征,而且每一个位置还可能包括不止一个槽位标签。在尝试将 BERT 模型应用于意图识别任务时,如何将槽位标签特征合适地与 BERT 模型结合起来就成为一个需要解决的重要问题。由于 BERT 预训练模型在预训练时并没有输入槽位信息,如果直接将槽位标签特征直接放入 BERT 模型的输入中,将会扰乱 BERT 预训练模型的输入,使得预训练模型过程失去意义。因此,我们需要考虑更合理的方式融合槽位标签特征。经过探索和实验,最终我们采取了槽位注意力和融合门控机制的方法来融合槽位特征,融合了槽位特征的意图识别模型结构如图 4 所示。

图 4 融合槽位特征的意图识别模型

首先,我们使用预训练 BERT 模型编码 Query 文本,得到融合了预训练先验知识的文本向量 Q。

接着,我们将槽位标签进行嵌入,得到槽位嵌入 ES。由于每个位置可能有多个槽位标签,我们需要对槽位嵌入进行池化操作,这里我们采用了槽位注意力机制对多个槽位嵌入进行加权求和。我们采用了缩放点积注意力(Scaled Dot-Product Attention)[2] 作为我们的槽位注意力机制,同时,在应用点积注意力机制之前,我们先对文本向量和槽位嵌入进行线性变换,将其映射到同一个维度的子空间。经过槽位注意力之后,多个槽位嵌入被加权平均为一个槽位向量 S。

然后,我们使用融合门控机制对文本向量 Q 和槽位向量 S 进行融合,得到融合后的向量 F。这里的融合门控机制类似长短期记忆网络(Long Short-Term Memory, LSTM)中的门控机制。

融合后的向量 F 表示每个位置的文本信息和槽位信息,但是由于融合门控机制是在每个位置上进行的,因此,单个位置上的融合向量缺乏其他位置的槽位上下文信息。为了对上下文信息进行编码,我们又使用了一个带残差连接和层归一化的多头注意力机制(Multi-Head Attention)[2] 编码融合向量 F,得到最终的输出向量 O。

最后,我们取出第一个位置([CLS] 标记对应位置)的输出向量,拼接上文本长度特征,送入带 softmax 的线性分类器中,得到每个意图类别上的概率,进而预测出 Query 对应的意图类别标签。

在业务数据上的微调实验表明,融合了槽位特征的 BERT 意图识别模型比只使用文本信息的 BERT 模型能够实现更好的效果。

语音交互 Query 判不停

用户在语音输入过程中会有停顿、语句不完整的现象,经过 ASR 识别后,得到的 query 文本存在不完整的情况,会影响到后续的意图识别和槽位提取。因此在送入中台之前,需要经过判不停模块识别,对于不完整 query 返回给 ASR 继续接收输入,完整 query 才进入中台。我们提出的语音交互 query 判不停模块,就是用于判断用户 query 是否完整的重要模块。判不停模块输入用户 query 文本,输出一个判不停标签,表明该 query 是否完整,其中'incomplete'表示 query 不完整,'normal'表示 query 完整,如下例所示。

  • Query 文本:播放张杰的

  • 判不停标签:incomplete


判不停模型的主要难点在于线上用户 query 请求量大,对模型推理速度有比较严格的限制,因此普通的 BERT 模型无法满足判不停业务的线上性能需求。但是,能够满足性能需求的小模型由于结构过于简单,模型的准确度往往不如 BERT 模型。因此,我们经过思考,采取了「集成学习+知识蒸馏」的判不停系统框架,先通过集成学习,集成 BERT 等业务效果好的模型,实现较高的准确度。再使用知识蒸馏的方法,将集成模型的知识迁移给 Albert Tiny 小模型 [3],从而在保证推理速度的基础上,大幅提升模型效果。「集成学习+知识蒸馏」的判不停框架如图 5 所示。

图 5 集成学习+知识蒸馏判不停框架

判不停框架的第一步是集成学习。目的是通过融合多个模型,减缓过拟合的问题,提升集成模型的效果。首先,我们在判不停业务数据集上训练 BERT 模型等多个效果好的大模型,这些效果好的大模型称之为教师模型。接着,对于每个教师模型,我们都使用它预测出每条数据对应的 logits,logits 本质上是 softmax 之前的 2 维向量,代表了教师模型在数据上的知识。最后,对于每条数据,我们对多个教师模型预测的 logits 进行集成,得到的集成 logits 就对应了一个集多个教师模型优点于一身的集成模型,这样的集成模型具有比单个 BERT 教师模型更好的效果。

判不停框架的第二步是知识蒸馏。由于推理性能限制,集成模型无法直接应用于线上判不停业务。因此我们使用知识蒸馏 [4] 的方法,把集成模型的知识迁移给能满足线上性能需求的小模型 Albert Tiny 模型,这样的小模型也被称为学生模型。蒸馏学生模型时,我们同时使用集成 logits 和真实标签训练学生模型,使得学生模型能够学到集成模型的知识,进一步提升学生模型的效果。具体来说,对于第 i 条训练数据,我们先使用 Albert Tiny 模型预测出该条数据对应的学生 logits,记为 z。另外,该条数据对应的集成模型 logits 记为 t,对应的真实标签记为 y。我们使用真实标签 y 和学生 logits z 得到通常的交叉熵损失函数,同时,我们使用集成 logits t 和学生 logits z 得到带温度平滑的蒸馏交叉熵损失函数,最终的损失函数是两种损失函数的加权求和。

 
最终,经过「集成学习+知识蒸馏」的判不停框架得到的 Albert Tiny 小模型能够达到 BERT 单模型的效果,同时也能很好地满足线上的推理性能需求。

小米 NLP 平台多粒度分词

中文分词已经成为了众多 NLP 任务的基础需求,为下游任务提供基础分词服务。小米 NLP 平台(MiNLP 平台)也开发了中文分词功能,为公司内其他 NLP 相关业务提供中文分词服务支撑。在实践中我们发现,不同业务对中文分词的粒度需求有所差异,短文本相关业务往往需要粒度较细的分词服务,而长文本相关业务则希望分词的粒度能够更粗一些。针对不同业务对不同粒度分词的需求,我们开发了多粒度分词算法,能够支持粗/细两种粒度的中文分词服务。多粒度分词的示例如下:

  • 文本:这是一家移动互联网公司

  • 粗粒度分词:这/是/一家/移动互联网/公司

  • 细粒度分词:这/是/一/家/移动/互联网/公司


我们在开发基于 BERT 模型的多粒度分词算法时,发现如果分别在每个粒度分词的数据集上进行微调,则需要训练并部署多个不同粒度的 BERT 分词模型,总的模型资源消耗量与粒度的数量成线性相关。同时,不同粒度的分词结果虽然有一些差异,但依然有着很大的共性,各自训练不同粒度的 BERT 分词模型不能充分利用这些共性知识来提升分词效果。为了充分利用不同粒度分词的共性信息,并减少训练和部署成本,我们基于多任务学习的思路,提出了一种「基于 BERT 的统一多粒度分词模型"[5],用一个统一的 BERT 模型训练了支持多个粒度的中文分词器。
 

图 6 基于 BERT 的统一多粒度分词模型

我们提出的统一多粒度分词模型如图 6 所示,其主要思想是:先在输入文本中加入一个特殊的粒度标记表示粒度信息,如 [fine] 表示细粒度,[coarse] 表示粗粒度。然后把加入了粒度标记的文本字符送入 BERT 模型中,再经过一个带 softmax 的线性分类器,把每个位置的表示映射为 BMES 四个分词标签上的概率。四个分词标签的含义分别是:B-词的开始,M-词的中间,E-词的结束,S-单独成词。如上面的文本得到的细粒度分词标签序列就是:

  • 细粒度分词标签:这/S 是/S 一/S 家/S 移/B 动/E 互/B 联/M 网/E 公/B 司/E


最后对整个文本序列的分词标签进行解码就得到了最终的分词结果。

我们提出的统一多粒度分词模型,不仅在公司内部的多粒度分词数据上取得了更好的效果,同时也在公开多标准分词数据集上取得了 SOTA(State-of-the-Art)的性能,实验结果可以参见参考文献 [5]。

总结与思考

小米 AI 实验室 NLP 团队通过 BERT 模型在具体业务中的实战探索,使用特征融合、集成学习知识蒸馏多任务学习深度学习技术,改造和增强了 BERT 预训练模型,并在对话系统意图识别、语音交互 Query 判不停、小米 NLP 平台多粒度分词等多个任务上取得了良好的效果。

同时,我们对如何进一步应用 BERT 模型提出一些简单的想法,留待于未来的探索和研究。首先,如何将非文本特征尤其是外部知识特征更有效地融入 BERT 模型之中,是一个值得深入研究的问题。另外,有些具体业务对线上推理性能有着严格的要求,这种场景下 BERT 模型往往不能直接进行应用,我们需要进一步探究大模型到小模型的知识迁移或模型压缩,在保证推理性能的基础之上提升模型效果。最后,公司内部的各项业务往往各自为战,在使用 BERT 模型时存在一些重复工作,并且不能很好地利用多个任务的共性信息,在多任务学习的基础上,打造一个各业务充分共享的 BERT 模型平台,服务并助益多项业务需求,是我们下一步需要努力的方向。

参考文献
[1] Devlin. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. NAACL. 2019.
[2] Vaswani. Attention is all you need. NIPS. 2017.
[3] Lan. ALBERT: A Lite BERT for Self-supervised Learning of Language Representations. ICLR. 2020.
[4] Hinton. Distilling the Knowledge in a Neural Network. NIPS. 2014.
[5] Ke. Unified Multi-Criteria Chinese Word Segmentation with BERT. 2020.

工程预训练模型NLP小米BERT
1
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

线性分类器技术

机器学习通过使用对象的特征来识别它所属的类(或组)来进行统计分类。线性分类器通过基于特征的线性组合的值进行分类决策。 对象的特征也称为特征值,通常在称为特征向量的向量中呈现给机器。

池化技术

池化(Pooling)是卷积神经网络中的一个重要的概念,它实际上是一种形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。直觉上,这种机制能够有效的原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。通常来说,CNN的卷积层之间都会周期性地插入池化层。

交叉熵技术

交叉熵(Cross Entropy)是Loss函数的一种(也称为损失函数或代价函数),用于描述模型预测值与真实值的差距大小

集成学习技术

集成学习是指使用多种兼容的学习算法/模型来执行单个任务的技术,目的是为了得到更佳的预测表现。集成学习的主要方法可归类为三大类: 堆叠(Stacking)、提升(Boosting) 和 装袋(Bagging/bootstrapaggregating)。其中最流行的方法包括随机森林、梯度提升、AdaBoost、梯度提升决策树(GBDT)和XGBoost。

词嵌入技术

词嵌入是自然语言处理(NLP)中语言模型与表征学习技术的统称。概念上而言,它是指把一个维数为所有词的数量的高维空间嵌入到一个维数低得多的连续向量空间中,每个单词或词组被映射为实数域上的向量。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

文本分类技术

该技术可被用于理解、组织和分类结构化或非结构化文本文档。文本挖掘所使用的模型有词袋(BOW)模型、语言模型(ngram)和主题模型。隐马尔可夫模型通常用于词性标注(POS)。其涵盖的主要任务有句法分析、情绪分析和垃圾信息检测。

损失函数技术

在数学优化,统计学,计量经济学,决策理论,机器学习和计算神经科学等领域,损失函数或成本函数是将一或多个变量的一个事件或值映射为可以直观地表示某种与之相关“成本”的实数的函数。

注意力机制技术

我们可以粗略地把神经注意机制类比成一个可以专注于输入内容的某一子集(或特征)的神经网络. 注意力机制最早是由 DeepMind 为图像分类提出的,这让「神经网络在执行预测任务时可以更多关注输入中的相关部分,更少关注不相关的部分」。当解码器生成一个用于构成目标句子的词时,源句子中仅有少部分是相关的;因此,可以应用一个基于内容的注意力机制来根据源句子动态地生成一个(加权的)语境向量(context vector), 然后网络会根据这个语境向量而不是某个固定长度的向量来预测词。

映射技术

映射指的是具有某种特殊结构的函数,或泛指类函数思想的范畴论中的态射。 逻辑和图论中也有一些不太常规的用法。其数学定义为:两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,y称为元素x在映射f下的象,记作:y=f(x)。x称为y关于映射f的原象*。*集合A中所有元素的象的集合称为映射f的值域,记作f(A)。同样的,在机器学习中,映射就是输入与输出之间的对应关系。

先验知识技术

先验(apriori ;也译作 先天)在拉丁文中指“来自先前的东西”,或稍稍引申指“在经验之前”。近代西方传统中,认为先验指无需经验或先于经验获得的知识。先验知识不依赖于经验,比如,数学式子2+2=4;恒真命题“所有的单身汉一定没有结婚”;以及来自纯粹理性的推断“本体论证明”

过拟合技术

过拟合是指为了得到一致假设而使假设变得过度严格。避免过拟合是分类器设计中的一个核心任务。通常采用增大数据量和测试样本集的方法对分类器性能进行评价。

对话系统技术

对话系统大致被分成两类: 任务为导向的对话系统,帮助用户去完成特定任务,比如找商品,订住宿,订餐厅等。实现任务为导向的对话系统,主要有两类方式,流水线方法和端到端方法。非任务导向的对话系统,与用户进行互动并提供回答,简单的说,就是在开放领域的闲聊。实现非任务导向对话系统也主要可分为两类,生成方法和基于检索的方法。

自然语言处理技术

自然语言处理(英语:natural language processing,缩写作 NLP)是人工智能和语言学领域的分支学科。此领域探讨如何处理及运用自然语言;自然语言认知则是指让电脑“懂”人类的语言。自然语言生成系统把计算机数据转化为自然语言。自然语言理解系统把自然语言转化为计算机程序更易于处理的形式。

知识蒸馏技术

Hinton 的工作引入了知识蒸馏压缩框架,即通过遵循“学生-教师”的范式减少深度网络的训练量,这种“学生-教师”的范式,即通过软化“教师”的输出而惩罚“学生”。为了完成这一点,学生学要训练以预测教师的输出,即真实的分类标签。这种方法十分简单,但它同样在各种图像分类任务中表现出较好的结果。

多任务学习技术

长短期记忆网络技术

长短期记忆(Long Short-Term Memory) 是具有长期记忆能力的一种时间递归神经网络(Recurrent Neural Network)。 其网络结构含有一个或多个具有可遗忘和记忆功能的单元组成。它在1997年被提出用于解决传统RNN(Recurrent Neural Network) 的随时间反向传播中权重消失的问题(vanishing gradient problem over backpropagation-through-time),重要组成部分包括Forget Gate, Input Gate, 和 Output Gate, 分别负责决定当前输入是否被采纳,是否被长期记忆以及决定在记忆中的输入是否在当前被输出。Gated Recurrent Unit 是 LSTM 众多版本中典型的一个。因为它具有记忆性的功能,LSTM经常被用在具有时间序列特性的数据和场景中。

层归一化技术

深度神经网络的训练是具有高度的计算复杂性的。减少训练的时间成本的一种方法是对神经元的输入进行规范化处理进而加快网络的收敛速度。层规范化是在训练时和测试时对数据同时进行处理,通过对输入同一层的数据进行汇总,计算平均值和方差,来对每一层的输入数据做规范化处理。层规范化是基于批规范化进行优化得到的。相比较而言,批规范化是对一个神经元输入的数据以mini-batch为单位来进行汇总,计算平均值和方法,再用这个数据对每个训练样例的输入进行规整。层规范化在面对RNN等问题的时候效果更加优越,也不会受到mini-batch选值的影响。

语言模型技术

语言模型经常使用在许多自然语言处理方面的应用,如语音识别,机器翻译,词性标注,句法分析和资讯检索。由于字词与句子都是任意组合的长度,因此在训练过的语言模型中会出现未曾出现的字串(资料稀疏的问题),也使得在语料库中估算字串的机率变得很困难,这也是要使用近似的平滑n元语法(N-gram)模型之原因。

小米机构

小米公司正式成立于2010年4月,是一家专注于智能手机自主研发的移动互联网公司,定位于高性能发烧手机。小米手机、MIUI、米聊是小米公司旗下三大核心业务。“为发烧而生”是小米的产品理念。小米公司首创了用互联网模式开发手机操作系统、发烧友参与开发改进的模式。2018年7月,工业和信息化部向与中国联合网络通信集团有限公司首批签约的15家企业发放了经营许可证,批准其经营移动通信转售业务,其中包括:小米科技有限责任公司。 2018年7月9日,正式登陆香港交易所主板 。

https://www.mi.com/
意图识别技术

意图识别指理解说话人的意图 。

推荐文章
暂无评论
暂无评论~