王悅林
摘要:人工智能領(lǐng)域近年發(fā)展十分迅猛,其中自然語言處理(NLP)領(lǐng)域從2016年起進入高速發(fā)展期,以BERT為代表的各種新模型層出不窮,解決了文本數(shù)據(jù)分析和信息提取的問題。其中有一個子領(lǐng)域,即NL2SQL領(lǐng)域,是解決如何用自然語言問句進行數(shù)據(jù)庫查詢的問題。具體方案是通過語義解析,將自然語言問句翻譯成SQL,再送到數(shù)據(jù)庫中進行查詢,大大降低了數(shù)據(jù)查詢的難度,提升了交互友好度和查詢效率。本文探討具體的技術(shù)解決方案。
正文
NL2SQL領(lǐng)域目前的數(shù)據(jù)集英文以WikiSQL和Spider為主,中文有追一科技提供的競賽數(shù)據(jù)集。WikiSQL數(shù)據(jù)集支持單表、單列、多Where子句查詢,現(xiàn)有模型可以較好地支持。而耶魯大學(xué)提供的Spider數(shù)據(jù)集要求支持Group By、Order By、Having,還需要Join不同表,這更貼近于真實場景,也帶來了更大的難度。追一科技的競賽數(shù)據(jù)集的難度介于兩者之間,要求支持多列查詢,支持多Where子句間不同操作符操作。本文以追一科技數(shù)據(jù)集的難度為準,探討解決方案。
1.主流模型
目前業(yè)內(nèi)的三大技術(shù)解決方案依次是SQLnet,SQLova和X-SQL,其中X-SQL在WikiSQL數(shù)據(jù)集上測試效果最好,但仍然滿足不了追一科技數(shù)據(jù)集的要求。我們主要參考后兩個模型,提出我們的解決方案。
2.方案思路
解決此問題有兩大思路,增強學(xué)習(xí)和解耦任務(wù)。增強學(xué)習(xí)是端到端的解決方案,比較先進,但實際應(yīng)用尚不成熟,達不到準確率的要求。因此解耦任務(wù)的思路成為首選。解耦的思路是將任務(wù)拆解為8個子任務(wù),分別是
Select-Number:選擇幾列
Select-Column:選擇哪一列
Select-Aggregation:使用什么聚合函數(shù)
Where-Number:有幾個條件
Where-Column:篩選條件是針對哪幾列
Where-Operator:各個條件的操作符
Where-Value:各個條件的條件值
Where-Operator:各個條件之間的關(guān)系。
為了將整體準確度提升到80%以上,需要8個子任務(wù)的平均準確度達到97.5%,這對方案提出了非常高的要求。
整體解決方案分為三部分:語義解析模塊、執(zhí)行引導(dǎo)模塊和SQL增強模塊。以下分別加以說明。
3.語義解析模塊
語義解析模塊是整個解決方案最重要的部分,共分為三個層次:編碼層、語義增強層和輸出層。
編碼層采用2019年7月由Facebook公司推出的RoBERTa作為基礎(chǔ)預(yù)訓(xùn)練模型。和2018年10月谷歌公司推出的BERT相比,此模型在CoLA和SST-2兩項任務(wù)中分別領(lǐng)先16個百分點和3個百分點。而這兩個任務(wù)是評判文本語義解析能力的重要指標。RoBERTa已經(jīng)有支持中文的版本。
我們也考慮了其它的可能性,例如MT-DNN,XLnet,ERNIE2.0和DistilBERT,經(jīng)過對可行性的分析和對性能的比較,最終選用RoBERTa。
語義增強層的思路是將問題的文本表示和組成數(shù)據(jù)列的token的文本表示進行融合,將融合后的結(jié)果結(jié)合注意力機制,然后進行數(shù)學(xué)相加,最后再加上問題的文本表示,以得到數(shù)據(jù)列的文本表示。
其中將問題與token進行融合的時候,加入兩個多維訓(xùn)練參數(shù)(m*d),以構(gòu)成神經(jīng)網(wǎng)絡(luò)層。那么數(shù)學(xué)上,兩個多維表示如何變成一個注意力參數(shù)的呢?問題和token都是((m*d)*(d*1)),點積后成為(m*1)向量,再次轉(zhuǎn)制和點積后成為(1*1)向量,即一個注意力參數(shù)。
最后再次加上問題的文本表示,是為了增強問題表示的比重,將問題和toke比重由1:1改為2:1,以增強最終效果。此處問題權(quán)重設(shè)為0.5。
到此已經(jīng)增加了一層神經(jīng)網(wǎng)絡(luò)層。在輸出層為所有的子任務(wù)還要再增加一層神經(jīng)網(wǎng)絡(luò)層,以Where Number子任務(wù)為例進行說明。這個子任務(wù)是二分類模型,可選值為1或2,而是否有Where子句由empty column指定。此子任務(wù)增加一層MLP層。其余子任務(wù)由不同的公式加上神經(jīng)網(wǎng)絡(luò)參數(shù)計算。所有輸出層的損失函數(shù)都是交叉熵損失函數(shù)。
這些子任務(wù)并不是每個獨立進行訓(xùn)練,在每一個batch size里,所有子任務(wù)按順序依次正向傳播,然后計算損失函數(shù),按照梯度下降原理,進行整體反向傳播,更新參數(shù),使整體損失函數(shù)值最低。
4.執(zhí)行引導(dǎo)模塊
執(zhí)行引導(dǎo)模塊參考arxiv.org/abs/1807.03100直接進行增強,可有效提升執(zhí)行準確率2%左右。
SQL增強模塊
SQL增強模塊在把生成的SQL送到數(shù)據(jù)庫之前,進行調(diào)整如下:
●對于表中的類別型列數(shù)據(jù),需要將生成的列值與數(shù)據(jù)庫里的此列的類別值進行相似度匹配,以替換成正確值。例如解析后的Where Value為“黃蜂”,而數(shù)據(jù)庫里的數(shù)據(jù)為“大黃蜂”,則修改為“大黃蜂”。
●如果兩個Where子句的列名相同,要檢查兩個Where Value是否相同,相同的話將其中一個替換為相似度最高的另一個值。
●如果Where Value里包含中文“和”字,則拆成兩個值
●如果問題中有中文“或”字,或者兩個Where子句的列名相同,則兩個Where子句的關(guān)系為“or”,其它情況均為“and”。
5.總結(jié)
以上是整體設(shè)計及方案的關(guān)鍵點。綜合以上方案,可以有效提升SQL轉(zhuǎn)化的準確度,取得較好效果。
參考文獻:
[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.
(作者單位:聯(lián)想集團)