基于的纠错
分享嘉宾:魏天闻 小米人工智能部
编辑整理:李淑娜
内容来源:DataFunTalk
导读: 小爱同学是小米公司开发的智能语音系统,已广泛应用在手机、手环、音箱、电视等电子产品中,并支持闲聊、问答、语音控制等多种语音交互场景。语音系统中语音内容识别 ( 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语料库也是是历史信息的话,很难把这类的问题进行纠正。如果只是通过不断收集新的语料来更新整个模型,对于这种庞大而臃肿的模型很难做到实时更新,因此需要探索一种让模型�
- 原文作者:知识铺
- 原文链接:https://index.zshipu.com/geek/post/%E4%BA%92%E8%81%94%E7%BD%91/%E5%9F%BA%E4%BA%8E%E7%9A%84%E7%BA%A0%E9%94%99/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。
- 免责声明:本页面内容均来源于站内编辑发布,部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性,如涉及版权等问题,请立即联系客服进行更改或删除,保证您的合法权益。转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。也可以邮件至 sblig@126.com