条件随机场conditional random field
主要翻译自http://blog.echen.me/2012/01/03/introduction-to-conditional-random-fields/,原作者是MIT的大神,加入了一些我自己的理解.
问题由来
给你某人一天内一系列生活照片,让你为每一张照片添加label(比如唱歌,跳舞,吃饭...),你要怎么做.
一种方式是忽略照片的顺序性,训练出一个classifier.比如你可以拿一个月的快照作为训练样本,然后训练出一个模型.这样来一个新图片,背景很暗,拍摄于早上,模型可能会将其判断为睡觉.图片里车很多,模型可能判断为驾车.
但是忽略照片的连续性,可能会丢失很多信息,比如说你看到一张图片,是嘴巴的特写,那么怎么知道这张图是在唱歌还是在吃饭?这时候我们既要参考这张图片之前的照片,如果之前的照片是在吃饭,那么当前图片很可能也是吃饭,如果前一张是在唱歌或者跳舞,那么当前图片很可能就是在唱歌.
即为了让我们的分类器更准确,我们需要考虑照片之间的关联,这就是crf大显身手的地方.下面以词性标注来说明条件随机场crf(conditional random field)
什么是词性标注?
比如“Bob drank coffee at Starbucks”,Bob是名词,drank是动词...,最终我们的目标是把每个词的词性标注出来-->“Bob (NOUN) drank (VERB) coffee (NOUN) at (PREPOSITION) Starbucks (NOUN)”
首先,我们要有一组特征函数.
Feature Functions in a CRF
In a CRF, each feature function is a function that takes in as input:
- a sentence s
- the position i of a word in the sentence
- the label li of the current word
- the label li−1 of the previous word
特征函数的输出是一个实数(实际应用中通常就是0或1)
注意:这里为了简化讨论,我们认为当前词的label只与它前面的一个词的label有关,这实际上是linear-chain CRF的一个特例.
例如,某个单词前面一个词是"very",一个可能的特征函数可以度量我们猜测当前单词应该被标记为形容词的程度。这个后面具体会举例,别心急,慢慢看.
Features to Probabilities
上面我们有一组feature function,可以得到很多数,现在我们要把这些数转换为概率.
\(score(l | s) = \sum_{j = 1}^m \sum_{i = 1}^n \lambda_j f_j(s, i, l_i, l_{i-1})\)
\(\lambda_j\)表示\(f_j\)的权重.这样对输入的一个有n个word的sentence s,我们有m个feature function,我们综合考虑这些feature function,则我们可以得到一个score。
通过指数化和正则化,我们将其转换为0-1之间的一个概率值.

