课程主页:http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html

视频地址:https://www.bilibili.com/video/BV1RE411g7rQ?p=1

参考资料:https://blog.csdn.net/qq_44574333/category_10304412_2.html

备注:图片均来自于课件。

这次回顾P6至P8,这部分介绍了语音识别的传统方法,由此引出端到端方法的训练方式。

语音识别(Speech Recognition)

这次紧接上次的内容,主要介绍语音识别的HMM视角。

引子

过去是用基于统计的模型求解语音识别问题:

该过程称为Decode,具体如下:

该问题实际上是很困难的,传统方法主要是通过近似的方法求解。

注意到概率的两部分对应两个模型:

  • $P(X|Y)$:声学模型,这部分主要是使用HMM。
  • $P(Y)$:语言模型。

下面具体介绍HMM。

HMM

参数介绍

HMM是对给定token($Y$),生成声学信号($X$)的条件概率建模,但是之前介绍的token对HMM来说都太大了(不够细),所以一般将token序列为状态序列:

具体来说,状态$S$比音素(phoneme)更细:

  1. phoneme:生成音素。
  2. tri-phone:由于音素的具体发音会受到前后的音素影响,所以将三个音素组合成一个tri-phone。
  3. state:对每个tri-phone,利用$k$个状态表示,一般$k=3,5$。

过程如下:

生成过程

语音识别的过程如下:

模型分为两个部分:

  • 转移概率:状态之间转移的概率分布。
  • 发射概率:给定状态,生成某个声音的概率分布,这部分常常使用GMM建模。
    • 由于概率分布是固定的,所以选择比音素更细的信息作为状态。
    • 如果选择字符的发音作为状态,那么c和ch中的c发音不同,建模比较困难。

具体如下:

一些问题

不难看出:

所以状态空间可能过多,但是不同state的发音可能相同,为了解决这点,有人提出了Subspace GMM模型:

概率计算

转移概率

利用数位语音处理的技术,我们可以计算出转移概率。

发射概率

注意状态和输出的对应关系我们是不知道的(通常输出的数量大于输入的数量),所以无法直接计算出$P(X|S)$。为了解决这点,我们需要对齐(alignment)的操作:对齐指定了每个状态生成了哪些向量。

对齐的例子:

对于此例来说,我们有三个state,所以不合法的对齐为:

利用对齐可以计算出发射概率:

如何应用深度学习

这部分介绍如何将深度学习和传统的方法结合。

Tandem

原本HMM的输入为MFCC,现在的思路是利用DL抽取新的声学特征:

具体思路如下:

  • 训练一个DNN状态分类器:
    • 输入MFCC。
    • 输出属于某个状态的概率分布。
  • HMM的输入MFCC替换为DNN的某一层。

DNN-HMM Hybrid

将GMM替换为DNN,然后利用贝叶斯公式计算概率:

我们的目标是计算$P(x|a)$,利用贝叶斯公式可以分解为三个部分:

  • $P(a|x)$:模型输出。
  • $P(x)$:忽略。
  • $P(a)$:从训练数据中统计。

如何训练

无论哪种方法,我们都需要对齐,但这事先是不知道的,需要用一些特殊的方法。

HMM

  1. 在没有对齐的数据上训练模型。
  2. 根据该模型计算对齐。

图示如下:

DNN

DNN使用了迭代训练的方法:

  1. 根据HMM的结果训练DNN。
  2. 根据该模型计算对齐。
  3. 根据新的数据训练模型。

图示如下:

回到端到端模型

这部分回到端到端模型,介其训练方法。

注意端到端模型计算的是:

但是模型计算的方式略有不同:

  • LAS,直接计算:

  • CTC,RNN-T需要对齐:

  • HMM:

LAS

训练:

解码:

利用端到端的方式训练即可。

CTC,RNN-T

这两个模型的训练方式类似:

  1. 枚举所有可能的对齐方式。

  2. 如何对所有对齐求和。

  3. 训练(涉及梯度计算):

  4. 测试(推理,解码):

后续依次介绍。

枚举所有可能的对齐方式

几种对齐的对比
  • HMM:重复字符。
  • CTC:重复或增加$\phi$。
  • RNN-T:增加$T$个$\phi$,最后一位为$\phi$,其中$T$为输入的长度。

这部分利用老师的课件很好理解:

HMM

算法是很平凡的,利用枚举即可:

这里老师利用格子图解释:

  • 横轴:声学特征。
  • 纵轴:token。

