Connectionist Temporal Classification (CTC)
CTC可以用于线上实时地语音识别,编码器用的是单向的RNN,解码是用MLP来预测文字分布。
编码器将语音输入\(x^i\)编码成\(h^i\),MLP再对它乘上一个权重,接上Softmax,得到词表V大小的概率分布。
但有时候当前的语音输入可能并不能对应实际的文本token,所以预测要额外多一个为空的类别,表示模型不知道要输出什么。
CTC中没有使用下采样,所以输入和输出的序列长度都是T。
模型预测完后要进行后处理,一是把重复的token合并,二是把空类别去掉,得到最终的预测序列。
CTC的这种预测方式,会让它的数据标注变得很难,因为要确保刚好每个输入声音特征都对应一个正确的token。而标注语料的不足,会直接影响模型评测的表现。
此外,一个序列正确的标注方式又可以存着很多种,造成标注多标准问题。这也加大标注数据选择的困难。
由此采用的方法是穷举所有的可能的标注去训练。在数据集充足的情况下,CTC的效果还是不错的。
CTC模型的问题主要在,每个MLP的解码器工作是独立的。它可能会遇到一个奇怪的问题。
比如语音数据部分前三帧都在发音c,第一个隐层\(h^i\)解码出是c后,后面两个隐层就无须再解码出c了。
但由于它们是独立工作的,后面的解码部分不知道前面解码的是什么,所以第二个可能解码成空或c,第三个也可能解码成空或c。
但如果编码器是足够深的RNN,它也可能在编码过程中考虑这种前后关系的依赖,让第一个输出隐层包含更多关于c的信息,而后面两个隐层包含更多关于空类别的信息。
RNN Tansducer (RNN-T)
Recurrent Neural Aligner (RNA)
RNA:RNA是一个介于CTC和RNN-T的过渡模型,针对CTC独立解码问题,把MLP换成了RNN。
RNN-T:可以输出多个token。比如要输出th,CTC只能先输出t,然后在下一个时间点解码输出h,而RNN可以输入一个隐层,预测多个tokens。
不过,RNN-T与CTC一样会遇到训练数据难标注,标注多标准的问题。对此也是穷举所有可能的标注给模型训练。
RNN-T在解码过程中是如何确保输入一个隐层,输出多个token的呢?
输入一个\(h^t\),RNN-T会决定要产生一个"t"。这个"t"会被放到另一个RNN中,输出的隐层会放回RNN-T的解码器中作为隐层和之前的ht输入,来产生新的输出"h"。再反复一次。由于那另一个RNN看到过"h"了,就会输出新的东西。这个新东西再与之前的ht输入RNN-T,可能会得到一个空类别。而另一个RNN会无视掉这个空类别,把之前输出"h",与下一个隐层ht+1输入到RNN-T得到的新输出"e"。