SpellGCN: Incorporating Phonological and Visual Similarities into Language Models for Chinese Spelling Check
这个是2020年蚂蚁金服在ACL上的一篇论文,主要思路是使用GCN将发音和形状相似的字符的嵌入向量进行融合,然后使用bert作为基模型进行字符级别的分类,最后使用softmax进行目标字符预测。
模型整体由两个模块组成,模块一为SpellGCN,模块二为抽取模型(满足输入为[x1,x2,…,xn],输出为[v1,v2,…,vn])进行字符的特征抽取,在本文中使用bert模型进行字符特征抽取。
在使用时模型一次性完成检测和纠错两项工作,在最后一层对输入字符 x i x_i xi进行目标字符预测时,选取 a r g m a x y ^ i p ( y ^ i ∣ X ) argmax_{\hat y_i}p(\hat y_i|X) argmaxy^ip(y^i∣X)具有最大概率的字符作为预测目标字符 y i y_i yi,当输入字符和目标字符一致时则表示文本无错误,如果不一致则表示文本拼写错误,纠正后的值为预测字符 y i y_i yi
个人感觉这个模型在结构方面比较新颖,使用GCN来进行相似字符的特征聚合,但是在最后检测和纠错上过于简单。另外bert使用T-TA是不是会对提取器的效果有所提高?
SpellGCN的结构
SpellGCN使用2013年的SIGHAN的csc比赛[数据集](Chinese Spelling Check Evaluation at SIGHAN Bake-off 2013)生成尺寸为 N × N N\times N N×N的二元邻接矩阵 A A A,其中N为数据集中出现过的混淆字符个数,邻接矩阵 A i , j A_{i,j} Ai,j的值由数据集决定,如果数据集中字符i和j为易混淆的字符,则 A i , j = 1 A_{i,j}=1 Ai,j=1,否则 A i , j = 0 A_{i,j}=0 Ai,j=0.其中在本数据集中字符的混淆有两种情况,发音相似( pronunciation)、形状相似(shape),我们根据混淆原因得到两个邻接矩阵:发音相近的矩阵 A p A^p Ap,形状相似的矩阵 A s A^s As.
SpellGCN的目标是学习映射函数将 l l l层节点向量 H l ∈ R N × D H^l\in \mathbb{R}^{N\times D} Hl∈RN×D通过卷积运算映射到新的节点向量 H l + 1 H^{l+1} Hl+1。这个映射函数主要有两个组件组成Graph Convolution Operation和Attentive Graph Combination Operation。
图卷积操作
图卷积操作的目的是为了包含(absorb)图中相邻字符的信息,在每层网络中,都进行如下操作:
f
(
A
,
H
l
)
=
A
^
H
l
W
g
l
f(A,H^l)=\hat AH^lW_g^l
f(A,Hl)=A^HlWgl
上式中
W
∈
R
N
×
N
W\in \mathbb{R}^{N\times N}
W∈RN×N是一个可进行训练的矩阵,
A
^
\hat A
A^表示邻接矩阵的规范化(normalized),具体的规范化操作可见SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS。值得注意的是,在本文中我们的初始化节点向量
H
0
H^0
H0与特征抽取模型中的输入向量一致。在本例中为bert的character embedding,因为我们采用了BERT作为抽取器,它有自己的学习语义空间,所以我们从方程中去掉激活函数,使导出的表示与原始空间保持一致,而不是完全不同的空间。在本文的实验中,也表明非线性激活如relu对于模型是无效的,将导致效果下降。
注意力图合并操作
Graph Convolution Operation主要针对的是单个的网络图,为了同时利用发音相似图和形状相似图的,下面使用注意力机制来得到包含两者信息的混合向量:
C
i
l
=
∑
k
∈
{
s
,
p
}
α
i
,
k
l
f
k
(
A
k
,
H
l
)
i
C^l_i=\sum_{k\in\{s,p\}}\alpha_{i,k}^lf_k(A^k,H^l)_i
Cil=k∈{s,p}∑αi,klfk(Ak,Hl)i
其中
C
l
∈
R
N
×
D
C^l\in \mathbb{R}^{N\times D}
Cl∈RN×D,同时
f
k
(
A
k
,
H
l
)
i
f_k(A^k,H^l)_i
fk(Ak,Hl)i表示图的卷积表示的第i行,
α
i
,
k
\alpha_{i,k}
αi,k表示图k的第i个字符的权重标量。权重
α
i
,
k
\alpha_{i,k}
αi,k通过如下方式计算:
α
i
,
k
=
e
x
p
(
w
a
f
k
(
A
k
,
H
l
)
i
/
β
)
∑
k
′
e
x
p
(
w
a
f
k
′
(
A
k
′
,
H
l
)
i
/
β
)
\alpha_{i,k}=\frac{exp(w_af_k(A^k,H^l)_i/\beta)}{\sum_{k'}exp(w_af_{k'}(A^{k'},H^l)_i/\beta)}
αi,k=∑k′exp(wafk′(Ak′,Hl)i/β)exp(wafk(Ak,Hl)i/β)
其中
w
a
∈
R
D
w_a\in \mathbb{R}^D
wa∈RD是一个可学习且各层共享的向量,
β
\beta
β是一个用来控制注意力权重平滑的超参数。在本文中作者认为
β
\beta
β对注意力机制起到重要作用。
输出累加
在经过图卷积和注意力合并的操作后,我们得到一个第l层的向量表示
C
l
C^l
Cl。为了保持提取器的原始语义表示,我们将前面所有层的输出进行累加得到新的输出。
H
l
+
1
=
C
l
+
∑
i
=
0
l
H
i
H^{l+1}=C^l+\sum_{i=0}^lH^i
Hl+1=Cl+i=0∑lHi
通过这种方式,SpellGCN能够专注于捕获字符相似性的知识,而将语义推理的责任留给提取器。希望每个层都能学会为特定的跃点聚合信息。在实验过程中,当累加时排除H0时,模型失败。
SpellGCN在中文拼写检查中的应用
首先使用提取器获取字符特征,在最后输出时使用SpellGCN进行目标字符的分类。
构造混淆图
本文中使用来自2013SIGHAN的混淆数据集,这个混淆数据集包含了大约95%的中文字符的相似字符,并将其根据混淆类型不同分为以下五类:
- 相似的形状
- 相同的发音和音调
- 相同的发音但音调不同
- 相似的发音和相同的音调
- 相似的发音但不同的音调
因为语音相似度比形状更为精细,因此本文将语音相似度合并为一个图,最终得到两个对应于发音和形状相似性的图。
提取字符表达
将输入的字符序列 X = { x 1 , x 2 , . . . , x n } X=\{x_1,x_2,...,x_n\} X={x1,x2,...,xn}通过提取器提取得到最终的向量表达 V = { v 1 , v 2 , . . . , v n } ( v ∈ R D ) V=\{v_1,v_2,...,v_n\}(v\in \mathbb{R}^D) V={v1,v2,...,vn}(v∈RD),此处可以使用任意模型完成提取器的任务,在本文中使用12layer-12head-768的base bert模型完成提取向量表达任务,使用X作为输入,使用最后一层的输出作为V。
使用SpellGCN进行字符分类
当我们通过提取器提取得到字符
x
i
x_i
xi的向量
v
i
v_i
vi,我们使用一个全连接网络进行目标字符的预测。
p
(
y
^
i
∣
X
)
=
s
o
f
t
m
a
x
(
W
v
i
)
p(\hat y_i|X)=softmax(Wv_i)
p(y^i∣X)=softmax(Wvi)
其中
W
∈
R
M
×
D
W\in\mathbb{R}^{M\times D}
W∈RM×D,M是提取器的字典大小,D是提取器的向量维度,如此文使用768维的bert,则D=768.
对于W,如果字符在混淆集中出现过,我们将SpellGCN最后一层的网络表示赋值给W对应的字符,如果未在混淆集中出现过的字符,我们使用提取器字符嵌入矩阵(embedding matrix)。
W
i
=
{
H
u
i
L
i
f
i
−
t
h
c
h
a
r
a
c
t
e
r
∈
c
o
n
f
u
s
i
o
n
s
e
t
E
i
o
t
h
e
r
w
i
s
e
W_i=\left\{ \begin{array}{rcl} H_{u_i}^L && if\quad i-th\quad character \in confusion set\\ E_i & & otherwise \end{array} \right.
Wi={HuiLEiifi−thcharacter∈confusionsetotherwise
u
i
∈
{
1
,
.
.
.
,
N
}
u_i\in\{1,...,N\}
ui∈{1,...,N}表示混淆字符集中的字符在提取器字典中的索引为i。
E
i
∈
R
M
×
D
E_i\in \mathbb{R}^{M\times D}
Ei∈RM×D是提取器的字符嵌入矩阵(embedding matrix)。
H
u
i
L
H_{u_i}^L
HuiL表示混淆字符
u
i
u_i
ui在SpellGCN第L层的输出。
之所以没有使用SpellGCN为所有包含在提取器字典中的字符建模是为了提高计算效率,因为SpellGCN的混淆集中约有5k字符,而提取器bert中的字符数量约为20k。
最后,我们的目标是最大化目标字符的最大似然函数。
L
=
∑
X
,
Y
∑
i
l
o
g
p
(
y
^
i
=
y
i
∣
X
)
L=\sum_{X,Y}\sum_ilogp(\hat y_i=y_i|X)
L=X,Y∑i∑logp(y^i=yi∣X)