维特比算法浅析,如何理解时序的动态规划

Csdn懂个锤子  还不是IT内容!!!

在汉中,即使知道了读音,也就是我们小学学的拼音,要找到准确的对应的汉字还有一些困难,因为汉语中平均一个读音对应十几个汉字,即使你的四声读音非常准,耳朵也听得非常准(南方人其实常常做不到这一点),一个标上了四声声调的读音也对应了六个国标汉字。一音多字这个问题,在语音识别上会产生指数爆炸的灾难性后果。比如一个音对应6个字,从理论上讲,两个音的组合就可能对应36个字的组合,一个长度只有十个字的短句子,10个拼音所对应的全部汉字串,能组合出6的十次方,也就是6000万种可能性。如果句子更长,组合数还会快速增长。

当然,可能有人会说考虑到一些字会组成常用的词,那么情况并不会这么糟糕。这种考虑在语音识别中的确是需要的,通过这种精简,可以大大减少排列组合的数量。但是,即使每一两个拼音,只对应少数几个单字词或者双字词,当句子稍微长一点,组合数量还是大得惊人。我们假定在考虑了组词之后每个拼音平均对应两个字,10个音节(拼音)可能的组合只有一千多种,比6000万种好了很多,但是,如果一句话的长度到了20个音节,可能的组合数量又达到了百万种。语音识别其实是一个任务,就是需要在这上百万的候选中找到最合理、最可能的语句。

上述问题在通信中也会遇到,是一个标准的解码问题,那么怎么解决这个问题呢?将一百万种可能性一一评估显然不是一个好办法。对此维特比想到了一个特别妙的解码办法。为了比较清楚地说明问题,我把一句话的拼音和相应的汉字,做一个编号,按照下面的方式放到一张表中。

假如一个句子有20个音节,每个音节可能对应6个字,那么我们就用一个长为20,深度为6的网格将每个可能的字填入其中。

由于一个句子的音节按顺序从头到尾构成一个时间序列,因此,为了便于描述,我们用t表示音节的时间次序,将第一个音节标记为时间t=1,最后一个音节标记为时间t=20。

接下来,我们把每一个音节可以对应的汉字填入到相应的那一列的六个网格中,并且从1到6挨个标记。比如第一个音节对应的字,编号就是从W11,W12,到W16,第二个拼音对应的字,编号为W21,W22,到W26。编号中第一个数字是时间t,后一个数字是某个拼音所对应的六个候选汉字的序号。因此,到了最后一个拼音,即t=20,相应的字就是W201,W202,到W206。在下面的表格中,我填入了第一个音和第六个音的情况。

所谓的解码就是在这样的网格中,找一条从t=1到t=20的路径,路径中经过的点,就是方格中的一个个字,比如W13,W24,到W201,等等。下图给出了一条路径。当然,对于一个20个音节的句子,这样的路径有三千六百万亿条。解码的过程就是找到一条最合理的路径的过程,我们把它称为寻找最佳路径。

维特比算法浅析,如何理解时序的动态规划_第1张图片

在T1和T2时刻最短路径是6*6种,找出最短路径

对于这样路径密密麻麻的网格,维特比注意到这样一个现象:不论有多少条路径,最佳的那一条路径在某个特定时刻,只有六种可能。比如在t=6(也就是第六个音节)的时刻,必须经过W61,W62,W63......W66,这六个字中的一个。这样一来在第六个音节之前不论有多少条路径,真正有可能是最佳路径的候选路径,只可能有六条候选。

接下来,进入到第七个音节,由于这个音节也对应了6个汉字,和前面六条路径组合出6x6=36种可能性。但是,由于在第七个音节处,最佳的路径也只可能有六种(和t=6的情况一样)。因此,我们只需要对第七个音节的六个候选,W71,W72,W73......W76,每个候选保留一个最佳路径即可,这样一共也是六条。

以此类推,在每个时刻,我们只需要保留六条路径,将这个步骤一直走到t=20最后的时刻。如果对于上述内容你一时难以理解,也没有关系,只要记住,在任何时刻,只要保留六条路径就好。

这种算法是维特比最早发明的,因此被称为维特比算法。对于20个音节,每个音节有6个候选字这种情况,维特比算法将复杂度从6的20次方,即3600万亿,减少到6x6x20=720次,足足减少了20万亿倍。

你可能感兴趣的:(算法)