滴滴语音交互自然语言理解探索与实践

2020 年 12 月 03 日

滴滴语音交互自然语言理解探索与实践

1. 模块介绍


语音交互在滴滴有非常丰富的应用场景,因为它可以解放双手,让人们在出行过程中更方便,更安全,实现我们美好出行的愿景。目前语音交互已经应用在滴滴司机端,四轮车,外呼等多个业务中。


滴滴语音交互的整体算法框架如下:



图 1 语音交互整体流程


下面着重介绍下交互引擎和纠错引擎中用到的一些算法和算法使用中的一些思考。


2. ASR 纠错


2.1 概述


2.1.1 背景介绍


语音识别结果的纠错是语音理解过程中的一项重要工作。由于受限于语音识别的准确性,语音识别的结果常常会出现错误,这将对语音理解的后续工作造成障碍,增加了语音理解的难度。语音识别结果的纠错可以对一些识别的错误结果进行纠正,从而提高语义理解及后续对话链路的成功率。


2.1.2 研究现状


在 ASR 纠错任务上,目前学术界主要使用的是端到端模型,输入是原始文本,输出是纠错后的文本。ACL2020 的一篇论文[1],通过联合训练基于 BiGRU 的错误检测网络和基于 soft-masked BERT 的错误修正网络,预测输入序列每个位置对应的纠正词。另一篇 ACL2020 的论文[2], 用 GCN 网络增加了混淆集信息,每个字不仅是它自己融合上下文特征后的 embedding,在 embedding 里也加入了音近、形近字的信息。从上面两篇较新的端到端纠错论文中都有几个共同点,仅使用无任何添加的 bert 基线模型效果相比其他模型都能独占鳌头,另外再在扩展特定任务上增强数据,性能又能提升一些。但端到端纠错方法同时也存在的问题如下:


  1. 模型都需要大量高质量的训练数据保障模型效果;

  2. 无法直接更新纠错词库,需要重新训练模型或增加额外模块。


在 ASR 纠错任务上由于需要的训练数据不够多样,另外在实际项目中的纠错功能需要及时的更新易错词汇, 在工业应用上大多使用的是传统的纠错框架,主要分为错误检测、候选召回、纠错排序等。多个子模型针对性优化,可以快速高效地在多个项目中落地。友商的纠错系统,有的是基于通用领域的纠错,有的是针对文法、拼写错误场景的纠错,有的是面向任务型对话垂直领域的纠错,而我们的是在特定语音对话场景下基于发音混淆的语音识别纠错。


2.1.3 待解决问题


在确定好在实际项目中使用传统的纠错方式后,我们系统地分析了这套纠错系统存在的难点和痛点:


  1. 如何高效地检测错误位置和错误纠正?

  2. 在实际项目中如何实现可复用?

  3. 如何实现纠错效果的持续性优化?


针对以上等问题,我们希望能够搭建一个高效、可复用、可持续优化的纠错系统。


2.2 技术方案


2.2.1 基础方案


我们采用分阶段的纠错架构,来解决任务型语音交互中的识别错误问题。纠错系统主要有三个模块组成,分别是错误检测、候选召回和候选排序。纠错系统的最终输出,可以用于后续链路的解析处理。



图 2 纠错整体框架


2.2.2 错误检测


根据语音识别的评价指标,语音识别项目中的错误分为 3 种类型,分别是替换错误、删除错误和插入错误,其中替换错误占 70~80%左右。这里的错误检测主要针对的是发音相同或相似的替换错误。使用的方法是利用识别的混淆集和关键词构建 AC 自动机,将待纠句子的音节序列来寻找适配的热词。



图 3 纠错技术方案


混淆集的构建: 基于识别结果和标注文本进行对齐得到混淆字对,对应的不同音节则视为发音混淆集。当然由于识别结果中删除错误和插入错误的存在,获取的混淆集并非可能性都一致。此处不同发音混淆集的概率由出现的频次来决定,概率和门限值均是经验值。



AC 自动机构建错误检测网络: 以关键词表的音节作为模式串,如 yu shi ju jin, yu ren wei shan, ju jing hui shen, shan gu 作为模式串,以音节为单位,在初步的图网络上再创建 fail 指针。



图 4 音节图网络



图 5 创建 FAIL 指针



图 6 AC 自动机错误检测网络


2.2.3 候选召回


在上面的 AC 自动机错误检测网络中,利用待纠句子的音节序列在网络中进行匹配,匹配到的叶子节点上的 word 即为召回的候选词。另外增加了基于 ngram 拼音的回退召回,增加对少数的同音删除错误的召回概率,多个索引词最大长度优先。具体过程如下,建立索引时使用各阶拼音 n-gram 作为键值:


  1. 召回时优先查询高阶键值;

  2. 无法满足数量阈值时回退到低阶键值查询,保证召回数量。



