端到端任务中目标词表过大问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoleiniu1314/article/details/84976226

前言

在端到端任务(如机器翻译、对话、摘要抽取等)中存在一个有待解决但没有引起研究者足够重视的问题:目标词表过大问题。这个问题不仅影响 training 和 decoding 的速度,也会影响生成句子的质量(引入不必要的噪声)。下面介绍两篇解决这个问题的论文,第一篇着眼于对话任务,第二篇着眼于机器翻译任务。

Neural Response Generation with Dynamic Vocabularies(AAAI 2018)

这篇论文是基于seq2seq模型的,主要有两个创新点:
第一:在decoding阶段,根据encoding的最后一个隐层向量为每个输入生成一个特定的词表,使得原来需要在几万个词上进行的projection操作变为现在的只需要在几千个词上进行,不仅提升了效果,也使得decoding的时间节省了40%;
第二:通过最大化目标函数的下界和使用蒙特卡罗采样方法,使得生成动态词表和decoding可以同时训练。

Vocabulary Manipulation for Neural Machine Translation(ACL 2016)

主要方法: 对于每个训练句子(而不是单词),使用下面三个部分的并集来构建目标词表,
1、源端句子中所有单词、短语对应的翻译(一对多的关系),这样做的目的主要是为了解决歧义的问题(如 bank,可译为 ‘银行’ 或 ‘河岸’);
2、词频最大的 top n 个词(论文中的 n 取 2k,也可以根据任务和数据量的不同取其他值),这样做的目的主要是为了在目标词表中包含一些不能和源端对齐的词(个人认为是一些连词,为的是让翻译出来的句子更流畅);
3、目标端参考句子中的所有单词,这一部分单词只在 training 的时候有,在 decoding 的时候由于没有目标端参考句子,目标词表中也就不会包含这部分单词。
对于一般的翻译模型,目标词表大概是取词频最大的 30k 到 50k 个单词,而对于论文中的方法,是首先根据词频取一个 500k 的大词表(其他为 UNK),然后再从这个大词表中为每个句子构建目标词表,这样也会解决目标语言的词语丰富性问题(个人认为是否在一定程度上也解决了 UNK 问题,对于这点论文中没有实验说明)。

实验细节: 虽然上面说的是为每个训练句子构建一个目标词表,但实际上是:在 training 阶段是为每个 minibatch 构建一个目标词表(所有句子的目标词表取并集),这样做的好处是各个句子在每个 epoch 中对应的目标词表都不同,因为每个 epoch 都会 shuffle 一遍数据(个人认为优点是在更大的参数子空间中探索局部最优解);在 decoding 阶段是为每个句子构建一个目标词表。

不足之处: 没有用到模型本身的信息(比如隐层向量等)。

任务迁移: 将这篇论文中的方法迁移到对话领域,是否适用?考虑用来构建目标词表的三个部分:1、第一部分在对话领域是不可行也没必要的,因为对话领域似乎不存在歧义问题;2、第二部分是可行且必要的;3、第三部分也是可行且必要的;

猜你喜欢

转载自blog.csdn.net/xiaoleiniu1314/article/details/84976226