自然語言到 SQL 語句,微軟只用六個子任務,結果超越人類水平

自然語言到 SQL 語句,微軟只用六個子任務,結果超越人類水平

論文標題:X-SQL:reinforce schema representation with context

論文地址:https://arxiv.org/pdf/1908.08113

1、背景介紹

如果有人問現在是一個什麼樣的時代?那麼很多人都會回覆現在是一個大數據的時代,如此海量的數據,我們將其大多數都存儲在數據庫中。在日常生活中我們經常和數據庫進行交互,比如網絡購物、訂票、訂餐等等,絕大多數操作都是在後臺封裝好的SQL 模板,這樣我們的操作常常會受限於預先設好的SQL模板,不具備靈活性,為了解決這個問題,我們可以使用NL2SQL的技術方案,用戶只需要通過自然語言表達意圖,NL2SQL會將其轉換為結構化查詢語句SQL,這樣會大大縮短用戶與數據庫之間的距離。

在自然語言處理領域,上述自然語言-SQL任務被稱為語義解析,即把自然語言自動轉化為一種機器可以理解並執行的SQL表達形式。

2、問題難點

結構化查詢語言SQL是由人類設計的,它句法要求嚴格,一條SQL語句往往由多個部分組成,彼此之間相互關聯,一旦某個部分出現問題,那麼整體都會執行失敗,所以如何將自然語言自動轉為SQL表達並且正確執行是非常困難的。

本文我們將介紹微軟在該領域的最新進展,它將自然語言到 SQL 語句的生成分解為六個子任務,彼此之間相互約束,保證模型輸出空間最大限度地滿足SQL語言要求。該任務由 Pengcheng He, Yi Mao, Kaushik Chakrabarti, Weizhu Chen 四位研究員完成,並且在數據集WikiSQL上達到了目前最佳表現,超越人類水平。

3、數據集WikiSQL介紹

WikiSQL 是 Salesforce 在 2017 年提出的大型標註 NL2SQL 數據集,也是目前規模最大的 NL2SQL 數據集。它包含了 24,241 張表、80,645 條自然語言問句及相應的 SQL 語句。該數據集不涉及高級用法,Question 所對應的正確表格已經給定,不需要聯合多張表格,圖一是其中的一條數據樣例,包括一個 table、一條 SQL 語句、SQL語句所對應的自然語言語句及該條SQL語句的執行結果。

自然语言到 SQL 语句,微软只用六个子任务,结果超越人类水平

圖一

4、主要思路

針對自然語言到sql的解析問題,本論文提出了一種新的網絡體系結構x-sql。x-sql提出利用bert風格的預訓練模型(MT-DNN)的上下文輸出來增強結構模式表示,並結合類型信息來學習用於下游任務的新模式表示。因為SQL語法的一部分受限於結構化數據模式的類型,例如,聚合器min只與數字列一起出現,而不能與字符串的類型列一起出現,所以我們必須要對其進行約束,論文中顯性的將列類型添加到模型中。

本論文中模型包含三層結構,分別是SequenceEncoder、ContextEnhancedSchemaEncoder、OutputLayer(輸出層),其中輸出層完成SQL語句的生成,我們將其分為6個子任務(select-column, select-aggregation, where-number, where-column, where-operator, and where-value),這六個任務彼此之間相互結合,彼此制約。下面我們將按照論文對這三層結構,6個子任務進行解析。

5、三層結構

自然语言到 SQL 语句,微软只用六个子任务,结果超越人类水平

第一層結構是Sequence Encoder(序列編碼器),在該結構中,我們為每個表增加一個empty列,然後段編碼替換為類型編碼,學習四個類型:question,categorial column,numerical column和empty column,該模型輸出h_[CTX], h_q1, ···, h_qn, h_[SEP], h_C11, ···, h_[SEP], h_C21, ··· h_[SEP], ···, h_[EMPTY], h_[SEP],其中問題中每一個詞編碼為h_qi,然後h_cij表示列 i 編碼第 j 個標記,因為每個列名可能包含多個標記。

自然语言到 SQL 语句,微软只用六个子任务,结果超越人类水平

第二層結構是Context Enhanced Schema Encoder,該結構用於增強在equence Encoder(序列編碼器)得到的H_[CTX],雖然在序列編碼器的輸出中已經捕獲了某種程度的上下文,但這種影響是有限的,因為自我關注往往只關注某些區域。另一方面,[ctx]中捕獲的全局上下文信息具有足夠的多樣性,因此用於補充序列編碼器中的模式表示。通過這種方式可以捕獲到哪一個查詢詞與哪一列最相關,從而得到增強的語義表示HCi它的計算過程如下圖所示:

自然语言到 SQL 语句,微软只用六个子任务,结果超越人类水平

第三層結構是Output Layer,它的核心是完成sql語句的生成,它將SQL語句分為六個子任務,對於每個子任務首先使用下面的子網絡結構得到使用融合hci和hctx的rCi,它的模型圖如下所示:

