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

函数:

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的话,就不用考虑这个维度不同的问题了

 

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小杨算法屋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值