基于深度学习的语音识别研究-CTC理论推导(四)

  有时候学习真的得循序渐进,并没有速成的方法,本小白在经历了大约一个月终于把CTC的从头到尾大致看完了,下面讲一下我的理解,欢迎各位朋友批评指正。

  首先,我们得知道为什么要引入CTC,前面博客讲到,之前在做语音的声学模型的时候,我们的数据形式是帧与标签的分别对齐,以Thchs30为例,训练集大约25小时的数据集,经过kaldi的GMM-HMM对齐之后,大约分为917w多帧的语音数据,标签经过后处理成one-hot形式的标签,具体可以看本人前面的文章,由于文章大多数是笔记的形式记录,还望各位体谅,以后有时间再做总结。

   CTC(connectionist temporal classification)从字面的意思是连接时序分类,个人认为没必要纠结于中文的含义,只要知道他是干什么的就行了,以往我们做DL-HMM训练声学模型的时候,我们都需要把帧与标签进行对齐之后才能进行训练神经网络,但是此方法多了一步采用传统方法GMM-HMM对语音的数据进行对齐的操作,采用对齐的缺点是:对齐效果不好,以Thchs30为例,在kaldi中10000句语料也仅仅对齐了9999句,集这么多人的力量仍然有对齐的漏洞,由此可知改方法是不太友好的,有没有一种方法无需对齐就可以实现语音识别声学模型的构建呢?答案是肯定的,下面就引入了端对端语音识别模型,端对端现阶段有三种,一种是DL-CTC,另一种是Attention-DL,还有最后一种是二者的组合,有论文数据显示,二者混合系统可能有着更好的效果。

  下面来简单说明一下CTC的作用,说白了CTC就是构建在神经网络顶层的损失函数,以往我们比较喜欢用交叉熵等损失函数来刻画我们的模型,采用最小化损失函数来提高我们模型的准确率,在之后我会详细的讲解CTC的损失函数。下面由一幅图来引出CTC是如何进行“对齐(alignment)”的。




  此图来源于CTC模型的提出者Graves教授,第一行是我们真正的语音波形图,第二行是我们采用HMM-GMM方法将语音分帧结果和语音的标签进行对齐,但是CTC不一样,他是采用的spike来对齐几帧连续的语音。实际上他的意思就是一段相同的分帧语音对应一个spike。这样就会减少很多对齐操作,个人是这样理解的。

  下面以论文里面的CAT英文单词为例,来推导CTC的推导过程.首先,先简述一下CTC中需要使用的符号:

  1:ykt:代表输出序列在第t步的输出为k的概率。举个简单的例子:当输出的序列为(a-ab-)时,y3aya3 代表了在第3步输出的字母为a的概率;
  2:p(π∣x)p(π∣x):代表了给定输入x,输出路径为 ππ 的概率;
  由于假设在每一个时间步输出的label的概率都是相互独立的,那么 p(π∣x)p(π∣x) 用公式来表示为 p(π∣x)=∏Tt=1(ytk)p(π∣x)=∏t=1T(ykt),可以理解为每一个时间步输出路径 ππ 的相应label的概率的乘积。
  3:F:代表一种多对一的映射,将输出路径 ππ 映射到 标签序列 ll 的一种变换。
  举个简单的例子 F(a−ab−)=F(−aa−−abb)=aabF(a−ab−)=F(−aa−−abb)=aab (其中-代表了空格)
  4: p(l∣x) :代表给定输入x,输出为序列 ll 的概率。

因此输出的序列为 ll 的概率可以表示为所有输出的路径 ππ 映射后的序列为 ll 的概率之和,用公式表示为 p(l∣x)=∑π∈F−1(l)p(π∣x)。

  CTC的创新之处在于他引入了Blank这个概念,以音素级别的语音识别为例,空格的作用就是把语音的音素分开。但是空格有两个显而易见的缺点:(1)空格无法预测出两个连续的相同的音素,因为在论文中,Graves明确指出空格会栓除连续相同的第一个字母;(2)无法预测出一整句话,意思就是最后CTC在去除空格的时候,无法表示单词与单词之间的停顿的部分。

  由于我公式不太好打,下面我自己手动推导了CTC的前向、后向的计算流程,如下图所示:

 

  CTC的前推和后退跟HMM中的前向-后向算法很类似,实际上个人认为深度学习方法都是很类似的,大家可以自己想一想。

  下面就是定义CTC的损失函数:


  关于上面的公式有说明:不论是在计算前向变量还是反向变量时,都涉及到了大量的概率的乘积。由于这些乘积都是小于1的,在大量的小数相乘时,最后得到的结果往往都会趋向于0,更严重的是产生underflow。因此在计算时对其做了取对数的处理,这样乘法就会转化为加法了,不仅避免了underflow,还简化了计算。但是,原来的加法计算就不是太方便了。不过这里有一个数学的trick。

  关于前向、后向的公式乘积我有一些自己的见解:


  假设路径必须讲过红色画圈的位置,那么前向到这里有3条路径,后向到这里也有三条路径,一共就是9条路径到达,这就是前向、后向算法的精髓!

  下面就是采用BP算法的思想进行调参,同样我还是以自己推导为例,如下图所示:



  之后就是采用TF实现CTC是否真正如论文所说的那样效果是state-of-art!


参考文献:https://blog.csdn.net/left_Think/article/details/76370453 





猜你喜欢

转载自blog.csdn.net/xwei1226/article/details/80889818