表 1 拼音 ngram 候选



表 2 badcase 上性能结果


2.2.4 候选排序


RNNLM 转换成 WFST 后,compose 到包含错误候选的句子主题上,对 FST 的候选排序进行打分,维特比解码后最终输出 1best 的结果。当然对于 ngram 语言模型也适用,在相同的合适语料上,RNNLM 的效果相对较好,ngram 模型的优点在于简单高效。在智能客服项目上,此种方式纠错后字准提升 2% (90.17%-92.16%)。



图 7 结果示例



图 8 打分路径示例


2.3 应用


纠错系统已经在多个业务上落地,均取得了相对不错的效果。


滴滴司机语音助手可以通过语音交互的方式实现接单、查询天气、规划路线等能力,帮助司机解放双手。在司机语音助手项目中,目前支持的设置温度、查询天气等意图中的实体部分容易识别错,我们支持了这些实体词的纠错能力,在语音识别字准优化上,提升了绝对 1%的字准确率,交互成功率平均提升 7.24%。


2.4 未来展望


ASR 纠错在语音对话场景中的重要性不言而喻,虽然上面的纠错系统在实际项目中取得一定收益,但我们的纠错系统还有有待优化的空间,如:


  1. 结合更多类型的识别结果(如lattice等)来进行检错和纠错;

  2. 引入更多的信息对错误候选进行排序,可以是声音信息、用户的个性化特征或项目的特定状态信息等;

  3. 结合端到端方法来改善纠错性能,BERT预训练方法或者是利用seq2seq模型以机器翻译的方式来纠错;


3. 意图分类


3.1 概述


在此说的意图分类是广义上的意图分类,目前主要有两种做法,这两种做法都有其相应的优点和缺点。


(1) 使用端到端的分类模型,像 FastText[3], TextCNN[4], Bert-Classifier[5]等直接输出类别 label 和其对应的置信度,此方法多用于任务型意图理解。


  • 优点


  1. 直接模型端到端输出结果,不需要中间环节,infer速度相对较快;

  2. 方差小,模型的拟合和泛化能力相对较强;

  3. 可以使用联合模型和NER任务一起完成。


  • 缺点


  1. 需要比较多的数据训练才会有较好的效果;

  2. 如果要删减数据或者意图需要重新训练模型,实时性差。


(2) 使用检索的方法去识别意图,通过计算 query 与候选 doc 的相似度做召回,排序,最后得到相应的意图,此方法多用于问答型意图理解。在此用到的算法有 BM25, DSSM[6], Siamese-LSTM[7], Sentence-BERT[8]等。


  • 优点


  1. 在数据更新时可以做到即时生效;

  2. 在召回和排序的模型选择上比较灵活,可以适应各种场景;

  3. 对数据数量的要求较低。


  • 缺点:


  1. 如果候选doc的数量过多,infer速度会变慢;

  2. 对数据质量有较高的要求。


3.2 技术方案


分类算法作为 nlp 领域中最常见的任务之一,在很多情况下我们都会用到,但是在选择算法模型的时候不能只考虑模型的准召,还需要考虑模型的训练速度,推理速度,是否可以支持数据的热更新等因素,然后根据当前业务的实际情况去选择模型。滴滴目前语音交互的业务场景较多,每个业务我们会根据其业务场景选择相应的算法。


3.2.1 文本分类算法


在比较稳定的任务型场景中我们是使用的端到端文本分类模型。


在粗粒度的领域分类中,我们使用了 TextCNN 的方法,TextCNN 可以在效率和精度之间达到一个比较好的平衡,我们在其中对 TextCNN 模型做了一些优化:


  1. 把entity整体作为一个token输入,增强模型对于特定领域的识别性能;

  2. 因为是通过ASR模型取得的query,可能会有个别字识别错误,所以加入拼音的embedding,提高模型对ASR数据识别的准确率;

  3. 同时使用预训练好字向量和随机初始化的字向量,解决OOV问题,增强模型的泛化能力;

  4. 使用k-max-pooling代替max-pooling,可以获取更多的局部信息。



图 9 TEXTCNN 网络


在细粒度的意图分类中,我们使用了 bert-classifier 模型,我们用来 fine-tune 的 bert base 版本做了相应领域的 adaptation 训练(word mask+ sentence prediction),因为用来做 adaptation 的领域数据噪声较大,所以在训练的时候固定前 9 层取得最好的效果。



