用BLSTM+CRF进行序列标注

前言:
2015年,百度几位研究员发表了一篇名为Bidirectional LSTM-CRF Models for Sequence Tagging的论文,意思是用神经网络中的RNN所衍生出的LSTM与CRF相结合来进行序列标注。由于本最近在处理序列标注的问题,所以拜读了一下这篇文章,思想比较朴素简单,但却非常有效且具有简约的美感,让我由衷地钦佩,所以在此对这篇文章中比较关键的部分进行一个翻译记录,并附上自己的理解。阅读该文章并不需要对LSTM和CRF的细节有很深刻的理解(当然不是说细节不重要,只是说不清楚这两个模型的细节也能够比较流畅的阅读,但如果是想更深一步进行研究,那当然建议分别弄清楚LSTM和CRF的原理和细节)。接下来就进入正文,本文主要以命名实体识别作为例子,当然其他的序列标注问题也可以用这个模型,但对于命名实体识别真是尤其的合适。

一.LSTM和CRF的简介

1.1 LSTM
用BLSTM+CRF进行序列标注_第1张图片
其中中间的隐藏层进行了这么一波操作:
用BLSTM+CRF进行序列标注_第2张图片
这里我就不赘诉它具体是怎么操作了,有兴趣的同学可以自己去看看写LSTM专题的文章。我们这里需要明白的事情只有一个,那就是:词是一个个分开输入的,每个输入经过中间层的一次LSTM的处理后,终得到了输出,中间层之间,总是受之前时刻的影响,但是最终的输出之间并没有互相影响。大家如果觉得这里讲的比较粗略的话,可以先看看原文,再来看看这句话是否合理。
由此我们便可以很轻松的推广到B-LSTM,如下图所示:
用BLSTM+CRF进行序列标注_第3张图片
可以看到,中间层由以前的一层变成了2层,需要注意的是,这两层之间的参数肯定是不同的哦,并不会公用相同的矩阵参数什么的,它们是相互独立的,而且方向是相反的,想表达的思想就是说当前字不仅受前文的影响,也受后文的影响。
1.2 CRF
用BLSTM+CRF进行序列标注_第4张图片
条件随机场也不是一两句话能讲清的,但我们还是简要的概括一下它想做的事:我们有一个输入的序列,我们想由输入的序列来预测输出的序列,输出的序列的每一个值不仅和输入有关,还和它的前后输出有关(满足马尔科夫性),也就是这幅图中的无向连线表达的思想。(之前的LSTM的连线是单向的。)

二. BLSTM-CRF networks

还是老规矩,先上图让大家直观感受一下它的流向图:
用BLSTM+CRF进行序列标注_第5张图片
是不是感觉很熟悉,没错,他其实就是完完全全把BLSTM和CRF放在了一块,也就是先过一下BLSTM层,再用CRF进行预测,关键之处在于我们如何来确定这些参数,也就是我们怎么设计出一个合理的损失函数,然后最小化损失函数,从而得到参数。
首先我们需要设计出损失函数,
用BLSTM+CRF进行序列标注_第6张图片
我们首先定义 [x]T1 [ x ] 1 T , [i]T1 [ i ] 1 T 分别是输入的序列和输出的序列,一共有T个词, θ~ θ ~ 表示的是所有未知参数的集合, [fθ][i]t,t [ f θ ] [ i ] t , t ,表示 [x]T1 [ x ] 1 T 中的第t个词通过BLSTM层后,预测结果为 [i]t [ i ] t 的得分,而 [A][i]t1,[i]t [ A ] [ i ] t − 1 , [ i ] t 表示的是标签 [i]t1[i]t [ i ] t − 1 到 [ i ] t 的转移概率,其中BLSTM网络层总的参数 θ θ 和转移矩阵A都是待求的。

具体如何计算这些参数呢?
我们可以先确定一个batch_size(不清楚的同学可以搜索 批量梯度下降法),对于每个batch,我们先用这个模型进行前向传播,首先算出BLSTM的 f f 值,然后再由此进入CRF层计算转移矩阵的值。然后对LSTM进行后向传播,最后同时对A和 θ θ 进行更新。

以上就是大体的一个步骤,有希望更加深刻理解的同学可以参照原文进行对照着学习。

**

%———————7.27更新———————–%

**
更新预定,下面将在tensorflow框架下,从代码层面来实现BLSTM_CRF

你可能感兴趣的:(NLP)