修改blank概率
方法
- 只对最大概率为非blank的帧进行解码
不过由于Transducer模型的特性,大多数帧的输出都是blank概率占绝对优势的,因此在解码的时候,完全可以跳过这些帧,只把最大概率为nonblank的帧的后验送给解码器即可,这样,解码器从时间同步变成了音素同步了,极大的减少了解码的步数而不带来任何损失,但解码效率能提高很多!
- 送进去解码的后验概率向量中,把blank概率减去一个值,对blank进行抑制来减少删除错误(识别为blank空,删除错误)
每一步都需要对blank的概率进行抑制,实验中我们发现,如果不对blank的概率进行抑制,模型会过度倾向blank的输出,这样就会导致非常高的删除错误。我们的做法很简单,在对数域上,每一步都需要给blank的概率剪掉一个常数,这里,我们实验发现在我们数据集合上,$β$取1.5或者2.0的时候效果最好。$\log p(blank)=\log p(blank)-\beta$
- 不考虑blank类别,只在非blank类别做beam search
实现过程类似方法2,给blank概率一个极小值,比如1000,不好,插入错误很高
- 方法2基础上,如果blank是最大概率的时候,人为调小,blank不是最大概率,不用调
适当减少送入解码器的帧数(通过blank阈值,blank概率很高就不送,blank概率中等偏高还是要送的,因为包含了可能其他类别的可能性,只有很有把握,才不送),送进去时,已知可能是某一个概率较小的类别,因此把blank概率人为调小(如果blank是最大概率的时候,人为调小,blank不是最大概率,不用调)
- [TODO]
在Transducer的Greedy search时,使用了ILME,无论是在大模型还是小模型,都能带来收益,
实践
- 只单独用方法1,效果不好,因为有些帧最大概率就是blank,该帧其他概率包含识别文本,不把这一帧送入解码器的话,那帧结果永远别想出来;因此方法1有问题
- 删除错误变少,有提升
- 方法3和方法2类似,插入替换错误很高,强行在不是blank的地方让它去搜索,结果就是容易有插入错误;
- 比方法2提升多一点
结果
解码测试集
1 | 解码 |
5gram的RTF更快(结点的出边更少)但是加载TLG特别耗时,5gram的TLG是3gram的10多倍