论文:IncSQL: Training Incremental Text-to-SQL Parsers with Non-Deterministic Oracles
⭐⭐⭐
ICLR 2019,arXiv:1809.05054, Microsoft Research
一、论文速读
本文提出了 IncSQL,一个使用 Non-Deterministic Oracles 思路的增量式 Text2SQL Parser,在 WikiSQL 上做的测试。
该模型的输入 x x x 包括 NL question 和 table schema(不包含 content),输出 y y y 是一个 SQL query。如下图所示:
由于 WikiSQL 的 SQL 结构是固定的,所以每个 SQL query 唯一对应一个 structured representation,比如上面 example 的 SQL 对应下面这个结构:
- 这个 structure 包含 AGG、SELCOL 和 COND 三个部分。
1.1 将对 SQL 的生成任务,视为对 action sequence 的生成
本文模型将 y y y 的生成转变为这个 structure 的生成,这个 structure 的生成又转为对 action sequence 的生成:有一个初始 parser state p 0 p_0 p0 和一个空的 struct,每一个 action 会在 struct 中填充一部分内容,并将 parser state 由 p p p 进化为 p ′ p' p′。所有可能的 action 如下表:
AGG(agg)
action 表示为 struct 的 AGG 部分填充上 agg 值SELCOL(ci)
action 表示为 SELCOL 部分填充上 c i c_i ci 值CONDCOL(ci)
action 表示为 COND 部分增加一列,并且将这一列中的 COL 部分填充为 c i c_i ci 值CONDOP(op)
action 表示为 COND 中的 OP 部分填充op
CONDVAL(w i:j)
action 表示为 COND 中的 VAL 填充上question[i:j]
的值END
表示 action sequence 的结束
由此,前面 Example 中的 SQL 的生成就可以被视为下面这个 action sequence:
这样,我们通过生成 action sequence,就可以生成一个 SQL query。
1.2 Decoder
假如我们已经通过 encoder 获得了 question 和 column headers 的上下文表示,使用 a a a 表示一个 action。
Decoder 模型就可以视为一个概率分布: P θ ( a ∣ x , a < i ) P_\theta (a | x, a_{\lt i}) Pθ(a∣x,a<i) —— 表示根据 input x 和过去的 actions 来生成当前 step 的 action。
在一个 step 中,具体选择哪一个 action 作为下一个生成结果,是一个分类问题,模型为所有候选 actions 打分,并通过 softmax 概率化,按照贪心策略选择当前 step 最有可能的 action。
模型的具体选择上,使用了 LSTM 来一个 step 一个 step 的生成,每一个 step 基于 LSTM 当前的 hidden state 和 question 与 schema 的 representation 来做预测。具体做法可以参考原论文。
1.3 Encoder
Encoder 主要是为 question 和 column headers 生成 context-sensitive representation,本论文主要使用了 bi-LSTM,具体细节不再介绍。
1.4 整体模型架构
有了 Encoder 和 Decoder,本论文的模型架构如下图所示:
二、Non-Deterministic Oracles
由于同一个 question,可以对应多个等价的 SQL,因为 WHERE 子句中不同的 cond 是可以互换的。
以往的研究中,由于 order-matters 问题,都假设了每个 question 仅有一个正确的 SQL query,但这在实践中并不符合实际。
在本文模型的训练过程中,在让 model 生成下一个 step 的 action 时,允许他探索多种目标策略,而不仅仅单一的目标策略,这种方法被称为 Non-Deterministic Oracles。
比如在最开始的例子中,是先生成的 CONDCOL(c3)
再 CONDCOL(c2)
,但训练时也允许先 CONDCOL(c2)
。
同时 Non-Deterministic Oracle 还增加了一个特殊列名 ANYCOL,因为所要预测的 column name 有可能不出现在 question 中,比如 “What is the area of Canada?” 中并没有 country 这个单词,为了预测这个单词,模型可以输出 CONDCOL(ANYCOL)
,在后面,我们会将其做扩展,比如模型如果想表达 ANYCOL='Willis'
,那我们会扩展为 rank='Willis' OR name='Willis' OR ...
,这样当 value 可以明确地解析为一个 column name 时,这样的 ANYCOL 时被视为正确的操作。
模型的损失函数被定义如下: