crf中的状态转移

crf条件随机场,有一个初始状态矩阵、状态转移矩阵和发射矩阵。

在用bilstm+crf做ner时状态转移矩阵常常有问题,比方说直接从”O“跳到“I”(BIO标注方式下)。看了tensorflow的代码后明白了原因所在:在没有给定状态转移矩阵时(通常不会给出状态转移矩阵),tensorflow随机初始一个状态转移矩阵,然后在训练的过程中学习这个状态转移矩阵。问题的原因是tf随机初始的,对于神经网络而言,初始值是非常重要的。一个好的初始值会让模型得到一个好的结果,一个不好的初始值很有可能让模型在一开始就跑偏。

一开始以为只有tf是这样的,后来看了pytorch的crf,发现也有这个问题。

所以状态转移矩阵是着手点。

之前听前辈说过可以单独训练状态转移矩阵,我设计了两个方案。

第一个方案:搞一个简单的神经网络,只有一层权重,然后加上crf,训练,得到状态转移矩阵。

第二个方案:统计所有标签,得出状态转移矩阵。

得到状态转移矩阵后,直接把转移矩阵作为参数transition_params传到crf_log_likelihood中,数据类型是tf.float32,shape是[num_classes, num_classes],num_classes是标签的数量。注意crf_log_likelihood(inputs,tag_indices,sequence_lengths,transition_params=None)中的inputs是[batch_size,seq_length,num_classes],tag_indices是[batch_size, seq_length]

分析方案一得出的状态转移矩阵,发现一行中只有一个值为正,其他值均为负。这其实并不合理,像I-ns后面可能接I-ns也有可能接O。但是得出的转移矩阵中,I-ns后接I-ns的概率为正,在转移矩阵中I-ns后接O的概率为负。虽然随着训练步数的增加,这种情况有所改善,但是状态转移矩阵确实是难以达到理想的状态。

在网络结构相同、其他参数相同的情况下,对比的结果是:增加初始化后,结果并没有得到提升,用统计的方法得到的结果稍微好一些。但就状态转移矩阵而言,方案二的状态转移更正确一些,分析原因是因为方案一得出的状态转移矩阵有点问题,再作为初始化的值传进去还是有点问题。

现在我做ner都是用crfsuite,对比了crfsuite的状态转移矩阵发现,确实tf得出的状态转移矩阵有问题。crfsuite得出的状态转移矩阵并不会出现一行中只有一个为正其他为负的情况。这是我一直比较疑惑的地方,crfsuite用到的特征少,甚至没有词向量,但用相同的数据结果却要比bilstm+crf高出10%左右。过段时间应该会出一个关于crfsuite的研究。

为什么不搞初始状态矩阵?因为tf中的状态初始化矩阵默认全是0,如果要改这个,改的东西太多了,暂时也只是尝试。

 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值