1. forward algorithm
\quad一个HMM的Acoustic likelihood可以用前向算法(forward algorithm)来计算。给定一个HMM模型MMM,一个特征向量序列o1,o2,...oTo_1,o_2,...o_To1,o2,...oT,模型MMM能够生成OOO的似然度, 即声学似然度P(O∣M)P(O|M)P(O∣M)定义如下:
(1)P(O∣M)=∑SP(O,S∣M)=∑Sπs1bs1(o1)as1s2bs2(o2)...asT−1sTbsT(oT)\begin{aligned}
P(O|M)&=\sum_{S}P(O,S|M) \\
&=\sum_{S}\pi_{s1}b_{s1}(o_1)a{s_1s_2}b_{s2}(o_2)...a_{s_{T-1}s_T}b_{s_T}(o_T)\tag{1}
\end{aligned}P(O∣M)=S∑P(O,S∣M)=S∑πs1bs1(o1)as1s2bs2(o2)...asT−1sTbsT(oT)(1)
\quad其中SSS表示状态序列s1,s2,...sTs_1,s_2,...s_Ts1,s2,...sT,在ttt时刻的状态为sts_tst。
\quad上面那个公式(1),是对所有可能产生观察序列的状态序列的转移概率和发射概率的和。然而枚举所有可能的假设需要很大的计算量。为了让这个求和效率更高一点,咱们可以用前向算法,一种递归的方式来进行计算。
(2)α(1,s)=πsbs(o1)α(t,s)=∑σ∈Sα(t−1,σ)aσsbsot\begin{aligned}
\tag{2}\alpha(1,s)&=\pi_sb_s(o_1)\\
\alpha(t,s)&=\sum_{\sigma\in{S}}\alpha(t-1,\sigma)a_{\sigma s}b_s{o_t}
\end{aligned}α(1,s)α(t,s)=πsbs(o1)=σ∈S∑α(t−1,σ)aσsbsot(2)
\quad其中,α(t,s)\alpha(t,s)α(t,s)表示的是在ttt时刻处于sss状态的前向概率。表示在ttt时刻,模型MMM输出o1,o2,...oto_1,o_2,...o_to1,o2,...ot,并且在ttt时刻到达sss状态的概率,即p(o1,o2,...,ot,st=s∣M)p(o_1,o_2,...,o_t,s_t=s|M)p(o1,o2,...,ot,st=s∣M)。所以最终输出o1,o2,...oTo_1,o_2,...o_To1,o2,...oT的概率为:
(3)p(O∣M)=∑s∈Fα(T,s)\begin{aligned}
\tag{3}p(O|M)=\sum_{s\in{\mathcal{F}}}\alpha(T,s)
\end{aligned}p(O∣M)=s∈F∑α(T,s)(3)
2. decode
\quad在解码的时候,我们一般用 Viterbi 算法,Viterbi 算法通过下面的公式来得到最可能输出OOO的状态序列的似然度。
(4)P~(O∣M)=maxSP(O,S∣M)=maxSπs1bs1(o1)as1s2bs2(o2)...asT−1sTbsT(oT)\begin{aligned}
\tag{4}\tilde{P}(O|M)&=\max\limits_SP(O,S|M) \\
&=\max\limits_S\pi_{s1}b_{s1}(o_1)a_{s_1s_2}b_{s2}(o2)...a_{s_{T-1}s_T}b_{s_T}(o_T)
\end{aligned}P~(O∣M)=SmaxP(O,S∣M)=Smaxπs1bs1(o1)as1s2bs2(o2)...asT−1sTbsT(oT)(4)
\quad这个式子看起来和前向很像,区别就在于用求最大值替换了求和。两者的区别根源在于所要完成的任务的不同,公式(1)的目的是想要看输出是OOO的可能性有多大。而(4)的目的是求最有可能输出OOO的状态序列。那公式(2)也可以为解码所用。不过会有一些改动如下:
(5)α~(1,s)=πsbs(o1)α~(t,s)=maxσ∈Sα~(t−1,σ)aσsbsot\begin{aligned}
\tag{5}\tilde{\alpha}(1,s)&=\pi_sb_s(o_1)\\
\tilde{\alpha}(t,s)&=\max\limits_{\sigma\in{S}}\tilde{\alpha}(t-1,\sigma)a_{\sigma s}b_s{o_t}
\end{aligned}α~(1,s)α~(t,s)=πsbs(o1)=σ∈Smaxα~(t−1,σ)aσsbsot(5)
\quadα~(t,s)\tilde{\alpha}(t,s)α~(t,s)模型MMM沿着最有可能的状态输出o1,o2,...oto_1,o_2,...o_to1,o2,...ot,并且在ttt时刻到达sss。这个时候,每个时刻就只用考虑一个状态了。那最终的:
(6)p~(O∣M)=maxs∈Fα~(T,s)\begin{aligned}
\tag{6}\tilde{p}(O|M)=\max\limits_{s\in{\mathcal{F}}}\tilde{\alpha}(T,s)
\end{aligned}p~(O∣M)=s∈Fmaxα~(T,s)(6)
\quad这个p~(O∣M)\tilde{p}(O|M)p~(O∣M)也叫做 Viterbi score。在每个时刻选择的状态,整个连接起来就形成了一条路径,我们管它叫 Viterbi path。
3. Viterbi algorithm for asr
\quad在语音识别解码问题上,有几个总出现的公式
(7)W^=argmaxW∈WP(W∣O)\begin{aligned}
\tag{7}\hat{W}=\arg\max\limits_{W\in{\mathcal{W}}}P(W|O)
\end{aligned}W^=argW∈WmaxP(W∣O)(7)
\quad根据贝叶斯公式:
(8)W^=argmaxW∈WP(O∣W)P(W)P(O)=argmaxW∈WP(O∣W)P(W)\begin{aligned}
\tag{8}\hat{W}&=\arg\max\limits_{W\in{\mathcal{W}}}\frac{P(O|W)P(W)}{P(O)}\\
&=\arg\max\limits_{W\in{\mathcal{W}}}P(O|W)P(W)
\end{aligned}W^=argW∈WmaxP(O)P(O∣W)P(W)=argW∈WmaxP(O∣W)P(W)(8)
\quad假定每个句子假设WWW是一个由w1,w2,...,wMww_1,w_2,...,w_{M_w}w1,w2,...,wMw组成的序列,那么 word-level的分数为:
(9)W^=argmaxW∈W∑S∈SWP(O,S∣W)P(W)=argmaxW∈W∑S∈SW∏m=1MWp(otm−1+1tm,stm−1+1tm∣wm)P(wm∣w1m−1)\begin{aligned}
\tag{9}\hat{W}&=\arg\max\limits_{W\in{\mathcal{W}}}\sum_{S\in{S_W}}P(O,S|W)P(W)\\
&=\arg\max\limits_{W\in{\mathcal{W}}}\sum_{S\in{S_W}}\prod_{m=1}^{M_W}p(o_{t_{m-1}+1}^{t_m},s_{t_{m-1}+1}^{t_m}|w_m)P(w_m|w_{1}^{m-1})
\end{aligned}W^=argW∈WmaxS∈SW∑P(O,S∣W)P(W)=argW∈WmaxS∈SW∑m=1∏MWp(otm−1+1tm,stm−1+1tm∣wm)P(wm∣w1m−1)(9)
\quad其中P(otτ,stτ∣w)P(o_t^\tau,s_t^\tau|w)P(otτ,stτ∣w)表示的是www沿着状态st,...,sτs_t,...,s_{\tau}st,...,sτ生成ot,...,oτo_t,...,o_{\tau}ot,...,oτ的似然度。SwS_wSw表示是的WWW可能的状态序列。tmt_mtm表示的是词wmw_mwm的结束帧,由状态序列SSS决定。此处,t0=0t_0=0t0=0。
\quad使用Viterbi算法进行解码的时候,最优的词序列W^\hat{W}W^是由最有可能的状态序列生成的。具体计算如下:
(10)W^=argmaxW∈WmaxS∈SWP(O,S∣W)P(W)=argmaxW∈WmaxS∈SW∏m=1MWp(otm−1+1tm,stm−1+1tm∣wm)P(wm∣w1m−1)=argmaxW∈WmaxT∈TW∏m=1MWp~(otm−1+1tm,stm−1+1tm∣wm)P(wm∣w1m−1)\begin{aligned}
\tag{10}\hat{W}&=\arg\max\limits_{W\in{\mathcal{W}}}\max\limits_{S\in{S_W}}P(O,S|W)P(W)\\
&=\arg\max\limits_{W\in{\mathcal{W}}}\max\limits_{S\in{S_W}}\prod_{m=1}^{M_W}p(o_{t_{m-1}+1}^{t_m},s_{t_{m-1}+1}^{t_m}|w_m)P(w_m|w_{1}^{m-1})\\
&=\arg\max\limits_{W\in{\mathcal{W}}}\max\limits_{T\in{\mathcal{T}_W}}\prod_{m=1}^{M_W}\tilde{p}(o_{t_{m-1}+1}^{t_m},s_{t_{m-1}+1}^{t_m}|w_m)P(w_m|w_{1}^{m-1})
\end{aligned}W^=argW∈WmaxS∈SWmaxP(O,S∣W)P(W)=argW∈WmaxS∈SWmaxm=1∏MWp(otm−1+1tm,stm−1+1tm∣wm)P(wm∣w1m−1)=argW∈WmaxT∈TWmaxm=1∏MWp~(otm−1+1tm,stm−1+1tm∣wm)P(wm∣w1m−1)(10)
\quad突然冒出来的TW\mathcal{T_W}TW表示的是可能的结束帧序列的集合。T∈TWT\in{\mathcal{T}_W}T∈TW是一个时间帧序列,这个序列和句子里面的没歌词是对应的,表示为:t1,...,tMWt_1,...,t_{M_W}t1,...,tMW。所以对于一个词序列的 Viterbi score ,可以通过 word-level 的 Viterbi Score 和对应的语言概率来累乘得到。
\quad为了更加有效地找到W^\hat{W}W^,避免枚举所有可能的WWW,单个词的 Viterbi 算法可以通过在不同的词HMM之间引入词间状态转移来扩展一下。词间状态转移是通过类似于FSG(finite state grammer)来定义的。n-gram模型同样可以应用于此,因为n-gram可以当做是一个 probabilistic FSG(PFSG),只不过每一个状态转移之间加了一个概率而已。
\quad一个PFSG可以定义为一个七元组:
(11)G=(Q,V,E,I,F,P,π)\tag{11}G=(\mathcal{Q,V,E,I,F},P,\pi)G=(Q,V,E,I,F,P,π)(11)具体含义如下:
- Q\mathcal{Q}Q:状态集合;
- V\mathcal{V}V:词标签集合,比如词典;
- E\mathcal{E}E:状态转移集合;
- I\mathcal{I}I:初始状态集合;
- F\mathcal{F}F:结束状态集合;
- P:QP:\mathcal{Q}P:Q x Q\mathcal{Q}Q —>[0, 1] 状态转移概率函数;
- π\piπ —> [0, 1] 初始状态概率函数
\quad如果GGG是一个 bigram LM,那么每个词分配一个状态。假定pwp_wpw表示词www的状态,那么www的初始概率π(pw)\pi(p_w)π(pw)就等于unigram LM中的P(w)P(w)P(w)。词vvv到词www之间状态转移概P(pw∣pv)=P(w∣v)P(p_w|p_v)=P(w|v)P(pw∣pv)=P(w∣v)。如果是trigram LM,那么对应的就每个状态都是一个词对(Word pair),对应的状态转移概率就是 trigram LM 中的概率。
\quad给定一个输出序列o1,o2,...,oTo_1, o_2,...,o_To1,o2,...,oT以及一个gammar(我也不知道咋翻译这个……),grammar的每一个词都对应着一个词HMM,这个HMM包含着状态的词标签。
\quad当使用word HMM的时候,每一个模型都被扩展了,加了一个初始状态和终止状态。假定一个grammar 状态ppp的Word HMM为θp=(Sp,Yp,Ap,Bp,∏p,F)\theta_p=(\mathcal{S_p,Y_p,A_p,B_p,\prod_p,F})θp=(Sp,Yp,Ap,Bp,∏p,F),其中,Ap={aσs(p)∣σ∈Sp}\mathcal{A_p}=
\{ a_{\sigma s}^{(p)}|\sigma \in \mathcal S_p \}Ap={aσs(p)∣σ∈Sp}为状态转移矩阵,Bp={bs(p)(o)∣s∈Sp,o∈Yp}\mathcal{B_p}=\{b_s^{(p)}(o)|s\in \mathcal S_p, o\in \mathcal Y_p\}Bp={bs(p)(o)∣s∈Sp,o∈Yp}为状态发射矩阵,∏p={πs(p)∣s∈Sp}\mathcal{\prod_p}=\{\pi_s^{(p)}|s\in \mathcal{S_p}\}∏p={πs(p)∣s∈Sp}为初始状态。我们用ipi_pip和fpf_pfp来表示初始和终止状态。
给定一个解码图,对于输入的utterance,可以用 one-pass viterbi algorithm 来得到最有可能的词序列。这个算法也被称为时间同步维特比搜索。下面详述这个过程。
\quadα~(t,p,s)\tilde\alpha(t,p,s)α~(t,p,s):在一个grammar state ppp (其实就是一句话中的一个词)中,直到ttt时刻,处于状态sss的某条路径的Viterbi score。
\quadB(t,p,s)B(t,p,s)B(t,p,s):a back pointer(回溯指针?……太难了太难了),来追踪在grammar state ppp 中,直到ttt时刻处于状态sss最可能的词序列的路径。B(t,p,s)B(t,p,s)B(t,p,s)有一对<τ,q><\tau,q><τ,q>,其中呢τ\tauτ表示与grammar state ppp 绑定的词的开始帧,qqq是在ppp之前的最有可能的 grammar state。如果 ppp 之前没有grammar state,那么q=0q=0q=0。
在这个utterance的结束帧,我们可以通过back-tracking来找到最有可能的词序列。具体的就是用那个回溯指针来找。
\quad令 Adj(sss)表示状态 sss 的邻近状态列表。Woerd(ppp)表示 grammar state ppp的词标签。如果 ppp是个空状态,Word(ppp)返回ϵ\epsilonϵ,表示空字符串。
Step 1: Initialization
\qquad for each grammar states p∈Qp\in \mathcal{Q}p∈Q,
\qquad\quadfor each HMM state s∈Sps\in\mathcal{S_p}s∈Sp,
(12)α~(0,p,s)={πpif p∈I and s=ipmaxq∈Qα~(0,q,fq)P(p∣q)if p∉I and s=ip0otherwise\tag{12}\tilde\alpha(0,p,s)=\begin{cases}\pi_p&\text{if }p\in\mathcal{I}\text{ and }s=i_p\\
\max\limits_{q\in\mathcal{Q}}\tilde\alpha(0,q,f_q)P(p|q)&\text{if }p\notin\mathcal{I}\text{ and }s=i_p\\
0&\text{otherwise}
\end{cases}α~(0,p,s)=⎩⎪⎪⎨⎪⎪⎧πpq∈Qmaxα~(0,q,fq)P(p∣q)0if p∈I and s=ipif p∈/I and s=ipotherwise(12)
(13)B(0,p,s)=<0,0>\tag{13}B(0,p,s)=<0,0>B(0,p,s)=<0,0>(13)
Step 2: Time-synchronous processing
\qquadFor time frames: t=1,2,...,Tt=1,2,...,Tt=1,2,...,T
\qquad\quad Intra-word transition:
\qquad\qquad for each grammar states p∈Qp\in \mathcal{Q}p∈Q,
\qquad\qquad\qquadfor each HMM state s∈Sp−{ip,fp}s\in\mathcal{S_p-\{i_p,f_p\}}s∈Sp−{ip,fp},
a~(t,p,s)=maxσ∈(Sp−{ip,fp})\begin{aligned}\tilde{a}(t,p,s)&=\max\limits_{\sigma\in(S_p-\{i_p,f_p\})}
\end{aligned}a~(t,p,s)=σ∈(Sp−{ip,fp})max