:BERT如何構建表格感知的詞嵌入?wemb_n與wemb_h原理剖析)
SQLova架構詳解一BERT如何構建表格感知的詞嵌入wemb_n與wemb_h原理剖析【免費下載鏈接】sqlova項目地址: https://gitcode.com/gh_mirrors/sq/sqlovaSQLova 是一個將自然語言問題翻譯為 SQL 查詢的 NL2SQL 語義解析器它的核心亮點是用 BERT 構建表格感知的詞嵌入table-aware word-embedding把問題和表頭放進同一條序列讓 BERT 互相看見再從中拆出wemb_n問題向量與wemb_h表頭向量。最終在 WikiSQL 測試集上達到 83.6% 邏輯形式準確率與 89.6% 執(zhí)行準確率。本文將帶你從零拆解這兩個向量的生成原理。NL2SQL 任務是什么SQLova 的目標與成績 SQLova 要解決的問題可以概括為一句話給定一張數據表和一個自然語言問題生成能查出正確答案的 SQL。比如針對下面這張球員表問 Which player has a back number of 31?模型需要產出SELECT player WHERE no 31執(zhí)行后得到高亮行的 Shawn Respect這個截圖來自項目自帶的人工評測見 human_eval/README.md246 名眾包工人的執(zhí)行準確率約為88.3%而 SQLova開啟執(zhí)行引導解碼達到91.0%已經追平甚至超過人類表現。核心結果如下模型測試集邏輯形式準確率測試集執(zhí)行準確率SQLova80.7%86.2%SQLova-EG執(zhí)行引導解碼83.6%89.6%第一步把問題 表頭拼進同一條 BERT 輸入序列 表格感知的第一步是把問題文本和所有列名拼接成一條 BERT 序列格式如下代碼見 generate_inputs()[CLS] what is the player name with score 15 [SEP] player [SEP] score [SEP] └──── 問題segment id 0 ────┘ └──── 列名segment id 1 ────┘拼接時有三個關鍵細節(jié)兩級分詞問題先由 CoreNLP 分好詞再經 BERT 的 WordPiece 切分成子詞見 bert/tokenization.py并用t_to_tt_idx/tt_to_t_idx雙向索引記錄原始詞 ? 子詞的映射方便訓練標簽對齊。段標記segment id問題部分記 0列名部分記 1讓 BERT 區(qū)分兩種來源。截斷與補齊序列統一補零到max_seq_length默認 222超過則截斷。正因為問題和列名在同一條序列里BERT 的自注意力會讓問題中的詞與列名直接交互——這就是表格感知的來源。wemb_n 原理問題詞元的上下文嵌入 BERT 前向傳播后返回全部 12 層的逐詞輸出all_encoder_layerget_bert_output()。wemb_n的構造在 get_wemb_n()取最后num_target_layers層默認 2 層越靠近頂層語義越充分用i_nlu記錄的區(qū)間切出問題對應的子詞段丟掉[CLS]和列名部分把 2 層輸出在向量維度上橫向拼接。于是得到問題嵌入wemb_n形狀為[B, l_n, 768×2]即每個問題詞元一個 1536 維上下文向量。訓練入口里也印證了這一點下游模塊的輸入維度被定義為iS bert_config.hidden_size * num_target_layerstrain.py。wemb_h 原理表頭列名向量的構造 列名的處理稍反直覺get_wemb_h() 把批次里所有表的所有列攤平成一個虛擬批次每一列當作一條獨立序列用i_hds記錄的每個列名的起止下標切出對應的 BERT 輸出同樣取最后 2 層拼接得到wemb_h形狀[B×hs, l_hpu, 1536]hs是列數l_hpu是該列的 WordPiece 長度同時返回l_hs每表列數與l_hpu每列長度供下游 LSTM 做池化。這樣下游模塊可以把一批表的 N 個列當成 N 條短序列統一編碼實現變長列數的批處理。wemb_n與wemb_h的總裝函數是 get_wemb_bert()。為什么表格感知帶來精度提升傳統做法往往給問題和表結構各用一個獨立的詞嵌入模型兩邊信息互不相通。SQLova 的做法則讓它們在 BERT 內部就完成交互問題里的 score 與列名 score 在注意力矩陣中直接關聯問題詞元的最終向量已經見過列名反過來列名向量也融合了問題語境選列/選值時歧義更少。得到的wemb_n、wemb_h隨后喂給 Seq2SQL 主干 Seq2SQL_v1由六個子模塊分工協作SCP/SAP 負責 SELECT 列與聚合函數WNP/WCP/WOP/WVP_se 負責 WHERE 的條件數、列、比較符與值的位置。每個模塊都用雙向 LSTM 分別編碼問題與表頭再通過注意力機制做跨結構對齊。訓練時 BERT 以 1e-5 的小學習率聯合微調--fine_tune讓嵌入進一步適配 NL2SQL 任務??焖偕鲜忠绘I訓練命令與文件導覽 按 README.md 說明訓練只需一條命令python3 train.py --seed 1 --bS 16 --accumulate_gradients 2 \ --bert_type_abb uS --fine_tune \ --lr 0.001 --lr_bert 0.00001 --max_seq_leng 222訓練過程中每當開發(fā)集邏輯形式準確率刷新會自動保存model_best.ptSeq2SQL 模塊、model_bert_best.ptBERT 模塊與results_dev.jsonl。關鍵文件導覽主干模型與六個子模塊sqlova/model/nl2sql/wikisql_models.py詞嵌入構造與數據工具sqlova/utils/utils_wikisql.py訓練與推理入口train.py、predict.py官方評測腳本evaluate_ws.pyBERT 模型實現與分詞器bert/modeling.py、bert/tokenization.py下期預告SQLova 架構詳解二將深入 Seq2SQL 主干六大子模塊的注意力機制以及執(zhí)行引導解碼Execution-Guided Decoding如何再榨出 3% 的精度?!久赓M下載鏈接】sqlova項目地址: https://gitcode.com/gh_mirrors/sq/sqlova創(chuàng)作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考