1. forward algorithm
\quad
一个HMM的Acoustic likelihood可以用前向算法(forward algorithm)来计算。给定一个HMM模型
M
M
M,一个特征向量序列
o
1
,
o
2
,
.
.
.
o
T
o_1,o_2,...o_T
o1,o2,...oT,模型
M
M
M能够生成
O
O
O的似然度, 即声学似然度
P
(
O
∣
M
)
P(O|M)
P(O∣M)定义如下:
(1)
P
(
O
∣
M
)
=
∑
S
P
(
O
,
S
∣
M
)
=
∑
S
π
s
1
b
s
1
(
o
1
)
a
s
1
s
2
b
s
2
(
o
2
)
.
.
.
a
s
T
−
1
s
T
b
s
T
(
o
T
)
\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
其中
S
S
S表示状态序列
s
1
,
s
2
,
.
.
.
s
T
s_1,s_2,...s_T
s1,s2,...sT,在
t
t
t时刻的状态为
s
t
s_t
st。
\quad
上面那个公式(1),是对所有可能产生观察序列的状态序列的转移概率和发射概率的和。然而枚举所有可能的假设需要很大的计算量。为了让这个求和效率更高一点,咱们可以用前向算法,一种递归的方式来进行计算。
(2)
α
(
1
,
s
)
=
π
s
b
s
(
o
1
)
α
(
t
,
s
)
=
∑
σ
∈
S
α
(
t
−
1
,
σ
)
a
σ
s
b
s
o
t
\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)表示的是在
t
t
t时刻处于
s
s
s状态的前向概率。表示在
t
t
t时刻,模型
M
M
M输出
o
1
,
o
2
,
.
.
.
o
t
o_1,o_2,...o_t
o1,o2,...ot,并且在
t
t
t时刻到达
s
s
s状态的概率,即
p
(
o
1
,
o
2
,
.
.
.
,
o
t
,
s
t
=
s
∣
M
)
p(o_1,o_2,...,o_t,s_t=s|M)
p(o1,o2,...,ot,st=s∣M)。所以最终输出
o
1
,
o
2
,
.
.
.
o
T
o_1,o_2,...o_T
o1,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 算法通过下面的公式来得到最可能输出
O
O
O的状态序列的似然度。
(4)
P
~
(
O
∣
M
)
=
max
S
P
(
O
,
S
∣
M
)
=
max
S
π
s
1
b
s
1
(
o
1
)
a
s
1
s
2
b
s
2
(
o
2
)
.
.
.
a
s
T
−
1
s
T
b
s
T
(
o
T
)
\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)的目的是想要看输出是
O
O
O的可能性有多大。而(4)的目的是求最有可能输出
O
O
O的状态序列。那公式(2)也可以为解码所用。不过会有一些改动如下:
(5)
α
~
(
1
,
s
)
=
π
s
b
s
(
o
1
)
α
~
(
t
,
s
)
=
max
σ
∈
S
α
~
(
t
−
1
,
σ
)
a
σ
s
b
s
o
t
\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)模型
M
M
M沿着最有可能的状态输出
o
1
,
o
2
,
.
.
.
o
t
o_1,o_2,...o_t
o1,o2,...ot,并且在
t
t
t时刻到达
s
s
s。这个时候,每个时刻就只用考虑一个状态了。那最终的:
(6)
p
~
(
O
∣
M
)
=
max
s
∈
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
^
=
arg
max
W
∈
W
P
(
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
^
=
arg
max
W
∈
W
P
(
O
∣
W
)
P
(
W
)
P
(
O
)
=
arg
max
W
∈
W
P
(
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
假定每个句子假设
W
W
W是一个由
w
1
,
w
2
,
.
.
.
,
w
M
w
w_1,w_2,...,w_{M_w}
w1,w2,...,wMw组成的序列,那么 word-level的分数为:
(9)
W
^
=
arg
max
W
∈
W
∑
S
∈
S
W
P
(
O
,
S
∣
W
)
P
(
W
)
=
arg
max
W
∈
W
∑
S
∈
S
W
∏
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
)
\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
(
o
t
τ
,
s
t
τ
∣
w
)
P(o_t^\tau,s_t^\tau|w)
P(otτ,stτ∣w)表示的是
w
w
w沿着状态
s
t
,
.
.
.
,
s
τ
s_t,...,s_{\tau}
st,...,sτ生成
o
t
,
.
.
.
,
o
τ
o_t,...,o_{\tau}
ot,...,oτ的似然度。
S
w
S_w
Sw表示是的
W
W
W可能的状态序列。
t
m
t_m
tm表示的是词
w
m
w_m
wm的结束帧,由状态序列
S
S
S决定。此处,
t
0
=
0
t_0=0
t0=0。
\quad
使用Viterbi算法进行解码的时候,最优的词序列
W
^
\hat{W}
W^是由最有可能的状态序列生成的。具体计算如下:
(10)
W
^
=
arg
max
W
∈
W
max
S
∈
S
W
P
(
O
,
S
∣
W
)
P
(
W
)
=
arg
max
W
∈
W
max
S
∈
S
W
∏
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
W
∈
W
max
T
∈
T
W
∏
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
)
\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
突然冒出来的
T
W
\mathcal{T_W}
TW表示的是可能的结束帧序列的集合。
T
∈
T
W
T\in{\mathcal{T}_W}
T∈TW是一个时间帧序列,这个序列和句子里面的没歌词是对应的,表示为:
t
1
,
.
.
.
,
t
M
W
t_1,...,t_{M_W}
t1,...,tMW。所以对于一个词序列的 Viterbi score ,可以通过 word-level 的 Viterbi Score 和对应的语言概率来累乘得到。
\quad
为了更加有效地找到
W
^
\hat{W}
W^,避免枚举所有可能的
W
W
W,单个词的 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 : Q P:\mathcal{Q} P:Q x Q \mathcal{Q} Q —>[0, 1] 状态转移概率函数;
- π \pi π —> [0, 1] 初始状态概率函数
\quad
如果
G
G
G是一个 bigram LM,那么每个词分配一个状态。假定
p
w
p_w
pw表示词
w
w
w的状态,那么
w
w
w的初始概率
π
(
p
w
)
\pi(p_w)
π(pw)就等于unigram LM中的
P
(
w
)
P(w)
P(w)。词
v
v
v到词
w
w
w之间状态转移概
P
(
p
w
∣
p
v
)
=
P
(
w
∣
v
)
P(p_w|p_v)=P(w|v)
P(pw∣pv)=P(w∣v)。如果是trigram LM,那么对应的就每个状态都是一个词对(Word pair),对应的状态转移概率就是 trigram LM 中的概率。
\quad
给定一个输出序列
o
1
,
o
2
,
.
.
.
,
o
T
o_1, o_2,...,o_T
o1,o2,...,oT以及一个gammar(我也不知道咋翻译这个……),grammar的每一个词都对应着一个词HMM,这个HMM包含着状态的词标签。
\quad
当使用word HMM的时候,每一个模型都被扩展了,加了一个初始状态和终止状态。假定一个grammar 状态
p
p
p的Word HMM为
θ
p
=
(
S
p
,
Y
p
,
A
p
,
B
p
,
∏
p
,
F
)
\theta_p=(\mathcal{S_p,Y_p,A_p,B_p,\prod_p,F})
θp=(Sp,Yp,Ap,Bp,∏p,F),其中,
A
p
=
{
a
σ
s
(
p
)
∣
σ
∈
S
p
}
\mathcal{A_p}= \{ a_{\sigma s}^{(p)}|\sigma \in \mathcal S_p \}
Ap={aσs(p)∣σ∈Sp}为状态转移矩阵,
B
p
=
{
b
s
(
p
)
(
o
)
∣
s
∈
S
p
,
o
∈
Y
p
}
\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
∈
S
p
}
\mathcal{\prod_p}=\{\pi_s^{(p)}|s\in \mathcal{S_p}\}
∏p={πs(p)∣s∈Sp}为初始状态。我们用
i
p
i_p
ip和
f
p
f_p
fp来表示初始和终止状态。
给定一个解码图,对于输入的utterance,可以用 one-pass viterbi algorithm 来得到最有可能的词序列。这个算法也被称为时间同步维特比搜索。下面详述这个过程。
\quad
α
~
(
t
,
p
,
s
)
\tilde\alpha(t,p,s)
α~(t,p,s):在一个grammar state
p
p
p (其实就是一句话中的一个词)中,直到
t
t
t时刻,处于状态
s
s
s的某条路径的Viterbi score。
\quad
B
(
t
,
p
,
s
)
B(t,p,s)
B(t,p,s):a back pointer(回溯指针?……太难了太难了),来追踪在grammar state
p
p
p 中,直到
t
t
t时刻处于状态
s
s
s最可能的词序列的路径。
B
(
t
,
p
,
s
)
B(t,p,s)
B(t,p,s)有一对
<
τ
,
q
>
<\tau,q>
<τ,q>,其中呢
τ
\tau
τ表示与grammar state
p
p
p 绑定的词的开始帧,
q
q
q是在
p
p
p之前的最有可能的 grammar state。如果
p
p
p 之前没有grammar state,那么
q
=
0
q=0
q=0。
在这个utterance的结束帧,我们可以通过back-tracking来找到最有可能的词序列。具体的就是用那个回溯指针来找。
\quad
令 Adj(
s
s
s)表示状态
s
s
s 的邻近状态列表。Woerd(
p
p
p)表示 grammar state
p
p
p的词标签。如果
p
p
p是个空状态,Word(
p
p
p)返回
ϵ
\epsilon
ϵ,表示空字符串。
Step 1: Initialization
\qquad
for each grammar states
p
∈
Q
p\in \mathcal{Q}
p∈Q,
\qquad\quad
for each HMM state
s
∈
S
p
s\in\mathcal{S_p}
s∈Sp,
(12)
α
~
(
0
,
p
,
s
)
=
{
π
p
if
p
∈
I
and
s
=
i
p
max
q
∈
Q
α
~
(
0
,
q
,
f
q
)
P
(
p
∣
q
)
if
p
∉
I
and
s
=
i
p
0
otherwise
\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
\qquad
For time frames:
t
=
1
,
2
,
.
.
.
,
T
t=1,2,...,T
t=1,2,...,T
\qquad\quad
Intra-word transition:
\qquad\qquad
for each grammar states
p
∈
Q
p\in \mathcal{Q}
p∈Q,
\qquad\qquad\qquad
for each HMM state
s
∈
S
p
−
{
i
p
,
f
p
}
s\in\mathcal{S_p-\{i_p,f_p\}}
s∈Sp−{ip,fp},
a
~
(
t
,
p
,
s
)
=
max
σ
∈
(
S
p
−
{
i
p
,
f
p
}
)
\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