在关于 CRF(like this或this)的论文中,作者都提到了 forward-backward 算法,但 GitHub 中的实现(或 PyTorch教程中的基本实现)似乎只使用 forward 算法来计算负对数似然为用 SGD 优化。
如果我想在 BiLSTM 特征上训练 NER,并且我将进行的唯一查询类型就像“给定一个句子,找到命名实体”,我需要前向后向算法吗?或者更一般地说,这两种算法有什么区别,什么时候使用哪一种?
我认为在 PyTorch 教程中只使用前向算法的原因是为了计算分区函数,只需要前向或后向传递。不过,需要前向后向算法来计算边际概率。
BiLSTM 为您提供更多上下文和可能更好的结果。考虑以下示例:
在第一种情况下,“泰迪”不是 NE,但在第二种情况下,“泰迪”是 NE。BiLSTM 会更好地注意到这一点,因为它不仅可以查看过去的状态,还可以查看未来的状态(即“熊”和“罗斯福”)。
来自关于 BiLSTM 的维基百科:
“训练的一般程序如下:对于前向传递,先传递前向状态和后向状态,然后传递输出神经元。对于后向传递,先传递输出神经元,然后传递前向状态和后向状态。在前向传递之后并完成后向传递,更新权重”