CRF 条件随机场

article/2025/11/6 21:24:35

目录

1. 基本概念       

1.1 各种随机场 

1.2 CRF模型的训练原理

1.3 条件随机场的参数化形式

1.4条件随机场对应的简化概率表达

2. 例子

定义CRF中的特征函数

从特征函数到概率

CRF与逻辑回归的比较

CRF与HMM的比较

HMM和CRF区别

3. Tensorflow实现

   tf.contrib.crf

(1)tf.contrib.crf.crf_log_likelihood()

(2)tf.contrib.crf.viterbi_decode       

(3)tf.contrib.crf.crf_decode

(4)代码实现


1. 基本概念       

参考:

CRF 条件随机场 概述 - 简书

条件随机场CRF(二) 前向后向算法评估标记序列概率 - 刘建平Pinard - 博客园

CRF模型 - 简书

1.1 各种随机场 

         条件随机场(Conditional Random Fields, 以下简称CRF)是给定一组输入序列条件下另一组输出序列的条件概率分布模型,即CRF擅长解决相邻上下文相关的问题

随机场:按照某种分布给一系列变量进行赋值,这些变量构成的整体就叫做随机场。是由若干个位置组成的整体,当给每一个位置中按照某种分布随机赋予一个值之后,其全体就叫做随机场)。标注序列 ”OOBSOBMSOOO” 就是一个随机场

马尔科夫随机场:满足马尔可夫性的随机场是随机场的特例,它假设随机场中某一个位置的赋值仅仅与和它相邻的位置的赋值有关,和与其不相邻的位置的赋值无关。

CRF:是马尔科夫随机场的特例,它假设马尔科夫随机场中只有X和Y两种变量,X一般是给定的,而Y一般是在给定X的条件下我们的输出。

线性链条件随机场:X和Y有相同的结构的CRF就构成了线性链条件随机场。

CRF的数学语言描述:设X与Y是随机变量,P(Y|X)是给定X时Y的条件概率分布,若随机变量Y构成的是一个马尔可夫随机场,则称条件概率分布P(Y|X)是条件随机场,(判别式模型)。

linear-CRF的数学定义:设

   

均为线性链表示的随机变量序列,在给定随机变量序列X的情况下,随机变量Y的条件概率分布P(Y|X)构成条件随机场,即满足马尔可夫性:

P(Y|X)称为线性链条件随机场。

1.2 CRF模型的训练原理

根据公式,我们可以将其拆解为两个部分来看:

  • 一部分是P(Y_{i}|X)):对应的特征函数被称为节点特征函数(发射函数);
  • 一部分是P(Y_{i}|Y_{i-1},Y_{i+1}):对应的特征函数被称为局部特征函数(转移函数)。

 为了建一个条件随机场,首先要定义一个特征函数集,每个特征函数都以整个句子s,当前位置i,位置i和i-1的标签和为输入。然后为每一个特征函数赋予一个权重,然后针对每一个标注序列Y,对所有的特征函数加权求和,必要的话,可以把求和的值转化为一个概率值


特征函数的取值为0和1,表示满足特征条件还是不满足特征条件。同时我们给予每个特征函数一个权重w,表示我们对这个特征函数的信任程度。而特征函数所对应的权重就可以看做是模型参数。

NER中X=LSTM对输入提取的更高级的特征;Y=标记序列学习目标=CRF的模型参数(每个特征函数f的权重)。

            

              

1.3 条件随机场的参数化形式

                      

                         

  • 转移特征 / 转移函数:其中\large t_{k}是定义在边上的局部特征函数,即P(Y_{i}|Y_{i-1},Y_{i+1}),我们称之为转移特征,它同时依赖于当前位置和上一个位置。
  • 状态特征 / 发射函数:而\large s_{l}是定义在节点上的节点特征函数,即P(Y_{i}|X),我们称之为状态特征,它仅仅依赖于当前位置。
  • 以上两个变量都依赖于位置,属于局部特征,在满足条件时它们的取值为1,不满足条件时,它们的取值为0,

1.4条件随机场对应的简化概率表达

                                                          

2. 例子

