资讯动态

SQLova架构详解(一):BERT如何构建表格感知的词嵌入?wemb_n与wemb_h原理剖析

发布时间:2026/8/23 13:38:18 来源:尧图企业网站定制
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% 执行准确率。本文将带你从零拆解这两个向量的生成原理。NL2SQL 任务是什么SQLova 的目标与成绩 SQLova 要解决的问题可以概括为一句话给定一张数据表和一个自然语言问题生成能查出正确答案的 SQL。比如针对下面这张球员表问 Which player has a back number of 31?模型需要产出SELECT player WHERE no 31执行后得到高亮行的 Shawn Respect这个截图来自项目自带的人工评测见 human_eval/README.md246 名众包工人的执行准确率约为88.3%而 SQLova开启执行引导解码达到91.0%已经追平甚至超过人类表现。核心结果如下模型测试集逻辑形式准确率测试集执行准确率SQLova80.7%86.2%SQLova-EG执行引导解码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 ────┘拼接时有三个关键细节两级分词问题先由 CoreNLP 分好词再经 BERT 的 WordPiece 切分成子词见 bert/tokenization.py并用t_to_tt_idx/tt_to_t_idx双向索引记录原始词 ↔ 子词的映射方便训练标签对齐。段标记segment id问题部分记 0列名部分记 1让 BERT 区分两种来源。截断与补齐序列统一补零到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记录的区间切出问题对应的子词段丢掉[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 任务。快速上手一键训练命令与文件导览 按 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训练过程中每当开发集逻辑形式准确率刷新会自动保存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 主干六大子模块的注意力机制以及执行引导解码Execution-Guided Decoding如何再榨出 3% 的精度。【免费下载链接】sqlova项目地址: https://gitcode.com/gh_mirrors/sq/sqlova创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价