Text2SQL學習整理(四)將預訓練語言模型引入WikiSQL任務
highlight: tomorrow theme: Chinese-red
「這是我參與2022首次更文挑戰的第4天,活動詳情查看:2022首次更文挑戰」。
導語
上篇博客:Text2SQL學習整理(三):SQLNet與TypeSQL模型簡要介紹了WikiSQL數據集提出後兩個早期的baseline,那時候像BERT之類的預訓練語言模型還未在各種NLP任務中廣泛應用,因而作者基本都是使用Bi-LSTM作為基本組件搭建模型。
本篇博客將介紹兩個藉助預訓練語言模型BERT來解決WIkiSQL數據集挑戰的方法:SQLOVA和X-SQL模型。其中,SQLOVA這篇工作更是發表在了2019年的NIPS上,可以看出這個任務被越來越多人所關注。
A Comprehensive Exploration on WikiSQL with Table-AwareWord Contextualization
創新點
SQLOVA工作的創新點有兩個: 1. 藉助預訓練模型,達到人類表現; 2. 給出了WikiSQL數據集上的人類表現。
模型架構
整個框架包含兩個部分: + Table-aware Encoding Layer,用於獲取表和上下文感知的question word表示; + NL2SQL Layer,用於從編碼表示生成SQL查詢。
輸入模塊
上圖為一個WikiSQL數據集中的問題-SQL示例。表格的schema(即圖中的表名、列名等)是一種結構性信息,而在利用BERT之類的預訓練模型時,需要將所有輸入全部轉為一個序列。SQLOVA的轉換方式如下:
可以看到,序列的開始部分是query(也即用户的自然語言問句Question),之後是數據庫的各個列的名字。因為WIkiSQL是單表的數據庫,所以不需要編碼表名。在序列化過程中,SQLOVA利用了BERT中的[CLS]、[SEP]等特殊token作為分隔符。
如上圖所示,輸入Table-aware Encoding Layer將自然語言查詢與整個表的所有header放在一起進行編碼,用來表示問題與表兩者信息之間存在交互。
NL2SQL模塊
與之前的SQLNet類似,SQLOVA在生成SQL語句時採用slot filling的思想,還是分別用6個子模塊來生成SQL語句的各個部分。
NL2SQL層的6個子模塊不共享參數、代替使用pointer network推斷Where_val,這裏訓練一個模塊來推斷start和end、where_val不僅依賴於where_col還依賴於where_op(比如text的類型不存在>或<)、當要結合question和header時,採用的是拼接操作而不是求和操作。
Execution-guided decoding
SQLOVA使用了Execution-guided decoding技術,以減少不可執行的query語句。
所謂Execution-guided decoding就是在輸出返回結果時對檢查生成的SQL序列是否是一條語法正確的SQL語句,使模型最終輸出的SQL語句一定是可以無語法錯誤執行的。它是通過將候選列表中的SQL查詢按順序提供給執行器來執行的,並丟棄那些執行失敗或返回空結果的查詢。該技術可以參考論文Robust Text-to-SQL Generation with Execution-Guided Decoding.
實驗結果
文章還給出了human的performance,從結果來看,SQLova已超過了人類表現。
Ablation Study
同時,文章還進行了充分的消融實驗以檢驗各個模塊的有效性。可以看出,預訓練模型BERT的引入對結果有很大提升。即使用詞語的上下文對logical form的acc有很大貢獻。
X-SQL: reinforce schema representation with context
創新點
X-SQL也是利用預訓練語言模型的方法。它使用BERT風格預訓練模型的上下文輸出來增強結構化schema表示,並在下游任務中與類型信息一起學習一個新的schema表示。同時,這裏不再使用BERT,而是使用MT-DNN(Multi-Task Deep Neural Networks for Natural Language Understanding一種多任務學習出來的語言模型,詳見https://fyubang.com/2019/05/23/mt-dnn/)預訓練模型。
模型架構
模型的整體架構如上圖所示。
模型包括三個部分:
- 序列編碼器:
- 上下文增強的schema編碼器
- 輸出層
序列編碼器
序列編碼器部分類似BERT,但主要改動如下: 1. 給每個表增加了一個特殊的空列[EMPTY]; 2. 將segment embedding替換為type embeding,包括問題、類別列、數字列、特殊空列,共4種類型; 3. 採用MT-DNN而不是BERT-Large來初始化。
上下文增強的schema編碼器:
該模塊根據表格每列的tokens的編碼來得到相應列的表示hCi,利用attention。將每個列名對應的多個token輸出的向量聚合並且在混入[CTX] token中的信息。
輸出層
採用與之前同樣的做法,最終輸出時將任務分解為6個子任務,每個均採用更簡單的結構,採用LayerNorm,輸入為schema的表示hCi和上下文表示hCTX。
結果
通過這些改進,X-SQL將性能表現提升至90%以上,超過了SQLOVA。
總結
本文介紹了兩個藉助預訓練語言模型BERT(MT-DNN)來表示schem和Question之間上下文關係表示的方法,通過預訓練語言模型強大的表示能力,模型第一次在數據集上的表現超越了人類。足以見證當今NLP技術發展之迅速。
- GPT、GPT-2和GPT-3概覽
- Text2SQL學習整理(四)將預訓練語言模型引入WikiSQL任務
- MySQL-系統庫講解
- NLP實戰高手課學習筆記(3):NLP基本任務及研究方向
- KBQA數據集整理(一):LC-QuAD 2.0
- 幻方螢火AI算力平台使用筆記(4):hfai workspace命令詳解
- 幻方螢火AI算力平台使用筆記(3):Workspace功能淺試——Resnet-50訓練示例
- 幻方螢火AI算力平台使用筆記(1):MacOS下的客户端安裝與管理平台概覽
- RocketMQ存儲層原理
- RocketMq-批量消息和消息過濾
- RocketMQ-存儲設計
- CS224N學習筆記(二)詞向量和詞含義
- T5模型中的位置編碼
- Text-to-SQL學習整理(二十一)Tree-SQL模型
- Text-to-SQL學習整理(二十)STRUG模型
- 論文筆記:Ordered Neurons: Integrating Tree Structures into Recurrent Neural Networks
- 莫凡Pytorch教程(六):Pytorch中的mini-batch和優化器
- 莫凡Pytorch教程(五):Pytorch模型保存與提取
- Mysql-詳解髒讀、不可重複讀、幻讀
- Mysql-MVCC多版本併發控制詳解