条件随机场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)
随机推荐
- python3+redis问题求解
学生管理系统 更新学生信息没做出来,找个大神补全下.谢谢. # 记录: # bug:操作后若退出需要两次退出才行. 待修复 # 下一步:链接redis进行使用. # 更新学生库信息 待完成 imp ...
- linux中iptables配置文件及命令详解
转自:https://www.cnblogs.com/itxiongwei/p/5871075.html iptables配置文件 直接改iptables配置就可以了:vim /etc/sysconf ...
- background-attachment属性
通过对background-attachment属性的学习,辨析每个属性值之间的区别. 1.fixed与scroll的区别 background-attachment:fixed;当滚动页面滚动条时背 ...
- html-有趣的标签-会移动的文字
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Redis-02.数据类型
Redis中所有数据都是以key-value存储的,value支持的数据类型包括string.hash.list.set.sorted_set 数据类型 string 是redis最基本的类型,一个k ...
- 剑指offer面试题25:二叉树中和为某一值的路径
题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.从根节点开始往下一直到叶节点所经过的节点形成一条路径. 解题思路:当使用前序遍历的方式访问某一节点时,把该节点添加到路径上 ...
- Android 基本控件相关知识整理
Android应用开发的一项重要内容就是界面开发.对于用户来说,不管APP包含的逻辑多么复杂,功能多么强大,如果没有提供友好的图形交互界面,将很难吸引最终用户.作为一个程序员如何才能开发出友好的图形界 ...
- Javascript高级编程学习笔记(28)—— BOM(2)window对象2
今天讲一下window对象和浏览器导航,弹窗等有关的内容 导航和打开窗口 window.open() 用于导航到某个特定 url 该方法接收四个参数 1.url 2.窗口目标(当页面中有多个框架fra ...
- JVM和GC垃圾回收机制和内存分配
JVM运行期间 线程共享 线程私有 线程共享: 方法区 堆方法区:存放可以共享数据,静态常量,类的共有方法属性字段等,可以共享的存在方法区. 堆:存放class对象 . 线程私有:本地方法栈 虚拟机栈 ...
- 大道至简第一章--java伪代码读后感
import java.大道至简.编程的精义; //愚公移山 public class 愚公移山 { public static void main(String[] args) { //惩山北之塞, ...