WFST相关学习

2019-01-14  本文已影响0人  习惯了千姿百态

知识准备


G非空,G上定义二元运算 *:满足已下条件:
(1)封闭性 \forall a,b \in Ga*b \in G
(2)结合律 \forall a,b,c\in G(a*b)*c=a*(b*c)
(3)幺元\exists e,\forall a\in Ga*e=e*a=a
(4)逆元\forall a\in G,\exists a^{-1}使得a^{-1}*a=a*a^{-1}=e
则称(G,*)
若只满足条件(1)(2)则(G,*)半群

具有两个二元运算+,\centerdot的非空集合S,满足:
(1)(S,*)是阿贝尔群
(2) (S,\centerdot)为半群
(3)\forall a,b,c\in S(a+b)+c=ac+bc, c(a+b)=ca+cb
语音处理常用的半环

常见环
WFST符号化表示
composition algorithm

Q:记录composition之后的状态集
S:是一个队列,保存遇到的所有状态
代码1-2:初始化Q,S,都初始为I_1,I_2的笛卡尔乘积
代码3-16:对队列S中的状态进行遍历操作
  代码4-5:从S中取出一个状态对(q_1,q_2)
  代码6-8:判断这个状态对是不是初始状态,如果是,则更新composition之后的初始状态I,更新初始状态的权重
  代码9-11:判断是否是终止状态
  代码12-16:遍历所有从q_1,q_2出发的转移,如果这两条的转移满足e_1的输出等于e_2的输入,那么就可以合并
    代码13-15:判断合并后的转移的终点状态(n[e_1],n[e_2])是不是新的状态(不在Q里面),如果是新的状态则加入Q,并插入队列S
    代码16:产生新的转移,加入composition之后的转移集合E

determination

首先定义了一个weighted subset

weighted subset
大概的意思是:
determination algorithm

代码1-3:将(初始状态,\bar{1})对(即,带权状态)插入队列S
代码5-6:从S中取出一个带权状态集合p'
代码7-16:对p'中各个带权状态对应状态出发转移的所有输入x进行操作
  代码8:更新新的状态的权值,把p'中每一个状态对的权值与该状态对出发转移上的权值做\otimes,然后再进行\oplus
  代码9:更新状态,E[Q[p']]p'中的状态对应的所有转移
  代码10:产生新的转移,加入集合E'
  代码11:判断这个状态q'是不是新的状态
     代码12:把q'加入新的状态集Q'
     代码13:判断这个状态对集合q'中的状态有没有终止态
       代码14-15:将这个状态q'加入终止态集合F'中,并更新其权值
     代码16:把状态q'插入队列S
WFST-determination例子演示

weight-pushing

主要分两步,第一步:计算potential值,第二步:更新权值,起始,终止状态的权值
计算potential:


计算potential

代码1-7:初始化V[q],如果是终止状态就赋值终止状态的权值,否则赋值\bar 0
代码14:从终止状态开始往前,E^{-1}[q]表示以q为终点的转移(个人理解...)
代码15:比较当前状态p[e]到终点的最短路径与 w[e]\otimes R哪个小(tropical semiring下),R表示从q到终点的最短路径
代码18:如果是出现新的状态插入队列S
r不知道有啥用。。。没看懂,这个算法解读仅供参考吧)
第二步更新:

更新
分别更新开始状态的权重,中间状态的弧的权重,结束状态的权重
WFST-weight-pushing 例子

minimization

最小化是建立在确定化和weight-pushing的前提下,把整个图再次精简,使状态数最小。
对一个WFST进行最小化操作分为两个步骤:

参考资料:
1.WFST详解
2.WFST核心算法
3.Speech recognition with weighted finite-state transducers

上一篇 下一篇

猜你喜欢

热点阅读