Deep Learning for Human Language Processing Part 3(P6 to P8)
课程主页: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)更细:
- phoneme:生成音素。
- tri-phone:由于音素的具体发音会受到前后的音素影响,所以将三个音素组合成一个tri-phone。
- 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
- 在没有对齐的数据上训练模型。
- 根据该模型计算对齐。
图示如下:
DNN
DNN使用了迭代训练的方法:
- 根据HMM的结果训练DNN。
- 根据该模型计算对齐。
- 根据新的数据训练模型。
图示如下:
回到端到端模型
这部分回到端到端模型,介其训练方法。
注意端到端模型计算的是:
但是模型计算的方式略有不同:
LAS,直接计算:
CTC,RNN-T需要对齐:
HMM:
LAS
训练:
解码:
利用端到端的方式训练即可。
CTC,RNN-T
这两个模型的训练方式类似:
枚举所有可能的对齐方式。
如何对所有对齐求和。
训练(涉及梯度计算):
测试(推理,解码):
后续依次介绍。
枚举所有可能的对齐方式
几种对齐的对比
- 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 | |
---|---|---|---|
解码器 | 考虑前一时刻的输出 | 不考虑前一时刻的输出 | 考虑前一时刻的输出 |
对齐 | 没有明确(软对齐) | 是 | 是 |
训练 | 直接训练 | 关于对齐求和 | 关于对齐求和 |
在线 | 否 | 是 | 是 |