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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yangfengling1023/article/details/82909585

函数:

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

 

 

猜你喜欢

转载自blog.csdn.net/yangfengling1023/article/details/82909585
CRF