语音交互在滴滴有非常丰富的应用场景,因为它可以解放双手,让人们在出行过程中更方便,更安全,实现我们美好出行的愿景。目前语音交互已经应用在滴滴司机端,四轮车,外呼等多个业务中。
滴滴语音交互的整体算法框架如下:
图 1 语音交互整体流程
下面着重介绍下交互引擎和纠错引擎中用到的一些算法和算法使用中的一些思考。
语音识别结果的纠错是语音理解过程中的一项重要工作。由于受限于语音识别的准确性,语音识别的结果常常会出现错误,这将对语音理解的后续工作造成障碍,增加了语音理解的难度。语音识别结果的纠错可以对一些识别的错误结果进行纠正,从而提高语义理解及后续对话链路的成功率。
在 ASR 纠错任务上,目前学术界主要使用的是端到端模型,输入是原始文本,输出是纠错后的文本。ACL2020 的一篇论文[1],通过联合训练基于 BiGRU 的错误检测网络和基于 soft-masked BERT 的错误修正网络,预测输入序列每个位置对应的纠正词。另一篇 ACL2020 的论文[2], 用 GCN 网络增加了混淆集信息,每个字不仅是它自己融合上下文特征后的 embedding,在 embedding 里也加入了音近、形近字的信息。从上面两篇较新的端到端纠错论文中都有几个共同点,仅使用无任何添加的 bert 基线模型效果相比其他模型都能独占鳌头,另外再在扩展特定任务上增强数据,性能又能提升一些。但端到端纠错方法同时也存在的问题如下:
在 ASR 纠错任务上由于需要的训练数据不够多样,另外在实际项目中的纠错功能需要及时的更新易错词汇, 在工业应用上大多使用的是传统的纠错框架,主要分为错误检测、候选召回、纠错排序等。多个子模型针对性优化,可以快速高效地在多个项目中落地。友商的纠错系统,有的是基于通用领域的纠错,有的是针对文法、拼写错误场景的纠错,有的是面向任务型对话垂直领域的纠错,而我们的是在特定语音对话场景下基于发音混淆的语音识别纠错。
在确定好在实际项目中使用传统的纠错方式后,我们系统地分析了这套纠错系统存在的难点和痛点:
针对以上等问题,我们希望能够搭建一个高效、可复用、可持续优化的纠错系统。
我们采用分阶段的纠错架构,来解决任务型语音交互中的识别错误问题。纠错系统主要有三个模块组成,分别是错误检测、候选召回和候选排序。纠错系统的最终输出,可以用于后续链路的解析处理。
图 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 自动机错误检测网络
在上面的 AC 自动机错误检测网络中,利用待纠句子的音节序列在网络中进行匹配,匹配到的叶子节点上的 word 即为召回的候选词。另外增加了基于 ngram 拼音的回退召回,增加对少数的同音删除错误的召回概率,多个索引词最大长度优先。具体过程如下,建立索引时使用各阶拼音 n-gram 作为键值:
表 1 拼音 ngram 候选
表 2 badcase 上性能结果
RNNLM 转换成 WFST 后,compose 到包含错误候选的句子主题上,对 FST 的候选排序进行打分,维特比解码后最终输出 1best 的结果。当然对于 ngram 语言模型也适用,在相同的合适语料上,RNNLM 的效果相对较好,ngram 模型的优点在于简单高效。在智能客服项目上,此种方式纠错后字准提升 2% (90.17%-92.16%)。
图 7 结果示例
图 8 打分路径示例
纠错系统已经在多个业务上落地,均取得了相对不错的效果。
滴滴司机语音助手可以通过语音交互的方式实现接单、查询天气、规划路线等能力,帮助司机解放双手。在司机语音助手项目中,目前支持的设置温度、查询天气等意图中的实体部分容易识别错,我们支持了这些实体词的纠错能力,在语音识别字准优化上,提升了绝对 1%的字准确率,交互成功率平均提升 7.24%。
ASR 纠错在语音对话场景中的重要性不言而喻,虽然上面的纠错系统在实际项目中取得一定收益,但我们的纠错系统还有有待优化的空间,如:
在此说的意图分类是广义上的意图分类,目前主要有两种做法,这两种做法都有其相应的优点和缺点。
(1) 使用端到端的分类模型,像 FastText[3], TextCNN[4], Bert-Classifier[5]等直接输出类别 label 和其对应的置信度,此方法多用于任务型意图理解。
(2) 使用检索的方法去识别意图,通过计算 query 与候选 doc 的相似度做召回,排序,最后得到相应的意图,此方法多用于问答型意图理解。在此用到的算法有 BM25, DSSM[6], Siamese-LSTM[7], Sentence-BERT[8]等。
分类算法作为 nlp 领域中最常见的任务之一,在很多情况下我们都会用到,但是在选择算法模型的时候不能只考虑模型的准召,还需要考虑模型的训练速度,推理速度,是否可以支持数据的热更新等因素,然后根据当前业务的实际情况去选择模型。滴滴目前语音交互的业务场景较多,每个业务我们会根据其业务场景选择相应的算法。
在比较稳定的任务型场景中我们是使用的端到端文本分类模型。
在粗粒度的领域分类中,我们使用了 TextCNN 的方法,TextCNN 可以在效率和精度之间达到一个比较好的平衡,我们在其中对 TextCNN 模型做了一些优化:
图 9 TEXTCNN 网络
在细粒度的意图分类中,我们使用了 bert-classifier 模型,我们用来 fine-tune 的 bert base 版本做了相应领域的 adaptation 训练(word mask+ sentence prediction),因为用来做 adaptation 的领域数据噪声较大,所以在训练的时候固定前 9 层取得最好的效果。
图 10 BERT-CLA 网络
在外呼和问答场景下我们采用的是检索式意图分类方案,其主要分为两步,召回和排序。
从特征提取的方法来说相似度计算方法分为基于表征信息统计的相似度计算和基于深度语义向量表示的相似度计算。
基于表征信息统计的相似度计算主要是根据 query 和 doc 的字面匹配度来计算其相关性,如编辑距离、TFIDF、BM25 等,这是我们的召回策略之一。这种方案有他的优点,比如计算量小,速度快。也有他的局限性:(1)缺少语义的理解能力,无法处理同义词的匹配,比如“建议”和“意见”就无法匹配。(2)忽略了字词之间相对顺序对语义的影响。
基于深度语义向量表示的相似度计算又分为基于表示的匹配方法(Representation-based)和基于交互的匹配方法(Interaction-based):
在我们召回策略中的 Representation-based 方法中又分为有监督和无监督两种方法,无监督的方法是直接通过预训练好的词向量做 pooling 或者是预训练好的语言模型直接输出来得到句向量表示,这种方法的无需额外的数据进行 fine-tune 训练,成本较低,适用性较强。有监督的方法是将 query 和 doc 作为模型的输入,使用 siamese 性质的网络结构,把他们的相似度打分作为输出来训练一个模型,然后将末端某一层特征向量作为句向量表示。
下面来介绍一下我们在深度语义向量表示的实践中用到的方法。
对于 Representation-based 中的无监督方法,我们是使用我们的 BERT Adaptation 模型,然后在他的输出结果上增加了一个 pooling 操作,从而生成一个固定大小的句子 embedding 向量可以作为这句话的语义表示。一共有三种 pooling 的方法,CLS,Mean,Max。
在我们的任务中,我们做了一些实验,发现对 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 输入,输出结果直接得到它们的相似度。此种方法需要的在线计算量较大,只能作为精排的策略之一。
命名实体识别(NER)是一种序列标注任务,近些年 NER 主流模型的演变是从 CRF->RNN-CRF->BERT-CRF,顶会中 NER 任务相关的文章主要集中在 NER 多任务的联合模型中,单纯 NER 任务只是加入了一些 tricks 比如引入多种特征,但是这些相较主流模型提升不大,目前我们对于单 NER 任务主要采用 Bi-GRU-CRF[9]和 BERT-CRF[10]模型。
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 的结构和 Bi-GRU-CRF 类似,只不过把 Bi-GRU 换成了 BERT,其实在实验中相比较单纯使用 BERT,增加了 CRF 后效果有所提高但区别不大,F1 值大概提升了 0.8%,这是因为 BERT 庞大的网络结构已经基本学习到了 CRF 结构中所包含的转移矩阵信息,如果条件不允许的话也可以直接使用 BERT 模型在最后一层输出实体 label。由于 BERT 语言模型的特性,相对于 Bi-GRU-CRF 模型,BERT-CRF 有它的优点和缺点。
优点:
缺点:
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)。
原文链接:
领取专属 10元无门槛券
私享最新 技术干货