图 10 BERT-CLA 网络


3.2.2 文本匹配算法


在外呼和问答场景下我们采用的是检索式意图分类方案,其主要分为两步,召回和排序。


从特征提取的方法来说相似度计算方法分为基于表征信息统计的相似度计算和基于深度语义向量表示的相似度计算。


基于表征信息统计的相似度计算主要是根据 query 和 doc 的字面匹配度来计算其相关性,如编辑距离、TFIDF、BM25 等,这是我们的召回策略之一。这种方案有他的优点,比如计算量小,速度快。也有他的局限性:(1)缺少语义的理解能力,无法处理同义词的匹配,比如“建议”和“意见”就无法匹配。(2)忽略了字词之间相对顺序对语义的影响。


基于深度语义向量表示的相似度计算又分为基于表示的匹配方法(Representation-based)和基于交互的匹配方法(Interaction-based):


  1. 基于表示的匹配方法最大的优势在于doc的语义表示向量可以离线计算,在做相似度排序的时候只需要重新计算query的语义表示向量,然后可以直接进行排序;它的缺点是在进行相似度计算的时候query和doc两者没有细粒度的交互,所以会有精确度的损失。这种方法我们主要用来做召回策略。

  2. 基于交互的匹配方法优势在于query和doc在模型训练时能够进行充分的交互匹配,语义匹配效果好;缺点是query和每个doc的相似度都要做实时计算来得到他们的相似度,需要消耗大量的计算时间。这种方法只适用于召回之后的精排策略中。


在我们召回策略中的 Representation-based 方法中又分为有监督和无监督两种方法,无监督的方法是直接通过预训练好的词向量做 pooling 或者是预训练好的语言模型直接输出来得到句向量表示,这种方法的无需额外的数据进行 fine-tune 训练,成本较低,适用性较强。有监督的方法是将 query 和 doc 作为模型的输入,使用 siamese 性质的网络结构,把他们的相似度打分作为输出来训练一个模型,然后将末端某一层特征向量作为句向量表示。


下面来介绍一下我们在深度语义向量表示的实践中用到的方法。


对于 Representation-based 中的无监督方法,我们是使用我们的 BERT Adaptation 模型,然后在他的输出结果上增加了一个 pooling 操作,从而生成一个固定大小的句子 embedding 向量可以作为这句话的语义表示。一共有三种 pooling 的方法,CLS,Mean,Max。


  1. CLS-pooling是直接把bert头部CLS位置的向量作为句向量;

  2. Mean-pooling是把某一层或者某几层的所有token输出向量的平均值作为句向量;

  3. Max-pooling是把某一层或者某几层的所有token输出向量的最大值作为句向量。


在我们的任务中,我们做了一些实验,发现对 BERT 第一层的 token 做 mean-pooling 得到的句向量表示效果最好。



可以看到 Mean-pooling 的效果远好于 CLS-pooling 和 Max-pooling,使用第一层的特征优于使用其他层的。


有监督的方法是使用的基于 Regression Objective Function 的 Siamese-BERT 网络。两个句向量 u 和 v 的相似度计算结构如下:



图 11 REGRESSION OBJECTIVE FUNCTION


此方法使用 MSE(mean squared error)作为损失函数。


在离线计算时将 doc 从 Sentence A 位置输入,得到 u 为此 doc 的句向量,然后缓存在索引中。当输入一个 query 时,只有计算 query 的句向量才用到在线计算,此方法需要很小的在线计算量,可以作为召回策略。


对于基于交互的匹配方法,我们是使用 Siamese-BERT 中的 Classification Objective Function,在这种方法中会将 u 和 v 拼接在一起组成一个新的向量去做分类,他们的相似度计算结构如下:



图 12 REGRESSION OBJECTIVE FUNCTION


在这个地方我们的实验结果和论文中一样,把 u,v 以及它们的差拼接在一起,然后乘以权重参数 Wt 最终得到的效果最好。此方法使用交叉熵作为损失函数。


使用这种方法必须是在线计算才能得到候选 doc 和 query 相似度,doc 从 Sentence A 输入,query 从 Sentence B 输入,输出结果直接得到它们的相似度。此种方法需要的在线计算量较大,只能作为精排的策略之一。


4. 命名实体识别


命名实体识别(NER)是一种序列标注任务,近些年 NER 主流模型的演变是从 CRF->RNN-CRF->BERT-CRF,顶会中 NER 任务相关的文章主要集中在 NER 多任务的联合模型中,单纯 NER 任务只是加入了一些 tricks 比如引入多种特征,但是这些相较主流模型提升不大,目前我们对于单 NER 任务主要采用 Bi-GRU-CRF[9]和 BERT-CRF[10]模型。


  • Bi-GRU-CRF 模型


