模型介绍
简单来说,lattice LSTM 模型首次融合了字符信息和词汇信息。对比基于字符的方法,融合了词汇的方法显然能带入更多的信息。但对比于基于词汇的方法,lattice LSTM 却避免了LSTM受分词错误的影响带来的效果下降。作者这里举了一个例子:
南京市长江大桥,一般分为“南京市”,“长江大桥”。但基于词汇的方法有可能产生歧义,将其分为“南京”,“市长”,“江大桥”,严重影响网络的性能。
也因此,一般来说,基于字符的方法性能一般优于基于词汇的方法。
LSTM详解
想要读懂 lattice LSTM 的网络结构,就必须先了解清除 LSTM 的网络结构。我们先来看两张经典的 LSTM 网络结构图。
我相信大家肯定知道 LSTM 的三大核心:输入门,遗忘门,输出门,大家看第二张图片,我这里分为了7个步骤来进行讲解,讲解之前,先对字符代表的意思进行了解:
- x j x_j xj 代表输入的第 j j j 个字符向量
- h j − 1 h_{j-1} hj−1 代表第 j − 1 j-1 j−1 个单元输出的隐藏状态
- c j − 1 c_{j-1} cj−1 代表第 j − 1 j-1 j−1 个单元输出的单元状态(cell这里翻译为单元)
- σ 代表 sigmod 激活函数
准备完毕,我们根据第二张图对第 j j j 个单元进行解释:
- 将第 j j j 个字符的字向量与前一个单元输出的隐藏状态进行拼接,作为三个门的输入,拼接指直接把第二个向量拼在第一个向量后面,为 [ h j − 1 , x j ] [h_{j-1},x_j] [hj−1,xj]。
- 计算遗忘因子 f i f_i fi,计算公式为: f i = σ ( W f ⋅ [ h j − 1 , x j ] + b f ) f_i=\sigma(W_f\cdot[h_{j-1},x_j]+b_f) fi=σ(Wf⋅[hj−1,xj]+bf),简单来说就是输入乘权重加上偏值(偏值在图中没有标出)。
- 计算输入因子 i j i_j ij,计算公式为: i i = σ ( W i ⋅ [ h j − 1 , x j ] + b i ) i_i=\sigma(W_i\cdot[h_{j-1},x_j]+b_i) ii=σ(Wi⋅[hj−1,xj]+bi)。
- 计算临时单元状态 c ~ j \widetilde{c}_j c j,计算公式为: c ~ j = t a n h ( W c ⋅ [ h j − 1 , x j ] + b c ) \widetilde{c}_j=tanh(W_c\cdot[h_{j-1},x_j]+b_c) c j=tanh(Wc⋅[hj−1,xj]+bc)。
- 计算最终单元状态 c j c_j cj,计算公式为: c j = c j − 1 ⋅ f j + i j ⋅ c ~ j c_j=c_{j-1}\cdot f_j+i_j\cdot\widetilde{c}_j cj=cj−1⋅fj+ij⋅c j,这个公式很好理解, c j − 1 ⋅ f j c_{j-1}\cdot f_j cj−1⋅fj 为前一个单元遗忘后保留的部分, i j ⋅ c ~ j i_j\cdot\widetilde{c}_j ij⋅c j 为当前临时单元状态保留的部分,两部分相加得到最终单元状态。
- 计算输出因子 o j o_j oj,计算公式为: o i = σ ( W o ⋅ [ h j − 1 , x j ] + b o ) o_i=\sigma(W_o\cdot[h_{j-1},x_j]+b_o) oi=σ(Wo⋅[hj−1,xj]+bo)。
- 计算隐藏状态 h j h_j hj,计算公式为: h j = o j ⋅ t a n h ( c j ) h_j=o_j\cdot tanh(c_j) hj=oj⋅tanh(cj),可以理解为最终单元状态要输出多少。
到目前为止,我们已经了解了 LSTM 的所有内部计算,下面进行一个总结:
大家注意看第2、3、4、6这四个步骤的公式,可以发现其基本一致,因此,可以对其进行合并,写成矩阵的形式:
[ i j o j f j c ~ j ] = [ σ σ σ t a n h ] ( W T ⋅ [ x j h j − 1 ] + b ) c j = c j − 1 ⋅ f j + i j ⋅ c ~ j h j = o j ⋅ t a n h ( c j ) \left[ \begin{matrix} i_j \\ o_j\\ f_j \\ \widetilde{c}_j \end{matrix} \right]= \left[ \begin{matrix} \sigma \\ \sigma\\ \sigma \\ tanh \end{matrix} \right] (W^T\cdot\left[ \begin{matrix} x_j \\ h_{j-1} \end{matrix} \right]+b )\\ \\ \begin{matrix} c_j=c_{j-1}\cdot f_j+i_j\cdot\widetilde{c}_j \\ h_j=o_j\cdot tanh(c_j)\\ \end{matrix} ijojfjc j = σσσtanh (WT⋅[xjhj−1]+b)cj=cj−1⋅fj+ij⋅c jhj=oj⋅tanh(cj)
这么一看是不是特别的简洁,也非常好理解。
Lattice LSTM详解
下面就是我们的重头戏了,因为 Lattice LSTM的模型结构还是有些复杂,所以这里我会结合论文进行讲解。
同理,我们先对一些符号和定义进行解释:
-
模型的输入是一个字符序列,表示为: c 1 , c 2 , . . . , c m c_1,c_2,...,c_m c1,c2,...,cm,这里的c代表character这个英文单词。
-
词汇集合D,这个词汇集合是作者用庞大的文本数据构建出来的。输入额外工作,不是模型的一部分。
-
w b , e d w^d_{b,e} wb,ed 代表一个属于词汇集合D的词汇,这个词汇在句子中的索引从 b 到 e ,这里的 w 代表 word 这个英文单词。以上图为例, w 1 , 2 d w^d_{1,2} w1,2d 代表“南京”, w 7 , 8 d w^d_{7,8} w7,8d 代表“大桥”
-
x j c = e c ( c j ) x^c_{j}=e^c(c_j) xjc=ec(cj) ,上面说到, c j c_j cj 代表第 j 个字符, e c e^c ec是一个字符向量表,通过在表中查找,得到字符 c j c_j cj 的字向量 x j c x^c_j xjc , x j c x^c_j xjc 作为第 j 个单元的输入
-
x b , e w = e w ( w b , e d ) x^w_{b,e}=e^w(w^d_{b,e}) xb,ew=ew(wb,ed) ,上面说到, w b , e d w^d_{b,e} wb,ed 代表索引从 b 到 e 的词汇, e w e^w ew是一个词向量表,通过在表中查找,得到词汇 w b , e d w^d_{b,e} wb,ed 的词向量 x b , e w x^w_{b,e} xb,ew , ** x b , e w x^w_{b,e} xb,ew 在后面也作为部分单元的输入。
好,介绍完基本符号概念,我们可以正式进行模型详解了。
简单来说,lattice LSTM 模型仍然使用了 LSTM 结构,但不同的是,其在 LSTM 的基础上融合了词汇的信息,所有,问题就变成了2个部分:
- lattice LSTM 模型基本字符的结构
- lattice LSTM 模型融合词汇信息的结构
我们来跟着论文进行解释:
作者这里列出了模型的第一个公式 Eq 11:
大家看,是不是很熟悉,没错!这就是完完全全的 LSTM,只不过每一个记号的右上角都带了一个小马甲 c ,这里的c指此 LSTM 用来处理字符,提取字符的信息,为了和后面处理词汇的单元做区分。
好,因为我们有每一个位置的输入向量 x j x_j xj,所以我们得到了每一个单元的单元状态向量 c j c_j cj 和隐藏状态向量 h j h_j hj。
我们已经使用一个 LSTM 结构来提取了字符的信息,下面我们将使用另一个 LSTM 结构来表达词汇信息。我们看作者的第二个公式Eq 13:
你是不是想说,这不还是和 LSTM 结构一样吗,恭喜你,完全正确!!这同样是一个标准的 LSTM 结构,只不过有一点点的不同。
之前的 LSTM,每一个单元代表的是一个字符,而这里的 LSTM,每一个单元代表一个词汇。
我们来分析下此结构不同的地方。大家肯定发现了,就是 门的输入不一样了、三个门变成了两个门,这里为大家来一一解释。
-
门的输入不一样了:基于字符的 LSTM,门的输入是前一个单元的隐藏状态 h j − 1 h_{j-1} hj−1 和当前单元的输入 x j x_j xj 的拼接 [ h j − 1 , x j ] [h_{j-1},x_j] [hj−1,xj],而此 LSTM 用来表示词汇,作者借用此词汇第一个字符的隐藏状态向量 h b c h^c_{b} hbc 来和此词向量 x b , e w x^w_{b,e} xb,ew 拼接,从而得到此词汇单元的单元状态向量 c b , e w c^w_{b,e} cb,ew,所以小马甲从 c 变成了 w。
至于为什么要拼接词汇的第一个字符,我认为是为了强化边界,在后面我会提到。 -
没有输出门:首先,隐藏状态 h 是用来在最后的CRF层选择标签的。要知道,数据集的标签都是基于字符标的,而词汇没有相应的标签,所以词汇单元不需要计算 h,而输出门的作用就是用来计算 h的,h都不需要了,输出门同样就不需要了。
难度已经渐渐变高了,作者又扔出一条公式 Eq 14:
是不是有点蒙了,为什么马甲是c,却用着词汇的索引。笔者当时看到这里也是蒙蒙的。
不用着急,大家看,其实这是第三个 LSTM 结构,但它只保留了一个输入因子,
x
e
c
x^c_e
xec 是字向量,说明这是一个索引为 e 的字符单元(定性),用来拼接的是
c
b
,
e
w
c^w_{b,e}
cb,ew,是以此字符e结尾的词汇单元的状态向量,还记得
c
b
,
e
w
c^w_{b,e}
cb,ew 是怎么计算的吗,它拼接的是开头字符b的信息,这就意味着作者将(b,e)这个词的信息融入了 e 这个字符中,并且强化了 b,e 的边界。
i
b
,
e
c
i^c_{b,e}
ib,ec 是输入因子,代表的意思是,第e个字符要融入多少词汇(b,e)的信息。
理解了这个,下面的就更好理解了,如果还是有些迷迷糊糊的,可以结合下面的公式一起来理解。
下面这个是我认为是 lattice LSTM 模型 的核心公式 Eq 15:
我们之前已经讲解了纯字符的 LSTM 单元状态的计算公式,而Eq15计算的是融合了词汇信息的单元状态。
我们回顾一下单元状态的计算公式:
c
j
=
c
j
−
1
⋅
f
j
+
i
j
⋅
c
~
j
c_j=c_{j-1}\cdot f_j+i_j\cdot\widetilde{c}_j
cj=cj−1⋅fj+ij⋅c
j
作者这里稍作改变,不使用前一个字符单元
c
j
−
1
c_{j-1}
cj−1 的信息,所以从公式中扔掉遗忘门的部分,加上表示字符的马甲
c
c
c,即:
c
j
c
=
i
j
c
⋅
c
~
j
c
c_j^c=i^c_j\cdot\widetilde{c}_j^c
cjc=ijc⋅c
jc
同时,作者在此融入以此字符为结尾的词汇单元的信息,假如以j字符结尾的词汇有三个(a,j),(b,j),(c,j),对应的词汇单元状态有3个
c
a
,
j
w
c^w_{a,j}
ca,jw,
c
b
,
j
w
c^w_{b,j}
cb,jw,
c
c
,
j
w
c^w_{c,j}
cc,jw,采用
i
j
⋅
c
~
j
i_j\cdot\widetilde{c}_j
ij⋅c
j 的方式进行融合,此输入门使用Eq14:
c j c = i a , j c ⋅ c a , j w + i b , j c ⋅ c b , j w + i c , j c ⋅ c c , j w + i j c ⋅ c ~ j c c^c_j=i^c_{a,j}\cdot c^w_{a,j}+i^c_{b,j}\cdot c^w_{b,j}+i^c_{c,j}\cdot c^w_{c,j}+i^c_j\cdot\widetilde{c}_j ^c cjc=ia,jc⋅ca,jw+ib,jc⋅cb,jw+ic,jc⋅cc,jw+ijc⋅c jc
是不是挺清晰明了的,每个词汇单元取部分输入 + 本字符单元取部分输入,得到本字符最终的单元状态向量。
但是公式太复杂,简化一下,有多少词以本字符结尾不确实,可以写成求和的形式,用
b
b
b 变量来表示
a
,
b
,
c
a,b,c
a,b,c(词汇的开头),那么
b
b
b 要满足的要求是,以
b
b
b 开头的词汇要以
j
j
j 结尾,并且属于词汇集合
D
D
D 。即:
b
∈
{
b
′
∣
w
b
′
,
j
D
∈
D
}
b \in \left\{ b^{\prime}|w^D_{ b^{\prime},j}\in D \right\}
b∈{b′∣wb′,jD∈D}
满足此条件的词汇可以进行求和,则上式变为:
c
j
c
=
∑
b
∈
{
b
′
∣
w
b
′
,
j
D
∈
D
}
i
b
,
j
c
⋅
c
b
,
j
w
+
i
j
c
⋅
c
~
j
c
c^c_j=\sum_{b \in \left\{ b^{\prime}|w^D_{ b^{\prime},j}\in D \right\}} i^c_{b,j}\cdot c^w_{b,j} + i^c_j\cdot\widetilde{c}_j^c
cjc=b∈{b′∣wb′,jD∈D}∑ib,jc⋅cb,jw+ijc⋅c
jc
到这里已经非常圆满了,只剩最后一个问题,对,就是每个词汇都有一个输入因子(相当于权重),这么多输入因子加和肯定很大,所以要进行归一化,使其加和为1,作者使用的公式为:
乍一看,这是啥呀,怎么这么复杂,上上下下,expp,不着急,我们定睛一看,这不就是softmax吗!!再讲softmax文章页太长了,简单来说:
是该元素的指数,与所有元素指数和的比值
假设我们有一个数组,
X
X
X,
X
i
X_i
Xi 表示
X
X
X 中的第
i
i
i 个元素,那么这个元素的Softmax值就是 :
S
i
=
e
x
i
∑
j
e
x
j
S_i=\frac{e^{x_i}}{\sum_j e^{x_j}}
Si=∑jexjexi
每个元素
X
i
X_i
Xi 都变为了
S
i
S_i
Si,并且
∑
S
i
=
1
\sum S_i=1
∑Si=1,这不就和我们的公式16一样吗!!
归一化后符号发生变化, i b , j c i^c_{b,j} ib,jc 变为 α b , j c \alpha^c_{b,j} αb,jc, i j c i^c_j ijc 变为 α j c \alpha^c_j αjc,放进公式:
c
j
c
=
∑
b
∈
{
b
′
∣
w
b
′
,
j
D
∈
D
}
α
b
,
j
c
⋅
c
b
,
j
w
+
α
j
c
⋅
c
~
j
c
c^c_j=\sum_{b \in \left\{ b^{\prime}|w^D_{ b^{\prime},j}\in D \right\}}\alpha^c_{b,j}\cdot c^w_{b,j} + \alpha^c_j\cdot\widetilde{c}_j^c
cjc=b∈{b′∣wb′,jD∈D}∑αb,jc⋅cb,jw+αjc⋅c
jc
终于搞定了,这不就和 Eq15 一模一样吗!!这里的
c
j
c
c^c_j
cjc 就是融合了词汇信息的字符单元状态向量,单元隐藏状态向量
h
j
c
h^c_j
hjc 作者使用 最基本的公式:
h
j
c
=
o
j
c
⋅
t
a
n
h
(
c
j
c
)
h^c_j=o^c_j\cdot tanh(c^c_j)
hjc=ojc⋅tanh(cjc)
其中:
o
j
c
o^c_j
ojc是第一个 纯字符LSTM 结构计算的,
c
j
c
c^c_j
cjc是最后融合词汇信息的LSTM计算的。
结语
后面的CRF层和损失函数就不说了,要讲解的话文章要长一倍。如果需要的话我会在后面更新新的文章。
以上全是我的个人见解,如果有不对的地方希望大家指正。
公式都是纯手打的,希望大家捧捧场哦!