前一章说了WFST的determinzation这个算法,本章继续说说WFST中的优化操作,包括权重推移(weight pushing)和最小化操作(minimization)。
权重推移我们可以这么理解,我们有一双硕大的双手,然后对着WFST的尾巴一用力一推,然后权重就像波浪一样沿着各个路径被推向了前方,自行脑补~
效果图如下所示:
(注意tropical半环和log半环不太一样)
在很多序列识别的问题中我们都是通过找到最小的cost来解决问题的,那么在WFST中我们同样就是通过找到最大或者最小的权重路径来解决问题的。
而pushing后权重都集中在前面可以降低整体的搜索时间因为我们会一步步的把我们不需要的路径排除掉,这样一开始就可以排除掉了很多种可能路径。
一般的权重推移算法包括两个步骤:
1 给每个状态计算一个potential,计算方式如下:
2 很据上面计算的potential和实际权重差值来修改转移路径上的权重值。
两步的伪代码如下所示(比较简单就不详细说了):
而minimization算法是在weight pushing之后再采用一个经典的最小化算法(比较著名的是Hopcroft算法,Revuz算法等,计算复杂度不同)就可以了伪代码如下所示: