<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          M-SQL:超強的多任務(wù)表示學(xué)習(xí)方法

          共 7254字,需瀏覽 15分鐘

           ·

          2021-09-26 19:21

          數(shù)據(jù)集整體介紹

          定義介紹

          國際慣例,先來一段定(bai)義(du)介(bai)紹(ke):Text toSQL,顧名思義,就是在給定數(shù)據(jù)庫(或表)的前提下,根據(jù)用戶的提問,產(chǎn)生SQL語句。其數(shù)學(xué)描述如下:

          令X表示用戶的自然語言提問,D表示與提問相關(guān)的數(shù)據(jù)庫(或表),Y表示其對應(yīng)的SQL語句。

          SQL語句生成任務(wù)可以表述為:對于每一組獨立的(X,D,Y),將(X,D)映射到對應(yīng)的Y。

          用一個大家熟悉的場景為例。假設(shè)我們有一張學(xué)生信息表,我們可以用自然語言提問:大于18歲的學(xué)生都有誰,模型需要返回一個與之相關(guān)的SQL語句,那么就是:

          SELECT 姓名 FROM 學(xué)生信息 WHERE 年齡 > 18

          場景分類

          Text to SQL有很多種分類,其中一種是按問題分類

          一種是上下文無關(guān)的(提問之間不存在關(guān)聯(lián)):Spider

          一種是上下文相關(guān)的(兩個提問之間存在一定關(guān)聯(lián)):SparC

          “上下文無關(guān)”是指提問之間沒有任何的關(guān)聯(lián),而“上下文相關(guān)”是前后兩個提問之間,存在一些指代關(guān)系或者說存在一定的關(guān)聯(lián)。

          同樣,我們舉一個簡單的例子來說明:

          提問1:有預(yù)約的醫(yī)生ID是什么?

          SELECT physician FROM appointment

          提問2:他們的名字是什么?

          SELECT T2.name FROM appointment AS T1 JOIN physician AS T2 ONT1.Physician = T2.EmpoyeeID

          以上就是一個上下文相關(guān)的例子,第一句的確定醫(yī)生ID,第二句根據(jù)醫(yī)生ID確定醫(yī)生名字。

          另一種是**按領(lǐng)域分類:**單領(lǐng)域 or 多領(lǐng)域

          如果所有的提問都是有關(guān)于航空方面的,這就是一個單領(lǐng)域的數(shù)據(jù)集。而跨領(lǐng)域數(shù)據(jù)集,則是在訓(xùn)練集當(dāng)中可能有很多種領(lǐng)域,在測試集當(dāng)中也有很多種領(lǐng)域,但是訓(xùn)練集中的領(lǐng)域和測試集中的領(lǐng)域不重合,這就要求我們的模型具有一定的泛化能力。

          第三種是按照數(shù)據(jù)庫進行分類

          單表數(shù)據(jù)庫:WikiSQL,其提問只針對一個表,或者是它所針對數(shù)據(jù)庫當(dāng)中只有一個表

          多表數(shù)據(jù)庫:Spider,其提問針對的數(shù)據(jù)庫當(dāng)中有許多個表,它所產(chǎn)生的 SQL語句可能涉及到多個表之間的連接。

          第四種種分類是按照標(biāo)注類型進行分類

          最終結(jié)果:WikiTableQuestion

          SQL語句:WikiSQL、Spider

          有一些數(shù)據(jù)集沒有給出相關(guān)的SQL語句,而是直接給出了一個結(jié)果。以前面的例子為例,“大于18歲的學(xué)生都有誰”,輸出有可能是給出SQL語句,也有可能是最終結(jié)果:把這些人名都給列出來,而沒有給出SQL語句,這其中涉及到的“弱監(jiān)督學(xué)習(xí)”,本次不做具體講解。

          TableQA 數(shù)據(jù)集

          本次要講解的論文所采用的是一個TableQA數(shù)據(jù)集,它也是一個單表數(shù)據(jù)。也就是每一個提問都只針對一個表進行提問。TableQA和WikiSQL有有很多相似之處,但是也有一定的差異,如下圖所示:

          論文概述

          介紹完數(shù)據(jù)集之后,我們來對論文中所提出的模型進行一個簡單的介紹。

          首先來思考這樣一個問題:通過自然語言生成SQL語可以有什么方法?其實一個最簡單的思路:輸入端是自然語言句子,輸出端是與之對應(yīng)的SQL語句(按照SQL語句按照一個token一個token進行生成)。

          比如說我們前面那個例子,Encoder是“大于18歲的學(xué)生都有誰“,輸出端是SELECT name FROM XX表 Y條件。

          這個方法很簡單,但是也伴隨著一些問題:SQL語句是結(jié)構(gòu)化的查詢語言,它是具備一定的結(jié)構(gòu)的,這和一般的語言生成任務(wù)是有一定差別的。

          對于一般的語言生成任務(wù)來說,如果變更其中的一兩個詞,可能它的語義不會發(fā)生太大變化。但是對于 SQL語句來說,如果某個詞不一樣了,那么其就可能就沒有辦法繼續(xù)執(zhí)行。所以我們需要利用好SQL語句內(nèi)部的一些語法信息,也就是結(jié)構(gòu)信息。按照它的結(jié)構(gòu)來進行生成,這就是論文當(dāng)中所提出來的,按照 SQL的框架來進行生成

          M-SQL

          因為TableQA數(shù)據(jù)集只針對單表,相當(dāng)于From字句可以省略。大體可以分成兩個部分,一部分是 Select子句,一部分是 Where子句。

          其中Select的子句當(dāng)中有兩個部分:一個是所選取的表的名稱,另一個是聚合操作。比如說我們要求某一列的最大值、最小值或者是對某一列進行求和,就需要聚合操作來進行。

          對于Where子句這一部分,我們詳細介紹一下:

          $WOP:where 條件連接符(and /or /Null)

          $COLUMN:數(shù)據(jù)庫中的列名

          $AGG:對選取列的操作(Null, AVG, MAX, MIN, COUNT, SUM)

          $OP:where子句中的列值

          根據(jù)對TableQA數(shù)據(jù)集進行統(tǒng)計,限定select中最多出現(xiàn)2列、where中最多有3個條件

          SELECT (AGGCOLUMN)*

          WHERE WOP (COLUMN OPVALUE)*

          M-SQL模型

          此模型大致可從下往上可以分成三塊。

          Encoder:對輸入進行一個編碼;采用了一個簡單的bert模型,版本是wwwm-ext。wwm意味著其使用的是一個全詞覆蓋的方式,而ext則擴充了它的訓(xùn)練集并使它的訓(xùn)練部署有所增加。

          其輸入部分包括:問題、列名。同樣以前面“大于18歲的學(xué)生都有誰”為例,可以看到上圖所示,T1至TL,后面跟著的是所提問的表當(dāng)中所出現(xiàn)的每一列它的列名,比如說這個表當(dāng)中可能有姓名、學(xué)號或者年齡。另外,與bert輸入不同的是它用 [XLS]去替換了[CLS]

          列表示:對于列的表示進行增強;由于每一列當(dāng)中它可能會由多個token構(gòu)成,比如說,一列的名字叫“姓名”,其可能是兩個字,這兩個字分別有兩個embeding,那么如何把這兩個embeding給它合并成一個embeding作為列的表示呢?我們可以用前面的 XLS的表示來對列的表示進行增強,具體的做法如下:

          先通過前面 XLS的表示,對這一列當(dāng)中所有的token表示進行計算attention,attention計算出來之后再加上前面 XLS表示的 embeding,這兩個之和就構(gòu)成了這一列的增強的表示。

          經(jīng)過上述步驟之后,我們就得到了問題當(dāng)中,每一個token的表示,以及表格當(dāng)中每一列的表示。

          子模型:8個子模型及對這8個子模型進行1個多任務(wù)的學(xué)習(xí)。

          前面提到,我們可以將SQL語句分割成不同的部分,然后每一部分分別進行生成,于是可以得出8個子任務(wù),分別是:

          • Select列數(shù)

          • Where列數(shù)和連接符

          • Select列

          • Select列操作

          • Where列

          • Where每列的運算

          • 值抽取

          • 值匹配

          接下來,我們對這8個子任務(wù)分別介紹一下它們的做法。

          任務(wù)一:S-num:Select中出現(xiàn)的列數(shù)。[1、2](2分類)

          首先是Select當(dāng)中出現(xiàn)的列數(shù)。對于TableQA數(shù)據(jù)集,Select當(dāng)中出現(xiàn)列數(shù)只可能是一列或者是兩列,因此我們可以當(dāng)做是一個二分類的問題:利用 XLS的 embeding做線性變換,然后過sigmoid的得到它的概率。

          任務(wù)二:w-num-op:Where中的連接符和條件數(shù)。[null-1、and-1、or-1、and-2、or-2、and-3、or-3](7分類)

          第二個任務(wù)是Where當(dāng)中出現(xiàn)的連接符和條件數(shù)。所謂“連接符”,指的是“And”還是“or”等;條件的個數(shù),指的是Where當(dāng)中所出現(xiàn)的“>”、“<”、“=”等等條件的個數(shù)。我們可以將他們分成了7個類別,“-”前面的就是連接符,“-”后面的這些就是條件的個數(shù)。當(dāng)然也可以把這兩個任務(wù)進行分開,但是如果把這兩個任務(wù)進行分開的話,效果與兩個任務(wù)一起做相比,會大打折扣。

          那么總共是有7個類型,就可以看成是7分類的問題,因此還是 XLS表示過一個線性變換,然后再經(jīng)過softmax,就可以得到這7個類別上的概率分布。

          第三個和第四個子任務(wù)是Select字句和Where字句當(dāng)中出現(xiàn)的列。我們前面已經(jīng)預(yù)測了Select當(dāng)中的例數(shù),以及Where當(dāng)中的例數(shù),那么在這一部分我們分別預(yù)測每一例所出現(xiàn)的概率即可。

          任務(wù)三:S-col:Select 中出現(xiàn)的列

          Select中出現(xiàn)的列:利用我們之前每一列得到增強的表示,經(jīng)過一個線性變換,再過一個softmax就可以得到這一列所出現(xiàn)的概率。

          任務(wù)四:W-col:Where 條件中出現(xiàn)的列

          對Where條件當(dāng)中出現(xiàn)的列:同樣,利用不同的線性變化來進行得到這一列它所出現(xiàn)的概率。

          任務(wù)五:S-col-agg:Select 中出現(xiàn)的列的操作符

          [Null, AVG, MAX, MIN, COUNT, SUM](6分類)

          第五個任務(wù)是Select當(dāng)中出現(xiàn)的這些操作符,這些操作符也被稱為是聚合操作。比如說,我們可以求這一列當(dāng)中所有數(shù)據(jù)的最大值、最小值或者求平均、求和等等。

          在TableQA當(dāng)中,5種操作符加上NULL一共是6種,我們可以將其看到是一個6分類的問題。同樣,我們對每一列的增強的表示做一個線性變換,然后再經(jīng)過softmax就可以得到每一類的概率分布。

          任務(wù)六:W-col-op:Where 條件中出現(xiàn)的列對應(yīng)的條件運算符

          [> / < / == / !=](4分類)

          對于Where條件當(dāng)中出現(xiàn)的這些運算符也是一樣。這些運算符,包括這一類大于一個數(shù)或者小于一個數(shù),或者是等于某個值,或者不等于某個值,一共是4類,我們可以看作是一個4分類的問題。做法和之前的Select當(dāng)中的運算符一致,也是給列的增強表示過一個線性映射再經(jīng)過softmax得到4類的每一類的概率分布,從中的選取最大的作為這一列的運算符。

          最后兩個子任務(wù)就是服務(wù)于條件值預(yù)測。同樣以我們前面的例子為例,“大于18歲的學(xué)生都有誰”。最后的結(jié)果應(yīng)該是Where條件當(dāng)中有一個age > 18,那么我們18應(yīng)該怎樣獲得呢?作者就問題給它拆成了兩個子任務(wù):

          任務(wù)七:從問題中抽取可能是值的短語

          使用0/1對問題中的Token進行標(biāo)記(1表示值,0表示非值),每一組連續(xù)的1標(biāo)記的token作為一個整體

          第一步就是從問題當(dāng)中抽取出有可能是值的短語。比如說“大于18歲的學(xué)生都有誰”這個問題,那么這個子任務(wù)就是把“18”從問題當(dāng)中進行抽出來。我們可以采用的方法是使用0和1對問題當(dāng)中所出現(xiàn)的token進行標(biāo)記,比如說“大于18歲都有誰”中的“18”,我們就把它標(biāo)記成1,然后其他所有的token就把它標(biāo)注上0,并對于問題當(dāng)中我們一個token的表述過一個線性變換,使用sigmoid的來預(yù)測它到底是1還是0。

          任務(wù)八:將抽取出的短語和Where中出現(xiàn)的列進行匹配

          在任務(wù)七的基礎(chǔ)上,我們需要將抽取出來的短語與where當(dāng)中所出現(xiàn)的列進行匹配。

          在前一個步驟,我們已經(jīng)把“18”給它打上1的標(biāo)簽了,因此也就生成了“18”這個token序列。它是一個可能會出現(xiàn)在某一個條件當(dāng)中的value,但是它會出現(xiàn)到哪一列之后,是這一步所要確定的事。

          將取出來的短語與Where當(dāng)中出現(xiàn)的列進行匹配,如果短語當(dāng)中它是由多個token構(gòu)成的,就把所有的token的text表示求一個平均。如下圖,此公式相當(dāng)于是對短語與where當(dāng)中出現(xiàn)的列求一個相似度,然后再過一個sigmoid。前面這個u是一個可學(xué)習(xí)的參數(shù),過一個sigmoid就可以得到短語與列是否匹配:如果匹配就把短語作為列的值,比如說18就跟age匹配了,然后我們就可以寫age> 18。

          Execution-GuidedDecoding

          我們已經(jīng)對上述8個子任務(wù)做了簡單的介紹。通過這8個子任務(wù),我們就可以得到一條SQL語句,并且保證它是符合了語法規(guī)則的。但是它所產(chǎn)生的SQL語句有可能還是不能被執(zhí)行。

          因為SQL語句的內(nèi)部可能還存在一些限制條件:

          • SELECT子句中如果出現(xiàn)string類型的列,則對應(yīng)的操作不能是’sum’, ‘min’, ‘max’

          • WHERE子句中如果出現(xiàn)string類型的列,則對應(yīng)的操作不能是‘<’, ‘>’

          • SELECT子句和WHERE子句中出現(xiàn)的列互不相同(分析數(shù)據(jù)集得知)

          在這些限制下,我們可以采用Execution-Guided Decoding的方法:在decode的過程當(dāng)中,去掉那些不能被執(zhí)行的SQL語句,比如說SQL語句執(zhí)行出來的結(jié)果是空,或者壓根就不能被執(zhí)行,從而被會報錯,這些SQL語句我們就可以直接被拋棄,而選取符合上述條件的概率最大的SQL語句。

          實驗結(jié)果

          接下來是實驗結(jié)果。

          首先簡單介紹一下其所采用的評價指標(biāo),分別是LX、X還有MX。

          LX,就是它的邏輯形式的準(zhǔn)確率。如果所生成的SQL語句和標(biāo)準(zhǔn)答案的SQL語句完全一致,那么上面這兩個操作正確;如果有一點不一樣,比如說“>”寫錯了,或者是這一列選錯了,那么這個例子即錯誤。

          X,就是它的執(zhí)行結(jié)果的準(zhǔn)確率。如果兩條SQL語句,可能它的邏輯形式不一樣(這兩個SQL可能存在一些差別),但它的執(zhí)行結(jié)果是一致的,那么也算預(yù)測正確。

          MX,是前面LX和X的一個平均。它有兩個模型,一個是單個模型,一個是集成模型(后面的Ens)。通過Ensemble對多次訓(xùn)練的結(jié)果進行集成,最終得到一個更好的結(jié)果。從圖中我們可以看到它比之前幾種模型的結(jié)果都要好。

          因為之前的模型都是基于WikiSQL進行實現(xiàn)的。我們所采用的TableQA與WikiSQL有一些不同,并且比WikiSQL要更難一些,所以之前的這些模型在TableQA對數(shù)據(jù)集上的效果并不是很好。

          子任務(wù)的性能

          下圖對8個不同的子模型的性能做了對比:

          我們可以看到在每一個子模型上,它的效果都是非常不錯的,現(xiàn)在經(jīng)過Ensemble之后就可以達到更好的效果。

          消融實驗

          在實驗的最后一部分我們做了一系列的消融實驗。

          從實驗結(jié)果我們可以看出,使用BERT-wwm-ext的版本比 BERT-base效果要好,使用XLS作為前置比CLS作為前置的效果要好。圖中更下面部分是所使用的一些值的抽取的方法,以及一些值匹配的方法,我們在下面給大家作更詳細的介紹。

          復(fù)現(xiàn)中的細節(jié)處理

          接下來,我們將介紹在復(fù)現(xiàn)過程當(dāng)中的一些細節(jié)處理。

          首先是數(shù)據(jù)預(yù)處理的部分。對于這個數(shù)據(jù)集來說,它的數(shù)據(jù)是不太規(guī)范的,有可能會出現(xiàn)以下情況(括號中表示歧義部分):

          • 數(shù)字:哪些城市上一周成交一手房超十五萬平?(十五,15)

          • 年份:你知道10年的土地成交面積嗎?(10年,2010)

          • 單位:哪些城市最近一周新盤庫存超過5萬套?(5萬,50000)

          • 日期:哪個公司于18年12月28號成立?( 18年12月28號,2018/12/28 )

          • 同義:你能幫我算算芒果這些劇的播放量之和是多少嗎?(芒果,芒果TV)

          前面幾個問題,可以直接按照一定的規(guī)則來進行轉(zhuǎn)換;而后面這些可以通過到數(shù)據(jù)庫當(dāng)中去找相關(guān)的品類詞做一個替換。

          值的抽取

          在“值抽取”這一部分的,我們嘗試了很多種方法,比如說bert+crf的方法,bert+bilstm+crf,以及bert+半指針的方法。最終所采用的還是0/1標(biāo)記的方法,因為它的效果是最好的。

          • bert + crf,val_acc: 0.8785

          • bert + bilstm + crf,val_acc: 0.8801

          • bert + 半指針,val_acc: 0.8891

          • bert + 0/1 標(biāo)記,val_acc: 0.8922

          0/1的方式是如何實現(xiàn)的呢?我們以問題是“青秀南城百貨有限公司在哪?”為例來詳細講解一下。

          query:青秀南城百貨有限公司在哪?

          bert_tokenizer:[‘[XLS]’, ‘青’, ‘秀’, ‘南’, ‘城’, ‘百’, ‘貨’, ‘有’, ‘限’, ‘公’, ‘司’, ‘在’, ‘哪’, ‘?’, ‘[SEP]’]

          value:青秀南城百貨有限公司

          tag:[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]

          首先對此問題進行Tokenizer,然后得到token序列,如果值“青秀南城百貨有限公司”出現(xiàn)在SQL語句中,就把這些token給標(biāo)記成1;對于其他的沒有在SQL語句當(dāng)中出現(xiàn)的,就標(biāo)記成0。

          細節(jié)處理

          Value檢索

          由于在value抽取的時候,抽取出來的value可能不太規(guī)范,或者是問題當(dāng)中和數(shù)據(jù)庫當(dāng)中出現(xiàn)的不太一致。比如說下圖中的“人人”與“人人網(wǎng)”:

          Query1:人人周漲跌幅是多少?

          Value:人人

          在這種情況下,我們就需要將 value與 SQL這一列當(dāng)中出現(xiàn)的所有的值做一個檢索,選出與之最接近的一個詞作為最終的 value。那么如果檢索,我們可以選的方法也很多,比如說rouge-L的匹配方式,以及幾種機器學(xué)習(xí)的方法:邏輯回歸、SVR以及貝葉斯。通過效果對比,我們可以發(fā)現(xiàn),邏輯回歸是最好的方式,其準(zhǔn)確度是97%。

          Table-Column 信息增強:

          最后一部分,使用表的內(nèi)容來對列的表示進行增強。

          如上圖,比如說地區(qū)這一類,從中隨機選取一個列值,比如說“廣西”,我們這一列就表示成“地區(qū), 廣西”這一個整體就作為這一列的一個表示,并把它送到input端,然后再進一步的獲得列的表示。通過這種方式對于列進行增強,最終可以獲得0.4的效果提升。

          復(fù)現(xiàn)中的問題及建議

          1、數(shù)據(jù)集不規(guī)范,建議抽取選取部分規(guī)范的數(shù)據(jù)進行訓(xùn)練和預(yù)測;

          2、不要從0開始復(fù)現(xiàn),可以基于現(xiàn)有的模型,參考現(xiàn)有的代碼。

          M-SQL:一種將自然語言轉(zhuǎn)換為SQL語句的多任務(wù)表示學(xué)習(xí)方法


          作者:華為云開發(fā)者社區(qū)
          鏈接:https://juejin.cn/post/7011012823861952548
          來源:掘金
          著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。



          瀏覽 46
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲足交视频 | 精品三级久久久 | 蜜av在线| 亚洲精品久久久久久久久久久久久 | 波多野结衣被干 |