原文链接:

Recurrent Neural Network Grammars

论文地址:Recurrent Neural Network Grammars

代码地址: github

今天要介绍的这篇论文是来自NAACL16的Recurrent Neural Network Grammars,主要贡献点就是提出了一种新的文法RNNG,不同于传统的PCFG之类的文法,RNNG使用RNN来对句子和它的句法树的联合概率进行建模,因此它是一个生成模型。但是稍稍修改就可以改为判别模型,也就是大家熟悉的基于转移的成分句法分析系统,并且转移系统是采用top-down方法的,也就是利用了句法树的前序遍历。

RNNG在语言模型任务上取得了当时的state-of-the-art结果,成分句法分析任务上,生成模型取得了媲美最好结果的F1值,而判别模型就差了点。本文最大的贡献点就是提出了生成式模型RNNG,说明了在数据量不是很大的时候,利用生成式模型可以提高成分句法分析的准确率。

摘要

RNN在语言模型和其他许多NLP任务上面都已经取得了非常不错的效果,但是RNN只能捕捉到句子的序列特征,例如句子的句法结构等递归嵌套的结构信息无法用RNN捕捉到。

因此本文提出了一种利用RNN建模出来的全新文法RNNG,建立在句子的句法结构之上,消除了PCFG的上下文无关假设。并提出了两种变体,一种是生成模型,可以用来句法分析和训练语言模型,另一种是判别模型,可以用来句法分析。

RNNG建立在top-down转移系统之上,top-down转移系统相比于bottom-up转移系统有一个好处,就是不需要二叉化,因为如果bottom-up转移系统不二叉化的话,REDUCE的状态就会有很多种可能,不知道到底归约栈里的几个结点。而top-down转移系统就不存在这个问题,直接归约到第一个父结点为止就行了。本文应该也是第一个提出用RNN来实现top-down转移系统的,之前的方法都是用top-down的文法,或者是bottom-up的,例如Sochar2013的CVG,也是用二叉化后的RNN学习结点的语义表示。

RNN文法

RNNG定义为三元组 ,其中 是非终结符集合, 是终结符集合,并且 就是神经网络的参数集合。RNNG和传统的PCFG的一个明显区别就是它没有显式地指出语法规则是什么,而是蕴含在了神经网络中,在句法转移的时候动态的生成。

Top-down句法分析和生成

这部分主要介绍RNNG的两个变体,一个是top-down的句法分析系统,还有一个是稍稍修改后的生成系统。

判别式系统

这个判别式模型之前也已经介绍过很多次了,和普通的基于转移的句法分析系统一样,输入是一个句子 ,输出是它的句法分析树 。主要组成部分有句法树栈、句子单词buffer、动作集合,每一步的动作有三种:

  • NT(X): 将一个父结点X移进栈里。
  • SHIFT: 从buffer中移一个单词到栈里。
  • REDUCE: 将栈顶的若干个结点归约为它们的父结点,并且出栈。

图1就是每个动作的状态变化过程,图2是判别式模型进行句法分析的示例:

当然得给动作添加一些限制,首先记当前状态为三元组 ,分别表示buffer、栈、当前栈里未归约的父结点数量,这个之前的博客没有提及过:

  • NT(X)动作只有当buffer不为空并且 的时候才能进行。因为buffer空了的话就没有单词了,此时不可能移进新的非终结符了,并且要限制 防止一元产生式无限生成下去。
  • SHIFT动作只有当buffer不为空并且 时才能进行。前者不用解释了,后者的话因为是top-down的,所以栈里至少要有一个父结点才能移进新的单词。
  • REDUCE只有当栈顶不是没有归约的父结点才能进行。
  • REDUCE只有当 或者buffer为空时才能进行。这里要解释一下为什么 ,因为如果buffer不为空同时 ,那么这时候如果REDUCE的话,栈里就只剩一个非终结符了,只可能是根节点S,而buffer里还有单词,所以这是不可能的。

记当前状态的可能动作集合为

生成式系统

将上面的top-down转移系统稍稍修改即可得到生成式系统。区别有两点:

  • 首先没有了输入的buffer,取而代之的是输出的buffer
  • 其次因为没有输入单词了,所以在需要输入单词的时候采用GEN(x)动作来产生一个新的单词 ,然后移进栈里,取代SHIFT动作。

图3就是每个动作的状态变化过程,图4是生成式模型进行句法分析的示例:

同样也要对其采取一些限制:

  • GEN(x)动作只有当 时才能进行,上面SHIFT限制已经解释过了。
  • REDUCE只有当 或者buffer为空时才能进行。这里再次解释一下,上面判别式模型限制条件是 ,为什么这里就变成了 ?因为生成模型没有输入buffer,所以即使 时REDUCE了,以后不要再GEN(x)即可,直接结束分析

