HMM
HMM的表示
隐马模型的概率图如下(出自PRML图13.5)。
因此,由上述的概率图,可以写出对应的联合概率分布。假设状态序列有N个观测值(当然,因为是序列数据,以T为变量的写法会更常见,不过为了统一,HMM这块都参考PRML里面的notation来解释),则:
其中,马尔科夫链的相关参数称为转移矩阵(transition matrix)A,即
综上,整个HMM的参数可以表示成
HMM的训练
虽然HMM中有隐状态,但是做参数估计的时候,如果有必要且成本可以接受的话,是可以给观测序列标记对应的隐状态的。比如基于HMM做中文分词或词性标注,可以在中文分词训练数据中标明每个字的位置状态(即BEMS-词首/词尾/词中/单字),在词性标注训练数据中明确指出每个词的词性。这种情况下,训练就变成了一个有监督的过程。那么这个训练过程就可以简单的用极大似然估计求解,直接得到解析解(跟朴素贝叶斯求解时的情况类似,似然函数是连乘项,取log后是各参数独立的加和项,非常容易求)。
但是还有一些情况,隐状态确实是无法标注的。比如在语音识别中,会利用HMM构建声学模型,观测值是声音信号分帧之后经过特征抽取形成的特征向量,隐状态代表了音素状态。比如最简单的单音素三状态表示,分别是起始状态(与前一音素可能存在关联),中间状态(稳定),结尾状态(与后一音素可能存在关联)。音素状态又可以对应到音素,最终通过词典对应到词。这里的因素状态就是无法人为识别的。因此这个时候就需要利用无监督学习,那么含有隐变量的模型自然用到的是EM算法。用EM算法求解HMM是一个特定的算法,即Baum-Welch算法。由于我个人工作内容与语音无关,用到无监督训练的场景几乎没有,所以也不仔细了解这个推导的细节了。
不过在无监督训练中有一个步骤,需要计算给定(当前的)模型参数时某个观测序列出现的概率,这个问题一般也会作为HMM的一个单独问题拿出来讨论,这里简单说下。这个问题如果按照加法公式展开就是:
这样展开成最基本的联合概率分布,根据模型参数一定是能够算的。但是这种计算方法,假设隐状态有k种取值,公式中求和项展开后就有
前向算法定义了一个
那么整个序列的概率就是:
然后定义起始项:
最后我们通过找到关于
后向算法也是通过递推关系,但是递推的方向相反。首先定义一个
那么整个序列的概率就是:
然后因为是反向操作,所以递推关系首项对应了序列的最后一个位置
然后递推关系如下(推导从略,类似上面前向关系一样可以凑出来):
HMM的预测
HMM的预测,也叫做解码,即给定一批观测数据,需要求出最有可能对应的隐状态。
描述一下问题:
也就是说要找到一组隐状态取值,使得整个联合概率分布最大。后面为了表述便捷,把这个联合分布记为
显然,把所有可能的z组合代入是不可行的低效蛮力计算,因此常规操作就是用基于动态规划的Viterbi算法。
Viterbi算法计算的是篱笆网络有向图的最短路径。先把我们的问题映射到最短路径问题中:
假设图上的每个节点对应任一时刻z的一个取值,节点之间的边的权重(距离)对应了红字,那么如果从起始点沿着任意一条路径走到末尾,得到的路径之和等价于任意一种z的取值组合代入问题得到的对数概率值,即
如果要用动态规划求解这个最短路径,那么需要得出递推方程。假设整条最短路径Q已经找到,这个路径会经过某个时刻n的一个节点
因此递推方程也可以得到:
其中
且第一个状态时可以直接求S:
那么最终的最大概率就是:
对应最后一个状态的取值应该是:
最后通过回溯得到每个时刻的取值。这个时候需要定义一个辅助变量
假设已经知道第
CRF
CRF的表示
CRF中文名条件随机场,条件的意思说明直接求条件概率,是个判别模型,即
可以看到在图上,
并且第k组方法有统一的权重
如果把这里的f和w全部以向量形式表示,那么可以进一步简写为:
CRF一般用在NLP序列标注问题中,对于方法的设计上完全由使用者自主控制。
- 比如把CRF当做独立模型使用,在CRF++这个工具里面,用户需要自己定义特征函数,称为特征模板,具体的例子可以参考相关的知乎问题。
- 又比如,通过特定的方法设计,CRF可以做到和HMM等价的含义(也就是对应到转移概率和发射概率两部分)。具体的方法可以参考Edwin Chen的blog,以及李宏毅老师2015年课程里面关于序列标注问题的lecture。
在如今的深度学习时代,CRF主要是通过嫁接在LSTM上面得到了延续。这个时候基本的特征抽取工作其实就交给底层的网络来完成,CRF更多的是实现前后关系的约束,这样一来也不需要手动设计特征模板的过程。比如在基于Bi-LSTM+CRF来做NER的方法里面[1],LSTM层直接输出原始的识别结果分布给CRF,条件概率表示成:
特征函数前面去掉了标准的w权重设定,并且被整体定义为两部分,一部分用矩阵A表示,代表前后两个位置输出结果的转移概率,第二部分就是LSTM输出的分数P:
CRF的训练
CRF由于是判别模型,没有隐变量,所以其训练过程比较显然是能通过极大似然估计来计算的。这里继续沿用上面论文中的公式,其对数自然函数可以写成:
可以看到分母项的logadd部分,需要遍历所有可能的y序列组合,当序列长度和y的取值较多时,这个可能性是非常大的。这种形式如果搁在word2vec这样的问题里面,基本上就要搞负采样之类的替代方法来解决。但是CRF也可以类似HMM那样推导出一个前向后向计算公式,递归的计算某种y序列组合下的函数值,所以是可以直接计算的。在pytorch的tutorial中就是用了相关的方法进行实现,知乎上也有相应的解读。但本篇写作期间,时间实在有限,所以这部分就不展开了。
CRF的预测
虽然CRF可以学到一个判别模型,但是直接输出这个模型的概率分布就不像用在逻辑回归里面那样有必要了。对于序列问题,一般只关心最大值即可:
对于CRF的预测问题来说,也满足Viterbi算法的适用条件。首先要对F函数进行拆解表示:
比如对照Bi-LSTM+CRF,可以看出来对应关系:
然后递推公式方面还是类似,而且由于目标函数本来就是求和项,不需要为了方便理解做log变换了。只不过在notation表示上,可以把隐变量z换成目标变量y:
其中d函数的定义就是:
余下的计算过程参考HMM预测部分即可。
参考
- ^Neural Architectures for Named Entity Recognition