Bi-GRU 即 Bi-directional GRU,也就是有两个 GRU cell,一个得到前向表征向量 l,一个得到反向表征向量 r,然后两层向量加一起得到最终向量。


如果不使用 CRF 的话,这里就可以直接接一层全连接层过 softmax 得到输出结果了;如果用 CRF 的话,CRF 层以 Bi-GRU 层的输出为输入,其可以通过学习数据集中不同 label 间的转移概率从而修正 Bi-GRU 层的输出,这时损失函数由预测结果的 softmax 和 CRF 中的转移概率共同决定,这样可以在条件随机场里面考虑预测结果之间的合理性(比如说 B-city 后面不可能跟着 I-music,更有可能是 I-city)。



图 13 BI-GRU-CRF


这里说一下用于表示序列标注结果的 BIO 标记法。序列标注里标记法有很多,主流的是 BIO 与 BIOES 这两种。B 就是标记某个实体词的开始,I 表示某个实体词的中间,E 表示某个实体词的结束,S 表示这个实体词仅包含当前这一个字。因为交互相关的业务中有很多实体变量,BIOES 方法会引入过多的 label 类型,所以我们使用的是 BIO 标记法。


  • BERT-CRF模型


在某些业务中我们使用的是 BERT-CRF 模型,BERT-CRF 的结构和 Bi-GRU-CRF 类似,只不过把 Bi-GRU 换成了 BERT,其实在实验中相比较单纯使用 BERT,增加了 CRF 后效果有所提高但区别不大,F1 值大概提升了 0.8%,这是因为 BERT 庞大的网络结构已经基本学习到了 CRF 结构中所包含的转移矩阵信息,如果条件不允许的话也可以直接使用 BERT 模型在最后一层输出实体 label。由于 BERT 语言模型的特性,相对于 Bi-GRU-CRF 模型,BERT-CRF 有它的优点和缺点。


优点


  1. 由于预训练语言模型已经在高维空间学习到了大量的语言信息,所以在做NER任务的fine-tune时需要少量的语料就可以得到很好的效果。

  2. 效果很好,F1值可以由84%提升到92%。


缺点


  1. 最大的缺点是慢,训练慢,infer慢,消耗的机器资源多。


5. 总结


nlp 算法在滴滴语音交互场景下有着非常广阔的应用场景,由于篇幅限制我们还有很多算法模块没办法和大家一一介绍,比如对话管理,分词,指代消解,数据增强,聚类算法等。


