WordPiece模型,BERT也有用到。Japanese and Korean Voice Search 看了半天才发现不稳啊。

背景知识

摘要

这篇文章主要讲了构建基于日语和法语的语音搜索系统遇到的困难,并且提出了一些解决的方法。主要是下面几个方面:

  • 处理无限词汇表的技术
  • 在语言模型和词典的书面语中,完全建模并且避免系统复杂度
  • 如何去构建词典、语言和声学模型

展示了由于模糊不清,多个script语言的打分结果的困难性。这些语言语音搜索的发展,大大简化了构建一门新的语言的语音搜索系统的最初的处理过程,这些很多都成为了语言搜索国际化的默认过程。

简介

语音搜索通过手机就可以访问到互联网,这对于一些不好输入字符的语言来说,非常有用。尽管从基础技术来讲,语音识别的技术是在不同的语言之间是非常相似的,但是许多亚洲语言面临的问题,如果只是用传统的英语的方法去对待,这根本很难解决嘛。许多亚洲语言都有非常大的字符库。这让发音词典就很复杂。在解码的时候,由于很多同音异义词汇,解码也会很复杂。基本字符集里面的很多字符都会以多种形式存在,还要数字也会有多种形式,在某些情况下,这都需要适当的标准化。

很多亚洲语言句子中没有空格去分割单词。需要使用segmenters去产生一些词单元。 这些词单元会在词典和语言模型中使用,词单元之间可能需要添加或者删除空白字符。我们开发了一个纯数据驱动的sementers,可以使用任何语言,不需要修改。

还有就是如何去处理英文中的许多词汇,比如URL、数字、日期、姓名、邮件、缩写词汇、标点符号和其它特殊词汇等等。

语音数据收集

公告开放的数据集很难用作商用,有很多限制,所以自己收集数据集。通过手机,从不同的地区、年龄、方言等等,收集数据。一般是尽可能使用这些原始的数据并且建模,而不是转化为书面的数据或者有利于英语的数据。

分词和词库

提出一种WordPieceModel去解决OOV(out-of-vocabulary)的问题。WordPieaceModel通过一种贪心算法,自动地、增量地从大量文本中学得单词单元(word units),一般数量是200k。算法可以,不关注语义,而去最大化训练数据语言模型的可能性,这也是解码过程中的度量标准。该算法可以有效地自动学习词库。

WordPieceModel算法步骤

1 初始化词库

给词库添加基本的所有的unicode字符和ascii字符。日语是22000,韩语是11000。

2 建立模型

基于训练数据,建立模型,使用初始化好的词库。

3 生成新单元

从词库中选择两个词单元组成新的词单元,加入到词库中。组成的新词要使模型的似然函数likelyhood最大。

4 继续加或者停止

如果达到词库数量的上限,或者似然函数增加很小,那么就停止,否则就继续2步,继续合并添加。

算法优化

你也发现了,计算所有可能的Pair这样会非常非常耗费时间。如果当前词库数量是\(K\),那么每次迭代计算的复杂度是\(O(K^2)\) 。有下面3个步骤可以进行优化

  • 选择组合新的单元时,只测试训练数据中有的单元。
  • 只测试有很大机会成为最好的Pair,例如high priors
  • 把一些不会影响到彼此的group pairs组合到一起,作为一个单一的迭代过程
  • only modify the language model counts for the affected entries (不懂什么意思)

使用这些加速算法,我们可以在一个机器上,几个小时以内,从频率加权查询列表中,构建一个200k的词库。

得到wordpiece词库之后,可以用来语言建模,做词典和解码。分割算法,构建了以基础字符开始的Pairs的逆二叉树。本身已经不需要动态规划或者其他的搜索方法。因此在计算上非常有效。分开基本的字符,基于树从上到下,会在线性时间给出一个确定的分割信息,线性时间取决于句子的长度。大约只有4%的单词具有多个发音。如果添加太多的发音会影响性能,可能是因为在训练和解码时对齐过程期间的可能数太多了

继续说明

一般是句子没有空格的,但是有的时候却有空格,比如韩文,搜索关键字。线上系统没有办法去把这些有空格的word pieces组合在一起。这对于常见的词汇和短查询是没有影响的,因为它们已经组合成一个完整的word unit。但是对于一些例如空格出现在不该出现的地方等不常见的查询,就很烦恼了。

在解码的时候,加空格效率更高,采用下面的技术:

1 原始语言模型数据被用来"as written",表示一些有空格一些没有空格。

2 WPM模型分割LM数据时,每个单元在前面或者后面遇到一个空格,那么就添加一个空格标记。单元有4种情况:两边都有空格,左边有,右边有,两边都没有。使用下划线标记

3 基于这个新词库构建LM和词典

4 解码时,根据模型会选择一个最佳路径,之前在哪些地方放了空格或者没有。为了输出显示,需要把空格全部移除。有3种情况,移除所有空格;移除两个空格用一个空格表示;移除一个空格。