20

基于 BERT 的 ASR 纠错

 3 years ago
source link: https://www.infoq.cn/article/5WqkeHlJBEZ8jRU9Jk6S
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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

  • ASR 纠错问题介绍
  • 纠错相关工作
  • 我们的工作
  • 未来的方向

01 ASR 纠错问题的介绍

1. 语音交互流程

rEfqE3M.png!web

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

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

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

2. ASR 错误的例子

3Inyem7.png!web

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

qaAVV3J.png!web

此时我们需要思考,对于 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 模型简介

E3eqmui.png!web

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

rIBFfuN.png!web

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 模型

aauayeQ.png!web

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 纠错模型

JraMRvY.png!web

最近发表的一个纠错模型是 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. 模型结构

bi2ENjj.png!web

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

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

2. 模糊音生成器

qeYzaaj.png!web

通过分析 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 语音出现错误的规律,找到合适的编辑距离计算方案。

zeEvY3i.png!web

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

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

3. 纠错判别器

imMfeae.png!web

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

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

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

4. 评测集的表现

JZZnIjq.png!web

模型中使用到了两个 trick:

  • 词表过滤

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

  • 递归预测

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

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

5. 纠错的表现

UJBN7bU.png!web

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

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

04 未来的方向

BreYfue.png!web

  • 尽管遵循目前关于 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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK