CRF 层可以向最终的预测标签添加一些约束,以确保它们是有效的。这些约束可以由 CRF 层在训练过程中从训练数据集自动学习。
CRF损失函数:
Path Score Real = Emission score(发射分数) + Transition score(转移分数)
Emission score:神经网络输出的各个Tag的置信度;
Transition score:CRF层中各个Tag之前的转移概率;Preal path = escore
当只使用CRF做NER的时候规则都是人为制定的
在只有CRF的情况下,上面说的2类特征函数都是人工设定好的。通俗的说就是人工设定了观测序列的特征;计算的时候,如果这句话符合特征模板中的特征规则,则那个特征规则的值就为1,否则就为0。
而深度学习模型+CRF则是模型根据数据训练得出的规则模板
为什么不能通过人工来判断标注规则并编写好修正逻辑呢?
因为人工虽然能判断出预测的标注前后关系是否符合规则,但是无法知道如何对不符合规则的预测进行调整,比如我们知道句子的开头应该是“B-”或“O”,而不是“I-”,但是究竟是B-还是O呢?而且对于标注状态非常多的场景下,人工编写的工作量和逻辑是非常大且复杂的
BERT负责学习输入句子中每个字和符号到对应的实体标签的规律,而CRF负责学习相邻实体标签之间的转移规则
CRF层可以自己学习这些约束。我们不需要手动构建矩阵。随着训练迭代次数的增加,分数会逐渐趋于合理。
正确路径的分数求解分以下两部分:
《1:发射分数
《2:转移分数:实际是CRF的学习参数
所有路径的得分总和
基于损失最小化原则,前面加符号
基于上面式子,就是求下面的分母
发射矩阵:三个字符w、两个标签l
下面展开成矩阵是为了便于计算
对previous和 obs和转移矩阵求和
实际根据previous就能求出所有路径得分之和(4种情况)
在解码阶段:
我们还有两个变量用来存储历史信息(得分和索引),alpha0和alpha1
用两个列表存储每一步的最大得分以及其对应的标签,然后解码从尾到头根据两个列表回溯出最优解码路径。
维特比存储上一个节点的最大概率节点路径,带来的好处是:最优路径变为了节点个数3条,而不是之前的3^5条了