是不是感觉和逻辑回归似曾相识?实际上crf可以理解为序列版本的逻辑回归.
That’s because CRFs are indeed basically the sequential version of logistic regression: whereas logistic regression is a log-linear model for classification, CRFs are a log-linear model for sequential labels.
下面看几个具体的feature function的例子:
f1(s,i,li,li−1)=1 if li= ADVERB and the ith word ends in “-ly”; 0 otherwise. ** If the weight λ1 associated with this feature is large and positive, then this feature is essentially saying that we prefer labelings where words ending in -ly get labeled as ADVERB.
f2(s,i,li,li−1)=1 if i=1, li= VERB, and the sentence ends in a question mark; 0 otherwise. ** Again, if the weight λ2 associated with this feature is large and positive, then labelings that assign VERB to the first word in a question (e.g., “Is this a sentence beginning with a verb?”) are preferred.
f3(s,i,li,li−1)=1 if li−1= ADJECTIVE and li= NOUN; 0 otherwise. ** Again, a positive weight for this feature means that adjectives tend to be followed by nouns.
f4(s,i,li,li−1)=1 if li−1= PREPOSITION and li= PREPOSITION. ** A negative weight λ4 for this function would mean that prepositions don’t tend to follow prepositions, so we should avoid labelings where this happens.
如果第i个词为副词,并且以ly结尾,则f1()=1,否则为0. 如果权重λ1很大,意味着我们倾向于认为ly结尾的词被认为是副词
f2() if i=1,li=动词,句子以问号结尾.则f2=1,否则f2=0. 如果我们给这个函数一个正数权重λ2,意味着我们倾向于将问句的第一个词认为是动词,例如“Is this a sentence beginning with a verb?"中我们倾向于认为"is"是个动词
f3() if li-1=形容词,li=名词,则f3()=1,否则f3()=0. 如果我们给这个函数一个正数权重,意味着我们倾向认为形容词后接的是名词
f4() if li-1为介词,li为介词,则f4()=1. 我们给这个函数一个负数权重,意味着我们认为介词后面还接介词 这种情况不太可能
总结一下:要构造一个crf,你需要事先定义一系列的feature function.然后赋以相应的权重,将其score相加,再转换为0-1之间的概率值.
条件随机场crf和隐含马尔科夫模型hmm之间的关系
实际上hmm是crf的一种特例. 每一个hmm都可以用某一种crf表达.
见博文隐含马尔科夫模型https://www.cnblogs.com/sdu20112013/p/10373091.html
Learning Weights
如何给我们的feature function找到合适的权重?
不出意外的,我们会想到梯度下降法.
假设我们已经有了大量的训练集(比如大量已经做了词性标注的语句)。
在刚开始的时候,我们给每一个feature function一些随机的权重.

