@ 苹果树数据科技有限公司-AI部
论文地址与代码地址
Abstract
词汇边界信息的缺失是高性能NER的主要障碍之一,幸运的是,自动构建的结构化词典包含丰富的词汇边界信息和词汇语义信息。然而,融合中文NER的词汇信息面临了挑战,因为self-matched lexical words和最近的上下文词汇,作者提出了Collborative Graph Network来解决这个挑战。实验结果显示:在多个任务上,不仅性能提升,而且速度比SOTA模型快6-7倍。
1 Introduction
套路,所有论文一样的写法
2 Related Work
套路,所有论文一样的写法
3 Approach
先介绍图的构建,构建的图能将self-matched lexical words和最近邻的上下文词汇融入到句子,其实图就是mask,如果大家对transformer的Attention机制比较了解的话,就不难理解了,就是利用这个mask来屏蔽掉那些我们不需要关注的信息;然后介绍Collborative Graph Network,它是中文NER任务的核心。
3.1 The Construction of Graphs
总共有三种图,C-graph、T-graph、L-graph,假设词典V={希尔, 希尔顿, 离开, 北京, 北京机场},原始的文本是:希尔顿离开北京机场了,三种图有相同的顶点即点集,点集包括句子的字符和matched lexical words,但是边集完全不同。三种图如下图所示:
- C-graph:
它能捕捉self-matched lexical words的边界和语义信息 - T-graph
它能帮助字符来捕捉最近的上下文词汇的语义信息。 - L-graph
它能捕捉最近邻的上下文词汇信息和self-matched lexical words。 - 如何表示三种图
三种图的点集相同,只是边集不同,可以使用临界矩阵来表示边集,假设邻接矩阵M,M[i][j]=1表示点i和点j是连接的,M[i][j]=0表示点i和点j不相连,所以M中的元素值要么是0,表示不相连,要么是1,表示相连。以C-graph为例,根据C-graph的特征,可用下面的矩阵M来表示C-graph。
3.2 Model
以字符为基础的Collaborative Graph Network包含:Encoding layer, Graph layer, Fusion layer, Decoding layer,如下图(作者有个地方少画了):
Encoding layer捕捉句子的语义信息和词汇的语义信息;Graph layer是以GAT为基础的,它可以对三种图进行建模;Fusion layer用来将句子语义信息和通过三种图捕捉到的信息进行融合;Decoding layer是使用CRF来对labels进行解码。
Encoding layer
这里就很简单了,最后得到
N
o
d
e
f
Node_f
Nodef
N
o
d
e
f
=
[
h
1
,
h
2
,
.
.
.
,
h
n
,
w
v
1
,
w
v
2
,
.
.
.
,
w
v
m
]
Node_f=\lbrack h_1,\;h_2,\;...,\;h_n,\;wv_1,\;wv_2,\;...,\;wv_m\rbrack
Nodef=[h1,h2,...,hn,wv1,wv2,...,wvm]
Graph layer
使用GAT来对三种图进行建模,GAT的操作如下:
f
i
′
=
∣
∣
k
=
1
K
σ
(
∑
j
∈
N
i
α
i
j
k
W
k
f
j
)
{f_{i}}^{'}=\overset K{\underset{k=1}{\vert\vert}}\sigma(\sum_{j\in{\mathrm N}_{\mathrm i}}\alpha_{ij}^kW^kf_j)
fi′=k=1∣∣Kσ(j∈Ni∑αijkWkfj)
α
i
j
k
=
e
x
p
(
L
e
a
k
y
R
e
L
U
(
a
T
[
W
k
f
i
∣
∣
W
k
f
j
]
)
)
∑
t
∈
N
i
e
x
p
(
L
e
a
k
y
R
e
L
U
(
a
T
[
W
k
f
i
∣
∣
W
k
f
t
]
)
\alpha_{ij}^k=\frac{exp(LeakyReLU(a^T\ [W^kf_i\vert\vert W^kf_j]))}{{\displaystyle\sum_{t\in{\mathrm N}_{\mathrm i}}}exp(LeakyReLU(a^T\lbrack W^kf_i\vert\vert W^kf_t\rbrack\;)}
αijk=t∈Ni∑exp(LeakyReLU(aT[Wkfi∣∣Wkft])exp(LeakyReLU(aT [Wkfi∣∣Wkfj]))
α
i
j
k
\alpha_{ij}^k
αijk计算的公式,作者写的有较大问题,我进行了纠正。
关于有些符号的相关说明,大家可以去看原始论文,我这里向对这个公式两个公式进行一下说明
- f i ′ {f_{i}}^{'} fi′的计算公式中的||是拼接操作,其实这里实现的也是多头注意力机制,类似于transfomer的做法。
- α i j k \alpha_{ij}^k αijk计算的是位置i对位置j的权重,只有两位置是连接的,才会考虑该权重,所以在计算得到 L e a k y R e L U ( a T [ W k f i ∣ ∣ W k f j ] ) LeakyReLU(a^T\ [W^kf_i\vert\vert W^kf_j]) LeakyReLU(aT [Wkfi∣∣Wkfj])之后,要把某些未连接的位置进行屏蔽,所以之后乘上了M,用来屏蔽掉某些没连接的边,得到 L e a k y R e L U ( a T [ W k f i ∣ ∣ W k f j ] ) LeakyReLU(a^T\ [W^kf_i\vert\vert W^kf_j]) LeakyReLU(aT [Wkfi∣∣Wkfj])之后就进行softmax操作。
- 令 a T = [ a 1 T ∣ ∣ a 2 T ] a^T=\lbrack a_1^T\vert\vert a_2^T\rbrack aT=[a1T∣∣a2T],记 W k f i = o i W^kf_i=o_i Wkfi=oi,则 W k f j = o j W^kf_j=o_j Wkfj=oj,那么 a T [ W k f i ∣ ∣ W k f j = a 1 T o i + a 2 T o j a^T\lbrack W^kf_i\vert\vert W^kf_j=a_1^To_i+a_2^To_j aT[Wkfi∣∣Wkfj=a1Toi+a2Toj。 记A=middle_result1+middle_result2,则 A [ i , j ] = a 1 T o i + a 2 T o j A[i, j]=a_1^To_i+a_2^To_j A[i,j]=a1Toi+a2Toj,表示位置i和位置j之间的权重。
- 对于该公式,可以加上源码进行更深刻的理解,注意在论文中向量F,即f的集合,F的维度是[dim, seq_length],而代码中的维度是[seq_length, dim]。
h = self.W(input) # 输入F'是300维,输出F是30维, input*W h:[batch_size, seq_len, F] 即实现matmul(W_k,f_j)的操作
# [batch_size, N, out_features]
batch_size, N, _ = h.size()
middle_result1 = torch.matmul(h, self.a1).expand(-1, -1, N)
middle_result2 = torch.matmul(h, self.a2).expand(-1, -1, N).transpose(1, 2)
e = self.leakyrelu(middle_result1 + middle_result2)
attention = e.masked_fill(adj == 0, -1e9) # 若adj[i][j]==0,说明点i和点j相连,则该位置的权重屏蔽
attention = F.softmax(attention, dim=2) # softmax操作求得alpha权重
attention = F.dropout(attention, self.dropout, training=self.training)
h_prime = torch.matmul(attention, h)
if self.concat:
return F.elu(h_prime)
else:
return h_prime
- 与transformer的self-attention操作的计算量进行对比,只分析求attention score,当然假定seq_length相同,最后一维的维度都相同。
在transformer的self-attention操作中求attention score主要是 Q K T QK^T QKT这一步,假设seq_length是n,最后一维的维度是d,则计算量是:乘法计算量是 O ( n 2 d ) O(n^2d) O(n2d),加法计算量是 O ( n 2 d ) O(n^2d) O(n2d),总的计算量是 O ( 2 n 2 d ) O(2n^2d) O(2n2d);在Graph中,middle_result1乘法计算量是 O ( n d ) O(nd) O(nd),加法计算量是 O ( n d ) O(nd) O(nd),则middle_result1和middle_result2总计算量是 O ( 4 n d ) O(4nd) O(4nd),middle_result1+middle_result2操作的计算量是 O ( n 2 ) O(n^2) O(n2),即Graph总的计算量是 O ( 4 n d + n 2 ) O(4nd+n^2) O(4nd+n2)。所以这里的操作比transformer更高效。经过验证,乘法计算量与加法计算量相同。
得到
G
k
G_k
Gk之后,因为只需要考虑文本长度n个位置,所以最后的图特征只取前面n个值,即
Q
k
=
G
k
[
:
,
0
:
n
]
,
k
=
1
,
2
,
3
Q_k = G_k[:, 0:n], k={1, 2, 3}
Qk=Gk[:,0:n],k=1,2,3
k表示不同的图。
Fusion layer
根据论文和代码中提出了三种方案:
-
R
=
w
1
H
+
w
2
Q
1
+
w
3
Q
2
+
w
4
Q
3
R = w_1H+w_2Q_1+w_3Q_2+w_4Q_3
R=w1H+w2Q1+w3Q2+w4Q3
w 1 、 w 2 、 w 3 w_1、w_2、w_3 w1、w2、w3分别表示待训练的值,通过模型去训练出各个特征对最终特征的比例。 -
R
=
W
1
H
+
W
2
Q
1
+
W
3
Q
2
+
W
4
Q
3
R = W_1H+W_2Q_1+W_3Q_2+W_4Q_3
R=W1H+W2Q1+W3Q2+W4Q3
W 1 、 W 2 、 W 3 W_1、W_2、W_3 W1、W2、W3分别表示线性映射矩阵 -
R
=
W
[
H
∣
∣
Q
1
∣
∣
Q
2
∣
∣
Q
3
]
R = W[H||Q_1||Q_2||Q_3]
R=W[H∣∣Q1∣∣Q2∣∣Q3]
其实该方法与第二个方法相同,方法2可以进行变换
W 1 H + W 2 Q 1 + W 3 Q 2 + W 4 Q 3 = [ W 1 W 2 W 3 W 4 ] [ H ∣ ∣ Q 1 ∣ ∣ Q 2 ∣ ∣ Q 3 ] = W [ H ∣ ∣ Q 1 ∣ ∣ Q 2 ∣ ∣ Q 3 ] W_1H+W_2Q_1+W_3Q_2+W_4Q_3=\begin{bmatrix}W_1\\W_2\\W_3\\W_4\end{bmatrix}\left[H\vert\vert Q_1\vert\vert Q_2\vert\vert Q_3\right]=W\left[H\vert\vert Q_1\vert\vert Q_2\vert\vert Q_3\right]\\\\ W1H+W2Q1+W3Q2+W4Q3=⎣⎢⎢⎡W1W2W3W4⎦⎥⎥⎤[H∣∣Q1∣∣Q2∣∣Q3]=W[H∣∣Q1∣∣Q2∣∣Q3]
4 Experiments
这里也是套路,大家看看论文就行了。
优化思路
- 使用其他的结构来替代LSTM
- 词典的设计越精细,越能融入更多词汇的信息,提升模型的性能
- 使用词典对句子进行匹配的时候,其实可以先进行分词,再匹配。但是这要求分词质量较高,特别是某些专有领域的分词难度更大
- 可以在模型训练的时候加入对抗训练,提高模型的稳定性
- Fusion layer对各个特征进行融合的时候,可以使用其他的融合方法