使用HMM模型时我们的问题一般有这两个特征:
生成模型是指对联合概率建模,判别模型是对条件概率建模 ,HMM模型属于生成模型,因为HMM模型中没有建立决策边界,而是直接对联合概率分布建模。当给定观测序列时,我们使用前向算法计算每条状态序列的概率,选取概率最大的状态序列路径作为序列标注的结果
HMM基于两个重要假设:
如果你有机器学习的基础,那你很可能学习过K-Means算法,这是一种无监督的聚类算法。它本质上就是一种EM算法。对于给定的许多个无标签的样本点,K-Means可以将他们聚成任意n个类别。具体的做法是先随机选取数据集中的n个点作为聚类的质心点,计算每个点到每个质心点的距离,将他们归类到距离最小的类别下;然后对于每一个类别,重新计算其质心点;我们反复迭代进行上述的归类和质心计算的步骤,直到质心不再变化。随机初始化和重置质心的过程其实就是EM算法的E步,计算样本点到质心的距离并将其聚类到最近的质心的过程其实就是EM算法的M步。
K-Means算法直接对样本点进行归类,而不是计算每个类别的概率,所以属于Hard EM。Hard EM和 Soft EM的区别和我之前在吴恩达的深度学习课程上看到的 SoftMax和HardMax的区别很像,个人感觉本质是一样。
总结一下,当我们的样本没有给定标注数据,即只有句子没有词性时,我们可以对需要学习的三个参数矩阵进行随机初始化(np.rand),初步确定模型,然后极大化数据的某种似然,调整得到新的参数矩阵,通过不断地迭代,参数矩阵将逐渐收敛,当它们的变化范围缩小到某个可以被接受的阈值时,我们可以停止迭代,将当前的参数矩阵用于预测。
需要注意的是,EM算法无法保证全局最优解,和梯度下降算法非常类似,他们能够稳定达到全局最优的条件都是似然函数(损失函数)是一个凸函数。(PS:似然函数和损失函数的关系我个人认为非常紧密,后面会专门写一篇blog说一下这个问题)
前向后向算法的使用,主要是因为对于网格中的每一个状态,它既计算到达此状态的“前向”概率(给定当前模型的近似估计),又计算到达此状态的“后向”概率(给定当前模型的近似估计)。 这些都可以通过利用递归进行加速计算。使用前向算法和后向算法的相互合作,我们可以得到很多有用的信息,并可以将它们运用在EM算法过程中的极大化似然估计上。(PS:这里的Forward算法和后面Viterbi算法中的Forward算法并不完全相同,这里是 sum-product ,你可以看作是神经网络中的正向传播过程,对于传至当前状态的概率进行求和;而后者是 max-product,对于传至当前状态的概率取最大值 )
这里顺带说一句,前向算法还可以用于计算序列的概率,从而选择模型。如果我们训练了多个词性标注的HMM模型,那么对于一个需要标注的句子,我们可以通过前向算法计算它在不同模型中可能出现的概率,然后选取最大概率的模型用于预测。
在这里,我们使用一种叫做维特比(viterbi)算法的动态规划算法进行状态序列的解码,也就是词性序列的预测。
维特比算法是一种动态规划求解篱笆网络(Lattice)的最优路径问题的方法。通俗看懂维特比
简单阐述一下就是:状态矩阵中,当前节点的值等于上一层各节点的值乘以对应的转移路径的权值所得结果中的最优值(max-product),同时,我们还建立一个回溯矩阵,保存状态矩阵中每个节点的值是由上一层的哪个节点转移而来。当前向传播计算到最后一层时,我们选取最后一层的节点中的最优值,并通过回溯矩阵反向回溯得到对应的最优序列。特别地,在隐马尔可夫模型中,我们在前向传播计算每个节点最优值的时候,还需要考虑发射概率。
通过维特比算法,我们可以较快的利用训练好的模型去预测一个句子的最大概率词性序列,并输出。
在实际运用模型的过程中,我们还会发现这样的一个问题:训练得到的参数矩阵很可能是较为稀疏的,例如从一个词性从未发射到某个单词过。同时,训练集的规模有限,不可能包含所有的词和词性。由于状态矩阵的转移涉及概率的累乘,上述未登录的情况将导致发射或转移或初始概率为0,进而使得前向传播计算出的整条序列地概率为0
为了解决零概率问题,我们需要还引入平滑方法,例如Laplace平滑等
平滑参考
至此可以了解HMM的详细训练和解码流程