王悅林
摘要:人工智能領域近年發展十分迅猛,其中自然語言處理(NLP)領域從2016年起進入高速發展期,以BERT為代表的各種新模型層出不窮,解決了文本數據分析和信息提取的問題。其中有一個子領域,即NL2SQL領域,是解決如何用自然語言問句進行數據庫查詢的問題。具體方案是通過語義解析,將自然語言問句翻譯成SQL,再送到數據庫中進行查詢,大大降低了數據查詢的難度,提升了交互友好度和查詢效率。本文探討具體的技術解決方案。
正文
NL2SQL領域目前的數據集英文以WikiSQL和Spider為主,中文有追一科技提供的競賽數據集。WikiSQL數據集支持單表、單列、多Where子句查詢,現有模型可以較好地支持。而耶魯大學提供的Spider數據集要求支持Group By、Order By、Having,還需要Join不同表,這更貼近于真實場景,也帶來了更大的難度。追一科技的競賽數據集的難度介于兩者之間,要求支持多列查詢,支持多Where子句間不同操作符操作。本文以追一科技數據集的難度為準,探討解決方案。
1.主流模型
目前業內的三大技術解決方案依次是SQLnet,SQLova和X-SQL,其中X-SQL在WikiSQL數據集上測試效果最好,但仍然滿足不了追一科技數據集的要求。我們主要參考后兩個模型,提出我們的解決方案。
2.方案思路
解決此問題有兩大思路,增強學習和解耦任務。增強學習是端到端的解決方案,比較先進,但實際應用尚不成熟,達不到準確率的要求。因此解耦任務的思路成為首選。解耦的思路是將任務拆解為8個子任務,分別是
Select-Number:選擇幾列
Select-Column:選擇哪一列
Select-Aggregation:使用什么聚合函數
Where-Number:有幾個條件
Where-Column:篩選條件是針對哪幾列
Where-Operator:各個條件的操作符
Where-Value:各個條件的條件值
Where-Operator:各個條件之間的關系。
為了將整體準確度提升到80%以上,需要8個子任務的平均準確度達到97.5%,這對方案提出了非常高的要求。
整體解決方案分為三部分:語義解析模塊、執行引導模塊和SQL增強模塊。以下分別加以說明。
3.語義解析模塊
語義解析模塊是整個解決方案最重要的部分,共分為三個層次:編碼層、語義增強層和輸出層。
編碼層采用2019年7月由Facebook公司推出的RoBERTa作為基礎預訓練模型。和2018年10月谷歌公司推出的BERT相比,此模型在CoLA和SST-2兩項任務中分別領先16個百分點和3個百分點。而這兩個任務是評判文本語義解析能力的重要指標。RoBERTa已經有支持中文的版本。
我們也考慮了其它的可能性,例如MT-DNN,XLnet,ERNIE2.0和DistilBERT,經過對可行性的分析和對性能的比較,最終選用RoBERTa。
語義增強層的思路是將問題的文本表示和組成數據列的token的文本表示進行融合,將融合后的結果結合注意力機制,然后進行數學相加,最后再加上問題的文本表示,以得到數據列的文本表示。
其中將問題與token進行融合的時候,加入兩個多維訓練參數(m*d),以構成神經網絡層。那么數學上,兩個多維表示如何變成一個注意力參數的呢?問題和token都是((m*d)*(d*1)),點積后成為(m*1)向量,再次轉制和點積后成為(1*1)向量,即一個注意力參數。
最后再次加上問題的文本表示,是為了增強問題表示的比重,將問題和toke比重由1:1改為2:1,以增強最終效果。此處問題權重設為0.5。
到此已經增加了一層神經網絡層。在輸出層為所有的子任務還要再增加一層神經網絡層,以Where Number子任務為例進行說明。這個子任務是二分類模型,可選值為1或2,而是否有Where子句由empty column指定。此子任務增加一層MLP層。其余子任務由不同的公式加上神經網絡參數計算。所有輸出層的損失函數都是交叉熵損失函數。
這些子任務并不是每個獨立進行訓練,在每一個batch size里,所有子任務按順序依次正向傳播,然后計算損失函數,按照梯度下降原理,進行整體反向傳播,更新參數,使整體損失函數值最低。
4.執行引導模塊
執行引導模塊參考arxiv.org/abs/1807.03100直接進行增強,可有效提升執行準確率2%左右。
SQL增強模塊
SQL增強模塊在把生成的SQL送到數據庫之前,進行調整如下:
●對于表中的類別型列數據,需要將生成的列值與數據庫里的此列的類別值進行相似度匹配,以替換成正確值。例如解析后的Where Value為“黃蜂”,而數據庫里的數據為“大黃蜂”,則修改為“大黃蜂”。
●如果兩個Where子句的列名相同,要檢查兩個Where Value是否相同,相同的話將其中一個替換為相似度最高的另一個值。
●如果Where Value里包含中文“和”字,則拆成兩個值
●如果問題中有中文“或”字,或者兩個Where子句的列名相同,則兩個Where子句的關系為“or”,其它情況均為“and”。
5.總結
以上是整體設計及方案的關鍵點。綜合以上方案,可以有效提升SQL轉化的準確度,取得較好效果。
參考文獻:
[1] Matthew E Peters,Mark Neumann,Mohit Iyyer,Matt Gardner,Christopher Clark,Kenton Lee,and Luke Zettlemoyer.2018.Deep contextualized word representations.arXiv preprint arXiv:1802.05365.
[2] Jason Phang,Thibault Fevry,and Samuel R Bowman.2018. Sentence encoders on stilts:Supplementary training on intermediate labeled-data tasks.arXiv preprint arXiv:1811.01088.
[3] Alec Radford,Karthik Narasimhan,Tim Salimans,and Ilya Sutskever.2018.Improving language understanding by generative pre-training.
[4] Pranav Rajpurkar,Jian Zhang,Konstantin Lopyrev,and Percy Liang.2016.Squad:100,000+ questions for machine comprehension of text.pages 2383–2392.
[5] Aarne Talman and Stergios Chatzikyriakidis.2018.Testing the generalization power of neural network models across nli benchmarks.arXiv preprint arXiv:1810.09774.
(作者單位:聯想集團)