Beam search 以及在语音识别(pure E2E)中的使用

Beam search 以及在语音识别(pure E2E)中的使用

Author: Xin Pan

Date: 2021.2.22


语音识别(ASR)中解码时一个很重要的过程。在其中不论是传统语音识别或是E2E的新结构虽然LM也许不存在了,但是解码过程和其中的解码方法是必不可少的。

首先简单说下beam search,之后说下ASR E2E+without LM这种方式中beam search如何使用的。

Beam Search

Beam search是介于穷举搜索贪心搜索之间的一种搜索算法。

穷举搜索每次计算所有可能组合,贪心搜素每次只计算最大的组合。Beam search就是它们的折中,每次计算最可能的K个组合。用ASR解码为例

假设现在的vocab_size=3,k=2。vocab=[你,最,牛],则

第一字,选择最大概率的k个字假设分别是[最,你],k=2;

第二字,会用[最,你]与[你,最,牛]分别组合,产生[最你,最最,最牛,你你,你最,你牛]。从中选择k个最大概率组合,假设是[最最,你最];

第三字,产生方法同第二字,假设产生了[最最牛,你最牛]这两个结果;

结束,最后就是[最最牛,你最牛]这两个最终结果。

这就是简单的beam search搜索过程。那么在E2E+without LM。中它是怎么工作的呢?

E2E+without LM条件下beam search的使用

在E2E+without LM这种方式中,解码的时候直接使用的是声学模型的得分(网络的输出),用得分直接进行beam search完成最终的解码过程。

解码的过程中,首先提取特征,使用特征可以计算出网络的输出对到每个字的得分。因为在网络的设计中,一般都有一个Z-vector是一个高维向量,它的含义其实就是输入特征的高维表征,它经过解码以后得到每个字的得分。因为考虑到随着时间的变化上下文信息不一样,因而解码阶段产生的输出和对应到每个字的score也不一样。

在离线解码时,整个语音是已知的,这时需要在时间维度上加mask。

一般每句开始都是有一个符号的比如,当我们将特征输入以后因为网络内部是会加mask的,因此不用担心解码当前时刻的字会使用将来的信息。

假设我定义最大的解码字串长度为60,nbest=3,batch=2,vocab_size=10。

和前边的beam search相比,当前步的score是由当前步的网络输出和之前步累积的beam search得分一起得到的。得到nbest个最好的结果,并且记下这个序列的长度以及每步的best id。当整个语句结束的时候依据score的得分就可以知道最好的解码结果了。

总结

现在看起来beam search的过程并不难,每个step传入网络去做推理的内容以及mask都是在改变的。隐约中还有一点没有理解,想想这个过程也是挺有意思的,巧妙而且高效。(中间还有没写清楚的地方,会继续看,回来继续完善)

未完待续。

你可能感兴趣的:(语音识别处理)