基于BERT的ASR纠错

2020 年 7 月 20 日

基于BERT的ASR纠错

导读: 小爱同学是小米公司开发的智能语音系统,已广泛应用在手机、手环、音箱、电视等电子产品中,并支持闲聊、问答、语音控制等多种语音交互场景。语音系统中语音内容识别 ( ASR ) 的精准性,是影响智能语音产品发展的关键制约因素,用户 query 的文本,通常是由 ASR 系统将用户的语音命令转换而成,但由于技术上的原因,这些由 ASR 生成的文本可能包含错误,继而导致后续的用户意图理解出现偏差。如何利用 NLP 技术对 ASR 的 query 文本进行预处理纠错成了一个亟待解决的问题。


本次分享,将介绍小爱算法团队基于近年来流行的 BERT 预训练模型在这个问题上所进行的一些技术探索,以及在业务场景中的落地情况,主要内容包括:


  • ASR纠错问题介绍

  • 纠错相关工作

  • 我们的工作

  • 未来的方向


01 ASR 纠错问题的介绍


1. 语音交互流程



在分享语音纠错的相关问题之前,先简单介绍一下小爱同学语音使用流程:首先我们需要唤醒小爱同学,比如,手机按键或者语音唤醒,唤醒之后进入录音模块,启动录音前开启 Voice Activity Detection ( VAD ) 状态,检测当前有没说话声音,如果没有则忽略,如果有,会把语音记录下来传递到下一个模块,就是最受关注的 Automatic Speech Recognition ( ASR ),该模块负责把语音转译成文字。


我们负责的是 ASR 接下来的一个模块,文本理解模块 Natural Language Understanding ( NLU ),主要目的是试图理解 ASR 转换出的文本,准确识别用户的意图,然后给出相应技能执行的方案,最后一步就是技能执行了。


在这个语音交互流程中,前三步都涉及到语音相关的工作,很容易出现记录噪音或者识别错误等情况,例如误操作唤醒录入了噪音;或者语音记录过程中,把某种声音误以为是人的声音而记录下来,在识别时转译成了错误的文本。另外,即便是纯净的人说话的语音,ASR 模型转换过程仍然会出现一定的错误。


2. ASR 错误的例子



表格中展示的是 ASR 识别过程中常见错误例子。用户问"给我播放一首 生僻字",识别的文本结果为"给我播放一首 升壁纸",还有中文中夹带英文的情况,如:“eraser 什么意思”,识别的文本结果为"意味着 什么意思"。通过分析这些错误的 case 发现,语音识别过程对于发音因素类似的词,识别准确的难度比较大。而我们的工作目标是把 ASR 识别后的错误 query 找出来,替换成正确的 query。



此时我们需要思考,对于 ASR 识别纠错是否为良定义问题 ( well-posed )[1],良定义问题是说在当前给定信息的条件下能解决的问题,或者说使用贝叶斯分类器分类得到的准确率非常高。对于 ASR 的纠错问题,从 case 中可以看出,要纠正这些 query,有些根据句子的结构就可以纠正,比如,“你讲话好像被句子”,可以通过语法结构的分析知道"被"在此处是不合适的,应该是背诵的"背";而有些是需要知道一些背景知识,才能进行纠错,比如"生僻字"是一首歌,“右眼血斑"是常识,“布朗熊"是小爱同学业务的技能 ( 布朗熊跳个舞 ),甚至有些语法上没有错误,需要根据原始的音频才能纠正错误,如"播放第二个"与识别的文本结果"拨打第二个”,或者"eraser"识别为"意味着”;有些可能听音频也没有用,对于中文有很多的发音声调都相同的词,需要结合当时环境的上下文情景才能确定是哪一个词。所以纠错需要结合很多的信息,如果全部考虑知识、音频、上下文环境,基本相当于重新做一个 ASR 识别系统。但 ASR 本身处理语音过程受限于一些内存、吞吐流量等物理条件,声学模型和语言模型很难有很大的处理量,综合考虑 ASR 的语言模型还是基于传统的 n-gram 模型。但是使用 NLP 技术具有一些先天的优势,能够利用目前强大的预训练模型,并且不需要音频来进行纠错。