记当前状态的可能动作集合为

转移序列

因为一棵句法树的前序遍历是唯一的,所以不管用判别式模型还是生成式模型,得到的动作序列也都是唯一的。对于句子 和句法树 ,记生成式模型动作序列为 ,判别式模型动作序列为

生成式模型

本文最重要的就是上面提到的生成式模型,因为GEN(x)动作的存在,所以模型同时对句子 和句法树 的联合分布进行了建模。记当前状态的向量表示为 ,那么联合分布可以表示为:

其中 表示动作 的向量表示, 表示偏移向量,都包含在了RNNG参数集合 里面,通过训练得到。

而当前状态的向量表示 由三部分得到,输出buffer的LSTM输出 、栈的LSTM输出 、历史动作序列的LSTM输出 ,然后经过一个前馈神经网络得到:

同样也包含在了RNNG参数集合 里面,下图是三个LSTM的示例图:

句法成分组合

在REDUCE操作时,需要将若干个子结点归约为一个父结点,为了得到父结点的向量表示,再次利用一个LSTM对子结点序列进行编码,同时在首尾加上父结点,结构图如下所示:

单词生成

单词生成采用softmax寻找概率最大的单词,但是单词数量可能十分巨大,所以采用分层softmax的思想,首先预测当前动作是不是GEN,如果是GEN,记单词总数为 ,再将单词平均分成 个类别,用softmax预测属于哪个类别,然后在那个类别里再用softmax预测输出哪个单词。这样时间复杂度就从 降到了

参数训练和判别式模型

模型最终训练目的就是使得联合概率最大。

而只需要将输出buffer改为输入buffer,GEN动作改为SHIFT动作,然后重新训练,就可以将模型变为判别式模型了,输出给定输入句子下概率最大的句法树。

通过重要性采样进行推理

本文的生成式模型另一大作用是训练语言模型 ,根据边际分布公式

可以直接得到 ,但是一句话的句法树可能性是指数级别的,不可能一一枚举,这时候就要用到重要性采样算法。

首先定义一个比较容易得到的条件分布 ,它满足如下性质:

  • 可以推出
  • 服从分布的样本很容易得到。
  • 可以直接计算得到。

可以发现,上面的判别式模型得到的条件分布符合上面的性质,所以这里直接用判别式模型来进行采样。

这样 就变为了:

其中重要性权重

最后如果根据分布 采样得到了 个句法树样本,那么用蒙特卡罗方法就可以估计出 了:

实验

实验部分主要说一下PTB上的句法分析和语言模型吧,下面两张图分别是句法分析和语言模型的结果:

句法分析方面可以看出,生成模型效果要远远好于判别模型,生成模型效果也接近了当时的最好结果。一个合理的解释是在小数据集上面,生成模型效果要更好,而在大数据集上,判别模型效果可以赶上生成模型。

这里要提到的一点是,判别式模型就是每一个状态直接贪心argmax找到概率最大的动作,然后生成句法树。而生成式模型是利用判别式模型采样出100个概率比较高的句法树,然后用生成式模型计算它们的联合概率,重排序选择概率最高的句法树。

语言模型方面,结果要比最好结果高了一点。

总结

RNNG这个文法是个生成式模型,建模了句子和句法树的联合分布,稍稍修改即可应用到句法分析和语言模型中,效果也非常的好。

最后,我再简要梳理一遍RNNG的主要训练过程,因为这篇论文也看了整整两天,还是看的头大,一些细节可能还是没完全搞清。

首先利用生成式模型对每句话进行训练,在每个状态计算正确的动作的概率,然后训练使得概率之积最大。

然后应用到句法分析中,只需要修改为判别式模型即可。

最后应用到语言模型中,由于需要用到重要性采样,所以直接利用判别式模型生成若干样本,然后根据算得的条件概率计算语言模型句子的概率。

