CRF损失函数与维特比解码

本节讨论如何计算
在上一篇博客我们学会了如何通过BILSTM提取特征得到发射分数,通过CRF层约束标签得到转移分数。
对于一个标签序列,我们可以通过发射分数和转移分数的和计算这条路径的最终得分。这是前向学习的内容,当然深度学习需要定义损失函数来进行反向传播,更新梯度。对于序列标注的模型,如何定义损失函数呢?
我们可以使用CRF损失函数学习模型参数。在这里维特比解码要解决的问题是对于一个新的样本过来我们如何通过发射分数和转移分数在所有的可能路径中找到最优路径。

前向算法

概率计算问题(HMM),已知模型参数(Π,A,B)和观测序列O = (o1,o2,…oT),计算状态序列出现的概率。
直接计算法:进行穷举,计算量很大,不可行。
前向算法:基于状态序列的路径结构递推计算,局部计算前向概率,利用路径结构将前向概率递推到全局。

什么是动态规划?

动态规划通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。
举例:可以想象成棋盘问题,从棋盘的左上角到右下角怎么才能消耗最低的能量路径呢?就用到了动态规划算法,答案就是每一步走的方向都是消耗最低的能量,最终走完消耗的总能量一定最低。

前向算法在NER中起到了什么作用?

损失函数:快速计算标注路径得分与所有路径得分的比值。若该比值比较大,说明标注路径得分比较高,是可取的。
预测或者说是解码:得到最优的标注序列,输出最终结果。

维特比算法

维特比算法非常重要,它是解决序列标注的预测问题/解码问题,通过模型训练学习到了模型的发射矩阵和转移矩阵,那么输入一条文本,如何通过模型得到最优的标注呢?就用到了维特比算法。
定义:一种用于选择最优路径的动态规划算法,从开始状态后每走一步,记录到达该状态所有路径的最大概率值,然后以最大值为基准继续向后推进。最后再从结尾回溯最大概率,也就是最有可能的最优路径。
如图是一个时间步为3,每一步有3种状态(标签)的序列,我们如何通过维特比算法选择一条最优路径?

在这里插入图片描述
在这里插入图片描述
对于A1,A2,A3而言,它们只能由S转移过来;S->A1,S->A2,S->A3是A的时间步长,它是初始的隐状态转移概率,模型已经训练好了,那么我们就可以计算。
那么B1是通过A1、A2还是A3转移过来的呢?通过计算P(A1->B1)、P(A2->B1)、P(A3->B1)的转移概率,寻找概率最大值,我们就把他记录下来。假设结果为P(A3->B1)最大。同理,P(A1->B2)最大,P(A2->B3)最大。
在这里插入图片描述
我们前面已经知道了B1最有可能来源于A3,B2来源于A1,B3来源于A2。所以C1从B1,B2,B3转移过来后,无需计算P(S->A1->B1)了,因为P(S->A1->B1)<P(S->A3->B1),简化了计算过程,只需要从B1这里拿我是从A3过来的即可。C1只需比较P(B1->C1)、P(B2->C1)、P(B3->C1)当前步最大的概率即可。
在这里插入图片描述
通过计算P(C1->E)、P(C2->E)、P(C3->E)比较的出了P(C3->E)最大,于是从E点开始回溯,Pmax(C->E)为C3->E;Pmax(B->C)为B2->C3;Pmax(A->B)为A1->B2;Pmax(S->A)为S->A1;于是我们便得到了最优的路径A->A1->B2->C3->E
设有N个状态,序列长度为T:
穷举法:NT
维特比算法:TN2
因此,维特比算法的计算量最小。

CRF损失函数

CRF损失函数由两部分组成,真实路径的分数和所有路径的总分数。真实路径的分数应该是所有路径中分数最高的。真实路径分数 = 发射分数 + 转移分数。那么如何计算所有路径的总分数?
总得分Ptotal = P1 + P2 +…+PN

LossFunction = P   R e a l P a t h   P   1   + P   2   + . . . + P   N   \frac{P~RealPath~}{P~1~ + P~2~ +...+P~N~} P 1 +P 2 +...+P N P RealPath 

LogLossFunction = log P   R e a l P a t h   P   1   + P   2   + . . . + P   N   \frac{P~RealPath~}{P~1~ + P~2~ +...+P~N~} P 1 +P 2 +...+P N P RealPath 

当我们训练模型的时候,我们的目标是最小化损失函数,于是我们加入负号。

LogLossFunction
= - log P   R e a l P a t h   P   1   + P   2   + . . . + P   N   \frac{P~RealPath~}{P~1~ + P~2~ +...+P~N~} P 1 +P 2 +...+P N P RealPath 

= - log e S   R e a l P a t h   e S 1 + e S 2 + . . . + e S N \frac{e^S~RealPath~}{e^S1 + e^S2+...+e^SN} eS1+eS2+...+eSNeS RealPath 

= - (log(eSRealPath - log(eS1 + eS2+…+eSN))

=- (SRealPath - log(eS1 + eS2+…+eSN))

=- ( ∑ i = 1 N X   i y i   \sum_{i=1}^N X~iyi~ i=1NX iyi  + ∑ i = 1 N t   y i y i + 1   \sum_{i=1}^N t~yiyi+1~ i=1Nt yiyi+1  - log(eS1 + eS2+…+eSN))

=- (发射分数 + 转移分数 - 所有路径的总分数)

如何计算所有路径的总分数?

当前结点得分?

类似维特比解码算法,这里每个结点记录之前所有结点到当前结点的路经总和,最后一步即可得到所有路径的总和。之前的维特比解码是每个结点记录之前所有结点到当前结点的最大的那条路径。
在这里插入图片描述
假设有两个标签分别是1和2.
previous矩阵:代表上一步的两种状态。
obs矩阵:代表这一步的两种状态。
scores矩阵:当前第一步的所有路径的可能。
scores[0][0] 代表的含义是上一步状态是1,这一步状态是1,即从状态1->状态1的转移概率;
scores[0][1] 代表的含义是上一步状态是1,这一步状态是2,即从状态1->状态2的转移概率;
scores[1][0] 代表的含义是上一步状态是2,这一步状态是1,即从状态2->状态1的转移概率;
scores[1][1] 代表的含义是上一步状态是2,这一步状态是2,即从状态2->状态2的转移概率;
所有路径得分:
每个结点记录之前所有结点到当前结点的路经总和,最后一步即可得到所有路径的总和。
在这里插入图片描述
预测采用维特比解码,每个结点记录之前所有结点到当前结点的最优路径,最后一步通过回溯可得到一条最优路径。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_45283671/article/details/109864736
CRF