
本文共 9705 字,大约阅读时间需要 32 分钟。
作者:尔总的马甲
链接:https://www.zhihu.com/question/53458773/answer/554436625 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。可以按照这个顺序理解:
1. 简单了解一下概率图模型
2. 简单了解一下朴素贝叶斯分类器和隐马尔可夫模型, 朴素贝叶斯模型扩展到序列问题,就是一个隐马
3. 其实还有个最大熵马尔可夫模型MEMM,就是结合了logistics regression地马尔科夫网络
4. CRF论文其实是拿MEMM来作比较的
5. 隐马尔可夫可以推导出线性链CRF
其他辅助理解的扩展
6. CRF与Logistic Regression
7. 生成式和判别式模型
8. 简单的代码实现
概率图模型
Graphical Models, 用图的形式表示随机变量之间条件依赖关系的概率模型,是概率论与图论的结合。图中的节点表示随机变量,缺少边表示条件独立假设。
G = (V, E). 其中 V: vertex, 顶点/节点, 表示随机变量. E: edge, 边/弧. 如果两个节点不存在边, 则二者条件独立.image from: Probabilistic Graphical Models Principles and Techniques
从图上可以看到, 贝叶斯网络(Bayesian Networks, BNs)是有向图, 每个节点的条件概率分布表示为P(当前节点 | 父节点)
.
而马尔可夫网络则是无向图. 无向图形模型是指一整个家族的概率分布,每个概率分布都根据给定的因子集合进行因式分解。一般用random field来指代无向图中定义的特定分布. 数学上表达无向图, 指给定子集 , 对于所有
和任何因子选项
,
, 无向图定义的各个分布可以写成:
Z是正则项用于保证分布 和为
Markov Net 包含了一组具有马尔可夫性质的随机变量. 马尔可夫随机场(Markov Random Fields, MRF)是由参数 表示, 其中
是状态的集合,
是初始状态的概率,
是状态间的转移概率。一阶马尔可夫链就是假设
时刻的状态只依赖于前一时刻的状态,与其他时刻的状态和观测无关。这个性质可以用于简化概率链的计算。使用类似性质作为假设的模型还有Bi-gram语言模型等.
从 朴素贝叶斯 到 隐马尔可夫模型
朴素贝叶斯分类器(NBs)假设条件独立性(朴素贝叶斯假设, Hand and Yu, 2001):
在给定目标值 y 时,x的属性值之间相互条件独立。这样, 计算可以简化为
朴素贝叶斯模型只考虑了单个输出变量y。如果要为一个观察序列 预测对应的分类序列
,一个简单的序列模型可以表示为多个NBs的乘积。此时不考虑序列单个位置之间的相互依赖。
因此,比较合理的假设是观测序列在连续相邻位置间的状态存在依赖。要模拟这种依赖关系, 就要引入状态转移概率 , 由此引出著名的隐马尔可夫模型 Hidden Markov model, HMM, Rabiner (1989)。
HMM的参数 ,其中
是隐状态(输出变量)的集合,
是观察值(输入)集合,
是初始状态的概率,
是状态转移概率矩阵
,
是输出观察值概率矩阵
。在POS任务中,
就是观察到的句子,
就是待推导的标注序列, 因为词性待求的, 所以人们称之为隐含状态.
概括一下HMM设定的假设:
1. 假设每个状态仅依赖于其前一个状态,从朴素贝叶斯, 到HMM有如下转换关系:
Diagram of the relationship between naive Bayes, logistic regression, HMMs, linear-chain CRFs, generative models, and general CRFs. image from: An Introduction to Conditional Random Fields, by Charles Sutton and Andrew McCallum
HMM的缺陷是其基于观察序列中的每个元素都相互条件独立的假设。即在任何时刻观察值仅仅与状态(即要标注的标签)有关。对于简单的数据集,这个假设倒是合理。但大多数现实世界中的真实观察序列是由多个相互作用的特征和观察序列中较长范围内的元素之间的依赖而形成的。而条件随机场(conditional random fiel, CRF)恰恰就弥补了这个缺陷.
从上图可以看到当HMM有了条件分布后,就变成了线性条件随机场 。
隐马尔可夫模型与最大熵马尔可夫模型
最大熵马尔可夫模型(Maximum Entropy Markov Models, MEMM)跟HMM的生成式概率图不同,MEMM对当前状态的判断依赖于前一时间步的状态和当前观察值的状态。
image from McCallum, A. (1909)
所谓"熵"就是信息论中的概念:
> Entropy: the uncertainty of a distribution. 量化Entropy: surprise. Entropy = expected surprise EventMEMM和CRF
CRF再拥有MEMM的优点的同时, 克服了MEMM的缺点. CRF和MEMM的关键区别在于,MEMM使用每个状态的指数模型来确定给定当前状态的下一状态的条件概率,而CRF则使用一个指数模型来表示整个标签序列的联合概率, 这个概率条件依赖于给定的完整观察序列。因此,在不同状态下,不同特征的权重可以相互抵消。也就是说CRF是一个以观测序列X为全局条件的随机场.
如果把问题简化为线性链, CRF把Y看成一个整体,截至每一个时间步n, 通过统计所有特征可以得一个总分隐马尔可夫模型 到 Linear-Chain 条件随机场
HMM和CRF的对应关系类似于Naive-Bayes和Logistics regression, 都是生成式和判别式的对比. HMM则采用生成式方法进行标签生成, CRF将各种特征组合在一起判断标签. HMM可以推演出特定形式的CRF. 把上式的HMM改写成如下形式:
Graphical model of the HMM-like linear-chain CRF. by Sutton, C. 2010
Linear Chain CRF
随机场, 可以看成是一组随机变量的集合(这组随机变量对应同一个样本空间)。当给每一个位置按照某种分布随机赋予一个值之后,其全体就叫做随机场。这些随机变量之间可能有依赖关系,一般来说,也只有当这些变量之间有依赖关系的时候,我们将其单独拿出来看成一个随机场才有实际意义。
如果给定的马尔科夫随机场(MRF)中每个随机变量下面还有观察值,我们要确定的是给定观察集合下,这个MRF的分布,也就是条件分布,那么这个MRF就称为 Conditional Random Fields (CRF)。它的条件分布形式完全类似于MRF的分布形式,只不过多了一个观察集合X。所以, CRF本质上是给定了条件(观察值observations)集合的MRF
1.特征函数的选择: 特征函数的选取直接关系模型的性能。
2.参数估计: 从已经标注好的训练数据集学习条件随机场模型的参数,即各特征函数的权重向量λ。 3.模型推断: 在给定条件随机场模型参数λ下,预测出最可能的状态序列。HMM的生成式概率模型是 , 它的条件概率
本质上就是选取了特定特征函数的CRF. 直接引用(Sutton, C. 2010)的定义:
An Introduction to Conditional Random Fields, by Charles Sutton and Andrew McCallum
CRF特征函数
在CRF中,首先需要定义特征函数.
然后为每个特征函数 分配权重
, 权重是从数据中学习而来. 对
个特征方程求和, 对序列每个位置
求和:
CRF的每个特征函数都是一个输入的函数, 对应的输出是一个实数值(只是0或1)。例如, 选择特征函数 , 当且仅当
, 且第i个单词以“
-ly
”结尾; 否则为0. 如果与此特征相关的权重 很大且为正,那么这个特征等同于说模型倾向于把以
-ly
结尾的单词标记为ADVERB。
通过指数化和归一化把这些得分转换为概率值:
通过恰当地设置特征函数, 就可以从CRF中构建出一个HMM. 在CRF的对数线性形式中, 设置权重为对应HMM(取对数后)的二元转换和发射概率:
- 对于每个状态
, 对应HMM的每个状态转换概率
, CRF定义一组特征函数为
如果
且
, 为这些特征赋予权重
- 对于每个状态-观察值pair, 对应HMM的每个发射概率
, CRF定义一组特征函数为
如果
且
, 赋予权重
.
如此, CRF计算的似然 就精确地正比于对应的HMM, 也就是说, 任意的HMM都可以由CRF表达出来.
Linear-Chain CRF 特征函数的定义非常灵活, 不同的形式用于不同的功能. 比如对于HMM而言, 不管输入怎么变, 状态转换 的分值是一样的
; 那么在CRF中, 我们通过增加这样一个特征
, 使
分值依赖于当前的观察序列:
from: An Introduction to Conditional Random Fields, by Charles Sutton and Andrew McCallum
这种特征常常用于文本处理中, 比如:
- 一个句子提供观察值
- 对应的标签
需要指出的是在线性链CRF的定义中每个feature的依赖值并不仅限于当前和上一时间步的观察值. 事实上, 因为CRF并不表达变量之间的依赖关系, 我们可以让因子 依赖于整个观察向量
并保持线性图结构, 这时候的特征函数就是
, 可以自由检视所有输入变量
,
from: An Introduction to Conditional Random Fields, by Charles Sutton and Andrew McCallum
这个特性可以拓展到所有CRFs而不仅限于线性链CRF.
CRF比HMM更强大, 更泛用
- CRF可以定义更广泛的特征函数:HMM受限于相邻位置的状态转换(二元转换)和发射概率函数,迫使每个单词仅依赖于当前标签,并且每个标签仅依赖于前一个标签。而CRF可以使用更多样的全局特征。例如,如果句子的结尾包含问号,则可以给给CRF模型增加一个特征函数,记录此时将句子的第一个单词标记为VERB的概率。这使得CRF可以使用长距离依赖的特征。
- CRF可以有任意的权重值:HMM的概率值必须满足特定的约束,
, 而CRF的权重值是不受限制的。
CRF既具有判别式模型的优点,又考虑到长距离上下文标记间的转移概率,以序列化形式进行全局参数优化和解码的特点,解决了其他判别式模型(如MEMM)难以避免的标记偏见问题。
CRF与Logistic Regression
CRF的概率计算与Logistic Regression (LR)的形式类似,
谈谈生成式模型和判别式模型
Diagram of the relationship between naive Bayes, logistic regression, HMMs, linear-chain CRFs, generative models, and general CRFs. image from: An Introduction to Conditional Random Fields, by Charles Sutton and Andrew McCallum
再祭上这张图, 第一排都是生成式的, 第二排都是判别式的.
在朴素贝叶斯与Logistic Regression, 以及HMM和CRF之间, 又有生成式和判别式的区别.
- 生成式模型描述标签向量y如何有概率地生成特征向量x, 即尝试构建x和y的联合分布
, 典型的模型有HMM,贝叶斯模型,MRF。生成式模型
- 而判别模型直接描述如何根据特征向量x判断其标签y, 即尝试构建
的条件概率分布, 典型模型如如LR, SVM,CRF,MEMM等.
原则上,任何类型的模型都可以使用贝叶斯规则转换为另一种类型,但实际上这些方法是不同的. 生成模型和判别模型都描述了 的概率分布,但努力的方向不同。生成模型,例如朴素贝叶斯分类器和HMM,是一类可以因式分解为
的联合分布, 也就是说,它们描述了如何为给定标签的特征采样或“生成”值。生成式模型从统计的角度表示数据的分布情况,能够反映同类数据本身的相似度,不关心判别边界。生成式模型的优点是:
- 实际上带的信息要比判别模型丰富, 研究单类问题比判别模型灵活性强
- 能更充分的利用先验知识
- 模型可以通过增量学习得到
缺点也很明显:
- 学习过程比较复杂;
- 在目标分类问题中准确度不高
而判别式模型, 比如 LR, 是一系列条件分布 . 也就是说,分类规则是直接建模的。原则上,判别模型也可通过为输入提供边际分布
来获得联合分布
,但很少需要这样。条件分布
不包括
的信息,在分类任务中无论如何也用不到。其次,对
建模的困难之处在于它通常包含很多建模难度较高的有高度依赖性的特征。判别式模型寻找不同类别之间的最优分类面,反映的是异类数据之间的差异。优点是:
- 分类边界更灵活,比使用纯概率方法或生产模型得到的更高级。
- 能清晰的分辨出多类或某一类与其他类之间的差异特征
- 在聚类、viewpoint changes, partial occlusion and scale variations中的效果较好
- 适用于较多类别的识别
缺点是:
- 不能反映训练数据本身的特性。
- 能力有限,可以分类, 但无法把整个场景描述出来。
用 TensorFlow 实现 Bi-LSTM + CRF
很多序列标注问题, 如命名实体识别, 如果预先使用 Bi-LSTM 解码序列, 经过 Bi-LSTM 解码后的每一步隐含状态, 包含了很多信息, 包括中长距离依赖和语法解析等, 把这些隐含状态作为 CRF 的特征输入 CRF 层来解码, 可以得到一条最大概率的序列标注路径.
比如序列经过某个模块(如CNN, BERT, 或者单纯是Embedding层) 解码后的 output 输入给Bi-LSTM 层lstm_layer , 再把双向LSTM层的每一步隐含层作为特征输入给CRF层. TensorFlow中要使用CRF 需要用到的函数是tf.contrib.crf.crf_log_likelihood 和 tf.contrib.crf.crf_decode :
output_layer = lstm_layer(output, _true_length, is_training)with tf.variable_scope("loss"): output_layer = tf.reshape(output_layer, [-1, hidden_size]) logits = tf.matmul(output_layer, output_weights, transpose_b=True) logits = tf.nn.bias_add(logits, output_bias) logits = tf.reshape(logits, [-1, FLAGS.max_seq_length, num_labels]) if FLAGS.use_crf: transition_params = tf.get_variable( "transition_params", shape=[num_labels, num_labels], initializer=tf.zeros_initializer()) log_likelihood, transition_params = tf.contrib.crf.crf_log_likelihood( inputs=logits, tag_indices=labels, transition_params=transition_params, sequence_lengths=_true_length) # NOTE CRF decode, decode_tags [batch_size, max_seq_len] 最大概率标注路径 decode_tags, best_score = tf.contrib.crf.crf_decode(potentials=logits, transition_params=transition_params, # NOTE sequence_length: [batch_size] vector of true sequence lengths. sequence_length=_true_length) # A [batch_size] Tensor containing the -log_likelihood of each example per_example_loss = -log_likelihood predictions = decode_tags
CRF++
CRF++利用特征模板来批量自动化生成 CRF 特征, 参考
比如
# UnigramU00:%x[-2,0]U01:%x[-1,0]U02:%x[0,0]U03:%x[1,0]U04:%x[2,0]U05:%x[-2,0]/%x[-1,0]/%x[0,0]U06:%x[-1,0]/%x[0,0]/%x[1,0]U07:%x[0,0]/%x[1,0]/%x[2,0]U08:%x[-1,0]/%x[0,0]U09:%x[0,0]/%x[1,0] # BigramB
T**: %x[#, #]
中的T
表示模板类型(U
或B
), 两个#
分别表示相对的行偏移与列偏移。
Unigram template: 用于生成 unigram features. %x[#, #]
生成一个 CRF 中的点(state)函数: f(s, o)
, 其中s为t时刻的标签(output),o
为t
时刻的上下文.
- 比如
是由
U02: %x[0, 0]
在输入文件的第一行生成的点函数. 大致意思是, 如果第一个输入是'今'
, 而且其对应的label是'B-TIME'
, 那么返回1
, 也就是
Bigram template: 用于生成 bigram features, %x[#, #]
生成一个 CRF 中的边(Edge)函数 , 与 Unigram 类似, 只是还要考虑到
t – 1
时刻的标签,
- 模板
B
默认生成 bigram 特征
参考资料
- Classical probabilistic models and conditional random fields
- , by Charles Sutton and Andrew McCallum
发表评论
最新留言
关于作者