参考:轻松理解条件随机场(CRF)_慕课手记

      上面所说的动词后面还是动词就是一个特征函数,我们可以定义一个特征函数集合,用这个特征函数集合来为一个标注序列打分,并据此选出最靠谱的标注序列。也就是说,每一个特征函数都可以用来为一个标注序列评分,把集合中所有特征函数对同一个标注序列的评分综合起来,就是这个标注序列最终的评分值。

  • 标注序列:相当于y
  • 特征函数:相当于x(x1,x2,x3,...)

简单说:为了建一个条件随机场,我们首先要定义一个特征函数集每个特征函数都以整个句子s,当前位置i,位置ii-1的标签为输入。然后为每一个特征函数赋予一个权重,然后针对每一个标注序列l,对所有的特征函数加权求和,必要的话,可以把求和的值转化为一个概率值。

定义CRF中的特征函数

现在,我们正式地定义一下什么是CRF中的特征函数,所谓特征函数,就是这样的函数,它接受四个参数:

  • 句子s(就是我们要标注词性的句子)

  • i,用来表示句子s中第i个单词

  • l_{i},表示要评分的标注序列给第i个单词标注的词性

  • l_{i-1},表示要评分的标注序列给第i-1个单词标注的词性

它的输出值是0或者1,0表示要评分的标注序列不符合这个特征,1表示要评分的标注序列符合这个特征。

Note:这里,我们的特征函数仅仅依靠当前单词的标签和它前面的单词的标签对标注序列进行评判,这样建立的CRF也叫作线性链CRF,这是CRF中的一种简单情况。为简单起见,本文中我们仅考虑线性链CRF。

从特征函数到概率

定义好一组特征函数后,我们要给每个特征函数f_j赋予一个权重λ_j。现在,只要有一个句子s,有一个标注序列l,我们就可以利用前面定义的特征函数集来对l评分。

                            

上式中有两个求和,外面的求和用来求每一个特征函数评分值的和,里面的求和用来求句子中每个位置的单词的的特征值的和。

         特征函数集中:每个特征函数求取句子中每个位置的单词特征值,内层求和即求特征值的和,外层求和是求特征汉书集中每一个特征函数评分值的和。

        对这个分数进行指数化标准化,我们就可以得到标注序列l的概率值p(l|s),如下所示:

                  

        l为一个标注序列,\sum l为所有标注序列

CRF与逻辑回归的比较

                             

        是不是有点逻辑回归的味道?
        事实上,条件随机场是逻辑回归的序列化版本。

  • 逻辑回归:是用于分类的对数线性模型;
  • 条件随机场:是用于序列化标注的对数线性模型。
     

CRF与HMM的比较

        对于词性标注问题,HMM模型也可以解决。HMM的思路是用生成办法,就是说,在已知要标注的句子s的情况下,去判断生成标注序列l的概率,如下所示:

                                

这里:
         \large p(l_{i}|l_{i-1}):是转移概率,比如,\large l_{i-1}是介词,\large l_{i}是名词,此时的p表示介词后面的词是名词的概率。
        \large p(w_{i}|l_{i}) :表示发射概率(emission probability),比如l_{i}是名词,w_{i}是单词“ball”,此时的p表示在是名词的状态下,是单词“ball”的概率。

那么,HMM和CRF怎么比较呢?
答案是:CRF比HMM要强大的多,它可以解决所有HMM能够解决的问题,并且还可以解决许多HMM解决不了的问题。事实上,我们可以对上面的HMM模型取对数,就变成下面这样:

               

我们把这个式子与CRF的式子进行比较:

                   

      不难发现,如果我们把第一个HMM式子中的log形式的概率看做是第二个CRF式子中的特征函数的权重的话,我们会发现,CRF和HMM具有相同的形式。换句话说,我们可以构造一个CRF,使它与HMM的对数形式相同。怎么构造呢?

      对于HMM中的每一个转移概率p(l_i=y|l_i-1=x),我们可以定义这样的一个特征函数:

                                

       该特征函数仅当l_i = y,l_i-1=x时才等于1。这个特征函数的权重如下:

                         

       同样的,对于HMM中的每一个发射概率,我们也都可以定义相应的特征函数,并让该特征函数的权重等于HMM中的log形式的发射概率。

       用这些形式的特征函数和相应的权重计算出来的p(l|s)和对数形式的HMM模型几乎是一样的!

