0%

Language to Logical Form with Neural Attention

论文概要

论文地址,发表于 2016 年。

语义分析的目的是将自然语言映射到机器可解释的有意义表示。传统的方法依赖于高质量的词汇、人工构建的模板以及特定领域或特定表示的语言特征,本文提出了一种注意力增强的 encoder-decoder 通用模型。将输入的话表示为向量形式,并通过调节输出序列或者树生成逻辑形式(总结来说,就是将话语转为逻辑形式,详情请看图 1)。 下图将一句话转为了逻辑形式,不同于以前的方法,它是通过神经网络生成的,而以前的方法依赖于手写的规则。图片取自 Tang and Mooney200语句转为逻辑形式

基于 RNN 的 encoder-decoder 已成功应用于各种 NLP 任务,图 1 中使用了 LSTM,我们的做法是提出了两个变体模型。第一个模型将语义解析视为普通的序列转换任务,第二个模型配备了层次树解码器,该解码器明确地捕获逻辑形式的组合结构。我们还引入了注意力机制,并提出一个识别步骤来识别很少提到的实体数字。 对四个数据集的实验结果表明,我们的方法在不使用人工设计特征的情况下具有竞争力,并且易于迁移。 我们的工作综合了两种标准研究,即语义分析encoder-decoder 架构的神经网络

相关工作

学习语义解析器的问题引起了广泛的关注,可以追溯到 Woods(1973年)。。。。

任务定义

我们的目标是学习一个模型,将自然语言输入 \(q = x_1 \dots x_{|q|}\) 映射为其含义的逻辑形式(logical form)表示 \(a = y_1 \dots y_{|a|}\)。条件概率被分解为: \[ \begin{align} p(a|q) & = \prod^{|a|}_{t=1} p(y_t|y_{<t},q) \tag 1\\ y_{<t} & = y_1 \dots y_{t-1} \end{align} \] 我们的模型包含一个编码器和一个解码器,编码器负责将输入的自然语言 q 编码成向量,解码器负责生成 \(y_1 \dots y_{|a|}\)。下面将仔细描述。

Seq2Seq

对于普通的 Seq2Seq 任务,使用 LSTM 来计算,如下图所示。\(h^l_t\) 代表第 l 层的第 t 个时间步的隐藏层,公式为: \[ \begin{align} h^l_t = \text{LSTM}(h^l_{t-1},h^{l-1}_t) \tag 2 \end{align} \] Seq2Seq 在实验中,遵循 Zaremba et al. 2015 提出的架构。不过,使用其他类型的门控激活函数也是可以的(例如Cho et al. 2014)。对于 encoder\(h^0_t = W_qe(x_t)\)(注:此公式是第 0 层的运算步骤,即输入层)是 RNN 中输入的词向量,\(W_q \in \mathbb{R}^{n \times |V_q|}\) 代表输入层的权重值矩阵,e(·) 代表对应 token 的索引。对于 decoder\(h^0_t = W_ae(y_{t-1})\) 代表前一个预测词的词向量,其中 \(W_a \in \mathbb{R}^{n \times |V_a|}\)。接下来,最后的 LSTM \(h^L_t\) 被用于预测 \(t\)-th 输出 token,计算公式为: \[ \begin{align} p(y_t|y_t,q) = softmax(W_oh^L_t)^T e(y_t) \tag 3 \end{align} \] 该公式用于预测每一个 token。另外补充一点,增加了 “start-of-sequence” <s> 和 “end-of-sequence” </s>。 该模型总的来说,就是 LSTM 的计算方法,也没什么好说的。

Seq2Tree

Seq2Seq 模型有一个缺点就是它忽略了逻辑形式的层次结构。所以,要改良的话,它需要记住各种辅助信息(比如括号对),以此生成格式良好的输出。如下图 3 所示,是一个层次树 decoder: Seq2Tree模型