ASR 纠错与普通错别字纠错也是有区别的,普通错别字纠错是根据字形相似来纠错,如"阀"和"阈"。而 ASR 纠错是音似,发音相似导致难以识别正确的内容,所以 ASR 纠错和普通错别字纠错面临的问题和数据分布是不同的。另外普通错别字纠错覆盖的范围也比 ASR 纠错更广一点,但这并不意味着普通错别字纠错可以用来 ASR 纠错。“天下没有免费的午餐”,也就是说没有一个模型能够很好的应用在不同的数据分布上。比如文本"的"、“地”、“得"纠错,假如句子中其他词都是正确的,只有"的"需要纠正为"得”,但是使用一个没有结合先验信息的普通模型来纠错,很显然容易把句中其他位置原本正确的词纠正为错误的,从而影响模型的准确率。正确的做法是根据先验条件做出一个能适应当前数据分布的纠错模型。对于 ASR 纠错模型也一样,发音相似是 ASR 纠错的一个限制条件,我们需要把普通错别字模型结合这个限制条件,来设计针对 ASR 识别后的文本数据纠错模型。


3. ASR 纠错问题设定


接着我们对 ASR 纠错问题进行以下初步设定:


  • 只考虑 6 字以上中长 query:短的query不能体现充足的语境信息,纠错比较难。

  • 不考虑上下文对话信息:上下文对话信息问题更复杂,并且在小爱同学对话信息中多轮对话只占1%,目前先不考虑多轮对话的场景。

  • 不考虑音频信息:作为ASR下游的一个纠错产品,只考虑文本信息。

  • 仅考虑一对一纠错:基于BERT模型的纠错,一对一比较容易实现,后续可以放宽限制。

  • 仅使用非监督语料:非监督语料节省人力成本,可以使用预训练模型,数据分布的头部语料可以嵌入到模型中,但可能不利于尾部数据的纠错,也就是说对于那些在语料中没有出现过的信息,不太可能纠正过来。


这些设定条件跟目前一些 ASR 纠错文献中设定条件一致。


02 纠错相关工作


1. BERT 模型简介



BERT[2]是目前效果最好的预训练语言表示模型,引入了双向的 Transformer-encoder 结构,已训练好的模型网络有 12 层 BERT-small 和 24 层的 BERT-large。BERT 包含两种训练任务,一种是 Masked Language Model ( MLM ),另一种是 Next Sentence Prediction ( NSP )。BERT 模型主要作为预训练模型使用,提取特征获得具有语义的词向量表示,提升下游任务的表现。



BERT 模型中与 ASR 纠错任务相关的是 MLM 部分, MLM 训练阶段有 15% 的 token 被随机替换为 [MASK] ( 占位符 ),模型需要学会根据 [MASK] 上下文预测这些被替换的 token。例如对于输入句子"明天武汉的 [MASK] 气怎么样",模型需要预测出 [MASK] 位置原来的 token 是"天"。


如果只利用 MASK 机制训练存在一些迁移的问题,因为在其他任务中没有 MASK 的情况,这样就很难作为其他任务的预训练任务,所以作者通过 MASK 的方式进行了优化。


  • 其中10% 的 [MASK] 会被随机替换成另一个token,此时"明天武汉的 [MASK] 气怎么样"会变成"明天武汉的微气怎么样",模型需要在训练中学会将"微"字纠正为 “天”。

  • 另外,还有 10% 的 [MASK] 会被"还原"。此时"明天武汉的 [MASK] 气怎么样"会被还原成"明天武汉的天气怎么样",而模型需要在训练中学会根据上下文分辨 "天"字是否需要进行纠错。

  • 其余80%的 [MASK] 保留这个占位符状态,BERT训练过程中计算的损失,只包括了MASK机制涉及到的token的损失,而不是整个句子的损失。


