参考链接
参考论文:https://arxiv.org/pdf/1508.01991v1.pdf
代码:https://github.com/GlassyWing/bi-lstm-crf
概述
- 这篇论文主要讲的是:基于LSTM的序列标注模型(sequence tagging model)
- 主要介绍:BI-LSTM-CRF模型
- BI-LSTM-CRF模型的优点:
- A. 可以有效的使用输入前后的特征信息,因为它使用双向的LSTM模型
- B. 可以使用句子级别标记信息,因为使用了CRF层。
- C. 该模型也具有强壮的健壮性,对词向量没有太大的依赖性。
模型架构
- 主要描述模型:LSTM, BI-LSTM, CRF, LSTM-CRF 和BI-LSTM-CRF.四个模型
LSTM Networks
- RNN在命名实体识别的应用如下图所示:
- RNN的内部运算公式: h ( t ) = f ( U x ( t ) + W h ( t − 1 ) ) h(t)=f(Ux(t)+Wh(t-1)) h(t)=f(Ux(t)+Wh(t−1)) y ( t ) = g ( V h ( t ) ) y(t)=g(Vh(t)) y(t)=g(Vh(t)) U , W U,W U,W和 V V V为模型参数。 f f f为 s i g m o i d sigmoid sigmoid激活函数, g g g为 s o f t m a x softmax softmax激活函数: f ( z ) = 1 1 − e − z f(z)=\frac{1}{1-e^{-z} } f(z)=1−e−z1 g ( z m ) = e z m ∑ k e z k g(z_m )=\frac{e^{z_m }}{∑_ke^{z_k } } g(zm)=∑kezkezm
- 在这篇论文中我们使用LSTM(Long Short-Term Memory)来进行序列标注。LSTM单元图如下:
- LSTM的计算公式如下:
i
t
=
σ
(
W
x
i
x
t
+
W
h
i
h
t
−
1
+
W
c
i
c
t
−
1
+
b
i
)
=
σ
(
W
i
[
x
t
,
h
t
−
1
,
c
t
−
1
]
+
b
i
)
i_t=σ(W_{xi} x_t+W_{hi} h_{t-1}+W_{ci} c_{t-1}+b_i )=σ(W_i [x_t,h_{t-1},c_{t-1}]+b_i )
it=σ(Wxixt+Whiht−1+Wcict−1+bi)=σ(Wi[xt,ht−1,ct−1]+bi)
f
t
=
σ
(
W
x
f
x
t
+
W
h
f
h
t
−
1
+
W
c
f
c
t
−
1
+
b
f
)
=
σ
(
W
f
[
x
t
,
h
t
−
1
,
c
t
−
1
]
+
b
f
)
f_t=σ(W_{xf} x_t+W_{hf} h_{t-1}+W_{cf} c_{t-1}+b_f )=σ(W_f [x_t,h_{t-1},c_{t-1}]+b_f )
ft=σ(Wxfxt+Whfht−1+Wcfct−1+bf)=σ(Wf[xt,ht−1,ct−1]+bf)
o
t
=
σ
(
W
x
o
x
t
+
W
h
o
h
t
−
1
+
W
c
0
c
t
−
1
+
b
0
)
=
σ
(
W
0
[
x
t
,
h
t
−
1
,
c
t
−
1
]
+
b
0
)
o_t=σ(W_{xo} x_t+W_{ho} h_{t-1}+W_{c0} c_{t-1}+b_0 )=σ(W_0 [x_t,h_{t-1},c_{t-1}]+b_0 )
ot=σ(Wxoxt+Whoht−1+Wc0ct−1+b0)=σ(W0[xt,ht−1,ct−1]+b0)
c
t
=
f
t
c
t
−
1
+
i
t
t
a
n
h
(
W
x
c
x
t
+
W
h
c
h
t
−
1
+
b
c
)
=
f
t
c
t
−
1
+
i
t
t
a
n
h
(
W
c
[
x
t
,
h
t
−
1
]
+
b
c
)
c_t=f_t c_{t-1}+i_t tan h(W_{xc} x_t+W_{hc} h_{t-1}+b_c )=f_t c_{t-1}+i_t tanh(W_c [x_t,h_{t-1}]+b_c)
ct=ftct−1+ittanh(Wxcxt+Whcht−1+bc)=ftct−1+ittanh(Wc[xt,ht−1]+bc)
h
t
=
o
t
t
a
n
h
(
c
t
)
h_t=o_t tanh(c_t)
ht=ottanh(ct)
σ
σ
σ为logistic sigmoid函数,
i
,
f
,
o
i, f, o
i,f,o 和
c
c
c分别是:输入门、遗忘门、输出门和单元向量(cell vectors)他们的大小等于隐藏层状态向量h的大小。下图表示的是LSTM应用于标注模型:
Bidirectional LSTM Networks
- 论文在序列标注中使用双向的LSTM网络:
CRF networks
- 在预测当前标签时,有两种不同的方法可以利用邻近标签信息。
- 第一种:预测每个时刻的标签分布,然后使用类似波束的(beam-like)解码来找到最佳标签序列。
- 第二种:关注句子级别而不是单个位置,这就是条件随机场(CRF)模型。如下图所示:
LSTM-CRF networks
- 我们将LSTM network 和CRF network 结合起来形成了LSTM-CRF模型。如下图所示:
- 该网络可以通过LSTM层有效地使用过去的输入特征,并通过CRF层有效地使用句子级标签信息。通过CRF层,我们可以有效地使用过去和将来的标签来预测当前标签。
- CRF层其实质就是一个状态转移矩阵
- 整个模型的计算过程:
- 我们用 [ x ] 1 T [x]_1^T [x]1T表示输出句子,长度为 T T T;
- 我们假设标签数为 L L L。
- 用 f θ ( [ x ] 1 T ) ∈ R L × T f_θ ([x]_1^T )∈R^{L×T} fθ([x]1T)∈RL×T表示 L S T M LSTM LSTM网络输出矩阵,其第 i i i列表示的就是句子中第 i i i个最后的标签概率分布。
- 用 [ f θ ] i , t [f_θ]_{i,t} [fθ]i,t表示 f θ ( [ x ] 1 T ) ∈ R L × T f_θ ([x]_1^T )∈R^{L×T} fθ([x]1T)∈RL×T的 ( i , t ) (i,t) (i,t)位置的元素,表示第 t t t个词经过 L S T M LSTM LSTM输出第 i i i个标签的概率。
- CRF层我们用 A ∈ R L × L A∈R^{L×L} A∈RL×L表示。 [ A ] i , j [A]_{i,j} [A]i,j表示的是第 i i i标签到第 j j j个标签的转移分数(概率)。
- 这样对每个句子 [ x ] 1 T [x]_1^T [x]1T我们得到了一个类似全连接神经网络的分数网络:网络的层数= T T T(句子长度);每层的神经元个数= L L L(标签个数);相邻两层神经网的链接权重都是矩阵 A A A。这样句子的每个标签序列都都对应这个网络的一条路径,路径上的权重和就是这个标签序列的分数。模型的预测就是分数最高的路径所对应的标签序列。
- 求最分数最高路径可以通过动态规划轻松的求得。下图形象的描述了整个过程:
BI-LSTM-CRF networks
- 我们将双向的LSTM network 和CRF network 结合起来形成了BI-LSTM-CRF模型。如下图所示:
总结: 序列标注(深度学习+ 条件随机场)
参考博客:https://spaces.ac.cn/archives/5542
softmax层:
- 序列标注可以简单理解为是给序列中的每一词都进行分类,既然是分类,很自然想到将这个序列用CNN或者RNN进行编码后,接一个全连接层用softmax激活,如下图所示:
条件随机场CRF:
- CRF主要用于序列标注问题,在序列标注中当我们设计标签时,比如用s、b、m、e的4个标签来做字标注法的分词,目标输出序列本身会带有一些上下文关联,比如s后面就不能接m和e,等等。逐标签softmax并没有考虑这种输出层面的上下文关联。而CRF就是用来将目标序列本身的一下关联引入模型的方式。如果我们希望CNN或RNN模型能自己学到这些关联,有时候会“强模型所难”,而CRF则更直接一点,它将输出层面的关联分离了出来,这使得模型在学习上更为“从容”:
条件随机场CRF:
-
在序列标注中,假如一个输入有n帧,每一帧的标签有k种可能性,那么理论上就有 k n k^n kn中不同的输出。我们可以将它用如下的网络图进行简单的可视化。在下图中,每个点代表一个标签的可能性,点之间的连线表示标签之间的关联,而每一种标注结果,都对应着图上的一条完整的路径。
-
而在序列标注任务中,我们的正确答案是一般是唯一的。比如“今天天气不错”,如果对应的分词结果是“今天/天气/不/错”,那么目标输出序列就是bebess,除此之外别的路径都不符合要求。换言之,在序列标注任务中,我们的研究的基本单位应该是路径,我们要做的事情,是从 k n k^n kn条路径选出正确的一条,那就意味着,如果将它视为一个分类问题,那么将是 k n k^n kn类中选一类的分类问题!
-
具体来讲,在CRF的序列标注问题中,我们要计算的是条件概率: P ( y 1 , y 2 , … , y n │ x 1 , x 2 , … , x n ) = P ( y 1 , y 2 , … , y n │ X ) P(y_1,y_2,…,y_n│x_1,x_2,…,x_n )=P(y_1,y_2,…,y_n│X) P(y1,y2,…,yn│x1,x2,…,xn)=P(y1,y2,…,yn│X)
-
为了得到这个概率的估计,CRF做了两个假设:
- 假设一 :该分布是指数族分布 :
这个假设意味着存在函数 f ( y 1 , y 2 , … , y n , X ) f(y_1,y_2,…,y_n,X) f(y1,y2,…,yn,X),使得: P ( y 1 , y 2 , … , y n │ X ) = 1 Z ( X ) e x p ( f ( y 1 , y 2 , … , y n , X ) ) P(y_1,y_2,…,y_n│X)=\frac{1}{Z(X)}exp(f(y_1,y_2,…,y_n,X)) P(y1,y2,…,yn│X)=Z(X)1exp(f(y1,y2,…,yn,X))其中 Z ( x ) Z(x) Z(x)是归一化因子,因为这个是条件分布,所以归一化因子跟 x x x有关。这个 f f f函数可以视为一个打分函数,打分函数取指数并归一化后就得到概率分布。 Z ( X ) = ∑ y 1 , y 2 , … , y n e x p ( f ( y 1 , y 2 , … , y n , X ) ) Z(X)=∑_{y_1,y_2,…,y_n}exp(f(y_1,y_2,…,y_n,X)) Z(X)=y1,y2,…,yn∑exp(f(y1,y2,…,yn,X)) - 假设二:输出之间的关联仅发生在相邻位置
这个假设意味着 f ( y 1 , y 2 , … , y n , X ) f(y_1,y_2,…,y_n,X) f(y1,y2,…,yn,X)可以更进一步简化为: f ( y 1 , y 2 , … , y n , X ) = h ( y 1 , X ) + g ( y 1 , y 2 , X ) + … + g ( y n − 1 , y n , X ) + h ( y n , X ) f(y_1,y_2,…,y_n,X)=h(y_1,X)+g(y_1,y_2,X)+…+g(y_{n-1},y_n,X)+h(y_n,X) f(y1,y2,…,yn,X)=h(y1,X)+g(y1,y2,X)+…+g(yn−1,yn,X)+h(yn,X)这也就是说,现在我们只需要对每一个标签和每一个相邻标签对分别打分,然后将所有打分结果求和得到总分。
- 假设一 :该分布是指数族分布 :
-
尽管已经做了大量简化,但一般来说还是过于复杂,难以求解。于是考虑到当前深度学习模型中,RNN或者层叠CNN等模型已经能够比较充分捕捉各个 y y y与输出 x x x的联系,因此我们可以用神经网络来实现 f f f。这样麻烦的问题只有 g g g了,于是我们继续简化 g g g,不妨考虑函数 g g g跟 x x x无关,那么: f ( y 1 , y 2 , … , y n , X ) = h ( y 1 , X ) + g ( y 1 , y 2 ) + … + g ( y n − 1 , y n ) + h ( y n , X ) f(y_1,y_2,…,y_n,X)=h(y_1,X)+g(y_1,y_2 )+…+g(y_{n-1},y_n )+h(y_n,X) f(y1,y2,…,yn,X)=h(y1,X)+g(y1,y2)+…+g(yn−1,yn)+h(yn,X)
-
到这里我们就可以可以将深度学习模型和CRF进行分工了, h ( y t , X ) h(y_t,X) h(yt,X)是输入序列生成 y t y_t yt的打分函数这个可以通过RNN或CNN加上softmax层产生。 g ( y t , y t + 1 ) g(y_t,y_{t+1}) g(yt,yt+1)是一个给相邻目标序列打分的函数它就是CRF,我们一般用以可以训练的 k × k k×k k×k的矩阵 G G G来实现, k k k是标签数。因此概率分布变为: P ( y 1 , y 2 , … , y n │ X ) = 1 Z ( X ) e x p { h ( y 1 , X ) + ∑ j = 1 n + 1 [ g ( y j , y j + 1 ) + h ( y j + 1 , X ) ] } P(y_1,y_2,…,y_n│X)=\frac{1}{Z(X)}exp\{ h(y_1,X)+\sum_{j=1}^{n+1}[g(y_j,y_{j+1} )+h(y_{j+1},X)]\} P(y1,y2,…,yn│X)=Z(X)1exp{h(y1,X)+j=1∑n+1[g(yj,yj+1)+h(yj+1,X)]} Z ( X ) = ∑ y 1 , y 2 , … , y n e x p { h ( y 1 , X ) + ∑ j = 1 n + 1 [ g ( y j , y j + 1 ) + h ( y j + 1 , X ) ] } Z(X)=∑_{y_1,y_2,…,y_n}exp\{ h(y_1,X)+\sum_{j=1}^{n+1}[g(y_j,y_{j+1} )+h(y_{j+1},X)]\} Z(X)=y1,y2,…,yn∑exp{h(y1,X)+j=1∑n+1[g(yj,yj+1)+h(yj+1,X)]}其中 h h h由神经网络最后输出, g g g则直接通过查找矩阵 G G G得到。
-
损失函数:对数概率函数 − l o g P ( y 1 , … , y n ∣ x ) −logP(y_1,…,y_n|x) −logP(y1,…,yn∣x) − { h ( y 1 ; x ) + ∑ k = 1 n − 1 [ g ( y k , y k + 1 ) + h ( y k + 1 ; x ) ] } + l o g Z ( x ) −\{h(y1;x)+∑_{k=1}^{n−1}[g(y_k,y_{k+1})+h(y_{k+1};x)]\}+logZ(x) −{h(y1;x)+k=1∑n−1[g(yk,yk+1)+h(yk+1;x)]}+logZ(x)其中第一项是原来概率式的分子的对数,它是给标签序列打分,虽然它看上去挺迂回的,但是并不难计算。真正的难度在于分母的对数 l o g Z ( x ) logZ(x) logZ(x)这一项;在这里它需要我们对所有可能的路径的打分进行指数求和,而我们前面已经说到,这样的路径数是指数量级的 k n k^n kn,因此直接来算几乎是不可能的。
-
事实上,归一化因子难算,几乎是所有概率图模型的公共难题。幸运的是,在CRF模型中,由于我们只考虑了临近标签的联系(马尔可夫假设),因此我们可以递归地算出归一化因子,这使得原来是指数级的计算量降低为线性级别。具体的说来我们只要出下图所有路径的总和:
-
求最大得分是路径的方法使用动态规划。