用一句话来说明HMM和CRF的关系就是这样:每一个HMM模型都等价于某个CRF
但是,CRF要比HMM更加强大,原因主要有两点:

  • CRF可以定义数量更多,种类更丰富的特征函数。HMM模型具有天然具有局部性,就是说,在HMM模型中,当前的单词只依赖于当前的标签,当前的标签只依赖于前一个标签。这样的局部性限制了HMM只能定义相应类型的特征函数,我们在上面也看到了。但是CRF却可以着眼于整个句子s定义更具有全局性的特征函数,如这个特征函数:

                                     

         如果i=1,l_i=动词,并且句子s是以“?”结尾时,f2=1,其他情况f2=0。

  • CRF可以使用任意的权重: 将对数HMM模型看做CRF时,特征函数的权重由于是log形式的概率,所以都是小于等于0的,而且概率还要满足相应的限制,如

                              


       但在CRF中,每个特征函数的权重可以是任意值,没有这些限制。

HMM和CRF区别

HMM有2个假设:

  • 一阶马尔可夫假设:即任意时刻的状态只依赖前一时刻的状态,与其他时刻无关;
  • 观测独立性假设:任意时刻的观测只依赖于该时刻的状态,与其他状态无关。

1)HMM是生成式模型,CRF是判别式模型

https://www.cnblogs.com/hellochennan/p/6624509.html

两者都是用了马尔科夫链作为隐含变量的概率转移模型,只不过HMM使用隐含变量生成可观测状态,其生成概率有标注集统计得到,是一个生成模型;而CRF反过来通过可观测状态判别隐含变量,其概率亦通过标注集统计得来,是一个判别模型。

2)HMM是概率有向图,CRF是概率无向图

3)HMM求解过程可能是局部最优,CRF可以全局最优

4)CRF概率归一化较合理,HMM则会导致label bias 问题

5)CRF和HMM都假设隐变量是满足马尔科夫性的,即当前状态仅和上一个状态有概率转移关系而与其它位置的状态无关。

6)CRF优于HMM的地方在于,它可以引入更多的特征,包括词语本身特征和词语所在上下文的特征,而非单词本身。

https://www.zhihu.com/question/53458773

  • 判别式模型:直接对P(Y|X)建模;
  • 生成式模型:训练阶段对P(X,Y)建模,inference再对新的sample计算P(Y|X)

3. Tensorflow实现

   tf.contrib.crf

(1)tf.contrib.crf.crf_log_likelihood():学习问题,训练

           在一个条件随机场里面计算标签序列的log-likelihood

        函数的目的:使用crf 来计算损失,里面用到的优化方法是:最大似然估计

参数:max_seq_len = 一个句子的字数

  • inputs: 一个形状为 [batch_size, max_seq_len, num_tags] 的tensor,也就是每个标签的预测概率值,这个值根据实际情况选择计算方法,CNN,RNN...都可以,一般使用BILSTM处理之后输出转换为他要求的形状作为CRF层的输入。
  • ​​​tag_indices: 一个形状为[batch_size, max_seq_len] 的矩阵,其实就是真实标签序列。
  • sequence_lengths:一个形状为[batch_size] 的向量,表示batch中每个序列的长度。这是一个样本真实的序列长度,因为为了对齐长度会做些padding,但是可以把真实的长度放到这个参数里
  • transition_params: 形状为[num_tags, num_tags] 的转移矩阵,可以没有,没有的话这个函数也会算出来。

返回:

  • log_likelihood: 标量,log-likelihood
  • transition_params: 形状为[num_tags, num_tags] 的转移矩阵,转移概率,如果输入没输,它就自己算个给返回。

(2)tf.contrib.crf.viterbi_decode:解码问题,预测       

         viterbi_decode(score,transition_params) 
         通俗一点,作用就是返回最好的标签序列,这个函数只能够在测试时使用,在tensorflow外部解码。

