crf的实现 keras_简明条件随机场CRF介绍 | 附带纯Keras实现

数学

当然,如果仅仅是引入输出的关联,还不仅仅是 CRF 的全部,CRF 的真正精巧的地方,是它以路径为单位,考虑的是路径的概率。

模型概要

假如一个输入有 n 帧,每一帧的标签有 k 中可能性,那么理论上就有k^n中不同的输入。我们可以将它用如下的网络图进行简单的可视化。在下图中,每个点代表一个标签的可能性,点之间的连线表示标签之间的关联,而每一种标注结果,都对应着图上的一条完整的路径。

▲4tag分词模型中输出网络图

而在序列标注任务中,我们的正确答案是一般是唯一的。比如“今天天气不错”,如果对应的分词结果是“今天/天气/不/错”,那么目标输出序列就是 bebess,除此之外别的路径都不符合要求。

换言之,在序列标注任务中,我们的研究的基本单位应该是路径,我们要做的事情,是从 k^n 条路径选出正确的一条,那就意味着,如果将它视为一个分类问题,那么将是 k^n 类中选一类的分类问题。

这就是逐帧 softmax 和 CRF 的根本不同了:前者将序列标注看成是 n 个 k 分类问题,后者将序列标注看成是 1 个 k^n 分类问题。

具体来讲,在 CRF 的序列标注问题中,我们要计算的是条件概率:

为了得到这个概率的估计,CRF 做了两个假设:

假设一:该分布是指数族分布。

这个假设意味着存在函数 f(y1,…,yn;x),使得:

其中 Z(x) 是归一化因子,因为这个是条件分布,所以归一化因子跟 x 有关。这个 f 函数可以视为一个打分函数,打分函数取指数并归一化后就得到概率分布。

假设二:输出之间的关联仅发生在相邻位置,并且关联是指数加性的。

这个假设意味着 f(y1,…,yn;x) 可以更进一步简化为:

这也就是说,现在我们只需要对每一个标签和每一个相邻标签对分别打分,然后将所有打分结果求和得到总分。

线性链CRF

尽管已经做了大量简化,但一般来说,(3) 式所表示的概率模型还是过于复杂,难以求解。于是考虑到当前深度学习模型中,RNN 或者层叠 CNN 等模型已经能够比较充分捕捉各个 y 与输出 x 的联系,因此,我们不妨考虑函数 g 跟 x 无关,那么:

这时候 g 实际上就是一个有限的、待训练的参数矩阵而已,而单标签的打分函数 h(yi;x) 我们可以通过 RNN 或者 CNN 来建模。因此,该模型是可以建立的,其中概率分布变为:

这就是线性链 CRF 的概念。

归一化因子

为了训练 CRF 模型,我们用最大似然方法,也就是用:

作为损失函数,可以算出它等于:

其中第一项是原来概率式的分子的对数,它目标的序列的打分,虽然它看上去挺迂回的,但是并不难计算。真正的难度在于分母的对数 logZ(x) 这一项。

归一化因子,在物理上也叫配分函数,在这里它需要我们对所有可能的路径的打分进行指数求和,而我们前面已经说到,这样的路径数是指数量级的(k^n),因此直接来算几乎是不可能的。

事实上,归一化因子难算,几乎是所有概率图模型的公共难题。幸运的是,在 CRF 模型中,由于我们只考虑了临近标签的联系(马尔可夫假设),因此我们可以递归地算出归一化因子,这使得原来是指数级的计算量降低为线性级别。

具体来说,我们将计算到时刻 t 的归一化因子记为 Zt,并将它分为 k 个部分:

其中

分别是截止到当前时刻 t 中、以标签 1,…,k 为终点的所有路径的得分指数和。那么,我们可以递归地计算:

它可以简单写为矩阵形式:

其中

,而 G 是对 g(yi,yj) 各个元素取指数后的矩阵,即

;而

是编码模型

(RNN、CNN等)对位置 t+1 的各个标签的打分的指数,即

,也是一个向量。式 (10) 中,ZtG 这一步是矩阵乘法,得到一个向量,而 ⊗ 是两个向量的逐位对应相乘。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值