【机器学习】条件随机场

  • 2020 年 2 月 23 日
  • 笔记

跟着博主的脚步,每天进步一点点

本文介绍了条件随机场模型,首先对比了隐马尔科夫模型、最大熵马尔科夫模型、条件随机场模型。基于前二者存在的1)独立性假设问题,2)标注偏置问题,条件随机场采用最大熵模型的特征模板定义克服独立性问题,参数学习过程建立在最大化整条序列的概率,而不是在时刻上进行归一化。

作者 | 文杰

编辑 | yuquanle

条件随机场

条件随机场是一个概率图模型,深入图模型的话实在有太多东西。这里,我们接着隐马尔科夫模型和最大熵马尔科夫模型基础理解条件随机场。在序列标注问题上,条件随机场与两者之间的差异:

1)隐马尔科夫模型是一个生成模型,其假设当前时刻状态只与上一状态有关,而当前的观测值只与当前的状态有关,所以独立性假设非常强。

2)最大熵马尔科夫模型则通过特征模板的定义克服了独立性假设问题。基于熵原理,在满足所有条件经验期望的条件下,熵最大的为最好的模型,也就导出了对数线性模型,是一个标准的判别模型。

3)条件随机场同最大熵马尔科夫模型非常一致,也是一个基于特征模板的判别模型。然而在序列标注问题上,最大熵马尔科夫模型将每个时刻看作是一个分类问题,每时刻独立归一化,这就导致标注偏置问题,条件随机场则归一化作用于整个序列。

结合最大熵模型,模型输出条件概率,假设所有的特征模板为,(其中一些书中分为转移特征和发射特征)。最大化条件概率为:

考虑整个序列的条件概率,条件随机场的目标函数是最大化:

对于参数的学习,同样可以采用最大熵模型使用的优化算法,比如梯度下降的方法。

状态预测问题就是一个最大化序列概率获得状态序列:

其中归一化因子忽略,分子的指数形式单调递增也忽略。所以整个序列的状态等价于在最优的状态序列下特征模板与特征模板权重乘积和最大。就此,条件随机场就变成了一个特征模板定义的问题了,特征模板直接决定条件随机场的性能。

代码实战

int CRF_CWS(){    cout<<"-----------training-----------"<<endl;    DataStr traindata;    LoadDataStr(traindata,"data\pku_training.utf8");    createVocabList_C(traindata);        cout<<"------------test-------------"<<endl;    DataStr testdata;;//加载测试数据    LoadDataStr(testdata,"data\pku_test.utf8");      cout<<"------------FenCi--------------"<<endl;      FenCi(testdata);      cout<<"-----------PingCe---------------"<<endl;      DataStr resultdata;    LoadDataStr(resultdata,"data\result.utf8");      DataStr golddata;    LoadDataStr(golddata,"data\pku_test_gold.utf8");      PingCe(resultdata,golddata);    return 0;}