对每个样本,我们都重复上述过程,直到误差达到某个很小的阈值.
- 对每一个feature function,计算概率梯度
- 梯度的第一项表示的是在真实label下特征函数f的贡献,第二项表示的是当前模型下的期望贡献.
- 将λi沿着梯度方向移动,`\(\alpha\)是学习率.
- 重复上述步骤直到停止条件满足
简言之,就是每一步都考虑diff=我们希望模型学到的-模型当前真正学到的,每一次λi的调整都朝着使diff减小的方向调整.
Finding the Optimal Labeling
假设我们已经训练好了一个crf model. 拿到一个新的句子,怎么给出一个合理的label呢(比我拿到句子:我爱你 是标注成:名词/动词/名词还是名词名词名词还是...?)
最直观的思路就是对每一种label,计算p(l|s).但是考虑一个句子有m个词,每个词有k个词性,就得有\(k^m\)种可能.复杂度太高了.
实际上是用a (polynomial-time) dynamic programming algorithm算法来计算的,类似于HMM中的维特比算法.
条件随机场crf和卷积神经网络cnn的思路上有很多相似的地方,cnn中卷积层和池化层提取出不同角度的特征,crf中预先定义好很多的特征函数.都是通过梯度下降更新各个特征的权重值,以达到最优化误差的目的.
条件随机场conditional random field的更多相关文章
- 条件随机场(Conditional random field)
条件随机场真是把我给折磨坏了啊,本以为一本小小的<统计学习方法>攻坚剩下最后一章,心情还是十分愉悦的,打算一口气把它看完,结果真正啃起来真是无比的艰难啊,每一句对我都好像是天书一般,怎么这 ...
- 条件随机场Conditional Random Field-CRF入门级理解
条件随机场Conditional Random Field-CRF入门级理解 有向图与无向图模型 CRF模型是一个无向概率图模型,更宽泛地说,它是一个概率图模型.现实世界的一些问题可以用概率图模型 ...
- 条件随机场 Conditional Random Fields
简介 假设你有冠西哥一天生活中的照片(这些照片是按时间排好序的),然后你很无聊的想给每张照片打标签(Tag),比如这张是冠西哥在吃饭,那张是冠西哥在睡觉,那么你该怎么做呢? 一种方法是不管这些照片的序 ...
- 随机场(Random field)
一.随机场定义 http://zh.wikipedia.org/zh-cn/随机场 随机场(Random field)定义如下: 在概率论中, 由样本空间Ω = {0, 1, …, G − 1}n取样 ...
- NLP —— 图模型(二)条件随机场(Conditional random field,CRF)
本文简单整理了以下内容: (一)马尔可夫随机场(Markov random field,无向图模型)简单回顾 (二)条件随机场(Conditional random field,CRF) 这篇写的非常 ...
- 条件随机场(conditional random field,CRF)模型初探
0. 引言 0x1:为什么会有条件随机场?它解决了什么问题? 在开始学习CRF条件随机场之前,我们需要先了解一下这个算法的来龙去脉,它是在什么情况下被提出的,是从哪个算法演进而来的,它又解决了哪些问题 ...
- [Scikit-learn] Dynamic Bayesian Network - Conditional Random Field
李航,第十一章,条件随机场 参考:[PGM] Markov Networks 携代码:用 Python 通过马尔可夫随机场(MRF)与 Ising Model 进行二值图降噪[推荐!] CRF:htt ...
- CRF(Conditional Random Field)
条件随机场是近几年自然语言处理领域常用的算法之一,常用于句法分析.命名实体识别.词性标注等.在我看来,CRF就像一个反向的隐马尔可夫模型(HMM),两者都是用了马尔科夫链作为隐含变量的概率转移模型,只 ...
- 条件随机场理论分析CRF(Conditional Random Field)
随机推荐
- eclipse中设置python的版本
(mac系统)由于系统的python是内置的,无法直接查找到安装文件,则可在eclipse偏好设置-PyDev - Interpreters-Python Interpreter其右边选择Quick ...
- python之路(十)-正则表达式
re模块用于对python的正则表达式的操作. 字符: . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 \b 匹配单词的开始或结束 ^ 匹配 ...
- spring配置问题
产生原因缺少包common-logging-1.2.jar 在该字段所在的类中没有提供该字段的set方法.
- 换PHP7后访问Apache虚拟站点Forbidden的问题解决
Httpd.conf中,注释掉前2行,补上后2行 <Directory /> #AllowOverride none #Require all denied Order deny,allo ...
- Windows平台最方便最易用的法语输入法
原文:http://wenwen.sogou.com/z/q1700007921.htm 对于XP,在“控制面板”中选择“输入法区域设置”,单击“更改”,出现一个“设置”框:选择“添加”,然后选择“法 ...
- Lombok轮子
前提 自从进公司实习后,项目代码中能用 Lombok 的都用了,毕竟这么好的轮子要充分利用好.也可以减少一些 get/set/toString 方法的编写,虽说 IDEA 的插件可以自动生成 get/ ...
- @ResponseBody 返回乱码 的解决办法
1:最快的 最简单的办法是 在Ajax请求脸面指定头信息Accept属性,StringHttpMessageConverter默认iso-8859-1编码,但是会根据请求头信息指定的编码格式来转换 ...
- 架构(四)Git简介,安装以及相关命令SourceTree
一 Git介绍 1.1 Git是什么? Git是一个分布式版本控制软件: 版本控制:假如开发人员开发了一个a功能,结果项目经理觉得不够需要修改,开发人员又改成了b功能,后来又改成了c功能,但是最终项目 ...
- Javascript高级编程学习笔记(39)—— DOM(5)Comment
Comment类型 顾名思义,comment类型指的就是注释节点在HTML文档中的类型 也就是说平时我们在代码中的注释,在HTML解析的时候也会被解析为一类节点 让我们可以根据这些节点进行一系列的操作 ...
- Javascript高级编程学习笔记(26)—— 函数表达式(4)私有变量
私有变量 严格来讲,JS中没有私有成员的概念,所有对象属性都是公有的. 但是JS中有私有变量的概念 所有在函数中定义的变量都可以认为是私有变量,因为不能在函数外部进行访问 私有变量包括 1.函数参数 ...