美文网首页
2020-03-06

2020-03-06

作者: 一个迷人的昵称 | 来源:发表于2020-03-06 15:08 被阅读0次
06a1e703ec6479ace979905b4fc3af0d19d5f6cf8c117a7e323e0e0771bcbf32.jpg

test

模型结构

  1. sequence encoder
  2. context enhanced schema encoder
  3. output layer

1. sequence encoder

使用了一个类Bert的模型,有以下改变:

  1. 在每个表结构中添加一个空列[EMPTY],这个空列会在`§{2.4}`节被清除
  2. 用type embedding替换segment embedding,这里会从四个类学习embedding:
  3. question
  4. categorial列
  5. numerical 列
  6. special empty 列
  7. 使用MT-DNN作为初始化encoder(与Bert结构类似,但是是由多个GLUE任务训练得到的,在下游NLP任务中展现了不错的表示性能)

将Bert的[CLS]重命名为[CTX](目的:注重当前捕获到的上下文信息,而非为了下游任务作表示)

为了实现以上的变化,对比SQLova中的NL2SQL layer,我们的方法主要是用了一个足够简单但是有效的layer

2. context enhanced schema encoder

`h_{[CTX]}, h_{q1}, ......, h_{qn}, h_{[SEP]}, h_{C_{11}}, ......, h_{[SEP]}, h_{C_{21}}, ...h_{[SEP]}, ..., h_{[EMPTY]}, h_{[SEP]}`表示Encoder的输出,每个均是d维

  • 每个question token被编为`h_{qi}`
  • `h_{C_{ij}}`表示第`i`列的第`j`个token

故 这个Encoder的目的是:对每一列`i`学习一个新的表示`h_{C_i}`,通过使用`h_{[CTX]}`来捕捉全局上下文信息来增强原始编码器的输出。

因此,`h_{C_i}`可以表示为:

<div align="center">

`h_{C_i}=\sum_{t=1}^{n_i}\alpha_{it}·h_{C_{it}}`······(1)

</div>

其中:

  • `n_i`表示列`i`中token数
  • `\alpha_{it}=softmax(S_{it})`
  • `S_{it}`表示第`i`列的第`t`个token捕捉全局上下文信息的好坏,`S_{it}=f(U·h_{[CTX]}/\sqrt{d}, V·h_{[C_{it}]}/\sqrt{d}),{U,V}\in{R^{m\times{d}}}`

3. output layer

output layer结合了SQL程序以及:

  1. sequence encoder 输出, `h_{[CTX]}, h_{q1}, ..., h_{qn}`
  2. context enhanced schema encoder 输出,`h_{C_1}, h_{C_2}, ..., h_{[EMPTY]}`

这个output layer类似于Xu et al.(2017)Hwang et al.(2019),该任务被划分为6个子任务,每一部分均是最终SQL pragram的一部分。

首先介绍一个使用`h_{[CTX]}`基于sub-network调整schema representation `h_{C_i}`的任务,特别是:

<center> rC_i=LayerNorm(U'·h_{[CTX]} + V'·h_{C_i}) ······(2) </center>

与公式(1)不同的是,对于每个子任务这个计算式分别进行的,以便于schema representation更好的对齐每个子任务应重点关注的自然语言query的特定部分。

(注:这个`rC_i`在另一篇论文中提到,虽然`h_{C_i}`已经通过token权重加强了上下文信息,但是`h_{[CTX]}`对query也有不错的~)

任务S-COL

预测SELECT列,那么给SELECT选择的列`C_i`即为:

<div align="center">

`P^{S-COL}(C_i)=Softmax(W^{S-COL}·rC_i)`

</div>

其中S-COL仅依赖于`rC_i`

任务S-AGG

对列预测Aggregator,为了增强aggregator依赖被选择列的类别(例如MIN不会用于string类型的列),我们明确地利用了type embedding,则选择的AGG可以表示为:

<div align="center">

`p^{S-AGG}(A_j|C_i)=Softmax(W^{S-AGG}{[j, :]\times LayerNorm(U''·h_{[CTX]} + V''·h_{C_i} + E^T_{C_i})}`····(3)

</div>

其中,`W^{S-AGG}\in{R^{6\times d}}`

与其他子任务不同的是,这里我们没有使用`rC_i`而是使用了`h_{C_i}`,因为我们使用了一个类似于公式(2)的方法来合并列的类别,type embedding`E^T_{C_i}`是由sequence encoder单独学来的。

<div align="center">

以下四个任务是围绕WHERE同时得到的

</div>

任务W-NUM

W-NUM使用`W^{W-NUM}·h_{[CTX]}`来计算WHERE的条数,被建模为四个可能标签的分类任务,每个标签代表最终SQL语句中的1~4个where子句。不过这没法预测where子句为空的情况,这种情况会通过KL散度交给W-COL来完成。

任务W-COL

<div align="center">

`p^{W-COL}(C_i)=Softmax(W^{W-COL}·rC_i`

</div>

(注:`p^{W-COL}`是一个分布,基于W-NUM,得到where选择的top score列)

任务W-OP

W-OP对于给定的where列选择合适的操作符,即:

<div align="center">

`p^{W-OP}(O_j|C_i)=Softmax(W^{W-OP}·[j, :]·rC_i)`

</div>

这个操作符也依赖于列的类别(text/real),能够类似于公式(3)的S-AGG进行建模。

任务W-VAL

W-VAL是从query中预测where语句的子串,因此转化为预测子串在query的起始和终止位置,即:

<div align="center">

`p^{W-VAL}_{start}(q_j|C_i)=Softmax g(U^{start}·h_{q_j} + V^{start}·rC_i)`

`p^{W-VAL}_{end}(q_j|C_i)=Softmax g(U^{end}·h_{q_j} + V^{end}·rC_i)`

</div>

其中`g(x):=W·x+b`

相关文章

网友评论

      本文标题:2020-03-06

      本文链接:https://www.haomeiwen.com/subject/rlpirhtx.html