自然语言到 SQL 语句,微软只用六个子任务,结果超越人类水平

需要注意的是每個子任務都具有一個這樣的子網絡,計算是針對每個子任務單獨進行的,以便更好地將模式表示與每個子任務應該關注的自然語言問題的特定部分對齊。該子結構的計算機構如下所示:

自然语言到 SQL 语句,微软只用六个子任务,结果超越人类水平

當我們完成這個子結構之後,我們就可以完成之後的六個子任務了

6、六個子任務

第一個任務S-COL,這個任務表示SQL語句查詢表的哪一列,我們使用前面得到的rci來完成這個子任務,使用softmax來找到最可能的列,計算公式如下所示:

自然语言到 SQL 语句,微软只用六个子任务,结果超越人类水平

第二個子任務S-AGG,這個任務表示對第一個子任務使用什麼函數操作,比如min、max,這裡就需要注意我們前面提到字符串函數不可以應用min、max的問題,為了解決這個問題,我麼們需要顯式的將任務一得到的列類型Ectype嵌入到模型中,與其他子任務不同,我們在這裡使用hci而不是rci,它的計算公式如下所示:

自然语言到 SQL 语句,微软只用六个子任务,结果超越人类水平

其中 E_Ci^T 就是任務一的類型,從公式可以看出來,這裡就相當於給任務二增加了類型約束,使得任務二預測的函數操作不可以和任務一得到的列類型相矛盾。

其餘4個任務w-num、w-col、w-op和w-val一起決定了SQL語句的where部分,其中w-num決定了對錶的幾列進行約束,w-col表示對哪幾列進行約束,w-op表示對這幾列的操作符,比如>、<、=等等,w-val表示對這幾列進行約束的值。

首先這w-col、w-op和w-val這三個任務是依賴w-num的,因為w-num決定了對幾列進行約束,這樣它們三個只需要取softmax最大的那幾個就可以了。然後w-col和w-op也進行依賴,這個和任務二w-agg一樣,字符串類型的列是不可以使用<或者>的,但是本論文實驗過程中,這裡並沒有多少改善,所以我們這裡可以不進行約束。

自然语言到 SQL 语句,微软只用六个子任务,结果超越人类水平
自然语言到 SQL 语句,微软只用六个子任务,结果超越人类水平

最後一個任務就是w-val,這個值是多少,只能來源於query的語句,所以這裡我們預測value值在query語句中的起始位置,計算公式如下:

自然语言到 SQL 语句,微软只用六个子任务,结果超越人类水平

至此為止,本論文的三層模型和六小任務就介紹完成了,我們前面介紹過它的模型效果已經超越人類表現了,我們來一下它的實驗結果。

7、實驗結果

自然语言到 SQL 语句,微软只用六个子任务,结果超越人类水平

因為在這個論文之前,在該數據集上的最佳表現的算法模型是SQLNet以及SQLova,所以本論文只能它們兩個進行了比較,我們可以看出在驗證集和測試集中X-SQL模型都有一個全面的提高。在沒有EG的情況下,x-sql在邏輯形式精度上絕對提高了2.6%(83.3對80.7),在測試集上的執行精度提高了2.5%。如果使用了EG,xsql在邏輯形式準確性上仍然高出2.4%。

自然语言到 SQL 语句,微软只用六个子任务,结果超越人类水平

因為本任務使用六個子任務完成,所以對於SQLova與X-SQL在每個子任務的效果,我們可以看到每個子任務的準確性,並展示了一致的改進。特別是,任務w-col顯示在沒有eg的情況下絕對有1.1%的增益,在有eg的情況下絕對有1.7%的增益。另一個顯著的改進是W-VAL任務,在沒有EG的情況下絕對增加了1.2%,而在有EG的情況下絕對增加了2.0%。

8、總結

由於SQL語句的嚴格語法規範性,本任務將問題進行拆分,並且相互之間進行約束,從而得到了一個好的模型學習,在WikiSQL數據集上取得了一個好的進展,我們可以思考是否默寫任務可以使用這種方式,比如NL2java,NL2python等等,或者我們可以增加更多的子任務,從而加強約束空間,得到更加嚴格的SQL語句。

雖然本任務取得好的效果,但是卻有一些問題,比如為什麼使用六個子任務,這是因為這個數據集只涉及到單表查詢,想對來說語法比較簡單,所以我們使用六個子任務就可以完成,但是如果有的數據集設計到多表聯合查詢,那麼六個子任務是遠遠不夠的,那麼此時增加更多的子任務是否可以解決多表查詢的任務,還是會成為負擔,這些都是我們需要擔憂的,但是無論怎麼本任務所需的的結果證明這個模型效果和思想是不錯的,我們可以借鑑或者進行升級,以此來幫助我們更好的解決自己的任務。

自然语言到 SQL 语句,微软只用六个子任务,结果超越人类水平


分享到:


相關文章: