论文笔记:LGESQL: Line Graph Enhanced Text-to-SQL Model with Mixed Local and Non-Local Relations
笔者按
这篇文章是截止目前(2021.8)Spider数据集榜单上的SOTA。文章从RATSQL的基础上对Encoder部分进行了多方面改进。首先将原始的异构图根据其1阶连接关系,拆分成节点图和线图两个部分,对两个互为对偶的输入各自应用关系图注意力网络(RGAT),其次借助用ELECTRA预训练模型得到单词的上下文词向量表示,比使用Glove词向量大幅度提升了表现。最后还加入一个Graph pruning的附加任务辅助Text-to-SQL的多任务学习。
- 论文地址:https://arxiv.org/abs/2106.01093
- 会议:ACL 2021
摘要
本工作旨在解决Text-to-SQL任务中具有挑战性的异构图编码问题。以往的方法以节点为中心,仅利用不同的权值矩阵参数化边类型,忽略了边拓扑结构中蕴含的丰富语义,无法区分每个节点的局部关系(local relation)和非局部关系(non-local relation)。为此,我们提出了一个Line Graph Enhanced Text-to- SQL (LGESQL)模型来挖掘底层关系特性,而无需构造元路径。通过Line Graph,消息不仅通过节点之间的连接,而且通过有向边的拓扑更有效地传播。此外,在图迭代过程中,局部关系和非局部关系都得到了明显的整合。为了提高编码器的识别能力,我们还设计了一个辅助任务——图修剪(Graph pruning)。在编写该论文时,我们的框架在跨域Text-to-SQL基准的Spider数据集上取得了最先进的结果(使用Glove为62.8%,使用ELECTRA为72.0%)。
简介
Text-to-SQL中一个令人头疼的问题是如何联合编码问题词(question word)和数据库模式项(schema items,including columns and tables),以及这些异构输入之间的各种关系。之前的许多文献都利用以节点为中心的图神经网络的方式从邻居节点聚合信息。
GNNSQL采用了一个关系图卷积网络(RGCN)来同时考虑不同类型的schema items之间的连边关系,比如一个table有一个column(T-HAS-C relationship,这里T代表table、C代表column、Q代表question)、 不同的table之间主键和外键之间的约束关系(primary key and foreign key constraints)。然而,这些边的特征是直接从一个固定长度的参数矩阵中检索得到,这样做有以下缺点:不知道上下文的信息,特别是边的结构拓扑。
如图1(a)所示,关系Q-EXACTMATCH-C 和 C-BELONGSTO-T 可以组成一个2跳的meta-path(后面会有详细定义什么是meta-path)表示一个table t有一个column在question中被精确提到了。
尽管RATSQL引入了一些有用的meta-path比如C-SAMETABLE-C,但它在一个完全图(RATSQL中任意两点之间都会有一个relation即连边)中处理1跳和多跳关系时同等看待,没有差别处理。如图1(b)所示,每个节点同等看待1跳(即作者称的local relation)和多跳(即作者称的non-local relation),这样会导致over-fitting的问题。(参考:图神经网络中的过平滑问题,简单来说就是各个节点的feature会趋于一致。)除此之外,选取这些meta-path也是非常耗时的。
为了解决上述问题,我们提出了Line Graph Enhanced Text-to- SQL (LGESQL)模型,首先从原始的节点中心图(node-centric graph)构造了一个边中心图(edge-centric graph)。这两个图分别捕获了节点和边的结构拓扑。然后进行迭代,每个图中的每个节点从其邻域收集信息,并结合对偶图的边特征来更新其表示。对于节点中心图,我们将局部和非局部边特征结合到计算中。局部边特征表示单跳关系,由Line Graph中的节点嵌入动态提供,而非局部边缘特征直接从参数矩阵中提取。这种区别鼓励模型在保持多跳邻居信息的同时更多地关注局部边缘特征。此外,我们提出了一个称为图修剪的辅助任务。要求模型可以从question中知道哪些schema item会出现在最终的SQL中。
本文贡献如下:
- 提出在text-to-SQL中用Line Graph来建模1跳边特征。在节点嵌入迭代过程中,融合了非局部特征和局部特征。
- 设计了一个称为图修剪的辅助任务,目的是确定数据库模式图中的每个节点是否与给定的问题相关。
- 在Spider数据集上的经验结果表明,模型在没有预先训练的语言模型和预先训练的语言模型的情况下都取得了最先进的性能。
预备知识
问题定义
给出一个自然语言问题 Q = ( q 1 , q 2 , ⋯ , q ∣ Q ∣ ) Q=(q_1,q_2,\cdots,q_{|Q|}) Q=(q1,q2,⋯,q∣Q∣),其长度为 ∣ Q ∣ |Q| ∣Q∣,对应的database schema为 S = T ∪ C S=T \cup C S=T∪C,目标是生成一个SQL语句 y y y。其中 S S S包含有多个table和column, T = { t 1 , t 2 , ⋯ } , C = { c 1 t 1 , c 2 t 1 , ⋯ , c 1 t 2 , c 2 t 2 , ⋯ } T=\{t_1,t_2,\cdots\}, C=\{c^{t_1}_{1}, c^{t_1}_{2}, \cdots,c^{t_2}_{1}, c^{t_2}_{2}, \cdots\} T={t1,t2,⋯},C={c1t1,c2t1,⋯,c1t2,c2t2,⋯}.每一个table名称可能由多个word组成,即 ( t i 1 , t i 2 , ⋯ ) (t_{i1}, t_{i2},\cdots) (ti1,ti2,⋯),同理每一个column名称 c j t i ∈ t i c^{t_i}_{j} \in t_i cjti∈ti。除此之外,每个 c j t i c^{t_i}_{j} cjti都有一个类型域(type field) c 0 t i c^{t_i}_{0} c0ti来表示这个column的数据类型(TEXT或NUMBER)。
整个节点中心异构网络 G n = ( V n , R n ) G^n=(V^n, R^n) Gn=(Vn,Rn)的输入节点类型包含上述三种类型,即 V n = Q ∪ T ∪ C V^n=Q \cup T \cup C Vn=Q∪T∪C,其节点数目为 ∣ V n ∣ = ∣ Q ∣ + ∣ T ∣ + ∣ C ∣ |V^n|=|Q| + |T| + |C| ∣Vn∣=∣Q∣+∣T∣+∣C∣。其中, ∣ T ∣ |T| ∣T∣和 ∣ C ∣ |C| ∣C∣分别表示table和column的数目。
Meta-path
如图1(a)所示,一个meta-path其实就是一组节点关系的序列, τ 1 ⟶ r 1 τ 2 ⟶ r 2 ⋯ ⟶ r l τ l + 1 \tau_1 \stackrel{r_1}{\longrightarrow} \tau_2 \stackrel{r_2}{\longrightarrow} \cdots \stackrel{r_l}{\longrightarrow} \tau_{l+1} τ1⟶r1τ2⟶r2⋯⟶rlτl+1。其中 τ \tau τ为节点的类型,即 τ i ∈ { QUESTION, TABLE, COLUMN } \tau_i \in \{\text{QUESTION, TABLE, COLUMN}\} τi∈{QUESTION, TABLE, COLUMN}。
Line Graph
Line Graph其实就是一个图的“对偶图”。以下举一个维基百科上的例子,这里以无向图为例,
如图所示,原始图中有1-5共5个节点和
{
(
1
,
2
)
,
(
1
,
3
)
,
⋯
}
\{(1, 2), (1, 3), \cdots\}
{(1,2),(1,3),⋯}等多条边。现在我们构造Line Graph。首先将图中所有的边全部变成Line Graph中的一个节点,然后如果两条边同时接到了一个点上,比如
(
1
,
2
)
(1, 2)
(1,2)和
(
1
,
3
)
(1, 3)
(1,3)那么这两条边对应到Line Graph中的节点就连一条边。
明白以上例子后,我们再来看论文就容易很多。这里定义原图的Line Graph为
G
e
=
{
V
e
,
R
e
}
G^e=\{V^e, R^e\}
Ge={Ve,Re}。定义函数
f
f
f把原图中的一条边
(
s
,
t
)
(s, t)
(s,t)映射为Line Graph中的一个节点
i
i
i。
f
−
1
f^{-1}
f−1的作用则相反。在创建Line Graph的节点时,仅考虑原图
G
n
G^n
Gn中的局部关系的边。同时,论文中的原图是有向图,所以它的边对应规则比无向图复杂一些,具体如图2所示。
方法
论文使用经典的Encoder-decoder架构作为模型的backbone。LGESQL主要包含以下三个组成部分:
- 一个图输入模块
- 一个增强的line graph隐藏模块
- 一个图输出模块
前两个模块旨在将输入的异构图 G n G^n Gn转换为节点embedding X ∈ R ∣ V n ∣ × d X\in \mathbb{R}^{|V^n|\times d} X∈R∣Vn∣×d,最后一个输出模块将 X X X转换为目标SQL语句。
整体模型结构如下图所示:
各个模块将分别在下面介绍。
图输入模块
图输入模块为节点和边提供初始的embedding。对于边的初始特征,直接从一个参数矩阵中取出即可。对于节点的初始表示,我们分别从Glove和预训练模型(PLM)中获得。
Glove
对于每个在question、table或column中的名称,使用Glove词向量时可以不考虑上下文直接在词典中拿到它们的embedding。然后将它们(这里的它们是指一个名称中包含的若干个word)按照所属部分(即是属于question,还是table,还是column)类型分别送入对应的BiLSTM中,并concatenate两端的hidden state。将得到的节点表示进行stack组成初始节点embedding矩阵 X 0 ∈ R ∣ V n ∣ × d X^0\in \mathbb{R}^{|V^n|\times d} X0∈R∣Vn∣×d。
PLM
使用预训练模型时,我们首先将所有的question和schema中的名字组成一个序列
[CLS]
q
1
q
2
⋯
q
∣
Q
∣
[SEP]
t
10
t
1
c
10
t
1
c
1
t
1
c
20
t
1
c
2
t
1
⋯
t
20
t
2
c
10
t
2
c
1
t
2
c
20
t
2
c
2
t
2
⋯
[SEP]
\text{[CLS]} q_1 q_2\cdots q_{|Q|}\text{[SEP]}t_{10}t_{1}c_{10}^{t_1}c_{1}^{t_1}c_{20}^{t_1}c_{2}^{t_1}\cdots t_{20}t_{2}c_{10}^{t_2}c_{1}^{t_2}c_{20}^{t_2}c_{2}^{t_2}\cdots \text{[SEP]}
[CLS]q1q2⋯q∣Q∣[SEP]t10t1c10t1c1t1c20t1c2t1⋯t20t2c10t2c1t2c20t2c2t2⋯[SEP]
其中类型信息
t
i
0
t_{i0}
ti0和
c
j
0
c_{j0}
cj0被插入到schema item之前。由于每个word都被分词为了subword-level,所以要获取每个word的表示向量需要再加入一个subword attentive pooling layer来获取word的表示。
其计算过程与attention的计算差别不大。获得每个word的词表示后,也分别将它们按照所属部分类型分别送入对应的BiLSTM中,并concatenate两端的hidden state。将得到的节点表示进行stack组成初始节点embedding矩阵
X
0
∈
R
∣
V
n
∣
×
d
X^0\in \mathbb{R}^{|V^n|\times d}
X0∈R∣Vn∣×d。
Line Graph Enhanced Hidden Module
该模块包含有 L L L个堆叠的dual relational graph attention network(Dual RGAT)层组成。每一层包含有两个RGAT模块来分别捕获原始图和Line graph的结构信息。每个图中的节点embedding都表示了对偶图中的边的特征信息。例如:下图中节点图Gn使用的边特征 z (边1-4和2-4)来源于线图中对应的“节点”特征。
原始图中的RGAT
RGAT的计算方法与RATSQL中计算基本一致。
由于Line Graph的构建只利用了1阶连接关系,对于节点图中的高阶邻域,论文采取静态动态混合特征或多头多视图拼接的方法,将更远的节点及其边类型引入到节点图中对节点特征的更新中,这些包含远距离信息的边特征不会迭代更新,仅仅使用静态参数初始化。
静态动态混合特征
关系特征是由 ψ ( r j i n ) \psi(r_{ji}^n) ψ(rjin)函数得到的。如果 r j i n r_{ji}^n rjin是一个局部关系(即1跳的关系),那么 ψ ( r j i n ) \psi(r_{ji}^n) ψ(rjin)函数将返回Line graph中的节点embedding z f ( j , i ) l z^l_{f(j,i)} zf(j,i)l。如果不是一个局部关系(即多跳的关系),那么 ψ ( r j i n ) \psi(r_{ji}^n) ψ(rjin)函数将直接从一个静态关系矩阵中取出这个关系对应的特征向量。
多头多视图拼接
另一种可以代替的方式是多头多视图拼接。我们让一半的head具有局部视野,在这些头中, ψ ( r j i n ) \psi(r_{ji}^n) ψ(rjin)返回更新的特征 z f ( j , i ) l z^l_{f(j,i)} zf(j,i)l。在另外一半头中,每个节点都具有全局视野, ψ ( ⋅ ) \psi(\cdot) ψ(⋅)返回的是从静态参数矩阵总取得的embedding。
无论哪一种方式,RGAT模块都区分对待了局部和非局部关系,并且对于局部关系都更加小心的去使用。
Line Graph中的RGAT
公式计算基本对称,不在赘述
图输出模块
该模块包含两个任务:一个是主任务用于Text-to-SQL的解码,另一个是附加任务称为graph pruning。
Text-to-SQL Decoder
采用的是与RATSQL一致的grammar-based syntactic neural decoder来首先生成AST,然后再由AST转换为SQL语句。
Graph pruning
该模块的主要目的是通过输入Question和Schema,模型能够知道哪些schema items是最终输出SQL语句中能用到的。如下图所示,
这个任务和主任务一同进行多任务学习,对提升主任务效果比较大。
关于多任务学习,可以参考模型汇总-14 多任务学习-Multitask Learning概述
实验
主要结果
实验结果见上图,可以看到无论是使用PLM还是Glove,模型都取得了领先于之前最好的模型的表现。在各个分组的性能如下:
消融研究
LGESQL不同的组件的实验表现
可以看到使用Line graph比不使用性能普遍高出1个百分点。而且Non-local relation是比较重要的。同时,多任务学习的Graph pruning模块也对最后结果有着不错的促进作用。
预训练模型的影响
使用ELECTRA比BERT的效果要好。
案例研究
相关工作
略
结论
在本工作中,我们利用Line graph来更新异质图中的边特征,用于Text-to-SQL的任务。通过对Line graph中的结构连接的迭代,局部边可以结合多跳关系特征并捕获重要的meta-path。通过进一步集成非本地关系,编码器可以从多个视图学习,并使用快捷方式关注远程节点。在未来,我们将研究更多有用的meta-path,并探索更有效的方法来处理不同的基于meta-path的邻居。
附录
局部和非局部关系
实验中用到的所有局部关系如下:
其中作者保留了NO-MATCH关系。
Text-to-SQL Decoder的细节
ASDL Grammar
所使用的ASDL语法如下,这部分我也不太熟悉,等后面了解了再详细介绍。
Decoder架构
Decoder中使用了一种新型的LSTM叫ON-LSTM,可以将结构信息考虑在内,详情参看ICLR 2019最佳论文 | ON-LSTM:用有序神经元表达层次结构
Graph pruning
这里作者做了一个实验,比较共享多少层给两个任务效果最好,结果发现直接多任务学习即共享所有层效果最佳。
参考
[1] Cao R, Chen L, Chen Z, et al. LGESQL: Line Graph Enhanced Text-to-SQL Model with Mixed Local and Non-Local Relations[J]. arXiv preprint arXiv:2106.01093, 2021.
[2] 计算机系X-LANCE实验室斩获Text-to-SQL权威榜单Spider第一名,https://homest.org.cn/article/detail?id=5811791