文章目录
前言1 Hidden Markov Model (HMM)1-1 传统HMM1-2 HMM+Deep Learning1-2-1 Tendam1-2-2 DNN-HMM混合模型2 Seq-to-Seq模型2-1 CTC2-2 RNN Transducer3 生成alignment时的异同3-1 如何穷举所有**alignment**3-2 如何对所有**alignment**求和3-3 如何训练3-4 如何解码(decoding, testing)前言
本文主要是李宏毅老师语音识别公开课(4/7)的笔记,图片也是从PPT中截取,全部课程可以参考这里,很推荐这里面讲RNN-T的部分,原始论文因为篇幅有限所以有些晦涩。
近几年语音领域的顶会发表了很多关于端到端Seq-to-Seq模型的研究,并且根据实验数据,在大规模语音数据集的支持下,他们的WER或者是CER都已经超过了传统的HMM,或者是hybrid HMM-DNN模型。但是以HMM为核心的开源工具kaldi仍然被用在工业应用的一线,低延迟和流式(straming)识别的能力使其备受青睐。在这里我想整理一下HMM和Seq-to-Seq模型的异同之处,并且分析一下各自的利弊,其中Seq-to-Seq模型主要以CTC和RNN-T模型最为代表,虽然课程中也讲到了LAS模型,这里就暂时不整理了。
1 Hidden Markov Model (HMM)
1-1 传统HMM
先是老生常谈的语音识别经典条件概率公式:
Y∗=argmaxYP(Y∣X)=argmaxYP(X∣Y)P(Y)P(X)=argmaxYP(X∣Y)P(Y)Y^*=\underset{Y}{argmax}P(Y|X)=\underset{Y}{argmax}\frac{P(X|Y)P(Y)}{P(X)}=\underset{Y}{argmax}P(X|Y)P(Y)Y∗=YargmaxP(Y∣X)=YargmaxP(X)P(X∣Y)P(Y)=YargmaxP(X∣Y)P(Y)
统计学的思想就是,给定一个序列的特征向量XXX,穷举出所有可能的token序列组合YYY,从这些token序列中找出使这个条件概率最大的序列作为识别结果Y∗Y^*Y∗,不管是HMM还是Seq-to-Seq模型他们不外乎都是在为P(X∣Y)P(X|Y)P(X∣Y)这个声学模型建模。
HMM中的序列单位既不是word也不是token,它比一个phoneme还要小,是一个state。我们首先说phoneme,或者音素,它是发音的最基本单位,以下图的waht do you think为例,他的phoneme可以拆解为hh w aa t d uw y uw th ih ng k,进一步phoneme还以拆解为triphone,比如上面的d可以拆解为t-d+uw,th可以拆解为uw-th+ih,注意这不是三个phoneme连在一起,而是将一个phoneme细分为更小的考虑上下文发音的单位。triphone还可以进一步细分,每个triphone还可为分解为多个state,一般是3个或者5个,比如上面的t-d+uw可以拆分为t-d+uw1 t-d+uw2 t-d+uw3。
在一个triphone中,从起始状态开始到终止状态结束,每个状态可以生成1个或多个特征向量,之后在跳转到下一个状态或者自跳转,在这里我们用状态序列S代替token序列Y,现在需要求解的就是P(X∣S)P(X|S)P(X∣S),即给定状态序列能生成什么样的特征向量序列。这里我们需要对转移概率(transition probability)和发射概率(emission probability)进行建模。对于转移概率,如果从状态a跳到状态b,用条件概率表示转移概率就是P(b∣a)P(b|a)P(b∣a),对于发射概率,我们需要知道给定一个state,这个state产生某一段特征向量的概率有多大,这里有一个前提条件,就是我们已经知道每个state产生的音频特征向量会遵循固定的概率分布P(X∣t−d+uw1)P(X|t-d+uw1)P(X∣t−d+uw1),这个分布我们用Gaussian Mixture Model (GMM)来表示。在HMM中之所以使用这么小的单位,是因为我们要确保每个状态都能对应不同的音频特征分布,只有这样我们的前提条件才能成立。
但此时出现了一个问题,那就是这么细分的话state数量会是指数级的,同时也就需要同样数量的GMM,但在我们的训练集中很可能某个state只出现几次,根本无法得知它对应的GMM长什么样子。为了解决这个问题便引入了Tied state技术,或者状态聚类,也就是将几个发音相似的state公用一个GMM,将极少出现的几个state并入到经常出现的state中,以大幅减少GMM的建模数量,人们很长一段时间都在研究将哪些state归为一类共用GMM,也就是决策树枝剪需要的规则,最终这种技术便发展为Subspace GMM。
现在我们假设已经知道了每个state的发射概率和转移概率(具体计算推荐参考这个公开课),也就是Pθ(X∣S)P_{\theta}(X|S)Pθ(X∣S)中的参数θ\thetaθ,但还是没法计算P(X∣S)P(X|S)P(X∣S),因为缺少关键的alignment,也就是说对于给定的特征向量序列,我们不知道哪些时刻的特征向量对应哪个state,很明显特征向量序列的长度是要大于state数量的,比如下图中的6个特征向量可以对应到aabbcc这样的state序列,即每个state按顺序产生2个特征向量,一旦有了alignment的信息,我们可以根据已知的发射概率P(x1∣a),P(x2∣a),...P(x6∣c)P(x^1|a),P(x^2|a),...P(x^6|c)P(x1∣a),P(x2∣a),...P(x6∣c)和转移概率P(a∣a),P(b∣a),...P(c∣c)P(a|a),P(b|a),...P(c|c)P(a∣a),P(b∣a),...P(c∣c)来计算P(X∣h1)P(X|h^1)P(X∣h1)。在不知道alignment的情况下,HMM的做法是穷举所有的alignment,也就是说
Pθ(X∣S)=∑h∈align(S)P(X∣h)P_{\theta}(X|S)=\sum_{h\in align(S)}P(X|h)Pθ(X∣S)=∑h∈align(S)P(X∣h),这里的hhh是所有有效的alignment。
1-2 HMM+Deep Learning
1-2-1 Tendam
Tandem方法基本上与传统HMM是一致的,唯一区别就是它不直接读取特征向量序列,而是先把每个时刻的特征向量送入DNN中做一个优化,之后将DNN的输出向量作为特征向量使用,其他的都和HMM保持一致。这里DNN的输出是一个维度为state个数的向量,输出层用一个softmax函数将输出结果表示为该时刻特征值属于各个state的概率是多少,如下图所示的[p(a∣xi),p(b∣xi),p(xi∣c)...][p(a|x^i), p(b|x^i), p(x^i|c)...][p(a∣xi),p(b∣xi),p(xi∣c)...],这是最早的HMM和深度学习结合的方法。
1-2-2 DNN-HMM混合模型
也就是DNN-HMM Hybrid,在传统的HMM中,我们用GMM来拟合某个state生成特征向量的概率分布p(x∣a)p(x|a)p(x∣a),那么我们希望可以用DNN来取代GMM。DNN计算的是给定某个特征向量,该特征向量属于哪个state的概率分布即p(a∣x)p(a|x)p(a∣x),因此我们用贝叶斯公式把他们结合起来,即
P(x∣a)=P(x,a)P(a)=P(a∣x)P(x)P(a)P(x|a)=\frac{P(x,a)}{P(a)}=\frac{P(a|x)P(x)}{P(a)}P(x∣a)=P(a)P(x,a)=P(a)P(a∣x)P(x)
这里的P(a∣x)P(a|x)P(a∣x)就对应DNN的输出,P(a)P(a)P(a)是某个状态出现的概率,可以通过统计训练集得到,由此我们可以直接用DNN的输出来代替GMM。而DNN优于GMM的主要原因是,我们可以发现之前的每个state对应一个GMM,每个GMM都有自己的均值向量和协方差矩阵,但DNN确是被所有state共用的,可以理解为一个终极Tied state。但同时我们也会注意到一个问题,DNN的训练是区分式训练(discriminative),不像GMM是生成式训练可以通过最大似然估计来进行迭代,DNN的训练需要label,即哪个特征向量对应哪个state,也就是上面说到的alignment,很明显我们不知道这种信息。这里采用的方法是先训练一个HMM-GMM模型用来生成一个alignment,再根据这个alignment训练DNN,也就是在kaldi中从monophone的训练到tri4训练的阶段。这种混合模型是现在最广泛被应用到产品中的模型,虽然最新的论文都是关于Seq-to-Seq的,但还没有被广泛应用。
2 Seq-to-Seq模型
2-1 CTC
CTC我比较熟悉,这里就暂时不做笔记了,但RNN-T没怎么用过,所以只对RNN-T单独做一下笔记
2-2 RNN Transducer
在说明RNN-T之前有必要引入RNA(Recurrent Neural Aligner)模型和CTC进行对比,CTC最大的特点就是给定一个输入(encoder之后的特征向量)产生一个输出,并且前后完全独立互不影响。如果将CTC的输出层替换成一个上下文相关的RNN,就转换成了RNA模型,如下图所示:
我们接着对RNA进一步改进,不再是一个输入对应一个输出的结构,而是使其给一个输入能够产生多个token输出,直到输出1个空字符ϕ\phiϕ表示需要下一个输入,也就是说最后ϕ\phiϕ的数量一定是和输入的长度相同,因为每一帧输入一定会产生一个ϕ\phiϕ,这一点在RNN-T的原始论文Sequence Transduction with Recurrent Neural Networks中几乎没有说明,我也看得很迷,该示意图如下图所示:
到此还不是RNN-T的完全体,因为还没有出现论文中的Prediction Network,原文中的Transcription Network对应的应该是一个特征向量的encoder,但他这个课程里面的示意图有一点很奇怪,那就是他的RNN输入除了输入特征向量和hidden state,还有前一帧的output distribution,一般RNN的输出可以写成:
ht=H(Wihit+Whhht−1+bh)h_t=H(W_{ih}i_t+W_{hh}h_{t-1}+b_h)ht=H(Wihit+Whhht−1+bh)
但这里是不是应该写成:
yt−1=softmax(F(ht−1))ht=H(Wih[it;yt−1]+Whhht−1+bh)y_{t-1}=softmax(F(h_{t-1}))\\h_t=H(W_{ih}[i_t;y_{t-1}]+W_{hh}h_{t-1}+b_h)yt−1=softmax(F(ht−1))ht=H(Wih[it;yt−1]+Whhht−1+bh)
这个问题先保留一下,回到上文,当前的模型还不是完全体的RNN-T,前面说的把CTC的ouptut layer直接替换成1个RNN,但实际上并不是直接替换,而是单独训练了一个RNN,也就是论文中的Prediction Network,他的输入序列长度就是所有非ϕ\phiϕtoken的序列长度,用(y1,y2,...,yU)(y_1, y_2, ..., y_U)(y1,y2,...,yU)来表示,输出序列也是该长度用(g1,g2,...gU)(g_1, g_2, ... g_U)(g1,g2,...gU)来表示,该输出序列通过下图中的红色箭头表示,可以看到它将上文的信息传递到当前时刻和当前时刻的输入hth_tht共同组成当前时刻的decoder输入:
同时这个Prediction Network不会将ϕ\phiϕ作为输入而是直接跳过。
3 生成alignment时的异同
CTC和RNN-T模型也需要alignment,因为输入和输出长度不同,所以要在输出的token中插入一些空字符nullnullnull,最后解码时再删掉空字符并且去重就得到最后的输出。和HMM一样,同一个输出token序列的alignment有很多种,也需要把所有可能的alignment概率加起来,
即P(Y∣X)=∑h∈align(Y)P(h∣X)P(Y|X)=\sum_{h\in align(Y)}P(h|X)P(Y∣X)=∑h∈align(Y)P(h∣X),其中解码和训练分别用下式表示,Y^\widehat{Y}Y表示标注的token序列:
Decoding:Y∗=argmaxYlogP(Y∣X)Training:θ∗=argmaxθlogPθ(Y^∣X)Decoding: Y^*=\underset{Y}{argmax} \space logP(Y|X) \\ Training: \theta^*=\underset{\theta}{argmax} \space log P_{\theta}(\widehat{Y}|X)Decoding:Y∗=YargmaxlogP(Y∣X)Training:θ∗=θargmaxlogPθ(Y∣X)
注意一下,这里区别已经出来了,Seq-to-Seq模型中可以直接求P(Y∣X)P(Y|X)P(Y∣X),不需要用贝叶斯公式转换,所以在对alignment求和时式子也就不一样:
HMM:Pθ(X∣S)=∑h∈align(S)P(X∣h)CTC,RNN−T:Pθ(Y∣X)=∑h∈align(Y)P(h∣X)HMM: P_{\theta}(X|S)=\sum_{h\in align(S)}P(X|h)\\ CTC,RNN-T: P_{\theta}(Y|X)=\sum_{h\in align(Y)}P(h|X)HMM:Pθ(X∣S)=h∈align(S)∑P(X∣h)CTC,RNN−T:Pθ(Y∣X)=h∈align(Y)∑P(h∣X)
下面主要针对这几个问题来讲解HMM和Seq-to-Seq模型的异同,问题设定是如下图所示的6帧输入特征向量,输出3个token。
3-1 如何穷举所有alignment
HMM:
HMM的做法是重复token,让token的长度和输入一致,比如ccaaat,或者caaaat… 直到穷举出所有有效的alignment。从第1帧开始可以选择重复当前token,或者输出下一个token,将这个过程用如下的表格表示的话,就是这个箭头只能往右走或者往右下走,终点一定是最后一帧的最后1个token, 不同颜色对应不同alignment,对于HMM,一般这个转态转换图的纵坐标应该是不同的state,这里用token是为了说明HMM和Seq-to-Seq模型的异同。
CTC:
CTC的做法是加入空字符ϕ\phiϕ,或者重复token让token的长度和输出保持一致,比如cϕ\phiϕaatt,或者ϕ\phiϕcaϕ\phiϕtϕ\phiϕ…。用graph表示的话如下图所示:
不同于HMM在每一点都可以向右或者向右下走,CTC中如果当前帧的token不是ϕ\phiϕ,那么下一步可以选择重复当前token,插入ϕ\phiϕ或者跳过ϕ\phiϕ输出下一个非ϕ\phiϕ的token,如果当前帧的token是ϕ\phiϕ,就不能跳过下一个token,否则输出就会少一个关键的token,这就是CTC在生成alignment时与HMM不同的地方,并且终点可以是以t为终点,也可以是以ϕ\phiϕ为终点。注意CTC中有一个特殊情况,那就是如果当前token(非ϕ\phiϕ)和下一个token(非ϕ\phiϕ)一样,那么就不能跳过下一个ϕ\phiϕ,否则输出里面就会把这两个token当做重复的token合并起来,必须通过ϕ\phiϕ把他们分开。
RNN-T:
在输出token中插入6个ϕ\phiϕ,也就是说每读取1帧特征向量都会生成1个ϕ\phiϕ,不同的插入方式会导致不同的alignment,比如cϕ\phiϕϕ\phiϕϕ\phiϕaϕ\phiϕϕ\phiϕtϕ\phiϕ…。RNN-T中插入算法如下图所示:
非ϕ\phiϕtoken只输出一次,任意token之间可以插入任意数量个ϕ\phiϕ,但最后一个token之后一定要插入ϕ\phiϕ,表示当前特征向量读取结束。用graph表示的话如下图所示:
向右表示插入1个ϕ\phiϕ,向下表示输出下1个token,最后一步必须至少插入1个ϕ\phiϕ,所以会向右多出来一块。注意这里和HMM,CTC不太一样,向右不是重复,而是插入一个ϕ\phiϕ。
总结:
用下图总结一下,虽然我们都画成一种像HMM那样的状态转移图,但实际上HMM是生成模型,而CTC和RNN-T是判别模型,在HMM中是通过3个state来生成特征向量,而CTC是给定特征向量输出特定的alignment,并且额外引入了ϕ\phiϕ。最后是RNN-T,很明显可以注意到他没有self-loop,进去某个token的state之后下一帧必须出来。
3-2 如何对所有alignment求和
实际上对所有alignment求和时,3个模型用的算法都是一样的,我们在这里用RNN-T举例,需要注意一下就是在RNN-T和CTC中输入的特征向量不是原始的MFCC或者filter bank,而是经过encoder之后的结果,一般用h1,h2..,hTh_1,h_2..,h_Th1,h2..,hT来表示。
RNN-T:
首先我们对一条路径计算score,或者概率,该路径如下图所示:
该路径可以表示为 h=ϕcϕϕaϕtϕϕh=\phi c\phi\phi a\phi t\phi\phih=ϕcϕϕaϕtϕϕ,在给定特征向量时该路径的score用下式计算:
P(h∣X)=P(ϕ∣X)P(c∣X,ϕ)P(ϕ∣X,ϕc)...P(h|X)=P(\phi|X)P(c|X,\phi)P(\phi|X,\phi c)...P(h∣X)=P(ϕ∣X)P(c∣X,ϕ)P(ϕ∣X,ϕc)...
如下图所示,我们给出第1个时刻的输入h1h_1h1,此时还没有任何token输出,因此我们用一个开始符号<BOS><BOS><BOS>作为Prediction Network的输入,把它的输出l0l_0l0和当前输入h1h_1h1一起送到decoder中产生1个output distribution的输出p1,0(ϕ)p_{1,0}(\phi)p1,0(ϕ),从这个distribution中我们可以得到第1个tokenϕ\phiϕ的输出概率。
因为第一帧的输出是ϕ\phiϕ,所以对于下一时刻的decoder输入,l0l_0l0保持不变,输入特征向量变成h2h_2h2,同样可以输出一个output distribution表示为p2,0p_{2,0}p2,0,可以得到输出token ccc的概率p2,0(c)p_{2,0}(c)p2,0(c)。直到最后输入h6h^6h6可以得到ϕ\phiϕ在最后一帧的概率p6,3(ϕ)p_{6,3}(\phi)p6,3(ϕ),将他们相乘就是这个alignment的概率:
h(h∣X)=p1,0(ϕ)p2,0(c)p2,1(ϕ)...p6,3(ϕ)h(h|X)=p_{1,0}(\phi)p_{2,0}(c)p_{2,1}(\phi)...p_{6,3}(\phi)h(h∣X)=p1,0(ϕ)p2,0(c)p2,1(ϕ)...p6,3(ϕ)
下面我们来讨论一下RNN-T中比较特别的地方,或者说为什么要单独训练一个RNN,如下图所示:
l0,l1,l2,l3l_0,l_1,l_2,l_3l0,l1,l2,l3分别表示Prediction Network对应<BOS>,c,a,t<BOS>, c, a, t<BOS>,c,a,t的输出,表格中的任意一
格都对应一个概率分布,比如这里的p4,2p_{4,2}p4,2,表示decoder将h4h_4h4和l2l_2l2作为输入是产生的token概率分布,同时很关键的一点是,每一格的概率分布和走到这一点的路径没有关系,不管怎么走,每一格的概率分布都是一定的,这个其实很好想,因为Prediction Network不接受ϕ\phiϕ作为输入,只看token,l0...l3l_0...l_3l0...l3都是固定的,自然而然每一格的概率分布也是固定的。
最后我们来计算所有alignment概率之和,用的方法和HMM是一样的,即前向后向算法,核心是动态规划,这里我们引入一个重要的参数 αi,j\alpha_{i,j}αi,j 来表示当走到第iii个输入特征向量hih_ihi并且输出第jjj个token时所有路径(alignment)的概率和。以下图为例:
为了计算α4,2\alpha_{4,2}α4,2,我们要先计算α4,1\alpha_{4,1}α4,1和α3,2\alpha_{3,2}α3,2,从α4,1\alpha_{4,1}α4,1到α4,2\alpha_{4,2}α4,2需要生成1个token a,而从α3,2\alpha_{3,2}α3,2到α4,2\alpha_{4,2}α4,2 需要生成1个ϕ\phiϕ,即 α4,2=α4,1p4,1(a)+α3,2p3,2(ϕ)\alpha_{4,2}=\alpha_{4,1}p_{4,1}(a)+\alpha_{3,2}p_{3,2}(\phi)α4,2=α4,1p4,1(a)+α3,2p3,2(ϕ)。那么通过动态规划算法就可以计算出最右下角的αi,j\alpha_{i,j}αi,j,
即αi,j=∑h∈align(Y)P(h∣X)\alpha_{i,j}=\sum_{h\in align(Y)}P(h|X)αi,j=∑h∈align(Y)P(h∣X)。
3-3 如何训练
到目前为止,我们得到的是 Pθ(Y∣X)=∑h∈align(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),实际上我们并不知道θ\thetaθ,也就是说不先对模型进行训练是无法计算alignment概率之和的,训练的目的是更新参数θ\thetaθ,用下式表示就是:
θ∗=argmaxθlogPθ(Y^∣X)\theta^*=\underset{\theta}{argmax} log P_{\theta}(\widehat{Y}|X) θ∗=θargmaxlogPθ(Y∣X)
Y^\widehat{Y}Y是标注的token序列,希望能够训练出的参数使得在给定特征向量的条件下,输出的Y^\widehat{Y}Y的概率最大。HMM用的训练方法是EM迭代,RNN-T和CTC都用梯度下降,即计算∂P(Y^∣X)∂θ\frac{\partial{P(\widehat{Y}|X)}}{\partial{\theta}}∂θ∂P(Y∣X)。
下面我们来计算这个偏微分
前面讲过,P(Y^∣X)=∑hP(h∣X)P(\widehat{Y}|X)=\sum_hP(h|X)P(Y∣X)=∑hP(h∣X),而其中每个alignment的概率都是由若干概率相乘得到的,如下图所示:
我们以这样一个alignment为例:ϕcϕϕaϕtϕϕ\phi c\phi\phi a\phi t\phi\phiϕcϕϕaϕtϕϕ,P(h∣X)=p1,0(ϕ)p2,0(c)...p6,3(ϕ)P(h|X)=p_{1,0}(\phi)p_{2,0}(c)...p_{6,3}(\phi)P(h∣X)=p1,0(ϕ)p2,0(c)...p6,3(ϕ),而pi,j(token)p_{i,j}(token)pi,j(token)又是由模型计算出来的,因此我们用链式求导公式可以得到:
∂P(Y^∣X)∂θ=∂p1,0(ϕ)∂θ∂P(Y^∣X)∂p1,0(ϕ)+...+∂p4,1(a)∂θ∂P(Y^∣X)∂p4,1(a)+...\frac{\partial{P(\widehat{Y}|X)}}{\partial{\theta}}=\frac{\partial{p_{1,0}(\phi)}}{\partial{\theta}}\frac{\partial{P(\widehat{Y}|X)}}{\partial{p_{1,0}(\phi)}}+...+\frac{\partial{p_{4,1}(a)}}{\partial{\theta}}\frac{\partial{P(\widehat{Y}|X)}}{\partial{p_{4,1}(a)}}+...∂θ∂P(Y∣X)=∂θ∂p1,0(ϕ)∂p1,0(ϕ)∂P(Y∣X)+...+∂θ∂p4,1(a)∂p4,1(a)∂P(Y∣X)+...
以p4,1(a)p_{4,1}(a)p4,1(a)为例,∂p4,1(a)∂θ\frac{\partial{p_{4,1}(a)}}{\partial{\theta}}∂θ∂p4,1(a)实际上就是对模型用BP求梯度,这里主要记一下链式求导的后一项∂P(Y^∣X)∂p4,1(a)\frac{\partial{P(\widehat{Y}|X)}}{\partial{p_{4,1}(a)}}∂p4,1(a)∂P(Y∣X),为了求这一项,我们可以将P(Y^∣X)P(\widehat{Y}|X)P(Y∣X)分成两个部分,一部分是包含p4,1(a)p_{4,1}(a)p4,1(a)的所有路径,另一部分是不包含p4,1(a)p_{4,1}(a)p4,1(a)的所有路径,即:
P(Y^∣X)=∑hwithp4,1(a)P(h∣X)+∑hwithoutp4,1(a)P(h∣X)P(\widehat{Y}|X)=\sum_{h\space with \space p_{4,1}(a)}P(h|X)+\sum_{h\space without \space p_{4,1}(a)}P(h|X)P(Y∣X)=hwithp4,1(a)∑P(h∣X)+hwithoutp4,1(a)∑P(h∣X)
求偏微分时很明显后面一项直接为0,同时前一项的P(h∣X)P(h|X)P(h∣X)也可以写成P(h∣X)=p4,1(a)×otherP(h|X)=p_{4,1}(a) \times otherP(h∣X)=p4,1(a)×other,我们可以得到:
∂P(Y^∣X)∂p4,1(a)=∑hwithp4,1(a)other=∑hwithp4,1(a)P(h∣X)p4,1(a)=1p4,1(a)∑hwithp4,1(a)P(h∣X)\frac{\partial{P(\widehat{Y}|X)}}{\partial{p_{4,1}(a)}}=\sum_{h\space with p_{4,1}(a)}other=\sum_{h\space with \space p_{4,1}(a)}\frac{P(h|X)}{p_{4,1}(a)}=\frac{1}{p_{4,1}(a)}\sum_{h\space with \space p_{4,1}(a)}P(h|X)∂p4,1(a)∂P(Y∣X)=hwithp4,1(a)∑other=hwithp4,1(a)∑p4,1(a)P(h∣X)=p4,1(a)1hwithp4,1(a)∑P(h∣X)
最后一项实际上就是所有通过p4,1(a)p_{4,1}(a)p4,1(a)的路径概率值和,为了计算这个我们再引入一个参数βi,.j\beta_{i,.j}βi,.j,和αi,j\alpha_{i,j}αi,j相反,表示从第iii个特征向量,以及已经产生jjj个token开始,走到终点所有的路径概率总和,如下图所示:
比如图中的β4,2\beta_{4,2}β4,2就是从已经经过444个特征向量,并且产生222个token这一点开始,不管怎么走,走到终点所有alignment概率之和,同样地为了计算β4,2\beta_{4,2}β4,2,需要知道β5,2\beta_{5,2}β5,2和β4,3\beta_{4,3}β4,3,即β4,2=β4,3p4,2(t)+β5,2p4,2(a)\beta_{4,2}=\beta_{4,3}p_{4,2}(t)+\beta_{5,2}p_{4,2}(a)β4,2=β4,3p4,2(t)+β5,2p4,2(a),表格中所有点的β\betaβ都可以用动态规划计算出来,有了所有点的αi,j\alpha_{i,j}αi,j和βi,j\beta_{i,j}βi,j,就可以计算出所有包含p4,1(a)p_{4,1}(a)p4,1(a)的所有路径概率之和,如下图所示 (熟悉HMM中的前向后向算法的话这个图一看就能明白):
即
∑hwithp4,1(a)P(h∣X)=α4,1p4,1(a)β4,2\sum_{h\space with \space p_{4,1}(a)}P(h|X)=\alpha_{4,1}p_{4,1}(a)\beta_{4,2}hwithp4,1(a)∑P(h∣X)=α4,1p4,1(a)β4,2
进一步可以得到偏微分:
∂P(Y^∣X)∂θ=∂p1,0(ϕ)∂θ∂P(Y^∣X)∂p1,0(ϕ)+...+∂p4,1(a)∂θα4,1β4,2+...\frac{\partial{P(\widehat{Y}|X)}}{\partial{\theta}}=\frac{\partial{p_{1,0}(\phi)}}{\partial{\theta}}\frac{\partial{P(\widehat{Y}|X)}}{\partial{p_{1,0}(\phi)}}+...+\frac{\partial{p_{4,1}(a)}}{\partial{\theta}}\alpha_{4,1}\beta_{4,2}+...∂θ∂P(Y∣X)=∂θ∂p1,0(ϕ)∂p1,0(ϕ)∂P(Y∣X)+...+∂θ∂p4,1(a)α4,1β4,2+...
3-4 如何解码(decoding, testing)
模型训练好之后就需要解码,即输出1个最优的token序列:Y∗=argmaxYlogP(Y∣X)Y^*=\underset{Y}{argmax}\space log P(Y|X)Y∗=YargmaxlogP(Y∣X),但这里的P(Y∣X)P(Y|X)P(Y∣X)还是要写成∑h∈align(Y)P(h∣X)\sum_{h\in align(Y)}P(h|X)∑h∈align(Y)P(h∣X),也就是说还要找到所有的alignment再对其概率求和才行,这样的得到的token序列肯定是最优解,但实际上这样做成本很高,一般的做法是把上面的式子简化为下式:
Y∗=argmaxYmaxh∈align(Y)logP(h∣X)Y^*=\underset{Y}{argmax}\space \underset{h \in align(Y)}{max}log P(h|X)Y∗=Yargmaxh∈align(Y)maxlogP(h∣X)
解释一下就是用概率最大的一个alignment去代替所有alignment之和,也就是认为除了概率最大的alignment,其他的概率之和都很小,不用考虑。那么现在的任务就转换为找到1个概率最大的alignment,即
h∗=argmaxhlogP(h∣X)h^*=\underset{h}{argmax}\space logP(h|X)h∗=hargmaxlogP(h∣X),这就又回到了beam search和greedy search的问题。