Gavin老师Transformer直播课感悟 - NLP信息提取中的CRF Modeling详解(二)

一、概述

本文介绍如何通过Pytorch实现linear-chain CRF,CRFs概括了任何无向的图结构,譬如序列,树,图等,在实现中使用了序列化的结构,即模型是基于前面的状态转移来进行条件判断的,这样的模型称为Linear-chain CRF。

二、通过Pytorch实现linear-chain CRF

  1. 关于CRF的理论

自从CRF的第一篇论文发布以来,已经在机器学习领域得到了广泛的运用,譬如从生物信息领域的计算,计算机视觉到自然语言处理等。CRFs模型和LSTMs模型组合使用带来了很好的效果。在前面谈到的DIET架构图中,就使用CRF对Transformer处理后的输出进行信息提取。当在BiLSTM模型上面搭建一层CRF时,针对sequence的POS tagging处理可以获得更准确的结果。

下面是测试结果样例:

对于CRFs来说,处理一个序列分类问题的目标是基于给定的输入序列vectors X,找到一个labels序列y的概率,条件概率表示为P(y | X)。

可以定义以下符号表示:

训练集:输入和目标序列对 {(Xi,yi)}

第i个vectors输入序列:

第i个labels目标序列:

条件概率可以表示为:

这里使用正则化对P(yk|xk)建模类似于在神经网络中广泛使用的softmax转换。使用exp函数的原因在于:

-避免underflow,当非常小的数字相乘时会得到更小的数字,从而可能造成underflow

-避免Non-negative输出:所有值都大于0

-避免单调递增:值会愈来愈大

U(x,y)被称为一元分数,即在第k个时间步基于vector x对应y的预测分数。X可以对应任意的内容,在实践中,x通常是周围元素的拼接,譬如来自于一个滑动窗口的词嵌入。每个一元factor的权重是通过模型中的一个可学习的权重来衡量的,如果把它们看做是LSTM的输出就很容易理解。

Z(x)通常称为partition 函数,我们可以把它看做是正则化的一个factor,因为最后需要得到概率,这类似于softmax函数的分母。

目前为止描述了一个常规分类模型,现在可以添加一个可学习权重来对label yk转移到label yk+1的情况进行建模。通过建模,可以创建连续的labels之间的依赖性,所以这就是Linear-chain CRF。为了达到这个目的,可以把前面的概率同P(yk+1|yk)进行相乘,通过指数运算把乘法变为一元分数U(x,y)与可学习转移分数T(y,y)之和。

整个条件概率公式表达如下:

从代码实现来说,T(y,y)可以被看做是一个矩阵:(nb_labels,nb_labels),其中的每个entry是一个可学习参数,表示从第i个label到第j个label的状态转移。下面是关于这些变量的描述:

-emissions或者unary scores(一元分数):给定输入xk时预测yk的概率分数

-transition scores(T):表示yk后面是yk+1的概率分数

-partition function(Z):为了基于序列获得概率分布的正则化因数(factor)

接下来是定义function Z,由于是正则化操作,需要考虑到每一个时间步基于label set的所有可能的组合。如果有l个组合计算,那么时间复杂度就是O(|y|∧l)。

我们可以利用循环依赖性使用动态编程来有效计算,这样的算法称为forward algorithm或者backward algorithm,取决于你迭代序列的顺序。这与神经网络中提到的正向传播和反向传播算法无关。

猜你喜欢

转载自blog.csdn.net/m0_49380401/article/details/123605916