参数:

  • score: 一个形状为[seq_len, num_tags] matrix of unary potentials. 
  • transition_params: 形状为[num_tags, num_tags] 的转移矩阵

返回:

  • viterbi: 一个形状为[seq_len] 显示了最高分的标签索引的列表. 
  • viterbi_score: A float containing the score for the Viterbi sequence.

(3)tf.contrib.crf.crf_decode

       crf_decode(potentials,transition_params,sequence_length) 
        在tensorflow内解码

参数:

  • potentials: 一个形状为[batch_size, max_seq_len, num_tags] 的tensor,
  • transition_params: 一个形状为[num_tags, num_tags] 的转移矩阵
  • sequence_length: 一个形状为[batch_size] 的 ,表示batch中每个序列的长度

返回:

  • decode_tags:一个形状为[batch_size, max_seq_len] 的tensor,类型是tf.int32,表示最好的序列标记。
  • best_score: 一个形状为[batch_size] 的tensor,包含每个序列解码标签的分数。

(4)代码实现

# !/home/wcg/tools/local/anaconda3/bin/python                                                                                                                                                                                                                                 
# coding=utf8
import numpy as np
import tensorflow as tf# 1.data settings
num_examples = 10         # 句子数
num_words = 20            # 每个句子字数
num_features = 100        # 每个汉字特征数
num_tags = 5              # 标签数# 2. x shape = [10,20,100]   y shape = [10,20]
x = np.random.rand(num_examples,num_words,num_features).astype(np.float32)# Random tag indices representing the gold sequence.
y = np.random.randint(num_tags,size = [num_examples,num_words]).astype(np.int32)# 真实序列的长度
# sequence_lengths = [19,19,19,19,19,19,19,19,19,19]
sequence_lengths = np.full(num_examples,num_words - 1,dtype=np.int32)# 3.Train and evaluate the model.
with tf.Graph().as_default():with tf.Session() as session:# Add the data to the TensorFlow gtaph.x_t = tf.constant(x) #观测序列y_t = tf.constant(y) # 标记序列sequence_lengths_t = tf.constant(sequence_lengths)# Compute unary scores from a linear layer.# weights shape = [100,5]weights = tf.get_variable("weights", [num_features, num_tags])# matricized_x_t shape = [200,100]matricized_x_t = tf.reshape(x_t, [-1, num_features])# compute                           [200,100]      [100,5]   get [200,5]# 计算结果matricized_unary_scores = tf.matmul(matricized_x_t, weights)#  unary_scores shape = [10,20,5]                  [10,20,5] unary_scores = tf.reshape(matricized_unary_scores, [num_examples, num_words, num_tags])# compute the log-likelihood of the gold sequences and keep the transition# params for inference at test time.#                                                shape      shape   [10,20,5]   [10,20]   [10]log_likelihood,transition_params = tf.contrib.crf.crf_log_likelihood(unary_scores,y_t,sequence_lengths_t)viterbi_sequence, viterbi_score = tf.contrib.crf.crf_decode(unary_scores, transition_params, sequence_lengths_t) loss = tf.reduce_mean(-log_likelihood)           # add a training op to tune the parameters.# 定义梯度下降算法的优化器#learning_rate 0.01train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss)#train for a fixed number of iterations.session.run(tf.global_variables_initializer())''' #eg:In [61]: m_20Out[61]: array([[ 3,  4,  5,  6,  7,  8,  9, 10, 11, 12]])In [62]: n_20Out[62]: array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])In [59]: n_20<m_20Out[59]: array([[ True,  True,  True,  True,  True,  True,  True,  True,  True, True]], dtype=bool)'''#这里用mask过滤掉不符合的结果mask = (np.expand_dims(np.arange(num_words), axis=0) < np.expand_dims(sequence_lengths, axis=1))###mask = array([[ True,  True,  True,  True,  True,  True,  True,  True,  True, True]], dtype=bool)#序列的长度total_labels = np.sum(sequence_lengths)print ("mask:",mask)print ("total_labels:",total_labels)for i in range(1000):#tf_unary_scores,tf_transition_params,_ = session.run([unary_scores,transition_params,train_op])tf_viterbi_sequence,_=session.run([viterbi_sequence,train_op])if i%100 == 0:'''false*false = false  false*true= false ture*true = true'''#序列中预测对的个数correct_labels = np.sum((y==tf_viterbi_sequence) *  mask) accuracy = 100.0*correct_labels/float(total_labels)print ("Accuracy: %.2f%%" %accuracy)


