2 tensorflow 实现 BI-LSTM-CRF
代码比较长,请访问github查看 bilstmcrf
2.1 训练
用GRU替代LSTM,这也是工程中常用的做法,其参数更少。训练时使用tf.contrib.crf.crf_log_likelihood计算损失, 模型公式参考前文,其函数内部使用向前算法计算Z(x)规范化因子,和之前纯crf模型一样使用\(\log\sum\exp\)计算\(logZ_w(x)\)而不是直接计算\(Z_w(x)\),这样才能避免数值超float32浮点范围。
2.2 解码
解码使用tf.contrib.crf.viterbi_decode,其实这个函数是numpy实现的,和显卡没什么关系。其算法参考中文分词词性和序列标注之CRF-4-查找最大概率序列
2.3 试验效果
使用gensim.models.Word2Vec预训练zh-wiki, word2vec,最小字频=3, 向量维度=640,其余参数默认。
bilstm模型在pku集训练,并在对应集评分分词效果。前后向lstm(gru)分别640个单元,只有一层,输出拼接后接投影层,优化算法使用adam, 梯度剪切norm尺寸=5. 其余参数默认, pku评分如下表(猜测继续尝试超参数和优化结构应可提高到0.96或更高, 此处只试验性质,不再继续优化):
algorithm | P | R | F | OOV | OOV Recall | IV Recall |
---|---|---|---|---|---|---|
maximum matching | 0.836 | 0.904 | 0.869 | 0.058 | 0.059 | 0.956 |
maximum probability | 0.859 | 0.919 | 0.888 | 0.058 | 0.085 | 0.970 |
HMM | 0.804 | 0.789 | 0.796 | 0.058 | 0.364 | 0.815 |
Full Second Order HMM | 0.824 | 0.799 | 0.811 | 0.058 | 0.360 | 0.825 |
MEMM | 0.909 | 0.891 | 0.900 | 0.058 | 0.383 | 0.923 |
CRF | 0.932 | 0.912 | 0.922 | 0.058 | 0.556 | 0.934 |
BI-LSTM-CRF | 0.956 | 0.950 | 0.953 | 0.058 | 0.703 | 0.965 |
Leave a Reply