李宏毅老师2020新课深度学习与人类语言处理课程主页:
http://speech.ee.ntu.edu.tw/~tlkagk/courses_DLHLP20.html
视频链接地址:
https://www.bilibili.com/video/BV1RE411g7rQ
课件ppt已上传至资源,可免费下载使用
对于语音辨识系统的三个模型HMM 、CTC、RNN-T,我们将解决四个问题,并做三个模型的总结比较。
在上两篇P5、P6中,我们明晰了HMM、CTC、RNN-T的模型细节,但都遇到了同样的问题,那就是Encoder生成的hidden state(或HMM的state)与token间的长度不等,导致的alignment的问题。
在此,我们提出了4个问题:
下面让我们来解决剩下的三个问题,注意,本节有一定挑战性。
以下计算都以RNN-T为例,CTC、HMM同理
在算所有的alignments的总和之前,我们先来算一条路径的一个alignment的概率,如上图所示。
我们选取一条alignment , h = c a t ,我们要怎么计算给acoustic feature x1-6 来产生这个这个alignment h的几率呢?
首先,先计算 在句首的几率 P(|X),再计算 给了 产生 c的几率 P(c|X,),再计算已产生 c 后生成 的几率 P(|X, c),…,依次类推,直到计算到P(|X,cat)。最终将这些几率累乘,便是这一个路径也就是一个alignment的几率。
对于RNN-T而言,模型会先读取第一个acoustic feature h1(经过encoder的x1),同时RNN-T另外训练了一个RNN,这个RNN会把decoder产生出来的token当作输入(注意,忽略),生成l去影响RNN-T接下来的输入,正如上图,左上角就是这个单独训练的RNN。
具体而言,对于上图的h的概率计算:
首先,另外训练的RNN(上图左上角,蓝色框框)因为一开始没有token故输入初始token
总而言之,计算P(h|X)中的每一项就是按步查找按照对应的probability distribution,对本例而言,也就是 在p1,0的几率,c在p2,0的几率, 在p2,1的几率,…, 在p6,3的几率 的累乘(上上图的路径累乘),就是这个alignment的几率。
RNN-T特别之处,就在于它特别把token和token之间的关系独立用另外一个RNN来表示,而这个RNN是忽略的,那这样做到底对训练有什么好处呢?
上图表格中的每一个格都对应到一个固定的概率的distribution,如上图的蓝点(x4,a)代表p4,2 (而这个p4,2正如上文所讲,第一个下标代表由第几个acoustic feature产生,第二个下标代表decoder已经产生了几个token)因此 这里的p4,2指的是读到x4的acoustic feature,已经产生了2个token c和a,并已经放到了单独训练的RNN里产生l2。因此,
关键点:每个格子代表的distribution不受到如何走到这个格子所影响。
就比如我们走到p4,2这个格子有很多种走法,但一走到这个格子,这个格子代表的distribution是固定的。
至此,请思考:为什么这里的每个格子代表的distribution是不受路径影响的?
回答:具体而言,如这个p4,2,参见2的图示,它代表它由第4个acoustic feature h4 和已经产生了两个token (c a)并输入到单独训练的RNN产生的l2决定。对于h4它只与已经产生的的个数有关,l2只与已经产生的token数目有关。这个单独训练的RNN是独立的,它只处理token,故无论在什么位置,对于顺序固定的token,它的输出都是一样的。
既然我们已经知道如何计算一条路径(即一个alignment的几率),那我们该怎样求得所有alignments的总和呢?
在这里,我们首先定义 α i , j α_{i,j} αi,j,代表考虑所有已经读了 i 个acoustic feature 和 输出 j 个token,我们把这些分数统统加总起来就是 α i , j α_{i,j} αi,j。
而上面表格中每一个格子也同样对应一个 α i , j α_{i,j} αi,j,如 α 4 , 2 α_{4,2} α4,2格子,把所有读过4个acoustic feature且输出2个token的路径统统找出来,将概率累加,如图所示的殊途同归的路线。
而这个 α 4 , 2 是 由 α 4 , 1 和 α 3 , 2 产 生 α_{4,2}是由α_{4,1} 和 α_{3,2}产生 α4,2是由α4,1和α3,2产生,计算式为:
α 4 , 2 = α 4 , 1 ∗ p 4 , 1 ( a ) + α 3 , 2 ∗ p 3 , 2 ( ϕ ) α_{4,2} = α_{4,1} * p_{4,1} (a) + α_{3,2} * p_{3,2} (\phi) α4,2=α4,1∗p4,1(a)+α3,2∗p3,2(ϕ)
而其中 p 4 , 1 ( a ) 和 p 3 , 2 ( ϕ ) p_{4,1}(a) 和p_{3,2}(\phi) p4,1(a)和p3,2(ϕ)是可由固定的distribution的概率得到,至此 α i , j α_{i,j} αi,j可依次计算得到,而最右下角的 α i , j α_{i,j} αi,j就是所有alignments的总和(用dynamic programming方法从左上一直算到右下即可)。
至此,我们已经能够计算
P θ ( Y ∣ X ) = ∑ h ∈ a l i g n ( Y ) P ( h ∣ X ) P_{\theta}(Y|X) = \sum_{h\in align(Y)}P(h|X) Pθ(Y∣X)=∑h∈align(Y)P(h∣X)
综上,我们已经知道RNN-T的参数要怎么计算 P θ ( Y ∣ X ) P_{\theta}(Y|X) Pθ(Y∣X),那么在训练中我们的目标是
假设给一段声音讯号x和人工标注的对应文字 Y ^ \hat{Y} Y^,我们希望找到参数 θ \theta θ使得 P θ ( Y ^ ∣ X ) P_{\theta}(\hat{Y}|X) Pθ(Y^∣X)的概率最越大越好。而使用深度学习方法,我们会用gradient descent的方法来优化参数。
要做梯度下降,我们就必须要计算参数 θ \theta θ对 P θ ( Y ∣ X ) P_{\theta}(Y|X) Pθ(Y∣X)的偏微分:
而对于 P ( Y ^ ∣ X ) P(\hat{Y}|X) P(Y^∣X)是由所有可能的alignment组成的,如下图,由这些几率相乘以后相加。
正是这些参数影响了每个格子产生 token 或 的几率,最终影响了 P θ ( Y ^ ∣ X ) P_{\theta}(\hat{Y}|X) Pθ(Y^∣X),以同样可以知道$P_{\theta}(\hat{Y}|X)对 θ \theta θ 的偏微分也可以通过这些路径求得。
根据微分公式的分布,亦即,如下图:
对每一项的微分都可以分步成两个部分的乘积,让我们先看第一项第一部分的微分计算方式
以 p 4 , 1 ( a ) 对 θ p_{4,1}(a) 对\theta p4,1(a)对θ的偏微分作为例子,如上图,我们只需使用Backpropagation(因为用RNN,故要through time),先初始化参数产生 p 4 , 1 p_{4,1} p4,1,接下来Bp更新参数,和训练一般的神经网络是一样的。
第一项的第一部分已可以求得。
接下来,我们要计算 p ( Y ^ ∣ X ) 对 p 4 , 1 ( a ) p(\hat{Y}|X)对p_{4,1}(a) p(Y^∣X)对p4,1(a)的偏微分
其中 p ( Y ^ ∣ X ) p(\hat{Y}|X) p(Y^∣X)是由很多alignment组成的,我们先把它们分成两类,一类是有 p 4 , 1 ( a ) p_{4,1}(a) p4,1(a),另外一类是没有 p 4 , 1 ( a ) p_{4,1}(a) p4,1(a),然后分别加起来。接下来,我们对这两类可以分别做偏微分并加和,而第二类不包含 p 4 , 1 ( a ) p_{4,1}(a) p4,1(a)故偏微分为0;第一类由 p 4 , 1 ( a ) p_{4,1}(a) p4,1(a) x other组成,偏微分后只剩other,而这个other可以写成 p ( h ∣ X ) p 4 , 1 ( a ) \frac{p(h|X)}{p_{4,1}(a)} p4,1(a)p(h∣X),提出 p 4 , 1 ( a ) p_{4,1}(a) p4,1(a)只剩 P ( h ∣ X ) P(h|X) P(h∣X)。
那么,我们该怎么计算 ∑ h ∣ w i t h p 4 , 1 ( a ) P ( h ∣ X ) \sum_{h|with p_{4,1}(a)}{P(h|X)} ∑h∣withp4,1(a)P(h∣X)呢,至此,我们引入一个新的符号 β \beta β,刚才我们已经知道怎么算 α \alpha α了,这个 β i , j \beta_{i,j} βi,j和 α i , j \alpha_{i,j} αi,j很像,只不过它代表的是从i,j点到终点的alignments的概率和,示例如下图,算法和 α i , j \alpha_{i,j} αi,j一样。
至此 ∑ h ∣ w i t h p 4 , 1 ( a ) P ( h ∣ X ) \sum_{h|with p_{4,1}(a)}{P(h|X)} ∑h∣withp4,1(a)P(h∣X) 可以写成 α 4 , 1 p 4 , 1 ( a ) β 4 , 2 \alpha_{4,1} p_{4,1}(a) \beta_{4,2} α4,1p4,1(a)β4,2 ,将 p 4 , 1 ( a ) p_{4,1}(a) p4,1(a)约掉:
第一项的第二部分只剩 α 4 , 1 β 4 , 2 \alpha_{4,1} \beta_{4,2} α4,1β4,2,这两者都可求得
至此,第一项的偏微分已经求得了,剩余项一样的算法。
在我们已经知道怎么通过Gradient descent更新参数训练模型后,训练好模型后我们该怎么做测试,即Decoding呢?
我们现在有了模型的参数,所以我们可以算出 P ( Y ∣ X ) P(Y|X) P(Y∣X),接下来在语音辨识的时候,声音讯号给定了即X,要找出Y,使得 P ( Y ∣ X ) P(Y|X) P(Y∣X)最大,这个使得 P ( Y ∣ X ) P(Y|X) P(Y∣X)最大的Y便是语音辨识的结果。
理想上:找一个Y,使得 ∑ P ( h ∣ X ) \sum{P(h|X)} ∑P(h∣X)最大
但现实中 : 使得 P ( Y ∣ X ) P(Y|X) P(Y∣X)最大是比较困难的,要穷举所有的Y算出 P ( Y ∣ X ) P(Y|X) P(Y∣X),在实作上,有一种近似的方法,就是我们把 ∑ P ( h ∣ X ) \sum{P(h|X)} ∑P(h∣X)替换成 max P ( h ∣ X ) \max{P(h|X)} maxP(h∣X),就是将align(Y)范围内的h的求和替换成范围内使得概率最大的h
我们不把每一个Y所有的alignments的分数加起来,我们只比每一个Y,它范围内h分数最高的alignment,得到该h后,反向alignment得到我们预测的 Y ^ \hat{Y} Y^
这两种方法在P4 Attend里有详细讲解,不再阐述。
这个RNN-T training部分其实是比较困难的,如果前面讲的东西你没有听的很懂,那没有关系,你并不孤单
如果你对RNN-T training部分没有看懂,至少你可以看一下这三个常用模型的比较。