导读: 小爱同学是小米公司开发的智能语音系统,已广泛应用在手机、手环、音箱、电视等电子产品中,并支持闲聊、问答、语音控制等多种语音交互场景。语音系统中语音内容识别 ( ASR ) 的精准性,是影响智能语音产品发展的关键制约因素,用户query的文本,通常是由ASR系统将用户的语音命令转换而成,但由于技术上的原因,这些由ASR生成的文本可能包含错误,继而导致后续的用户意图理解出现偏差。如何利用NLP技术对ASR的query文本进行预处理纠错成了一个亟待解决的问题。
本次分享,将介绍小爱算法团队基于近年来流行的BERT预训练模型在这个问题上所进行的一些技术探索,以及在业务场景中的落地情况,主要内容包括:
在分享语音纠错的相关问题之前,先简单介绍一下小爱同学语音使用流程:首先我们需要唤醒小爱同学,比如,手机按键或者语音唤醒,唤醒之后进入录音模块,启动录音前开启Voice Activity Detection ( VAD ) 状态,检测当前有没说话声音,如果没有则忽略,如果有,会把语音记录下来传递到下一个模块,就是最受关注的Automatic Speech Recognition ( ASR ),该模块负责把语音转译成文字。
我们负责的是ASR接下来的一个模块,文本理解模块Natural Language Understanding ( NLU ),主要目的是试图理解ASR转换出的文本,准确识别用户的意图,然后给出相应技能执行的方案,最后一步就是技能执行了。
在这个语音交互流程中,前三步都涉及到语音相关的工作,很容易出现记录噪音或者识别错误等情况,例如误操作唤醒录入了噪音;或者语音记录过程中,把某种声音误以为是人的声音而记录下来,在识别时转译成了错误的文本。另外,即便是纯净的人说话的语音,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识别后的文本数据纠错模型。
接着我们对ASR纠错问题进行以下初步设定:
这些设定条件跟目前一些ASR纠错文献中设定条件一致。
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的方式进行了优化。
MLM实际上包含了纠错任务,所以原生的BERT就具备了纠错能力。但是BERT的MASK位置是随机选择的15%的token,所以并不擅长侦测句子中出现错误的位置;并且BERT纠错未考虑约束条件,导致准确率低,比如:“小爱同学今 [明] 天天气怎么样”,MASK的位置是"今", 那么纠错任务需要给出的结果是"今"。但是由于训练预料中大多数人的query都是"明天天气怎么样",这样在没有约束的条件下,大概率给出的纠正结果是"明",虽然句子结构是合理的,但结果显然是不正确的。
ELECTRA[3]模型由Standford 大学团队提出,其模型结构由一个生成器和一个判别器组成,看起来与GAN结构类似但不属于GAN模型。
ELECTRA模型的判别器虽然可以检测错误,但模型设计不是为了纠错,而是为了在有限计算资源的条件下能提取更好特征表示,进而得到更好的效果,文章中表示在GLUE数据集上表现明显优于BERT。
ELECTRA的一个变体ELECTRA-MLM模型,不再输出0和1,而是预测每个MASK位置正确token的概率。如果词表大小是10000个,那么每个位置的输出就是对应的一个10000维的向量分布,概率最大的是正确token的结果,这样就从原生ELECTRA检测错误变成具有纠错功能的模型。
最近发表的一个纠错模型是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%左右。
但是我们的工作在论文之前,并未参考该模型,未来会根据实际情况考虑。关于纠错模型的文献就先介绍到这里,接下来介绍我们的工作内容。
我们的纠错模型结构也类似生成器和判别器的模式,如上图所示。
语料库包括维基百科中文、知乎中文、爬取的一些新闻语料,以及小爱同学运行的用户日志,总共将近有1亿条的数据,从语料库中抽样出原始样本,类似"请播放歌曲芒种"、“布朗熊跳个舞”、“打开和平精英"等等。我们开发了专门模拟ASR生成错误数据的模糊音生成器,基于模糊拼音来对原始样本处理生成错误样本,生成结果如"请播放歌曲曼钟”、“波兰熊跳个舞”、"打开和平静音"等等。构造好正确样本和错误样本的样本对输入到判别器模型,判别器进行端到端的纠错,即给模型输入错误样本,模型输出为正确的样本。
通过分析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识别的纠错任务中。
纠错判别器结构如上图所示,输入数据为汉字和拼音的特征,其中汉字经过BERT预训练模型得到汉字的词向量,而拼音数据则是通过BERT模型重新训练一个关于拼音数据的词向量,二者拼接后经过Softmax层,计算交叉熵损失。
为什么使用拼音的数据呢?这是因为正确的字发音一般比较相似,那么可以通过拼音来缩小搜索正确词的范围,所以拼音是一个重要的特征。并且通过尝试后,拼音和汉字单独训练再拼接提取的特征优于其他组合方式,这种方式类似于Ensemble模型。先用汉字语料训练一个端到端的纠错模型BERT,再训练一个拼音到汉字的解码模型,两个模型拼接后通过输出层softmax训练每个位置的交叉熵损失,这点不同于原生的BERT模型只计算MASK位置的损失,而是类似于ELECTRA模型的损失函数。
关于拼音特征的处理过程,比较合理的做法是将拼音拆分成声母、韵母、声调,根据发音特征来得到相似发音的embedding表示向量,并且有相似发音的embedding向量要尽可能接近。汉字的拼音表示只有有限个,所有声母韵母组成的网格也只有几百个,并且拼音的写法变化也不多,所以拆分成声母、韵母、声调之后做embedding是合理的。如果直接对拼音做embedding的训练,得到的拼音表示向量无法表示出相似的发音。
模型中使用到了两个trick:
从表中纠错的例子中可以看出,之前分析的ASR识别错误类型的query,基本上能实现纠错了,比如"播放洛天依唱的忙种"能够纠正为"播放洛天依唱的芒种",“你能帮我玩和平基因吗"纠正为"你能帮我玩和平精英吗”,"清理一下听懂灰尘"纠正为"清理一下听筒灰尘"等
虽然没有引入知识库,但是对于语料数据分布的头部知识仍然是可以纠正的,比如"芒种"、“和平精英”、"新冠肺炎"等,在语料中的占比比较高,但是对于尾部的知识,该模型纠错效果并不理想。
这三个方向是未来考虑的重点,另外还可以将模型中使用的N-gram语言模型替换成其他强语言模型,增加任务的难度,进而可能提高纠错任务的表现。
今天的分享就到这里了,谢谢大家!
作者介绍:
魏天闻,小米人工智能部小爱基础算法团队负责人
本科毕业于武汉大学数学系,博士毕业于法国里尔一大数学系,主要研究领域包括独立成分分析、非监督表示学习、语言模型等,有多篇论文发表于IEEE Trans. Information Theory, IEEE Trans. Signal Processing、ICASSP等知名学术期刊或会议上。魏天闻于2018年加入小米人工智能部,目前主要负责小爱同学语言模型有关算法研发与落地。
本文来自 DataFunTalk
领取专属 10元无门槛券
私享最新 技术干货