tf.contrib.crf.crf_log_likelihood()的用法

本文详细介绍了tf.contrib.crf.crf_log_likelihood函数在序列标注任务中的使用,包括其参数、返回值及如何通过最大似然估计优化CRF模型。对比了CRF与传统分类器如softmax的区别,强调了CRF在处理序列标注问题上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数:

tf.contrib.crf.crf_log_likelihood(inputs, tag_indices, sequence_lengths, transition_params=None)

在一个条件随机场里面计算标签序列的log-likelihood,函数的目的是使用crf来计算损失,里面用到最大似然估计的优化方法

参数:

inputs: 一个形状为[batch_size, max_seq_len, num_tags] 的tensor,一般使用BILSTM处理之后输出转换为他要求的形状作为CRF层的输入

tag_indices: 一个形状为[batch_size, max_seq_len] 的矩阵,其实就是真实标签

sequence_lengths: 一个形状为 [batch_size] 的向量,表示每个序列的长度

transition_params: 形状为[num_tags, num_tags] 的转移矩阵

返回:

log_likelihood: 标量,log-likelihood

transition_params: 形状为[num_tags, num_tags] 的转移矩阵

 

例子:

log_likelihood,self.transition = contrib.crf.crf_log_likelihood(pred,self.Y,self.X_len)

cost = tf.reduce_mean(-log_likelihood)

上述例子中pred是预测出来的标签,self.Y是正确答案的标签,self.X_len是每一个句子的长度(ps:例子中的代码是从命名实体识别的代码中取出来的)

返回:

log_likelihood:包含给定序列标签索引的对数似然的标量

self.transition:一个[num_tags,num_tags]转换矩阵,即转移矩阵

上面代码的含义是使pred与self.Y尽可能的相近时的参数值(不明白的可以查查最大似然估计是什么含义)

 

题外话:

对于序列标注的问题,可以简单的理解成分类问题,但和真正意义上的分类还是有区别的,这也是为什么NLP中通常使用CRF/HMM而不是直接使用softmax等分类器。主要是序列标注问题的目标输出序列本身会带有一些上下文关联,而softmax等分类器不能体现出这种联系。CRF除了可以体现上下文的联系,更重要的是利用viterbi算法,体现的是一种路径规划的概率。

另外,通常在NLP中,输入每个batch的语句长度是不一样的(单个batch语句长度可以通过padding补齐),如果用CNN做特征提取的话,batch之间的结果的维度是不同的,而采用CRF的话,就不用考虑这个维度不同的问题了

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小杨算法屋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值