[ACL18]基于RNN和动态规划的线性时间成分句法分析
原文链接:
Linear-Time Constituency Parsing with RNNs and Dynamic Programming
好像已经很久没有看论文了呢,开学了一堆事情,以后还是要抽空阅读论文,保持一定的阅读量,并且不能光看最新的论文,还得去前人传统的方法中去寻找有没有能应用于深度学习的东西,说不定就发ACL了呢(手动滑稽)。
论文地址:Linear-Time Constituency Parsing with RNNs and Dynamic Programming
代码地址: github
介绍
这次要介绍的论文是huang liang发表在ACL18的一篇短文,提出了一个基于转移系统的线性时间句法分析器。本文的主要贡献点主要有如下几点:
- 传统的基于转移的句法分析模型都是贪心解码,不能考虑到所有的状态空间,所以本文的模型采用beam search将状态空间提升到了指数级别。
- 首次采用cube pruning将分析的时间复杂度降低到了 。
- 采用max-violation损失函数代替原来的求和的损失函数,并且对cross-span的span进行了惩罚。
- 在单模型上取得了最高的F1值。
- 采用图结构的栈(GSS)代替了原来的stack,这样不需要时刻保存历史信息。
模型基础
基于span的转移系统
这个我已经在之前的文章
成分句法分析综述
中详细阐述过了。核心思想就是stack里面保存的不再是短语结构树,而是span的左右边界下标 ,初始时stack里面是 ,终止状态栈里是 ,SHIFT之后栈顶变为 ,REDUCE之后栈顶变为 (假设之前栈顶两个元素是 和 )。
Bi-LSTM特征
状态转移时用双向LSTM两端的差值计算每个span的表示,然后计算出得分,用来预测action。
动态规划
句法树得分
还是和之前chart-based模型一样,用每个span的label得分之和作为句法树的总得分。
图结构栈(Graph-Struct Stack, GSS)
因为要采用动态规划来枚举每个时刻所有的状态,不是用普通的stack,使用GSS来保存每个时刻的状态。GSS每个时刻只需要保存栈顶的span就行了,假设为 。如果action是SHIFT,那么下一步就变成了 ,如果action是REDUCE,那么还需要知道栈顶第二个元素是什么。因为考虑到了所有的状态空间,所以所有的 都是有可能的。
GSS的具体结构如下图所示:
每个时刻的状态仅用一个span表示,在具体实现的时候,每个span还保存了一个span指针数组,指向它前面所有可能的span,还保存了当前span以及之前所有span的分数之和 和当前span子树的分数之和 。每个状态还保存了一个时刻标记 ,易知一共有 个时刻。
当采取SHIFT动作时,状态变为了 ,并且新的span 的指针数组中新增加一个span也就是 。prefix分数变为 ,其中 是span 的最高label得分,而inside分数就是span 的分数 。
当采取REDUCE动作时,枚举span 指针数组中所有的前一个span ,然后合并成一个span ,prefix分数变为 ,其中 就是span 的最高label得分,inside分数变为了 。实际代码实现中,REDUCE完了后,span 的指针数组要更新为span 的指针数组。
Beam Search和Cube Pruning
在每个时刻,只保存prefix得分最高的前b个span状态,这样时间复杂度可以降为 ,但是 相对于句子长度来说还是太大了,所以采用cube pruning继续降到 。
cube pruning原理是这样的:普通的beam search每个时刻枚举至多b个span,每个span和之前的至多b个span结合,所以一共最多产生 个span。
而cube pruning在每个时刻都建立一个堆,首先用上一个时刻的beam里的b个span,来产生b个SHIFT的span,送入堆里。理论上来说还应该产生至多 个REDUCE的span,但是在这里对于每个span,只取它的指针数组里得分最高的那个span,来和它结合产生新的span,送入堆里。然后在产生好的堆里,每次取出得分最高的span,出堆,如果它是REDUCE得到的span,那么就继续按照它的指针数组得分从高到低顺序产生一个span,REDUCE完之后送入堆里。依次下去,直到出栈了b个span为止。
训练
还是使用max-margin loss来训练,但是有几点小小的改进。
cross-span损失
以往的损失函数里有个 ,衡量的是预测树和标准树不同的span的数量。但是这有个问题,因为用了隐式二叉化,所以在预测树里存在label为空的情况。如果这个span在标准树中label也是空,那么原来的损失就不惩罚这一项了,但是要考虑到如果这个span在标准树中与某个标准的span产生了交叉,那么它根本就不可能是对的,也得进行惩罚。
max violation updates
这是huang liang在2012提出来的,其实就是计算出每个时刻预测得分和标准得分的差距,然后取差距最大的那个时刻的得分差距作为最终的损失函数,之前都是用每个时刻得分差距之和来作为损失函数的。
实验
下图是不同的beam大小对不同长度句子分析速度的影响:
最终综合考虑速度和准确率,选择beam大小为20。
最后是beam-span模型在PTB测试集上的准确率,在单模型上取得了最好的结果:
总结
这篇论文是短论文,所以相比之下创新没有那么的大吧,主要还是速度上比chart-based有了提升,准确率上比普通的转移系统有了提升,另外还提出了几点小的改进吧,例如cross-span问题、max-violation损失之类的,转移系统也改成了适合用来进行beam search的GSS,为了进一步加快速度,还用了cube剪枝。
这么多改进其实个人感觉也是影响不大的,不是很通用,cross-span和max-violation损失可以考虑拿来用一下。下一步的工作还是考虑如何增加特征表示、加入头结点之类的吧。
[ACL18]基于RNN和动态规划的线性时间成分句法分析相关推荐
- 时间窗口算法用matlab,一种基于动态规划算法的时间窗口相关的参与者选择方法与流程...
本发明涉及一种移动群智感知中时间窗口相关的参与者选择方法,特别地,涉及一种基于动态规划算法的时间窗口相关的参与者选择方法. 背景技术: 在移动群智感知网络中,智能设备中嵌入了麦克风.相机.温度传感器. ...
- 算法模板:动态规划之线性DP【沈七】
算法模板:动态规划之线性DP 前言 线性DP 数字三角形模型 摘花生 最小路径和 不同路径模型 不同路径(有障碍) 过河卒 (综合应用) 最长上升子序列模型 木棍加工 导弹拦截 完结散花 参考文献 前 ...
- 【NLP】seq2seq 由浅入深——基于Rnn和Cnn的处理方式
seq2seq seq2seq最初是google2014年在<Sequence to Sequence Learning with Neural Networks>提出的,简单的说就是一种 ...
- leetcode 5. Longest Palindromic Substring 字符串中的最长回文数 逐步从O(n^2)优化至线性时间
题目 解析 思路一 暴力解法 思路二 指针+最大长度 思路3 由中间至两边找回数 思路4 Manacher's algorithm 线性时间 参考文档 题目 链接 给定一个字符串 s,找到 s 中最长 ...
- 线性时间查找固定频率的元素
转自:http://blog.ibread.net/467/linear-time-iceberg-query-algorithm/ 一.从面试题开始 在进入到枯燥的正文之前,先来看一道据说在很多面试 ...
- 【算法学习】线性时间排序-计数排序、基数排序和桶排序详解与编程实现
计数排序 计数排序假设n个输入元素中的每一个都是介于0到k之间的整数.此处k为某个整数(输入数据在一个小范围内). 算法思想 计数排序的基本思想是对每一个输入元素x,确定出小于x的元素的个数.然后再将 ...
- 基于RNN和CTC的语音识别模型,探索语境偏移解决之道
摘要:在本文介绍的工作中,我们展示了一个基于RNN和CTC的语音识别模型,在这个模型中,基于WFST的解码能够有效地融合词典和语言模型. 本文分享自华为云社区<语境偏移如何解决?专有领域端到端A ...
- 基于多任务学习的快件送达时间预测方法
1.文章信息 文章题目为<基于多任务学习的快件送达时间预测方法>,发表在计算机工程期刊上的一篇有关多任务学习预测的文章. 2.摘要 快件送达时间预测是物流领域中一项至关重要的服务.准确地预 ...
- 基于RNN的序列化推荐系统总结
嘿,记得给"机器学习与推荐算法"添加星标 作者 | 阳光明媚 单位 | 华东师范大学 方向 | 推荐系统 本文介绍两篇基于RNN的用户序列行为建模的经典论文,原文地址: 1. Se ...
- Pytorch实战——基于RNN的新闻分类
目录 一.项目介绍 二.基于RNN的新闻分类 Step1 加载数据集 Step2 分词和构建词汇表 Step3 构建数据加载器 dataloader Step4 定义神经网络模型 Step5 定义模型 ...
最新文章
- C语言解析pcap文件得到HTTP信息实例(原创,附源码)
- epoll/select
- 神经网络的设计与分析之概述
- Foundation框架介绍
- win11什么时候发布的_2021年初级会计师考试大纲什么时候发布?
- 54_pytorch GAN(生成对抗网络)、Gan代码示例、WGAN代码示例
- cannot find Toolkit in /usr/local/cuda-8.0
- 过了双十一之后的你。。| 今日最佳
- 计算凸多边形面积的算法
- ubuntu使用问题与解决记录[持续更新]
- 某度质量部测试开发面试题2(未完待续)
- Unity中 创建射线的两种方法
- 服务器拒绝mac访问共享文件,Mac共享文件连接失败怎么办?Mac无法访问打开共享文件解决方法...
- stm32开发环境:vs201x+visualGDB+cubemx开发stm32程序
- DiffuseBumpCutout‘: invalid subscript ‘boxMax‘ at line 151
- 【第1章】凸集——几种重要的凸集
- SVG排版公众号文章『CSS滤色混合模式』模板代码
- 必须注销计算机才能应用这些更改,Win10不用注销电脑就可以实现切换开始菜单/屏幕的方法...
- 数据库各种锁的简单理解(转自口渴的火麒麟)
- cmd 删除文件和文件夹
热门文章
- selenium webdriver学习(一)------------快速开始(转载JARVI)
- The command (dfs.browser.action.delete) is undefined 解决Hadoop Eclipse插件报错
- Android 使用WakeLock
- ByteBuffer分散和聚集的应用场景
- 模块电源(三):PCB Layout
- HTML CSS设计与构建网站
- P1038 神经网络[拓扑]
- Linux命令行操作基础练习
- java学习日记-基础-列出2~100内的素数
- 日常邮件用语(一)网摘学习