如何在张量流序列模型中添加 CRF 层?

How to add CRF layer in a tensorflow sequential model?

我正在尝试在 TensorFlow 序列模型中针对 NER 问题实施 CRF 层。我不知道该怎么做。以前当我实现 CRF 时,我使用来自 keras 的 CRF 和 tensorflow 作为后端,即我在 keras 而不是 tensorflow 中创建了整个模型,然后通过 CRF 传递了整个模型。有效。

但现在我想在 Tensorflow 中开发模型,因为 tensorflow2.0.0 beta 已经内置了 keras,我正在尝试构建一个顺序层并在双向 lstm 层之后添加 CRF 层。虽然我不确定该怎么做。我已经浏览了 tensorflow-addons 中的 CRF 文档,它包含不同的功能,例如前向 CRF 等,但不确定如何将它们实现为一个层?我想知道是否有可能在顺序张量流模型中实现 CRF 层,或者我是否需要从头开始构建模型图然后使用 CRF 函数?谁能帮我解决这个问题。提前致谢

训练过程中

可以参考this API

tfa.text.crf_log_likelihood(
    inputs,
    tag_indices,
    sequence_lengths,
    transition_params=None
)

输入是一元势(就像逻辑回归中的那样,你可以参考this answer)而你的情况是logits(通常不是分布之后的分布) softmax 激活函数)或编码器中每个字符的 BiLSTM 状态(上图中的 P1、P2、P3、P4;)。

tag_indices是目标标签索引,sequence_lengths代表批次中的序列长度。

transition_params 是二元势(也是标签如何从一个时间步转移到下一个时间步),您可以自己创建矩阵,或者让 API 为您做.

推理过程中:
您只需利用 this API:

tfa.text.viterbi_decode(
    score,
    transition_params
) 

分数代表与训练中相同的输入(P1,P2,P3,P4状态)并且transition_params也是在训练过程中训练的。