赞
踩
@ 苹果树数据科技有限公司-AI部
词汇边界信息的缺失是高性能NER的主要障碍之一,幸运的是,自动构建的结构化词典包含丰富的词汇边界信息和词汇语义信息。然而,融合中文NER的词汇信息面临了挑战,因为self-matched lexical words和最近的上下文词汇,作者提出了Collborative Graph Network来解决这个挑战。实验结果显示:在多个任务上,不仅性能提升,而且速度比SOTA模型快6-7倍。
套路,所有论文一样的写法
套路,所有论文一样的写法
先介绍图的构建,构建的图能将self-matched lexical words和最近邻的上下文词汇融入到句子,其实图就是mask,如果大家对transformer的Attention机制比较了解的话,就不难理解了,就是利用这个mask来屏蔽掉那些我们不需要关注的信息;然后介绍Collborative Graph Network,它是中文NER任务的核心。
总共有三种图,C-graph、T-graph、L-graph,假设词典V={希尔, 希尔顿, 离开, 北京, 北京机场},原始的文本是:希尔顿离开北京机场了,三种图有相同的顶点即点集,点集包括句子的字符和matched lexical words,但是边集完全不同。三种图如下图所示:
以字符为基础的Collaborative Graph Network包含:Encoding layer, Graph layer, Fusion layer, Decoding layer,如下图(作者有个地方少画了):
Encoding layer捕捉句子的语义信息和词汇的语义信息;Graph layer是以GAT为基础的,它可以对三种图进行建模;Fusion layer用来将句子语义信息和通过三种图捕捉到的信息进行融合;Decoding layer是使用CRF来对labels进行解码。
这里就很简单了,最后得到
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]
使用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计算的公式,作者写的有较大问题,我进行了纠正。
关于有些符号的相关说明,大家可以去看原始论文,我这里向对这个公式两个公式进行一下说明
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
得到
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表示不同的图。
根据论文和代码中提出了三种方案:
这里也是套路,大家看看论文就行了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。