本文为李弘毅老师【Speech Recognition - CTC, RNN-T and more】的课程笔记,课程视频youtube地址,点这里(需)。
下文中用到的图片均来自于李宏毅老师的PPT,若有侵权,必定删除。
文章索引:
上篇 - 1-2 LAS
下篇 - 1-4 HMM
总目录
CTC源于论文Connectionist Temporal Classification: Labelling Unsegmented
Sequence Data with Recurrent Neural Networks,是用来训练RNN的一种方法,它被广泛应用于一些标签未与输入对齐的任务中,如语音识别、图像文本识别等等。说简单点,就比如我们今天有一段语音"Hello",然后我们的标签一般来说只会是"Hello"这样几个字符,从标签中,我们无法知道语音的哪几秒对应了"H",哪几秒对应了"e"。所以当我们的Encoder输出一个长度和输入相等为 T T T的序列时,我们没法和标签对齐,也就没法去算这个loss。当然,我们可以再加一个RNN的decoder来解决问题,但我们也可以减小一些模型的大小,直接利用CTC来处理Encoder的输出。
没错,利用CTC来计算loss的话,我们只需要Encoder就可以了。不过这个时候,我们每个time step的输出要比vocabulary的size大1,这多出来的一个就是CTC需要的间隔符,这里记作 ϕ \phi ϕ。
这个 ϕ \phi ϕ是我们人为加进去的,出现在模型输出的结果中,但不应该出现在最终得到的结果当中,因为vacabulary里是没有这个 ϕ \phi ϕ的。所以,在解析模型输出结果的时候,我们定义了如下两条规则:
哦,对了,还有一条规则,这个是在构建模型和数据集的时候需要注意的:
实际情况下,label的长度最好是远小于模型输出的长度,因为label中有重复字符的话,模型的输出就必须加入额外的 ϕ \phi ϕ才可能解析出和label一样的结果。
如下是几个转化的例子:
从上面的例子也不难推断出,模型不同的输出也可以得到相同的结果,比如下图左边的三种输出都可以解析得到相同的文字。CTC在训练的时候会去穷举所有可能的对齐方式。
也正是因为CTC的这些特性,模型classifier(第一张图☝️)的每一个time step的最终输出结果是独立的,在面对有很多重复的输入时,CTC很容易坏掉。
为了解决这个问题,有人提出了一种叫做RNA(Recurrent Neural Aligner)的方法。它就是把CTC独立的classifier换成了一个RNN就结束了。这样模型在输出token的时候,就可以参考前面的输出了。
不过,这样还有一个问题,就是面对一个输入,需要有多个输出的时候,该怎么办?比如“th”的发音只有一个音节,但是输出却有两个字母。这个时候就轮到RNN-T出场了。
RNN-T出自论文Sequence Transduction with Recurrent Neural Networks。它在RNA的基础上做了改进,解决了上述一对多的问题。它的改进在于,每个time step产生输出的时候,一直要等到模型输出了 ϕ \phi ϕ,才会继续去看下一个time step的内容,如下图所示。
所以,RNN-T的运算流程是长这个样子的。输入sequence的长度有多长,那么就会产生多少个 ϕ \phi ϕ。
而实际的RNN-T,还会再多做一步,就是它会以输出的token为输入,加了一个RNN的模型去影响输出的token,如下图所示。不过,这个RNN会无视 ϕ \phi ϕ。
这里多加入的RNN模型可以看成一个language model,可以先单独train好再拿进来。
Neural Transducer又继续做了优化,就是每次不是只看一个time step的hidden state来进行输出,而是看一个长度为 w w w的窗口内的hidden states来做attention,之后再塞进RNN里去得到token,输出 ϕ \phi ϕ后再看下一个窗口。这个有些细节我也没去细看,李老师也只是略讲了一下,这里就当了解一下吧。
MoCha(Monotonic Chunkwise Attention)也是略讲了一下,它就是一个窗口可以自由选择移动的Neural Transducer,这里我也偷下懒不说了。
结合上篇所讲的LAS,现在一共讲了6个模型。