在格子图中有两种移动方式:

  • 向右移动(表示重复)
  • 向右下方移动(表示切换到下一个token)

限制:

  • 起点为左上角。
  • 终点为右下角。
  • 第一步向右下方移动。

从起点到终点的每条路径就是一个合法的对齐。

图示如下:

例如绿色的路径对应的对齐为:

错误的对齐:

CTC

CTC的区别在于有$\phi$符号。

算法:

格子图解释:

  • 横轴:声学特征。
  • 纵轴:token以及$\phi$,两个token之间有一个$\phi$。

有三种移动方式:

  • 向右移动(表示重复)
  • 向右下方移动(切换到下一个token)
  • 向右下走马步(插入$\phi$)。

限制:

  • 起点为左上角。
  • 终点为右下角。
  • 第一步不能向右移动。
  • 如果当前token和下一个token相同或者当前处于$\phi$,那么不能走马步。

从起点到终点的每条路径就是一个合法的对齐。

例子:

第4条限制是为了防止丢失token,图示如下:

RNN-T

RNN-T的区别于最后一步必然为$\phi$。

算法:

格子图解释:

  • 横轴:声学特征。
  • 纵轴:一个空白位置,token。

有两种移动方式:

  • 向右移动(插入$\phi$)。
  • 向下移动(切换到下一个token)。

限制:

  • 起点为第二行第二列。
  • 终点为右下角右边一格。

从起点到终点的每条路径就是一个合法的对齐。

例子:

小结

从状态转换图理解几种对齐的不同:

如何对所有对齐(路径)求和

一条路径的计算方式

以RNN-T为例,考虑对齐:

对应路径为:

现在结合路径的产生过程计算概率:

注意到RNN-T有两个RNN,其中一个是语言模型,不考虑$\phi$。

初始状态:

$h^1$是Encoder生成的向量,BOS是句子开始符号,输入到RNN中得到得到$l^0$,表示还没有产生token;将$l^0,h^1$输入到另一个RNN,得到概率分布$p_{1,0}$:

注意此时的输出是$\phi$,所以下一步$l^0$不变,另一个向量变成$h^2$:

这一步的输出为$c$,所以将$c$输入到语言模型,得到$l^1$,另一个输入依然为$h^2$,以此类推:

从而一条路径的概率为:

从之前例子中,不难看出$p_{i,j}$表示读取第$i$个声学特征,输出第$j$个token后产生的概率分布,从图示法来说,其表示每个格子中,产生token的概率分布:

事实上,每个格子的概率分布是固定的,和如何到达当前格子的路径无关,这点可以从如下数学推导中看出:

例如如下三种对齐对应相同的$p_{4,2}$:

备注:从这点来说,语言模型是很必要的,否则无法实现该特性。

多条路径的计算方式

接下来利用动态规划即可,定义:

  • $\alpha_{i,j}$:读取第$i$个声学特征并输出第$j$个token的所有路线的分数总和。

那么可以计算其递推关系:

  • 读取第$i$个声学特征并输出第$j$个token分数 =

    • 读取第$i -1$个声学特征并输出第$j$个token分数 $\times$ 读取第$i -1$个声学特征并输出第$j$个token后再读取$\phi$的概率 $+$ 读取第$i$个声学特征并输出第$j-1$个token分数 $\times$ 读取第$i$个声学特征并输出第$j-1$个token后再读取第$j$个token的概率

具体例子:

该例子的递推公式为:

训练(涉及梯度计算)

目标:

根据

计算梯度:

第一部分$\frac{ \partial p_{i,j}(t_{j+1})}{\partial\theta}$是RNN的梯度,所以只需要计算第二项即可:

为了计算该和式,定义

  • $\beta_{i,j}$:读取第$i$个声学特征并输出第$j$个token后到达终点的分数总和。

递推关系为:

图示:

要使得路径中包含$p_{i,j}(t_{j+1})$,必然是从$(i,j)$位置走到$(i,j+1)$位置:

图示法:

测试(推理,解码)

目标:

该方法的缺点是运算量太大,实际采用的方法是

所以分为两步即可:

图示:

上述方法是贪心法,可以用Beam Search提高效果。

总结

LAS CTC RNN-T
解码器 考虑前一时刻的输出 不考虑前一时刻的输出 考虑前一时刻的输出
对齐 没有明确(软对齐)
训练 直接训练 关于对齐求和 关于对齐求和
在线