参考 https://www.cnblogs.com/createMoMo/p/7529885.html
数据编码准备
采用BIO编码,在BI后面指定实体了类别
B-Person
I- Person
B-Organization
I-Organization
O
BiLSTM-CRF 模型结构
1.句子中的每一个词/字符都被表征为一个向量,如果包含词性,就是词性和词向量的拼接
2.词性向量是随机初始化的,词向量是预先训练的
3.所有向量都会放在神经网络中继续调整训练
4.BiLSTM-CRF的输入就是词的embedding,输出是词的预测标签的分数
1.BiLSTM的输出是每个预测标签的分数, 比如w0这个词,输出是1.5 (B-Person), 0.9 (I-Person), 0.1 (B-Organization), 0.08 (I-Organization) , 0.05 (O). 这个输出作为CRF层的输入.
2.在CRF层接受到输入之后,CRF在众多标签序列路径中,选择将拥有最高预测得分的标签序列作为最后的预测结果
BiLSTM的局限性
LSTM可以直接完成实体识别的任务,此时LSTM的预测标签的得分作为实体识别的结果,比如w0预测为B-Person,因为得分最高为1.5
1.单单只有LSTM可能会预测得到非法结果,比如下图LSTM的预测结果是 I-Organization -> I-Person -> O -> I-Organization -> I-Person,这是非法的,因为 I-Organization后面不可能接I-Person
2.LSTM没有考虑到标签的上下文限制
CRF层的作用
CRF能学到标签的上下文限制,可以对LSTM的预测结果进一步加入约束条件来保证预测结果的合法性
这些限制条件比如:
1.第一个词必须是B或者O,不能是I
2.B -> I -> I这样的组合,后面的类别必须一致,比如B-Person -> I-Person -> I-Person,不能是B-Person -> I-Organization -> I-Person等等
3.O后面接I是非法的
有了这些限制之后,非法的标签序列会显著减小
CRF层详解
CRF层的损失函数包含两部分
第一部分是发射概率或者发射得分,这个发射概率由BiLSTM层产生,比如w0发射B-Person的概率得分是1.5
给每一个标签设置索引如下
Label | Index |
---|---|
B-Person | 0 |
I-Person | 1 |
B-Organization | 2 |
I-Organization | 3 |
O | 4 |
此时Xw1y2=0.1, 表示w1词对于B-Organization的发射概率是0.1
1.第二部分是转移概率或者转移得分
2.使用Tyiyj来表示转移得分,比如Ty0y1=0.9表示从B-Person -> I-Person, 因此得到一个转移矩阵
3.为了使转移矩阵更加稳定鲁棒,需要增加两个新标签,START和END,START是句子的开始,END是句子的结尾
4.从转移矩阵可以明显看出标签之间的上下文限制.比如句首必须是B或者I,不能是I,因为从STRAT到I的得分非常低,等等.
5.转移矩阵是BiLSTM-CRF的一个参数,在模型训练之前,转移矩阵需要随机初始化,这个矩阵会随着模型的训练一致迭代更新,换句话说CRF层能够自动学习到这个矩阵,不需要手工指定转移矩阵.
CRF损失函数计算
CRF损失函数的计算包含真实路径和所有路径,其中真实路径是所有可能路径中分数最高的路径.
如果有一个包含5个词的句子,它的可能路径包括
1.START B-Person B-Person B-Person B-Person B-Person END
2.START B-Person I-Person B-Person B-Person B-Person END
3.START B-Person I-Person O B-Organization O END
4.O O O O O O O
等等
设第i种路径的分数是Pi,则所有路径的分数和是Ptotal = P1 + P2 + ... + Pn = es1 + es2 + ... + esn,其中e是自然对数
如果第10条路径是真实路径,那么第10条路径就是训练集的金标准路径,第10条路径的得分占比是所有路径中最大的
CRF层的损失函数的主要部分如下
BiLSTM-CRF模型会一直更新内部参数(发射概率和转移概率),来使得真实路径的占比增大
真实路径得分的计算
CRF的损失函数关乎真实路径得分和所有路径得分,真实路径得分的占比随着训练逐渐增大
对于真实路径的得分esi,由于e是自然对数,所以只要计算si即可
如果START B-Person I-Person O B-Organization O END 是真实路径,那么
1.这个句子有5个词组成
2.额外增加了START和END使得一共有七个词
Si = EmissinScore + TransitionScore 真实路径得分是序列的发射概率得分加转移概率得分
EmissinScore = x0,start + x1,B-Person + x2,I-Person + x3,O + x4,B-Organization + x5,O + x6,END
这些发射得分来自于LSTM层
1.x1,B-Person + x2,I-Person + x3,O + x4,B-Organization + x5,O来自与BiLSTM层,x0
2.start和x6,END可以随机初始化为0
Transition Score = Tstart,b-person + Tb-person,i-person + Ti-person,o + To,b-organization + Tb-organization,o + To,end
这些转移分数来自于crf层,换句话说转移分数是CRF层的参数.
所有路径得分计算
最简单的方法就是枚举出所有可能路径,然后根据发射概率+转移概率计算路径得分,这种方法是低效的,训练时间不可接受
CRF损失函数的化简
期望这个比率增大,所以损失函数加入负号
加入log,一方面因为取了e作为底数,另一方面可以将除法转化为减法
Srealpath可以单独计算,所有路径得分的计算过程如下
1.假设一个句子有三个词w0,w1,w2
2.标签有两个l1,l2
在w0处,没有转移概率,只有发射概率,因此
在w1处,需要w0发射概率+w0->w1转移概率+w1发射概率,因此
在w2处,需要w0发射概率+w0->w1转移概率+w1发射概率+w1->w2转移概率+w2发射概率
模型对新数据的推断过程
通过BiLSTM+CRF的模型训练,分别得到发射概率和转移概率如下
第一个词w0
第一个词w0的推断label很简单,由于不存在转移概率,直接以发射概率最大为准,比如w01=0.2,w02=0.8,则第一个词w0的推断标签是l2
记录下标签[l2]
第二个词w1
整个句子包括w0->w1
这个矩阵需要竖着看
第一列是所有当前第二个词是l1的所有情况
第二列是所有当前第二个词是l2的所有情况
取每一列的分数最大值作为当前词label下的最优路径
比如如果当前词的label是l2,那么最优路径是x02+x12+t22,分数是0.4
这两个label下的最优结果,传递给第三个词再计算,作为第三个词之前所有词的基础发射概率
由于0.5是最大得分,记录下标签l1,和历史标签拼接得到 l2->l1
第三个词w2
第一列是第三个词是l1标签的所有路径可能,其中之前历史路径已经使用第二个词各标签下的最大分数路径
如果矩阵得分计算如下,依旧还是取列的最大值
由于最大得分是0.9,此时的标签是l2,历史策略是0.5,所以最优路径是 l2->l1->l2