首先,我们回顾下seq2seq想要解决的问题这样一类问题:

关于Seq2Seq model: Connectionist Temporal classification一些理解(1)

    比如说,在语音识别的任务中,我们是输入一段语音然后输出一段文字,而在机器翻译中,假设中英翻译,那我们就是输入一段中文的文字序列然后输出一段英文序列,在这个过程中通常N!=M.

    以语音识别任务为例来详细展开讲述一下CTC:

关于Seq2Seq model: Connectionist Temporal classification一些理解(1)

    上图是通常语音识别的预处理过程,首先将常见的音频文件(mp3,wmv等格式)解压成wav文件,之后进行VAD处理(这个处理在这里介绍的CTC没有很大必要),然后再进行帧处理,这个过程之前都是在时域中进行的,然后再提取MFCC特征,在这里每一帧都会被提取出来相同维数的特征,具体过程如下图所示:

关于Seq2Seq model: Connectionist Temporal classification一些理解(1)

到这里,我们就可以得到一段语音的声谱图类似于下图:

关于Seq2Seq model: Connectionist Temporal classification一些理解(1)

    所以如果对于一段简单的语音“你好”,可能就1-2秒的语音,本来是一个1-D的数据,经过以上分帧以及提取MFcc特征后就得到了一个N(帧数)*12的2-D数据。

    经过预处理后的数据序列就和我们原本的“你好”的音素标签“n i h a o”存在不等长,不对齐的关系。

关于Seq2Seq model: Connectionist Temporal classification一些理解(1)

    在深度学习网络中,传统的RNN模型常用来对两个序列之间的关系建模,但是标注序列和输入序列是一一对应的,而在语音识别的任务中,输入的语音特征序列长度是远远大于预测输出的字符或者说音素序列的,因此就不能够直接用RNN来建模。所以常能够想到的一种方法是先对每一帧打标签,然后用打好的标签放入RNN中训练。这种想法在很早的时候有一些Hybrid HMM&RNN的方法有去尝试,但是效果并不理想。其实我们仔细去思考一下也是很容易想到问题的根源的,因为我们很难确定说哪一帧是分割点,拿“nihao”来举例,我们很难确定“n”和“i”的界限是哪一帧,即便说是人工去标注也是一件因人而异的事情。所以想要找到确定的界限是不太现实的,而CTC就避免了这个问题,它可以对没有对齐的数据进行自动对齐。

参考文献:

[1] Graves, A., Fernández, S., Gomez, F., & Schmidhuber, J. (2006, June). Connectionist temporal classification: labelling unsegmented sequence data with recurrent neural networks. In Proceedings of the 23rd international conference on Machine learning (pp. 369-376). ACM.

[2] CMU Deep Learing 2018 by Bhiksha Raj, Lecture14: Connectionist Temporal Classification(CTC).

相关文章: