隐马尔科夫模型(HMM)困扰我很长时间,其困扰我的真正原因不是其计算过程,只不过是流程性的东西,大家可以阅读很多大神的博客,心得等。之前很多人讲到HMM总会说它的前向算法、后向算法以及维特比搜索算法是动态规划,而我也一直表示怀疑。
因为动态规划要求这个问题要符合最优子结构性质,即要求问题的最优解包含其子问题的最优解 [Thomas H. Cormen etc. 算法导论]。这是很显然的,在书中分别举了钢材分段和矩阵联乘的例子来说明。然而对于HMM的前向算法和后向算法,我感觉只能称得上它用了一种列举所有可能性的简单的递归算法,称不上是严格意义上的动态规划,因为它整个过程缺少对最优子结构的求解,注意是最优一词。其实前向和后向算法,初始化之后,每个时刻隐状态的值都是可以唯一确定的,里面不存在最优的技巧(如果非得把唯一的值叫成最优也行,不过那就没什么意义了,唯一的意义就是给算法蒙上一层神秘色彩,让很多人看不懂,让自己显得高大上)。人家钢材切割等例子确实会针对每一个规模的子问题集合中所有的元素进行比较,求出最优子问题,而HMM对于每一个规模的子问题集合中元素的比较在哪里呢?它这个集合只有一个元素还比什么呢?其实就是一个简单的递归搜索,没必要说成是动态规划这么高大上。对于维特比算法也一样,虽然它里面用到了max,但也不是对每一个子问题本身求最优,而是列出几个子问题,选择最好的一个子问题,这个与动态规划也有本质的区别,其实它也是前后向算法,只不过是一个取巧的方式而已。
当然了,整个过程也不是没有求最优的地方,那就是当我们用前向和后向算法或者维特比将每个时刻,节点的值都求出来之后,我们需要在每个时刻选一个最大或者最小值(求下一个时刻的时候用了上一个时刻所有状态的组合或者最大值,在最后生成路径的时候,却只选了一个,这和最优子结构性质不是同一路),这里涉及到了比较,不过这不能算作是动态规划的过程,因为它只是比较每个时刻所有值,并且选一个最大的和前面的过程相对独立,不能混为一谈。因为很多地方声称的是,前向、后向和维特比是动态规划,然而上一段已经解释了,为什么上述算法不是最优子结构性质。
无论如何还是很佩服先人的创造力,不然也不会让我挂在心上很久。
原来如此啊,维特比和前后向搜索算法,是带有剪枝的动态规划,并不是完整的动态规划算法,这个东西看你怎么给他取名字了,简单直观点的名字,就是一个搜索比较算法。求出的解也只是次优解。动态规划能求出全局最优解的,动态规划记录了上一个规模子问题的所有可能的取值,没有漏掉任何一个,并且传给下一层。