CTC: Connectionist Temporal Classification [Graves et al., ICML'06]
首先为了实现online的效果,CTC的encoder RNN 是单向的。
CTC的特点是它的token space引入了一个新的值 (null)。原因是每一帧的声学特征往往所占的时间非常短,甚至远小于一个phoneme的长度,因此根据它输出的东西往往不能代表什么。 就是用来代表那些无法单独识别的feature。
具体地,和一般的seq2seq模型一样,encoder将声学特征转换为高阶的序列h,然后做一个transform和softmax后就输出一个token distribution。
这里的token space里还会包含之前定义的。
此时我们得到的输出序列的长度就等于输入序列的长度(T),要得到想要的识别结果,就得将重复的token合并,然后去除掉。例如: 输出序列d d e e e p p 就代表 deep。
接下来就是模型训练的问题:
由于我们对每一个声学特征都有对应的输出值并且引入了null值的概念,我们在训练的时候并不知道某个训练utterance文本确切的形式。例如: deep可以是 d d e e e p p得到的,但也可以是 d e ep p得到的。这里解决的办法就是将所有可能的对齐方式(deep 和 T长度输出序列在token space上的对齐)都用到训练中来。其类似HMM模型中的前向后向算法(会在之后的笔记解释)。
该模型显然有一个问题,前后timestep的输入输出是互相独立的,因此会有比较大的error rate
RNN-T:RNN-Transducer
RNA(Recurrent Neural Aligner)
在介绍RNN-T之前,先理解RNA。对应CTC的前后文独立问题,RNA考虑到了前后的关联性。具体做法非常简单,将CTC的linear classifier层换成RNN结构就可以了。
RNN-Transducer
在RNA一对一的基础上,我们会考虑有时输入的声学特征是否会对应多个token输出(比如“th”)。具体做法如下图,对一个声学特征会不停的copy本身输入到模型中,然后不停输出对应的token。直到模型认为这个声学特征对应的token都得到了,此时就输出null,相当于使用下一个声学特征。因此这里其实一定会输出T个null。
接下来RNN-T训练的过程结构又会有所不同。可以看到这里又引入了新的一个RNN网络,它只将除null以外的token作为输入,用以影响下一个timestep的RNN decode。这里一种理解可以把这个新增的RNN当作一个训练好的LM(因为都是有意义的token输入)。但更本质的理解是这样,因为RNN-T和CTC一样需要考虑所有的对齐方式做训练,这个网络就是为了这一点而存在的。(会在之后笔记解释)
cover source: 语音识别ASR - HTK(HResults)计算字错率WER、句错率SER - debugger.wiki - debugger.wiki
ref: DLHLP 2020 Spring