识别论文笔记(二)语言模型融合

语言模型融合

==Cabrera, Rodrigo, et al. “Language model fusion for streaming end to end speech recognition.” arXiv preprint arXiv:2104.04487 (2021).==

解决什么问题
  • 通过使用在和训练不匹配的文本数据上训练的语言模型(LM)来解决流式和尾部识别的挑战,以增强端到端模型;
  • 解决tail phenomena 的问题,比如专有名词,数值,口音 ?
用了什么方法
  • 扩展了流式RNNT中声学模型和语言模型融合shallow fusion 和 cold fusion方法,提出两种新的competitive fusion方法
效果如何
  • 8%改善识别率
还存在什么问题
  • tail phenomena ?

  • 加了lm对rtf、内存、延时有影响吗?多大影响?

  • 好的多语种识别模型一般是怎么样的?是按论文所说的各自训练一个语种的am/lm模型,再多个模型融合吗?

论文思路

  • 通过使用在和训练不匹配的文本数据上训练的语言模型(LM)来解决流式和尾部识别的挑战,以增强端到端模型;

  • 扩展了流式RNNT中shallow fusion 和 cold fusion方法,提出两种新的competitive fusion方法

  • 端到端模型中,可以用纯文本训练LM,来进行模型融合,常用的有shallow fusion,deep fusion,cold fusion,component fusion,他们大多用神经网络LM,少部分用n-gram fst LM;

    但是这些融合模型是非流式的,流式的融合模型还没怎么有论文

image-20220511171437884
  • RNN-LM:对于一个wordpiece序列,语言模型概率为 $\large P(w_1^T)=\prod\limits_{i=1}^TP(w_i|w_1,w_2,…,w_{i-1})$

    训练LM时没有blank,但是RNNT里有,因此推理时要给RNN-LM一个blank概率,文中定义blank概率等于RNNT里blank的输出概率,即 $\large logP_{lm}()=logP_{rnnt}()$

    这意味着当RNNT模型输出blank时,RNN-LM不更新,融合后blank的概率保持不变。。?

  • shallow fusion:把RNNT的概率和RNN-LM的概率log线性相加,再送入softmax层: $\large logP(y_t)=logP_{rnnt}(y_t)+\beta logP_{lm}(y_t)$ ,其中$y_t$是t帧时的输出符号

    • RNNT和LM分开训练(不同数据)各训各的,
    • 注意,这里应该就不是联合训练,没有训练过程,而是各自训练好了,融合到一块,得到每帧下每个符号的概率
    • 因此,$\beta$ 和 blank惩罚这两个超参数就要精细调节,才能有好的识别率
  • Early Shallow Fusion

    • 因为RNNT里的预测网络prediction network被比作LM,受此启发,将该LM和预训练LM进行log线性插值融合,再送入RNNT里的joint network;
    • $l_t^{Pred}=DNN(h_t^{Pred})$ , $h_t=l_t^{Pred}+\beta l_t^{LM}$
    • 只在推理阶段用
  • Cold Fusion

    • 预训练LM参与rnnt训练,但是rnnt参数更新,lm参数不更新

    • 用fine-grained gating方法,这样对于非训练集之外的场景效果会更好[TODO]?

    • $\large h_t^{LM} = DNN (l_t^{LM})$

      $\large g_t=\sigma(W[s_t^{jn};\dot h_t^{LM}]+b)$

      $\large s_t=[s_t^{jn};g_t h_t^{LM}]$

      $\large r_t=DNN(s_t)$

      $\large \hat P(y_t|x,y<t)=softmax(r_t)$

      ? 公式有写错吗

    • 推理时还需要用LM吗?

  • Early Cold Fusion

    • 训练推理阶段都用

    • $\large h_t^{LM}=DNN(l_t^{LM})$

      $\large g_t=\sigma(W[h_t^{Pred};h_t^{LM}]+b)$

      $\large h_t=[h_t^{Pred};g_t \dot h_t^{LM}]$

实验

  • 模型:RNNT:

    • encoder network :8层单向LSTM,2048结点,640维projection层;
    • prediction network :2层单向LSTM,2048结点,640维projection层;
    • joint network:前馈层,640结点;
    • 参数量:120M
    • 建模单元:wordpieces(WPE),vocabulary=4096
    • A stacking layer is inserted after the second layer, which stacks the outputs of two neighboring frames with a stride of 2 for speed improvement.
  • 模型:RNN-LM:

    • 2层单向LSTM,2048结点,128维embedding层;60M参数量;
    • 建模单元:wordpieces(WPE),vocabulary=4096
  • RNNT数据集:不同数据量的的多语种实验(三种语言),

    • Greek :6700h
    • Norwegian :3500h
    • Sinhala :160h
    • 数据扩展:room simulator ,加噪,混响,平均信噪比12dB
  • RNN-LM训练数据:60%来自RNNT训练文本,40%来自其他;

    • Greek :10亿条文本
    • Norwegian :10亿条文本
    • Sinhala :2亿条文本
  • RNN-LM训练准则:最小化log困惑度

  • 最终用的模型:不同语种模型进行模型融合得到的一个模型;

结果

  • 对于attention base 模型,shallow fusion 优于 cold fusion;(文中没做该实验,该结论来自las论文)
  • 对于RNNT models 模型,cold fusion 优于 shallow fusion;

收获

  • 预训练的RNN-LM和声学模型联合训练(只训练声学模型参数)会提高识别率

==Liu, Yufei, et al. “Internal language model estimation through explicit context vector learning for attention-based encoder-decoder ASR.” arXiv preprint arXiv:2201.11627 (2022).==

解决什么问题

E2E模型已经学了一些语言模型信息(称为biased internal language model(ILM)),这时候如果想用外部语言模型的分数,内部lm的分数要先减掉,然后才能加外部lm分数,不然就加太多;因此需要知道怎么评估ILM的分数,才能获取该分数。

也可以不减掉这个内部lm分数,但是要尽量让内部lm的bias作用不明显,就是可以用外部lm的训练数据去训练这个内部lm,到时候不需要外部lm,直接用内部lm,也是起到了外部lm参与的效果;

本文的E2E模型是LAS模型;

用了什么方法

两种方法来评估ILM:

  1. 把LAS decoder里的context vector(AttentionContext )换成参数可学习可更新的vector;
  2. query vector通过前馈网络映射到context vector,使得context vector不依赖encoder信息(声学信息);

只更新上述两种方法里的参数,LAS其他参数固定不更新,用纯文本训练他们,就相当于训练一个外部LM了,目标函数是最小化perplexity;

[TODO] 方法2. c只来源于文本不需要声学信息,那声学信息在哪里作用??encoder信息不需要了吗。。。

效果如何

在多个数据集上,优于shallow fusion的方法,优于前人的两种Internal Language Model Estimation (ILME) 方法;

没有额外LM参与,没有额外的耗时,保证了RTF不会很大;

应用到我的任务

用conformer encoder+ctc decoder和attention decoder,这里可以把attention decoder全替换成外部lm训练数据训练的lm,

  1. 用ctc出来n best做rescore(和wenet的attention rescore方法相同,只是attention decoder换了,不需要encoder信息),该方法叫rescore
  2. shallow fusion,
  3. attention decoder输入的embedding层就用ctc decoder出来的,当blank概率不要很大的帧送进去解码(作为attention decoder的输入embedding层),非自回归(不使用attentiondecoder的输出信息作为下一个符号的输入),然后把ctcdecoder给的全送进去,得到N个V向量,做beam search;