RNN命名实体识别 命名实体识别算法crf_特征函数

CRF 层可以向最终的预测标签添加一些约束,以确保它们是有效的。这些约束可以由 CRF 层在训练过程中从训练数据集自动学习。

CRF损失函数:

RNN命名实体识别 命名实体识别算法crf_python_02

Path Score Real = Emission score(发射分数) + Transition score(转移分数)

Emission score:神经网络输出的各个Tag的置信度;

Transition score:CRF层中各个Tag之前的转移概率;Preal path = escore

RNN命名实体识别 命名实体识别算法crf_RNN命名实体识别_03

当只使用CRF做NER的时候规则都是人为制定的

在只有CRF的情况下,上面说的2类特征函数都是人工设定好的。通俗的说就是人工设定了观测序列的特征;计算的时候,如果这句话符合特征模板中的特征规则,则那个特征规则的值就为1,否则就为0。

而深度学习模型+CRF则是模型根据数据训练得出的规则模板

 为什么不能通过人工来判断标注规则并编写好修正逻辑呢?
因为人工虽然能判断出预测的标注前后关系是否符合规则,但是无法知道如何对不符合规则的预测进行调整,比如我们知道句子的开头应该是“B-”或“O”,而不是“I-”,但是究竟是B-还是O呢?而且对于标注状态非常多的场景下,人工编写的工作量和逻辑是非常大且复杂的

BERT负责学习输入句子中每个字和符号到对应的实体标签的规律,而CRF负责学习相邻实体标签之间的转移规则

CRF层可以自己学习这些约束。我们不需要手动构建矩阵。随着训练迭代次数的增加,分数会逐渐趋于合理。

正确路径的分数求解分以下两部分:

《1:发射分数

RNN命名实体识别 命名实体识别算法crf_数据集_04

《2:转移分数:实际是CRF的学习参数

RNN命名实体识别 命名实体识别算法crf_数据集_05

所有路径的得分总和

基于损失最小化原则,前面加符号

RNN命名实体识别 命名实体识别算法crf_数据集_06

基于上面式子,就是求下面的分母

RNN命名实体识别 命名实体识别算法crf_数据集_07

 发射矩阵:三个字符w、两个标签l

RNN命名实体识别 命名实体识别算法crf_深度学习_08

RNN命名实体识别 命名实体识别算法crf_python_09

 

RNN命名实体识别 命名实体识别算法crf_特征函数_10

RNN命名实体识别 命名实体识别算法crf_特征函数_11

下面展开成矩阵是为了便于计算

RNN命名实体识别 命名实体识别算法crf_特征函数_12

对previous和 obs和转移矩阵求和

RNN命名实体识别 命名实体识别算法crf_数据集_13

RNN命名实体识别 命名实体识别算法crf_python_14

实际根据previous就能求出所有路径得分之和(4种情况)

RNN命名实体识别 命名实体识别算法crf_数据集_15

在解码阶段:

我们还有两个变量用来存储历史信息(得分和索引),alpha0和alpha1

RNN命名实体识别 命名实体识别算法crf_深度学习_16

RNN命名实体识别 命名实体识别算法crf_数据集_17

 

RNN命名实体识别 命名实体识别算法crf_数据集_18

用两个列表存储每一步的最大得分以及其对应的标签,然后解码从尾到头根据两个列表回溯出最优解码路径。

维特比存储上一个节点的最大概率节点路径,带来的好处是:最优路径变为了节点个数3条,而不是之前的3^5条了

RNN命名实体识别 命名实体识别算法crf_深度学习_19