論文導讀-BERT學會寫SQL了

文字-SQL轉化任務,是將使用者的自然語言轉化為SQL繼而完成資料庫查詢的工作。

例如根據下表,使用者輸入一個問題,模型將其轉換為 SQL,查詢資料庫得到結果:“-4。52, -9。55”

Query:新浪和人人網的周漲跌幅分別是多少?

SQL:SELECT 周漲跌幅 FROM 表 WHERE 名稱=‘新浪’ OR 名稱=‘人人網’

論文導讀-BERT學會寫SQL了

原本要辛辛苦苦寫SQL,現在我用大白話告訴機器想看的內容,就能從資料庫中拿到答案,這就是Text2SQL。

本文將解讀Text2SQL領域論文,BERT從中學會了如何編寫SQL語言。原文發表在EMNLP 2020會議上。

論文題目:

Bridging Textual and Tabular Data for Cross-Domain Text-to-SQL Semantic Parsing

論文連結:

https://arxiv。org/pdf/2012。12627v2。pdf

開原始碼:

https://github。com/salesforce/TabularSemanticParsing

01 Text2SQL定義

Text2SQL解決的是將自然語言對映到資料庫查詢語句SQL的問題。論文中將跨領域的text-to-SQL任務定義如下:

論文導讀-BERT學會寫SQL了

論文導讀-BERT學會寫SQL了

表中的單元值包含了真實資料資訊,例如前文的“人人網”和“sina”。

明白了什麼是Q和S,我們來思考如何搭建模型。

02 模型架構

論文提出的模型BRIDGE採用了主流的Seq2Seq架構,把Text2SQL視作翻譯問題(原序列:text,目標序列:SQL),包含編碼器和解碼器。

編碼器

編碼器的目的是對Q和S分別做向量編碼,同時對兩者之間的關係充分互動。

論文導讀-BERT學會寫SQL了

每一個表名、欄位名分別用字元[T]和[C]分隔。問題Q和S之間用字元[SEP]分隔。最後,在開始位置插入[CLS]字元。

這樣的序列既符合BERT的輸入格式,從而優雅地編碼跨模態資訊,又能快速獲取任意欄位的編碼向量(提取[T]/[C]對應特徵即可)。

論文導讀-BERT學會寫SQL了

Meta-data Features

相比於表名,欄位名多了主鍵、外來鍵等屬性。為了利用這些特徵(meta-data),論文中用了一層前饋網路對錶名、欄位名進一步編碼。

論文導讀-BERT學會寫SQL了

Bridging

截至目前,僅僅完成了Q和S的各自編碼。讀者可能會疑惑,互動在哪呢?

為了解決這個問題,作者使用錨文字(anchor text)將問題Q中包含的單元值與資料庫欄位連結起來。

具體實現上,作者將問題Q中的每一個token,與資料庫表中每一列的所有value值進行字串模糊匹配,匹配上的value值將被插入到序列X中。

論文導讀-BERT學會寫SQL了

如上圖所示,問題Q和表格“Properties”、“Reference Property Types”相關聯。其中Q包含的兩個單詞“houses”和“apartments”與兩張表中的同名欄位“Property type code”有重合單元值。

欄位名“Property type code”本身沒有在問題Q中出現,讓模型直接推理出“houses”、“apartments”和“Property type code”相關,難度很大。

論文導讀-BERT學會寫SQL了

作者把這種方式稱為“bridging”,即模型BRIDGE的由來。

解碼器

解碼器的目的是從編碼特徵中還原出相應SQL。

相比於前人的工作(RAT-SQL[2]、IRNet[3]等),BRIDGE解碼器設計非常簡潔,僅使用了一層帶多頭注意力機制[4]的LSTM指標生成網路。

在每一個step中,解碼器從如下動作中選擇1種:

1、從詞彙表V中選擇一個token(SQL關鍵字)

2、從問題Q中複製一個token

3、從模式S中複製一個元件(欄位名、表名、單元值)

論文導讀-BERT學會寫SQL了

論文導讀-BERT學會寫SQL了

03 資料集與評價指標

作者在WikiSQL、Spider[5]兩份資料集上測試了效果。

Spider是耶魯大學釋出的資料集,訓練/驗證/測試集資料庫不重疊,涵蓋了幾乎所有SQL語法,被公認是難度較大的Text2SQL資料集。

論文導讀-BERT學會寫SQL了

預測評價指標上,作者選擇了完全匹配準確率(Exact Set Match)。模型輸出SQL的各個子句(select、from、where)需要和標註SQL一一匹配。

論文導讀-BERT學會寫SQL了

04 實驗分析

實驗部分,作者端到端的訓練並測試了模型在Spider上的表現。

模型訓練

引數設定部分,作者用交叉熵loss、Adam-SGD最佳化器、uncased BERT-large訓練模型。為確保訓練的穩定性,使用了L-inv學習率衰減函式。

論文導讀-BERT學會寫SQL了

論文導讀-BERT學會寫SQL了

消融實驗

為了證明BRIDGE各個子模組的有效性,作者做了消融分析實驗。

論文導讀-BERT學會寫SQL了

BERT對於最終表現有至關重要的影響,帶來3倍以上的提升效果。

此外,在訓練過程中隨機打亂db中table順序(防止過擬合)、引入meta-data、bridging機制都有一定的積極作用。

論文導讀-BERT學會寫SQL了

其中,bridging機制對於Ex-Hard難度的樣本有顯著的提升效果(9%)。

05 錯誤分析

誤差都去哪了呢?作者用最優的BRIDGE模型,隨機選擇dev上50條預測錯誤的樣本進行了分析。

論文導讀-BERT學會寫SQL了

有9條樣本屬於假負樣本(False Negative)。原因在於同一句話可以翻譯成不同的SQL,E-SM指標不能發現這種差異。

# 例如“oldest age”,可以用兩種SQL表示

MAX(age)

ORDER BY age DESC LIMIT 1

剩餘錯誤中,36%屬於邏輯錯誤。由於模型的泛化能力不足,或沒有結合上下文“死記”訓練集出現的固定模式,導致在select、where子句等處預測錯誤。

當輸入的文字包含未見過的單詞時,模型容易不知所措,不能準確推理這個詞在資料庫中的含義。作者認為“持續學習“是一種有效的解決方案。

論文導讀-BERT學會寫SQL了

06 總結

這篇論文提出了BRIDGE模型,與BERT結合取得了奇效(提升300%)。

論文作者也在論文中對比、總結了許多前人的工作。應該說這是一篇SQL解析方向非常Robust的paper!