http://chatgpt.dhexx.cn/article/ZVFj5GMj.shtml

相关文章

NLP之条件随机场

条件随机场&#xff08;conditional random fields, CRFs&#xff09;由J. Lafferty等人&#xff08;2001&#xff09;提出&#xff0c;近几年来在自然语言处理和图像处理等领域中得到了广泛的应用。 CRF是用来标注和划分序列结构数据的概率化结构模型。言下之意&#xff0c;就…

条件随机场CRF

1 条件随机场CRF&#xff1a;从条件随机场到线性链条件随机场 条件随机场(Conditional Random Fields, 以下简称CRF)是给定一组输入序列条件下另一组输出序列的条件概率分布模型&#xff0c;在自然语言处理中得到了广泛应用。 1.1 什么样的问题需要CRF模型 这里举一个简单的…

条件随机场的肤浅理解

条件随机场&#xff08;Conditional Random Field&#xff0c;CRF&#xff09;是自然语言处理的基础模型&#xff0c;是一个无向图概率模型。经过长期的发展目前已经广泛应用于词性标注、图像分类等众多场景。 一、基本概念 随机场 : 给定一组随机变量: X { X 1 , X 2 , X …

条件随机场详解

为了更好地理解条件随机场&#xff0c;这里主要以命名实体识别为例子&#xff0c;介绍如何和LSTM结合&#xff0c;进行NER。 首先什么是NER&#xff0c;就是针对一句话的每个词&#xff0c;都标注出它们的词性&#xff0c;比如输入一句"Dog play football"&#xff…

条件随机场(CRF)

目录 1.定义 1.1 图 1.2 概率图模型&#xff08;PGM&#xff09; &#xff08;1&#xff09;有向图的联合概率&#xff1a; &#xff08;2&#xff09;概率无向图模型&#xff1a; 1.3 马尔可夫性 1.4 团与最大团 1.5 概率无向图模型的联合概率分布 1.6 条件随机场 …

条件随机场 (CRF)

背景 CRF和HMM是有相似性的&#xff0c;最后都是使用Verterbi算法来进行最优状态转移序列的确定。CRF主要用于序列标注问题。 本质&#xff1a;通过1D卷机学习近邻信息&#xff0c;然后输入到CRF定义好的计算方式中。 一些实现的库&#xff0c;并不能主观反应出CRF的计算方式&…

条件随机场简介(Conditional Random Fields, CRF)

首先&#xff0c;我们来看看什么是随机场。随机场是由若干个位置组成的整体&#xff0c;当给每一个位置中按照某种分布随机赋予一个值之后&#xff0c;其全体就叫做随机场。以词性标注为例&#xff1a;假如我们有一个十个词组成的句子需要做词性标注&#xff0c;这十个词每个词…

简单理解条件随机场CRF

一、条件随机场是什么&#xff1f; 什么是条件随机场&#xff1f;我们先从它的命名开始说起&#xff0c;为什么是条件随机场这么奇怪的名字&#xff0c;为什么不叫飞机场、火葬场&#xff1f;通常数学上的命名是简单而直白的&#xff0c;大家听我一一解释。 条件 “条件”指…

条件随机场(CRF)的详细解释

条件随机场(CRF)由Lafferty等人于2001年提出&#xff0c;结合了最大熵模型和隐马尔可夫模型的特点&#xff0c;是一种无向图模型&#xff0c;常用于标注或分析序列资料&#xff0c;如自然语言文字或是生物序列。近年来在分词、词性标注和命名实体识别等序列标注任务中取得了很好…

RBM理论推导

RBM&#xff08;Restricted Boltzmann Machine&#xff09; 上面这个图就是一个RBM模型&#xff0c;它包括三个部分&#xff0c;最下面的可视层&#xff08;visible layer&#xff09;&#xff0c;中间的权重连边&#xff08;无向&#xff09;&#xff0c;上面的隐藏层&#xf…