另外在这里介绍一下我们开发的 delta 平台项目(https://github.com/didi/delta),它是滴滴第一个开源的 AI 项目,它可以实现语音语义算法训练、测试、上线一体化,帮助我们快速完成算法的从实现到部署的整个 pipeline,提升生产效率。


参考文献


[1] Zhang, S., Huang, H., Liu, J., & Li, H. (2020). Spelling Error Correction with Soft-Masked BERT. arXiv preprint arXiv:2005.07421


[2] Cheng, X., Xu, W., Chen, K., Jiang, S., Wang, F., Wang, T., ... & Qi, Y. (2020). SpellGCN: Incorporating Phonological and Visual Similarities into Language Models for Chinese Spelling Check. arXiv preprint arXiv:2004.14166.


[3] Joulin, A., Grave, E., Bojanowski, P., & Mikolov, T. (2017). Bag of Tricks for Efficient Text Classification. ArXiv, abs/1607.01759.


[4] Y. Kim. Proceedings of the 2014 Conference on Empirical Methods in Natural Language Processing, EMNLP 2014, October 25-29, 2014, Doha, Qatar, A meeting of SIGDAT, a Special Interest Group of the ACL, page 1746--1751. (2014)


[5] Devlin, J., Chang, M.-W., Lee, K. & Toutanova, K. (2019). BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. In J. Burstein, C. Doran & T. Solorio (eds.), NAACL-HLT (1) (p./pp. 4171-4186), : Association for Computational Linguistics. ISBN: 978-1-950737-13-0


[6] Huang, P.-S., He, X., Gao, J., Deng, L., Acero, A. & Heck, L. P. (2013). Learning deep structured semantic models for web search using clickthrough data.. In Q. He, A. Iyengar, W. Nejdl, J. Pei & R. Rastogi (eds.), CIKM (p./pp. 2333-2338), : ACM. ISBN: 978-1-4503-2263-8


[7] Mueller, J. & Thyagarajan, A. (2016). Siamese Recurrent Architectures for Learning Sentence Similarity.. In D. Schuurmans & M. P. Wellman (eds.), AAAI (p./pp. 2786-2792),: AAAI Press.


[8] Reimers, N., & Gurevych, I. (2019). Sentence-bert: Sentence embeddings using siamese bert-networks. arXiv preprint arXiv:1908.10084.


[9] Jiao, Z., Sun, S., & Sun, K. (2018). Chinese Lexical Analysis with Deep Bi-GRU-CRF Network. ArXiv, abs/1807.01882.


[10] Yang, H. (2019). BERT Meets Chinese Word Segmentation. arXiv preprint arXiv:1909.09292.


作者介绍


Han


滴滴高级算法工程师


Cassiel


滴滴算法工程师


Emma


滴滴专家算法工程师


本文转载自公众号滴滴技术(ID:didi_tech)。


原文链接


滴滴语音交互自然语言理解探索与实践


2020 年 12 月 03 日 10:05774

评论

发布
暂无评论
发现更多内容

5年Java开发,面试4大厂(阿里、拼多多、字节、美团)后,我总结出大厂高频面试真题及解析

Java成神之路

Java 程序员 架构 面试 编程语言

大作业2

追风

架构师一期

圣诞狂欢,保险师APP赋能精细、个性化的运营服务

DT极客

Alibaba面试官:“这该死的程序员,知识竟如此渊博!”

Java架构之路

Java 程序员 架构 面试 编程语言

从根上理解高性能、高并发(二):深入操作系统,理解I/O与零拷贝技术

JackJiang

网络编程 高并发 高性能 即时通讯

智慧平安小区整体解决方案,智慧社区管控系统开发

13530558032

阿里云开源项目 OAM 负责人张磊入选「中国开源先锋 33 人」

阿里巴巴云原生

开源 开发者 云原生 k8s cncf

你真的会学习吗?从结构化思维说起

阿里巴巴云原生

云原生 技术人 自我思考 职场成长 成长笔记

阿里Java岗个人面经分享(技术三面+技术HR面):Java基础+Spring+JVM+并发编程+算法+缓存

Java成神之路

Java 程序员 架构 面试 编程语言

区块链食品溯源系统开发,农产品溯源小程序搭建

13530558032

CEG挖矿系统APP开发|CEG挖矿软件开发

开發I852946OIIO

系统开发

美团工作7年,精华全在这份学习笔记里了,已成功帮助多位朋友拿到5个大厂Offer

Java成神之路

Java 程序员 架构 面试 编程语言

ARTS打卡 第28周

引花眠

微服务 ARTS 打卡计划 springboot

阿里“云钉一体”加速整合 低代码开发平台“钉钉宜搭”发布

人称T客

智慧公安警务大数据分析研判云平台开发

13530558032

窝家恶补三月,字节跳动三面,终于喜提offer!分享面试感受

Java架构之路

Java 程序员 架构 面试 编程语言

利用文字技术帮助选购商品,慧眼“识”物的人都这样做……

华为云开发者社区

文字识别 智能 识别

3D 可视化突发公共卫生事件 ,防护效率高达90%

一只数据鲸鱼

疫情 物联网 数据可视化 数据监测 3D可视化

弹性训练AI模型,华为云黑科技解决开发算力缺陷

华为云开发者社区

学习 华为云

LeetCode题解:剑指 Offer 40. 最小的k个数,sort,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

浅谈如何做客户端性能测试

行者AI

性能测试

这份阿里P8级别内部疯传的“Linux私房菜”让你一次吃个饱

Java架构之路

Java 程序员 架构 面试 编程语言

字节面试坎坷之路,第一次二面凉了!捞起来之后一面就凉了;我太难了呀!

Java架构之路

Java 程序员 架构 面试 编程语言

道高一丈,且看CWE4.2的新特性

华为云开发者社区

技术 安全 漏洞

Dart基础——如何在Dart&Flutter中使用Stream

咸鱼杰克

flutter 大前端 dart

如何通过一个SDK轻松搞定人脸识别,拯救初入职场的程序猿

华为云开发者社区

人脸识别 智能 识别

漏洞扫描软件AWVS的介绍和使用

行者AI

安全 漏洞

SpringBoot系列(7)- 自动装配

引花眠

springboot

软件测试所需要掌握的技能

测试人生路

软件测试

Java程序员晋升之路:“Java高级核心知识全面解析”

Java架构之路

Java 程序员 架构 面试 编程语言

腾讯大牛亲自带你学:Java安全weblogic T3协议漏洞!

比伯

Java 编程 架构 面试 计算机

滴滴语音交互自然语言理解探索与实践-InfoQ