decoder_main修改blank概率

修改blank概率

孙思宁 知乎 Tiny-Transducer(1) 设备端轻量级ASR模型

方法

  1. 只对最大概率为非blank的帧进行解码

不过由于Transducer模型的特性,大多数帧的输出都是blank概率占绝对优势的,因此在解码的时候,完全可以跳过这些帧,只把最大概率为nonblank的帧的后验送给解码器即可,这样,解码器从时间同步变成了音素同步了,极大的减少了解码的步数而不带来任何损失,但解码效率能提高很多!

  1. 送进去解码的后验概率向量中,把blank概率减去一个值,对blank进行抑制来减少删除错误(识别为blank空,删除错误)

每一步都需要对blank的概率进行抑制,实验中我们发现,如果不对blank的概率进行抑制,模型会过度倾向blank的输出,这样就会导致非常高的删除错误。我们的做法很简单,在对数域上,每一步都需要给blank的概率剪掉一个常数,这里,我们实验发现在我们数据集合上,$β$取1.5或者2.0的时候效果最好。$\log p(blank)=\log p(blank)-\beta$

  1. 不考虑blank类别,只在非blank类别做beam search

实现过程类似方法2,给blank概率一个极小值,比如1000,不好,插入错误很高

  1. 方法2基础上,如果blank是最大概率的时候,人为调小,blank不是最大概率,不用调

适当减少送入解码器的帧数(通过blank阈值,blank概率很高就不送,blank概率中等偏高还是要送的,因为包含了可能其他类别的可能性,只有很有把握,才不送),送进去时,已知可能是某一个概率较小的类别,因此把blank概率人为调小(如果blank是最大概率的时候,人为调小,blank不是最大概率,不用调)

  1. [TODO]

在Transducer的Greedy search时,使用了ILME,无论是在大模型还是小模型,都能带来收益,

实践

  1. 只单独用方法1,效果不好,因为有些帧最大概率就是blank,该帧其他概率包含识别文本,不把这一帧送入解码器的话,那帧结果永远别想出来;因此方法1有问题
  2. 删除错误变少,有提升
  3. 方法3和方法2类似,插入替换错误很高,强行在不是blank的地方让它去搜索,结果就是容易有插入错误;
  4. 比方法2提升多一点

结果

解码测试集

1
2
3
4
5
6
7
8
# 解码
export GLOG_logtostderr=1
export GLOG_v=3

langname=ngram_7g_train_en_zh_hua_lexicon

# docker:067:
./tools/decode.sh --nj 40 --acoustic_scale 10 --lattice_beam 30 --max_active 7000 --ctc_weight 0.05 --rescoring_weight 1 --chunk_size -1 --blank_skip_thresh 0.98 --dict_path /home/aban-c009/lang_aban-c009_$langname/words.txt --fst_path /home/aban-c009/lang_aban-c009_$langname/TLG.fst /home/data/yelong/docker_seewo/corpus/200/doc/wav.scp /home/data/yelong/docker_seewo/corpus/200/doc/text /home/aban-c009/final.zip /home/aban-c009/lang_aban-c009_$langname/units.txt exp/aban-c009/200.8/lm_10_attention_rescore

5gram的RTF更快(结点的出边更少)但是加载TLG特别耗时,5gram的TLG是3gram的10多倍