受限玻尔兹曼机RBM简述与Python实现

生成式模型 生成式模型的理念大同小异&#xff0c;几乎都是用一个模型产生概率分布来拟合原始的数据分布情况&#xff0c;计算两个概率分布的差异使用KL散度&#xff0c;优化概率模型的方法是最小化对数似然&#xff0c;可以用EM算法或梯度优化算法。 今天表现比较好的生成模…

RBM系列1:预备知识

受限玻尔兹曼机是一种可用随机神经网络来解释的概率图模型。它由Smolensky于1986年在玻尔兹曼机&#xff08;BM&#xff09;的基础上提出&#xff0c;所谓“随机”&#xff0c;是指这种网络中的神经元是随机神经元&#xff0c;其输出只有两种状态&#xff08;激活和未激活&…

深度学习20-限制玻尔兹曼机RBM

玻尔兹曼机来源于玻尔兹曼分布&#xff0c;而玻尔兹曼分布的创立者是路德维希玻尔兹曼&#xff0c;这个原理来源于他首次将统计学用于研究热力学&#xff0c;即物质的状态概率和它对应的能量有关。比如&#xff0c;我们常用熵来形容物体的混乱程度&#xff0c;同时如果我们的定…

【深度学习】受限玻尔兹曼机 (RBM) 初学者指南

一、说明 受限玻尔兹曼机&#xff08;Restricted Boltzmann Machine&#xff0c;RBM&#xff09;是一种基于能量模型的人工神经网络。它只有一个隐层&#xff0c;将输入层和隐层中的每个神经元互相连接&#xff0c;但不同层的神经元之间没有连接。RBM是一种无向的概率图模型&am…

matlab rbm 语音,Deep Belief Network 学习笔记-RBM

Deep Belief Network 学习笔记-RBM By Placebo (纯属个人笔记) 第一次知道deep learning&#xff0c;是上学期dengli博士来实验室的一次报告&#xff0c;他讲到&#xff0c;当神经网络的层数大于2时(即一个hidden层&#xff0c;一个输出层&#xff0c;不算输入层&#xff0c;之…

受限玻尔兹曼机(RBM)

受限玻尔兹曼机&#xff08;RBM&#xff09; 一起读懂传说中的经典&#xff1a;受限玻尔兹曼机 https://mp.weixin.qq.com/s?__bizMzA3MzI4MjgzMw&mid2650731098&idx1&snc7391caee3a567b4b046406d53f022f2&chksm871b3624b06cbf320f3725fe452d291e04a4a8c1beda…

人工智能(pytorch)搭建模型13-pytorch搭建RBM(受限玻尔兹曼机)模型,调通模型的训练与测试

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型13-pytorch搭建RBM(受限玻尔兹曼机)模型&#xff0c;调通模型的训练与测试。RBM(受限玻尔兹曼机)可以在没有人工标注的情况下对数据进行学习。其原理类似于我们人类学习的过程&#xff0c…

受限玻尔兹曼机(RBM)原理总结

https://blog.csdn.net/l7H9JA4/article/details/81463954 授权转发自&#xff1a;刘建平《受限玻尔兹曼机&#xff08;RBM&#xff09;原理总结》 地址:http://www.cnblogs.com/pinard/p/6530523.html 前 言 本文主要关注于这类模型中的受限玻尔兹曼机&#xff08;Restrict…

特征工程(七)—特征学习RBM

1、MNIST数据集 """ MNIST数据集&#xff0c;包括6000个0-9手写数字图像&#xff0c;以及学习的真实值此处使用很低级的特征&#xff0c;而不是解释性很好的特征。每一个数据点包括784个特征&#xff08;灰度图像的像素值&#xff09; """impor…

特征学习-RBM与PCA应用在LR

Table of Contents 1. 基本信息查询 导入package2. 提取PCA 成分3. 提取RBM主成分 取出前20个最有代表性的特征提取后20个特征4. RBM在machine learning中效果 直接用LR模型采用PCA主成分的LR采用RBM主成分的LR 1. 基本信息查询 导入package import numpy as np import matpl…