Seq2Tree 与 Seq2Seq 的编码器类似,不同的是解码器。Seq2Tree 以自上而下的方式生成逻辑,为了定义树结构,我们定义了一个表示子树的 “nonterminal” <n> 标记。如图 3 所示,将逻辑形式 “lambda $0 e (and (>(departure_time $0) 1600:ti) (from $0 dallas:ci))”预处理为树,方法是用 nonterminal 替换括号对之间的标记(token)。特殊记号 <s><(> 分别表示序列和 nonterminal 序列的开头(由于缺少空间,图3中省略了),记号 </s> 代表序列结束。具体步骤是: 1. 编码输入值 q; 2. 层次树解码器使用 RNN 在逻辑形式 a(在任务定义中已经说明了 q 和 a 的含义)的对应部分的子树中生成 tokens(注意这里的 token 带了 s); 3. 如果预测的 token 为 <n>,则通过调节 nonterminal 的隐藏向量来解码序列。(博主注:举个例子理解一下:看图 3 的第一层,先是使用 encoder 进行编码,接着开始对逻辑形式进行解码,逻辑形式就是上面的斜体部分。接下来预测到了 token<n> 于是调用 nonterminal 的隐藏向量来进行解码,即生成一棵子树。以此类推,碰到 toekn <n> 就开始解码) 4. 与 Seq2Seq 解码器不同,当前的隐藏状态不仅仅取决于上一个时间步,为了更好地利用 parent nonterminal 的信息,我们引入了一个 parent-feeding 的连接,其中 parent nonterminal 的隐藏向量与输入连接(concatenated)并喂入 LSTM。

再举个例子帮助理解一下,如图 4 所示。逻辑形式为 A B (C),其中 \(y_1 \dots y_6\) 代表不同的时间步,(C) 对应子树。解码一共有两个步骤:一旦输入值 q 被编码,首先在深度为 1 处生成 \(y_1 \dots y_4\),直到 token </s> 被预测到;接下来通过调节 nonterminal \(t_3\) 的隐藏向量来生成 \(y_5, y_6\)\(p(a|q)\) 的概率是这两个序列解码步骤的乘积: \[ p(a|q) = p(y_1 y_2 y_3 y_4 | q) p(y_5 y_6 | y_{\leq 3},q) \] 一个简单的Seq2Tree的例子

Attention 机制

Attention 的原理

训练模型

我们的目标是最大化由自然语言语句作为输入时产生的逻辑形式的可能性,所以目标函数为: \[ \text{minimize} - \sum_{(q,a) \in D} logp(a|q) \] 其中 \(D\) 是所有自然语言逻辑形式训练对的集合,\(p(a|q)\) 按式(1)计算。采用 RMSProp 算法解决了这一非凸优化问题。此外,使用 Dropout 进行正则化。

推论

暂时略。

参数识别

大多数的语义分析数据集都是为问答开发的。在经典的系统中,问题被映射乘逻辑形式,并在知识库中获取答案。由于问答任务的性质,许多自然语言的语句都包含实体或数字,它们通常被解析为逻辑形式的参数。其中不可避免地会有一些罕见或者根本不会出现在数据集中的实体或数字(对于小规模数据集尤其如此)。传统的序列编码器只是简单地用一个特殊的位置单词符号替换稀有单词(Luong et al. 2015a; Jean et al. 2015),这对语义分析是有害的。 为此开发了一个简单的参数识别程序。具体来说就是在输入的问题中标识实体和数字,并用它们的类型唯一 id 替换它们。例如,将训练样本“jobs with a salary of 40000”及其逻辑形式“job(ANS), salary_greater_than(ANS,40000, year)”预处理为“jobs with a salary of \(num_0\)”和“job(ANS), salary_greater_than(ANS,\(num_0\),year)”。一旦解码完毕,后处理步骤就会将所有标记 \(type_i\) 恢复到它们以前的实体或数字。

实验

我们将我们的方法在四个数据集上分别与以前的多个系统进行比较,下面将描述这些数据集。代码可在此处获得https://github.com/donglixp/lang2logic(lua 版,官方),https://github.com/Alex-Fabbri/lang2logic-PyTorch(python 版,非官方)。

数据集

JOBS 工作 GEO Geoquery data ATIS Airline Travel Information System(航空旅行信息系统) IFTTT if this then that(地址 百度百科介绍),Quirk et al.2015 从 IFTTT 网站提取大量的 if-this-then-that 来创建此数据库 数据集介绍

设置

自然语言语句是小写的,并且使用基于维基百科的常见拼写错误列表来纠正拼写错误。使用 NLTK 来限制词汇([Bird et al.2009] Natural Language Processing with Python. O’Reilly Media.),对于 IFTTT 过滤了在训练集中出现少于五次的 token,channels 和 functions。对于其他数据集,过滤了在训练集中至少两次没有出现的输入词,但保留了逻辑形式中的所有 token。并且使用了参数识别,当然也可以使用更复杂的办法。 超参数在 JOBS 和 GEO 上使用了交叉验证,使用了 ATIS 和 IFTTT 作为标准开发集(就是验证集,不同的叫法而已 development/validation)。 - RMSProp:batch size = 20;parameter = 0.95; - 梯度修剪为 5 以缓解梯度爆炸(Pascanu et al.2013); - 参数从均匀分布 \(U(-0.08, 0.08)\) 中随机初始化; - 两层 LSTM 用于 IFTTT,单层 LSTM 用于其他数据集; - dropout \(\in\) {0.2,0.3,0.4,0.5}; - 隐藏向量和词嵌入维度从 {150, 200, 250} 选择; - early stopping; - 输入句子在进入编码器之前被反转(Sutskever et al.2014); - 贪婪搜索生成逻辑形式; - softmax 用于分类。

结果

Attention 机制可以提高性能,对于小数据集参数识别至关重要。

错误分析

数据格式

论文使用 Logical Form 对基准数据集做实验,数据集包括 Geo880 和 Jobs640,论文中使用的是 Logical Form 的其中一种表示——PCCG,它是 CCG 的改进版。他们将数据集分割为训练集和测试集,Language to Logical Form with Neural Attention 沿用了此分割方式(比如说将 GEO 分割为 680 个训练样本,200 个测试样本),并且采用此论文的思想,即:将自然语言映射为 Logical Form。 虽然 PCCG 的 Logical Form 效果不错,但是作者没有使用他,而是使用了 lambda-caculus作者将 Geo880 等数据集改写为了 lambda-calculus 的形式此处可找到全部数据,但是这里面的格式不是 lambda-calculus。我有点搞不懂他提供的数据到底是什么意思19.09.16 补充:经过多方查找,终于找到了 geo880 最初的论文,在此处找到的。GEO880 最初版本并不是 lambda calculus。 作者将数据改写为 lambda-calcullus 形式是我估计的。因为全文找不到数据的来源,格式转换的说明也找不到。只是在 Section 4.1 Datasets 中说到: > GEO 有 880 个示例,将其分割为 680 个训练样本以及 200 个测试样本(Zettlemoyer and Collins, 2005), 我们使用了基于 lambda-calculus 的具有相同含义的表示

所以我推测作者应该是将原本的 PCCG 表示的 GEO 改成了 lambda-calculus 表示。 论文是作者对 Language to Logical Form with Neural Attention 的改进版。