論文:X-SQL: reinforce schema representation with context
????
Microsoft, arXiv:1908.08113
X-SQL 與 SQLova 類似,使用 BERT style 的 PLM 來獲得 representation,只是融合 NL question 和 table schema 的信息的方式不太一樣,也就是在利用 BERT-style 得到的 representation 后進一步的加工方式不一樣。
X-SQL 先由 BERT-style PLM 生成 question 和 schema 的 representation,然后對 schema representation 做上下文信息的進一步加強,再交由 6 個 sub-task 分別構建出 SQL 的一部分,最終得到完整的 SQL。
一、X-SQL
整個架構包含三層:sequence encoder、context enhancing schema encoder 和 output layer。
1.1 Sequence Encoder:得到 PLM 的 representation
將 question 和 table headers 拼裝成下面的形式(與 SQLova 的類似):
- 有一個特殊的空 column 被附加到每個 table schema 最后,也就是實際最后一個 column 后面會在加一個
[EMPTY]
- 將
[CLS]
重命名為[CTX]
,用來強調這里是捕獲上下文信息,而非用于下游任務的 representation - SQLova 中的 segment embeddings 被替換為 type embeddings,這是我們為四種 types 學習的 embeddings:question、categorial column、numerical column 和 special empty column
另外,這里的 PLM 不是使用 BERT-Large 初始化的,而是使用 MT-DNN 初始化的,它與 BERT 架構相同,只是在多個 GLUE 任務上做過訓練,從而能夠得到更好的用于下游任務的 representation。
經過這一層,我們為 question 和 table schema 的每個 token 都利用 BERT-style PLM 生成一個 hidden state。
1.2 Context Enhanced Schema Encoder:加強 schema representation
在上一層 seq encoder 中,我們為 question 和 table headers 的每個 token 都得到一個 hidden state vector,在這一層,我們的 context enchanced schema encoder 通過用 h [ C T X ] h_{[CTX]} h[CTX]? 來加強前面 encoder 的輸出,從而得到每個 column 的一個新的 representation h C i h_{C_i} hCi??,它代表 column i 的新 representation。
論文認為,盡管 BERT style 的 sequence encoder 在它的 output 中也捕捉到了一定的 context,但是這種 context influence 受限于 self-attention 的機制(它傾向于關注某個特定 region 從而缺少全局信息),所以這里使用帶有全局信息的 [CTX]
的 hidden state 來加強 representation。
這里的具體做法就是,將 column i 的所有 token 的 hidden state 和 h [ C T X ] h_{[CTX]} h[CTX]? 一起輸入到一個 Attention 層中,得到加強后的新的 column i i i 的 representation:
經過這一層 encoder,我們得到了上下文增強的 schema representation,也就是每個 column 的新 representation。
這一步的做法也體現出 X-SQL 與 SQLova 的區別,這一層的 “context enchanced schema encoder” 和 SQLova 中引入的 column-attention 機制都是為了相同的目標:更好地對齊 question 和 table schema,但兩者的實現思路卻不同:
- column-attention 通過將 column 作為條件來改變 question 的編碼
- context enchanced schema encoder 認為 BERT-style 的 encoder 已經足夠好了,只是基于此并試圖使用
[CTX]
中捕獲的全局上下文信息來得到一個更好的 representation。
1.3 Output Layer:完成各 sub-task 生成 SQL
這一層借助 sequence encoder 輸出的 hidden states 和 context enchanced schema encoder 輸出的 h C 1 h_{C_1} hC1??、 h C 2 h_{C_2} hC2??、…、 h [ E M P T Y ] h_{[EMPTY]} h[EMPTY]? 來生成 SQL。這里的思路也是基于 SQL sketch 并填充 slots。
這一步的任務被分解成了 6 個子任務,每個子任務預測最終 SQL 程序的一部分。
1.3.1 用來修正 schema representation 的 sub-network
首先,這里引入了一個 sub-network 用來調整 schema representation with context,具體來說,就是分別對 H [ C T X ] H_{[CTX]} H[CTX]? 和 H C i H_{C_i} HCi?? 做一個仿射變換,再加起來經過一個 LayerNorm 得到 r C i r_{C_i} rCi??(column i 一個修正后的 representation),圖示如下:
公式如下:
注意,這個 sub-network 在每個 sub-task 中都是獨立訓練的,也就是每個 sub-task 得到的 r C i r_{C_i} rCi?? 是不同的,這也體現了這個 sub-network 就是針對一個具體 task 來修正 schema representation。
之后,各個 sub-task 就可以基于我們之前得到的 vectors 和 r C i r_{C_i} rCi?? 來做了。
1.3.2 sub-task 1:S-COL
S-COL 任務是預測 SELECT 語句中的 columns,這其實就是計算各個 columns 的一個概率,計算方式如下:

可以看到,這里只使用了 r C i r_{C_i} rCi??,另外的 W W W 是一個可訓練參數。
1.3.3 sub-task 2:S-AGG
直覺來說,aggregator 的選擇會依賴所選中的 column 的類型,比如 aggregator MIN
只能被用于數字類型的 column。為了實現這個直覺,這個 task 在做 aggregator 分類時,會利用到 column type 的 embedding:

具體公式可以參考原論文
1.3.4 其他 sub-task
其他 sub-task 共同確定出 WHERE 部分,這里可以具體參考原論文,整體思路是差不多的。
二、總結
通過以上改進,X-SQL 在表現 WikiSQL 上的表現提升到 90% 以上,超過了 SQLova:
本文對 BERT-style 生成的 representation 的進一步的加工利用值得研究學習。