MLM 实际上包含了纠错任务,所以原生的 BERT 就具备了纠错能力。但是 BERT 的 MASK 位置是随机选择的 15%的 token,所以并不擅长侦测句子中出现错误的位置;并且 BERT 纠错未考虑约束条件,导致准确率低,比如:“小爱同学今 [明] 天天气怎么样”,MASK 的位置是"今", 那么纠错任务需要给出的结果是"今"。但是由于训练预料中大多数人的 query 都是"明天天气怎么样",这样在没有约束的条件下,大概率给出的纠正结果是"明",虽然句子结构是合理的,但结果显然是不正确的。


2. ELECTRA 模型



ELECTRA[3]模型由 Standford 大学团队提出,其模型结构由一个生成器和一个判别器组成,看起来与 GAN 结构类似但不属于 GAN 模型。


  • 生成器的作用是输入一个正确的句子,负责生成一个错误的版本,如"the chef cooked the meal"经过生成器内部随机抽样15%的token进行MASK后,再对这些MASK的位置进行预测,输出结果为"the chef ate the meal",生成器中语言模型保证了生成的错误句子仍然是比较合理的,只是区别于原始句子。

  • 判别器 ( ELECTRA ) 是用来判别生成器输出的句子中哪些位置的token被改动了,因此对每个token的位置进行original/replaced标注,如"cooked"变成了"ate",标注为"repalced",其余位置相同token标注为"original",类似于序列标注任务,判别器的输出为0或1。


ELECTRA 模型的判别器虽然可以检测错误,但模型设计不是为了纠错,而是为了在有限计算资源的条件下能提取更好特征表示,进而得到更好的效果,文章中表示在 GLUE 数据集上表现明显优于 BERT。


ELECTRA 的一个变体 ELECTRA-MLM 模型,不再输出 0 和 1,而是预测每个 MASK 位置正确 token 的概率。如果词表大小是 10000 个,那么每个位置的输出就是对应的一个 10000 维的向量分布,概率最大的是正确 token 的结果,这样就从原生 ELECTRA 检测错误变成具有纠错功能的模型。


3. Soft-Masked BERT 纠错模型



最近发表的一个纠错模型是 Soft-Masked BERT[4],该模型通过对搜集到的语料,进行同音字替换等简单规则随机生成错误样本,然后得到错误-正确的样本对作为训练数据。该网络模型串联了一个检测模型 ( BiGRU ) 和一个纠错模型 ( BERT ),双向的 GRU 模型输出每个 token 位置是错误词的概率,当错误概率为 1 时,退化为原生 BERT 模型纠错。


该模型的创新点在于 BERT 输入的词向量不是原始输入的 token,而是 token 的 embbeding 和 [MASK] 的 embbeding 的加权平均值,权重是 BiGRU 输出序列中每个位置的错误概率,从而在 MASK 时起到 soft-mask 的作用。举个例子,假如 GRU 认为某个位置的词输出错误概率是 1,则输入到 BERT 的词向量就是 [MASK] 的词向量;而如果是检测模型认为某个位置的词是正确的,即错误概率是 0,这时输入到 BERT 模型的词向量就是 token 的向量;但是如果检测模型的某个位置输出错误概率是 0.5,此时输入到 BERT 模型的词向量为二者加权后的结果 ( (1-0.5)* token_embedding + 0.5*[MASK]_embedding )。不同于之前检测器输出 0/1,只有被 MASK 和未被 MASK 的 Hard-Mask 方式,因此该模型称为 Soft-Mask BERT,文章指出这种方式纠错比原生的 BERT 纠错效果高出 3%左右。


但是我们的工作在论文之前,并未参考该模型,未来会根据实际情况考虑。关于纠错模型的文献就先介绍到这里,接下来介绍我们的工作内容。


03 我们的工作


1. 模型结构



我们的纠错模型结构也类似生成器和判别器的模式,如上图所示。


语料库包括维基百科中文、知乎中文、爬取的一些新闻语料,以及小爱同学运行的用户日志,总共将近有 1 亿条的数据,从语料库中抽样出原始样本,类似"请播放歌曲芒种"、“布朗熊跳个舞”、“打开和平精英"等等。我们开发了专门模拟 ASR 生成错误数据的模糊音生成器,基于模糊拼音来对原始样本处理生成错误样本,生成结果如"请播放歌曲曼钟”、“波兰熊跳个舞”、"打开和平静音"等等。构造好正确样本和错误样本的样本对输入到判别器模型,判别器进行端到端的纠错,即给模型输入错误样本,模型输出为正确的样本。


2. 模糊音生成器



通过分析 ASR 错误样本的规律,在模糊音生成器中定义了模糊等级和模糊候选集,如上图所示。


根据模糊音的相似性划分为 5 个等级,等级越高,发音越不相似,比如 level1 是发音完全相同 ( “爱"和"艾” ),level2 的发音相同,声调不同 ( “几"和"季” ),level3 是常见的平卷舌和前后鼻音模糊 ( “shi"和"si”,“l"和"n” ),level4 的拼音编辑距离为 1,level5 拼音的编辑距离大于 1,基本上发音已经不一样了。


拼音的编辑距离计算采用的非标准拼音方案,如虽 ( “sui"使用"suei”,“sui"是缩写形式 ),“四"的发音"si"使用"sI”,由于"i"在"si"中和在"di"中发音是不同的,因此使用"I"来代替"i"在"si"中的发音。再比如"有” ( “you"使用"iou"代替 ) 是因为"y"并不是真正的声母,当"i"作为声母时用"y"替换"i”,这里相当于还原了这种实际发声拼音规则,还有"挖" ( “wa"使用"ua” ),“w"作为声母时真正的发音实际上是"u”。


标准的拼音方案不能很好的体现汉字的发音相似问题,比如"挖"和"华"读音很相似,如果使用标准拼音方案时,拼音的编辑距离为 2 ( “wa”,“hua” ),而采用我们定义的非标注方案时,编辑距离为 1 ( “ua”,"hua ),所以采用非标准拼音方案更能准确地描述 ASR 语音出现错误的规律,找到合适的编辑距离计算方案。



模糊音生成器的工作流程如上图所示,输入文本为"小爱同学请播放音乐",假设 MASK 位置随机到"爱",模糊等级 level=1 时,发音与"爱"相同的候选集为{“哎”,“艾”,“碍”,“暧”,…},然后基于 n-gram 语言模型在模糊候选集中选择最可能的替代词,如果计算的词序列概率最大的是"艾",那么"爱"被替换成了"艾",最后的输出为"小艾同学请播放音乐"。


我们通过人工标记了一些 ASR 错误样本的数据,研究了声母和韵母的特征,例如平卷舌,前后鼻音等出现的识别错误。人工标注的数量毕竟有限,所以根据掌握的规律,通过调整模糊音生成器的超参数 ( MASK 的数量,fuzzy 的比例等 ),使生成的错误样本分布尽可能接近真实 ASR 系统中错误样本的数据分布,以便纠错模型可以更容易地用于 ASR 识别的纠错任务中。


3. 纠错判别器



纠错判别器结构如上图所示,输入数据为汉字和拼音的特征,其中汉字经过 BERT 预训练模型得到汉字的词向量,而拼音数据则是通过 BERT 模型重新训练一个关于拼音数据的词向量,二者拼接后经过 Softmax 层,计算交叉熵损失。


为什么使用拼音的数据呢?这是因为正确的字发音一般比较相似,那么可以通过拼音来缩小搜索正确词的范围,所以拼音是一个重要的特征。并且通过尝试后,拼音和汉字单独训练再拼接提取的特征优于其他组合方式,这种方式类似于 Ensemble 模型。先用汉字语料训练一个端到端的纠错模型 BERT,再训练一个拼音到汉字的解码模型,两个模型拼接后通过输出层 softmax 训练每个位置的交叉熵损失,这点不同于原生的 BERT 模型只计算 MASK 位置的损失,而是类似于 ELECTRA 模型的损失函数。


关于拼音特征的处理过程,比较合理的做法是将拼音拆分成声母、韵母、声调,根据发音特征来得到相似发音的 embedding 表示向量,并且有相似发音的 embedding 向量要尽可能接近。汉字的拼音表示只有有限个,所有声母韵母组成的网格也只有几百个,并且拼音的写法变化也不多,所以拆分成声母、韵母、声调之后做 embedding 是合理的。如果直接对拼音做 embedding 的训练,得到的拼音表示向量无法表示出相似的发音。


4. 评测集的表现



模型中使用到了两个 trick:


  • 词表过滤

  • 如果词表很大,比如10000维,想要限制一下端到端纠错模型在纠错时的搜索范围,可以对词表增加限制,比如只允许在过滤后的300甚至几十个相似的词语中选择,理论上召回有所损失,但是纠正的准确率大大提升,并且这种过滤程度可以调整。实际测评中显示,加入词表过滤,显著提升了模型的效果和性能。

  • 递归预测

  • BERT在纠错过程中是一对一的纠错,如果一个句子中有多个错误的位置,但是对于端到端输入模型一次Feed Forward 过程可能只纠正了一个位置,若要整个句子实现纠错,那么需要把纠正后的结果放到句子中再次输入模型,进行递归纠错。如果两次递归结果相同则停止递归纠错,否则会递归纠错最多3次。

  • 从结果中发现,原生BERT微调之后直接纠错,模型评测指标为9.3%,加入词表过滤和递归预测后,f1提升到21.6%,加入纠错训练后f1大幅提升到65%,加入trick后,又提升到73.4%,再加入拼音特征数据,效果提升明显,f1提升到77.6%。


5. 纠错的表现



从表中纠错的例子中可以看出,之前分析的 ASR 识别错误类型的 query,基本上能实现纠错了,比如"播放洛天依唱的忙种"能够纠正为"播放洛天依唱的芒种",“你能帮我玩和平基因吗"纠正为"你能帮我玩和平精英吗”,"清理一下听懂灰尘"纠正为"清理一下听筒灰尘"等


虽然没有引入知识库,但是对于语料数据分布的头部知识仍然是可以纠正的,比如"芒种"、“和平精英”、"新冠肺炎"等,在语料中的占比比较高,但是对于尾部的知识,该模型纠错效果并不理想。


04 未来的方向



  • 尽管遵循目前关于NLP纠错模型的设定条件,但是该模型在纠错方面仍然存在一定的局限性。后续可以考虑BERT-Decoder结构的模型如 GPT系列模型,BERT-Decoder是seq2seq模型,不会局限于一对一的纠错方式。

  • 目前模型的领域知识是由参与训练的语料库来体现,因此对于那些小众的、处于长尾分布的数据无法实现纠错。要解决这个问题,可以借鉴ASR中基于Contextual attention的方式,把领域知识数据显示的通过某种特殊结构模型引入到纠错模型中,强制模型依赖领域知识来实现纠错。

  • 模型需要实时更新,比如时下热点"传闻中的陈芊芊",ASR识别成了"传闻中的成仙仙",这是由ASR模型对时事热点反应不及时造成的。如果用于纠错的NLP语料库也是是历史信息的话,很难把这类的问题进行纠正。如果只是通过不断收集新的语料来更新整个模型,对于这种庞大而臃肿的模型很难做到实时更新,因此需要探索一种让模型具备某种结构或者机制,只更新少量信息就能适应最新的时事热点。


这三个方向是未来考虑的重点,另外还可以将模型中使用的 N-gram 语言模型替换成其他强语言模型,增加任务的难度,进而可能提高纠错任务的表现。


今天的分享就到这里了,谢谢大家!


05 参考文献


  1. S. Shalev-Shwartz and S. Ben-David (2014) . Understanding Machine Learning: From Theory to Algorithm.

  2. Devlin J, Chang M W, Lee K, et al(2017). BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding[J].

  3. K.Clark et al (2019) .ELECTRA: Pretraining Text Encoders as Discriminators Rather Than Generators.

  4. Zhang Shaohua et al (2020) Spelling Error Correction with Soft-Masked BERT.


作者介绍


魏天闻,小米人工智能部小爱基础算法团队负责人


本科毕业于武汉大学数学系,博士毕业于法国里尔一大数学系,主要研究领域包括独立成分分析、非监督表示学习、语言模型等,有多篇论文发表于 IEEE Trans. Information Theory, IEEE Trans. Signal Processing、ICASSP 等知名学术期刊或会议上。魏天闻于 2018 年加入小米人工智能部,目前主要负责小爱同学语言模型有关算法研发与落地。


本文来自 DataFunTalk


原文链接


https://mp.weixin.qq.com/s?__biz=MzU1NTMyOTI4Mw==&mid=2247503412&idx=1&sn=75ef312902713d3766a43a6c71e1024e&chksm=fbd77c58cca0f54e3a9ffbe9ec075a144e8b16a171287367173d4a0d69f511106335c7b05298&scene=27#wechat_redirect


2020 年 7 月 20 日 10:061770

评论

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

从面试角度分析ArrayList源码

Java旅途

Java List 面试 ArrayList

关于敏捷开发的最佳实践和工具

PingCode

程序人生 敏捷开发 研发管理 管理工具 开发平台

ISP芯片:如何让数字之眼“看清”真实世界?

脑极体

《逻辑和计算机设计基础》第五版(英文原版)PDF免费下载

计算机与AI

计算机基础 计算机组成原理

求求你,别再用wait和notify了!

王磊

Java

金融科技 | 建设中台能力,助力开放生态

xcbeyond

金融科技 中台战略 中台架构

时序数据库DolphinDB和TimescaleDB 性能对比测试报告

DolphinDB

大数据处理 分布式系统 时序数据库 DolphinDB 数据库开发

架构师训练营第四周总结

Geek_xq

以理性不断的崇敬 - 对DDD之后复杂业务软件系统设计的思考

Winfield

领域驱动设计 DDD 架构设计

我国一项物联网安全测试技术成为国际标准;Windows 10将支持安卓应用

京东智联云开发者

京东智联云与CDA携手 共同打造电商领域数字化人才认证标准

京东智联云开发者

大数据 数据分析 数据分析师

一鼓作气学会“一致性哈希”,就靠这 18 张图了

四猿外

分布式 算法 一致性哈希 一致性Hash算法 哈希算法

跨越“数字鸿沟”,日本老年智能化服务的解法

脑极体

新增原创标签相关改动

yinhaixiang

测试 个人 aa bb

【架构师训练营 1 期】第十二周学习总结

诺乐

如何搭积木式的快速开发H5页面?

徐小夕

Java 前端 前端工程 React 数据可视化

Java虚拟机科普系列—元空间Metaspace的内存结构

Java老k

Java JVM Java虚拟机 metaspace

【架构师训练营 1 期】第十二周作业

诺乐

浅谈产品与项目之间的爱恨情仇

还在手写Operator?是时候使用Kubebuilder了

Java架构师迁哥

Sentinel 是如何做限流的

vivo互联网技术

高可用 限流 底层

访问者模式及其在Java Parser中的应用

maijun

甲方日常 67

句子

工作 随笔杂谈 日常

新增原创标签相关改动

yinhaixiang

aa bb cc

ReactNative | 项目复盘,涉及环境、RN版本升级、安全等方案

梁龙先森

前端 混合应用开发 React Native

Week_12 作业

golangboy

极客大学架构师训练营

数据类型· 第1篇《元组和列表的性能分析、命名元组》

清菡

测试开发

FORSAGE智能合约矩阵系统软件APP开发

开發I852946OIIO

系统开发

生产环境全链路压测建设历程之九 淘宝网全链路压测的原理

数列科技杨德华

区块链发展前景广阔,要紧跟时代步伐

13828808769

区块链发展 时代发展

领域驱动设计(DDD)实践之路(四):领域驱动在微服务设计中的应用

vivo互联网技术

架构 领域驱动设计 DDD 领域驱动设计DDD

基于BERT的ASR纠错-InfoQ