[NAACL16]RNN文法相关推荐

  1. 【李宏毅2020 ML/DL】P53-55 Conditional Generation by RNN Attention Pointer Network Recursive

    我已经有两年 ML 经历,这系列课主要用来查缺补漏,会记录一些细节的.自己不知道的东西. 已经有人记了笔记(很用心,强烈推荐):https://github.com/Sakura-gh/ML-note ...

  2. 软件智能:aaas系统 度量衡及文法规则

    在前面的录音文件"可观察的现象和突现的过程本体-由存在的现象探索存在的真到转向存在的历史"中曾给出对现象世界的一个归纳和总结:"参差不齐的现象世界暴露出三个钉和八个爪,向 ...

  3. 斯坦福CS224n NLP课程【十四】——树RNN递归和短语句法分析

    语言光谱模型 对于语义相似性等这类目标来说,最好的方法还是词袋 最简陋最常用的是词袋模型,或"词向量袋模型".最复杂的可能是短语结构树,额外再标注一些诸如指代.语义等标签. 这张图 ...

  4. 深度学习与自然语言处理(8)_斯坦福cs224d RNN,MV-RNN与RNTN

    原文作者:Richard Socher 翻译:@胥可 && @熊杰 && @杨帆 && @陈沛 && @Molly 校对调整:寒小阳 & ...

  5. 【机器学习】RNN循环神经网络

    循环神经网络归属: 领域:机器学习 方向:自然语言处理 贡献:自动文本生成 循环神经网络实际应用: 生活中因为原始数据都是序列化的,比如自然语言,语音处理,时间序列问题(股票价格)等问题, 这个时候需 ...

  6. pytorch中如何处理RNN输入变长序列padding

    一.为什么RNN需要处理变长输入 假设我们有情感分析的例子,对每句话进行一个感情级别的分类,主体流程大概是下图所示: 思路比较简单,但是当我们进行batch个训练数据一起计算的时候,我们会遇到多个训练 ...

  7. RNN,LSTM,GRU基本原理的个人理解重点

    20210626 循环神经网络_霜叶的博客-CSDN博客 LSTM的理解 - 走看看 重点 深入LSTM结构 首先使用LSTM的当前输入 (x^t)和上一个状态传递下来的 (h^{t-1}) 拼接训练 ...

  8. [PyTorch] rnn,lstm,gru中输入输出维度

    本文中的RNN泛指LSTM,GRU等等 CNN中和RNN中batchSize的默认位置是不同的. CNN中:batchsize的位置是position 0. RNN中:batchsize的位置是pos ...

  9. 递归下降文法C语言实验报告,递归下降语法分析器实验报告.doc

    递归下降语法分析器实验报告 编译原理实验报告 题目: 递归下降语法分析器 学 院 计算机科学与技术 专 业 xxxxxxxxxxxxxxxx 学 号 xxxxxxxxxxxx 姓 名 宁剑 指导教师 ...

  10. lstm timestep一般是多少_请问rnn和lstm中batchsize和timestep的区别是什么?

    图说起来可能更直观些: Tensor是一个高维数组,每单一个样本是一个Input_Size*Time_Step的二维矩阵,其中Input_Size 代表观察的特征数量,比如我需要用电池的电压电流和温度 ...

最新文章

  1. mysql索引 钱缀_-MySQL索引背后的数据结构及算法原理--索引选择性与前缀索引
  2. css学习笔记2--多重边框
  3. 用go语言制作读取excel模板批量生成word工具
  4. 使用Domain-Protect保护你的网站抵御子域名接管攻击
  5. C++大学教程(第九版)2016-07 保罗·戴特尔 (Paul Deitel)、 哈维·戴特尔 (Harvey Deitel)_cafbe(C++中文版)
  6. PAT1053 住房空置率 (20 分)
  7. Linux 中断实验
  8. myeclipse去掉js报错
  9. python入门之装饰器
  10. 罗永浩宣布年后回归科技界!下一代平台上见 网友:暗示年后“真还传”要完结...
  11. 《交互式程序设计 第2版》一第2章 编程基础
  12. 55.模拟撕衣服游戏编辑图片
  13. SCI-hub论文下载器(附下载方法)
  14. 最新区块链开发教程汇总
  15. python漏洞扫描器编写,用Python编写Web漏洞检测工具
  16. keras之分类问题和回归问题
  17. LabVIEW编程LabVIEW开发1920 LCR仪表例程与相关资料
  18. 一款可以帮助你处理文字、编写内容等办公软件-Word 2013 提供下载
  19. EXCEL输入数字编号总是变成日期的解决办法
  20. 论文学习——黄河源区气象水文序列突变点诊断

热门文章

  1. 关于javascript中apply()和call()方法的区别
  2. 定制C# combobox的下拉框
  3. 【MFC相关问题】vs 2019 出现 building MFC application with /MD [d] (CRT dll version) requires MFC shared
  4. Java学习之反射机制及应用场景
  5. LeetCode - Merge Two Sorted Lists
  6. .Net 数据类型转化
  7. C# Invoke 和 BeginInvoke的区别和共同点
  8. 为什么日志只应该有三个级别
  9. 第四章表单与文件-笔记-验证
  10. 程序理解与程序员的未来