HMM(隐含马尔可夫模型)
HMM参数
中文分词为例:
隐藏(状态)序列:词语的词性 States = {B,M,E,S}
观察序列:每个词语(小明 ,去,学校,了)
状态转移矩阵A,其中第i行j列表示状态i转移到状态j的概率(转移概率)
状态序列到观察序列的分布矩阵B,即每个单词为某一次性的概率(发射概率)
这个时候我们就完成了训练阶段的参数估计,得到了
三个概率矩阵:
- TransProbMatrix: 转移概率矩阵(array_A)
- EmitProbMatrix: 发射概率矩阵(array_B)
- InitStatus: 初始状态分布(array_pi)
两个序列:
- 观察序列
- 状态序列
推导算法:
Viterbi(维特比)算法
viterbi算法解决HMM
假设我们需要测试语句为:小明是中国人
- 初始状态矩阵通过训练数据的统计很容易得到。
- 发射概率矩阵统计训练集每个状态下这个单词出现的次数即可。
- 转移矩阵统计每一个状态下,下一个状态的数量即可。
观察矩阵已给出,我们需要的是得到状态矩阵。
算法编程思想:动态规划法。
- 设p[n][state]表示已n结束的序列中n的状态为state最大概率。
- 则n+1只需要考虑n为state的最大概率即可
- 单词1:p[0][state] = array_pi[state]*array_b[state]['小']
- 单词n:p[n][state] = p[n-1][pre_state]*array_a[pre_state][state]*array_b[state0][sentence[i]]
HMM中文分词进阶
- 在上诉实验中我们只考虑到了一个单词对于前一个单词的转移概率,但是在实际上一个单词不仅仅与前一个单词有关,可能与前后多个。有关
- 在HMM中概率可以用log表示,这样可以达到平滑的效果。
CRF(条件随机场)
判别模型与生成模型
HMM与CRF的区别
HMM是生成式模型,它的发射概率和转移概率由统计得到,是上帝信息,它在统计出两个概率的情况下,用维特比算法得到最优路径。HMM有两大假设,一个是有限历史假设,二是输出独立假设。前者说明一个隐状态的转移概率只与上一个隐状态有关,CRF定义了很多特征函数,可以引入很多全局特征来计算这个转移概率,即crf++里面的转移特征函数。后者限定了隐状态和显状态之间的依赖,同理,crf里面的状态特征函数也可以引入很多全局特征。
crf里面可以自定义很多特征函数,它是判别模型,由HMM的概率图转为函数拟合,你就把它理解为它的特征函数即是它的一个个特征,我们要学习的东西是特征函数的权重,在预测的时候就和逻辑回归的分类器类似。
它的全局最优在于它是计算完序列概率之后进行归一化,而不是标注一个归一化一次(类似最大熵马尔可夫模型),这样就解决了MEMM的标注偏执问题。
如果你用CRF++的话,拥有训练集的情况下,你只要手写模板,定义一个词的前后多少unigram或者bigram对这次标注有影响,会自动生成很多特征函数,在训练的时候特征函数会训练出不同的权重。预测的时候,顺着无数个特征函数的打分加起来,会得到一个score,与其他不同标注方式的打分做做归一化就能得到概率了。