CTC每个时间步进行的解码是independent的,这样的设定能够简化模型,但却不是很合理。事实上,实际应用中的序列,往往前后token都是有约束关系的。为了达到比较好的识别效果,在CTC的输出之后,通常需要再经过一个Language Model进行后处理。因为本质上来说,Language Model得到的就是前后token之间的转化概率,Language Model的引入弥补了CTC中时间步之间独立假设的缺陷。那能不能不用Language Model,抛弃时间步独立假设呢?
答案是:可以! 这就是RNA模型所做的事情
RNA
谷歌的学者发论文很喜欢玩取名的梗,这个模型与核糖核酸RNA同名。RNA是Recurrent Neural Aligner的缩写,它是一个介于CTC和RNN-T的过渡模型,针对CTC独立解码问题,把MLP换成了RNN
CTC或者RNA的缺陷在于,这两种模型都是输入一个vector,输出一个token。然而,在实际的语音识别任务中,却可能存在输入一个token,需要输出多个token的情况
RNN-T
RNN Transducer就是为了克服CTC和RNA输入一个vector,只输出一个token的问题而设计的
RNN-T在解码过程中是如何确保输入一个隐层,输出多个token的呢?输入一个$h^t$,RNN-T会决定要产生一个"t"。这个"t"会被放到另一个RNN中(下图深蓝色节点),输出的隐层会放回RNN-T的解码器中作为隐层和之前的$h^t$输入,来产生新的输出"h"。再反复一次。由于那另一个RNN看到过"h"了,就会输出新的东西。这个新东西再与之前的$h^t$输入RNN-T,可能会得到一个空类别。而另一个RNN会无视掉这个空类别,把之前输出"h",与下一个隐层ht+1输入到RNN-T得到的新输出"e"
Neural Transducer
前面的CTC、RNA在解码阶段,都是输入一个vector,输出一个token,是1v1的输入-输出方式; RNN-T是输入一个vector,输出多个token,是1vN的输入-输出方式;那么有没有可能输入多个vector,也输出多个token呢,即采用NvN的输入-输出方式。 答案是,可以! 这就是Neural Transducer的思路
Neural Transducer的改进主要是在解码的输入端。它不再是输入一个vector,而是输入W个vector,经过attention计算后,得到解码的输入,如下图所示。首先我们会让声学特征通过编码器产生隐层输出,再对一个窗口的小范围隐层做注意力后,再输出给解码的RNN。若窗口大小内信息已经用完了,解码的RNN就会输出空类别。接下来我们再移动窗口,对下一个窗口内的隐层重复刚才的操作
窗口大小要如何设计呢?Neural Transducer做了实验发现,没有注意力时,窗口一长,结果就会很糟糕。但用了注意力后,窗口大小又没那么重要。它尝试了各种计算注意力的方法,有DOT和MLP,甚至还有LSTM-ATTENTION。它把注意力权重读进LSTM中去,通过LSTM来考虑前一个时间步的注意力的位置
MochA
CTC、RNA、RNN-T、Neural Transducer都有一个相同的问题,就是$\phi$。因为我们在数据标注的时候很难插入$\phi$。例如"好棒"这个词,他有可能是"$\phi$好$\phi$棒$\phi$",也有可能是"好$\phi\phi\phi$棒","好$\phi\phi$棒$\phi$"等等。18年提出的一个新的模型MochA就解决了这个问题
MochA全称为Monotonic Chunkwise Attention,相比于Neural Transducer,它最大的改进在于输入的W个vector,不再是固定的,而是浮动的。也就是说,输入W个vector的起点和终点,是通过网络学习出来的。具体来说,这个网络输入$z^0$和隐层$h^1$,输出yes/no,表示要不要把窗口开头放在此处位置。如果不要,就往右移动窗口,再检查下一个位置的隐层$h^2$。一旦确定放置窗口,就对窗口内的隐层向量做注意力,解码出的token不会包含$\phi$。因为在输入浮动的情况下,事实上已经能够学习到输出-输入间的依赖关系,没有必要再引入$\phi$