条件随机场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)
随机推荐
- 与我们息息相关的internet服务(2)---WWW服务
			在起步一个公司,从组建的技术上,可能要准备很多东西,其中一个就是我们熟悉的公司网站 网站,在初中,那时浏览一个网页可叫网上冲浪,听起来似乎比洗澡还爽快,可现在这词就是土鳖,网上冲浪火起来主要是应 ... 
- HDU5810 Balls and Boxes
			Balls and Boxes Time Limi ... 
- php中ob_get_contents、curl_multi_init、curl_init多线程下载远程图片并保存记录
			php中三种方式测试图片下载效率 原文共24张不同图,每张大小在500K以上 使用时注意调整传入数组格式以及需要下载时保存地址的路径格式等 这三种方式无需额外安装扩展,方便快捷易操作[虽然效率看结果没 ... 
- Django+easyui 快速开发
			Django的使用我们可以查看上一篇博客,今天我们要在Django中使用easyui快速开发,在我们安装好Django, 我们可以道改地址那一下easyui 官方API文档(http://downlo ... 
- Vipe框架构思记
			准备着手写一个JAVA框架,基于公司目前的框架提取出来.当然公司现在的框架也是我搭建的.在这整理一下思路. 框架名称:Vipe AOP,IOC容器:Spring MVC:Spring MVC ORM: ... 
- JVM内存分配和垃圾收集策略
			java内存区域 程序计数器 因为java可以多线程并发执行,因此,为了线程切换后能恢复到正确的执行位置,每个线程都需要一个独立的程序计数器.记录正在执行的虚拟机字节码指令的地址. 这个区域不会产生内 ... 
- js连等赋值的陷阱
			先来看一段代码: (function(){ var x = y = 1; })(); console.log(y); console.log(x); 最开始我觉得这道题简直是送分题啊,很明显结果为,y ... 
- 对List集合中的对象中的某个属性进行排序
			今天在项目中遇到的问题,不能在sql中进行order by.所以将数据库中查询出来的集合,在java代码中进行排序 Collections.sort(list, new Comparator<H ... 
- Python shuffle() 函数
			描述 shuffle() 方法将序列的所有元素随机排序. 语法 以下是 shuffle() 方法的语法: import random random.shuffle (lst ) 注意:shuffle( ... 
- python读取并写入csv文件
			在ubuntu下,新建.csv文件的方法是使用LibreOffice来创建一个数据表,然后我们把表格存储为.csv的格式: “Save as”菜单把我们的表格存为一个CSV的文件格式:命名为csvDa ... 
