Vintage NLP for Work
Sequence Level Training with Recurrent Neural Networks https://arxiv.org/abs/1511.06732 Marc'Aurelio Ranzato, Sumit Chopra, Michael Auli, Wojciech Zaremba
句子的生成一般都用一个语言模型实现,无论具体是基于 n-gram 还是 RNN 还是 seq2seq 框架,训练语言生成器都会遇到两个问题。
一个是训练数据和测试数据的分布不匹配。如上图,语言模型在训练时使用标准数据做输入,用预测结果和标准数据做交叉熵。但是在测试时,必然只能使用上一时刻的输出作为这一时刻的输入。预测的终究不是完美的,本文将这个问题称为训练时仅将模型暴露给训练数据从而引起的暴露偏差(exposure bias)。
另一方面,训练模型所用的目标函数是词级别的,会强制模型从 "I took a walk" 变为生成 "I took a long walk",而最终的指标却是 BLEU、ROUGE 值等。
因此,本文提出了一个新的句子级别学习算法,既在训练时加入模型预测值来减少 exposure bias,又用强化学习直接优化最终的评价指标。
发表在 ICLR 2016,虽然比较老了,但是对后面的工作影响很大。
一个是训练数据和测试数据的分布不匹配。如上图,语言模型在训练时使用标准数据做输入,用预测结果和标准数据做交叉熵。但是在测试时,必然只能使用上一时刻的输出作为这一时刻的输入。预测的终究不是完美的,本文将这个问题称为训练时仅将模型暴露给训练数据从而引起的暴露偏差(exposure bias)。
另一方面,训练模型所用的目标函数是词级别的,会强制模型从 "I took a walk" 变为生成 "I took a long walk",而最终的指标却是 BLEU、ROUGE 值等。
因此,本文提出了一个新的句子级别学习算法,既在训练时加入模型预测值来减少 exposure bias,又用强化学习直接优化最终的评价指标。
发表在 ICLR 2016,虽然比较老了,但是对后面的工作影响很大。
Vintage NLP for Work
句子的生成一般都用一个语言模型实现,无论具体是基于 n-gram 还是 RNN 还是 seq2seq 框架,训练语言生成器都会遇到两个问题。 一个是训练数据和测试数据的分布不匹配。如上图,语言模型在训练时使用标准数据做输入,用预测结果和标准数据做交叉熵。但是在测试时,必然只能使用上一时刻的输出作为这一时刻的输入。预测的终究不是完美的,本文将这个问题称为训练时仅将模型暴露给训练数据从而引起的暴露偏差(exposure bias)。 另一方面,训练模型所用的目标函数是词级别的,会强制模型从 "I took…
在这之前 Venkatraman 等和 Bengio 等也有做过一个改进(DAD 算法),用一个随机概率来决定,究竟是拿本时刻的输出用作下一时刻的输入,还是用下一时刻的标准输入数据作为输入。
Vintage NLP for Work
在这之前 Venkatraman 等和 Bengio 等也有做过一个改进(DAD 算法),用一个随机概率来决定,究竟是拿本时刻的输出用作下一时刻的输入,还是用下一时刻的标准输入数据作为输入。
Bengio 等还设计了一个退火规划(annealing schedule),一开始选择标准输入,逐渐逐渐改为使用模型的预测作为下一时刻的输入。
但是这样的训练中不管你随机选了哪个作为输入,预测目标依然是来自标准数据。在已生成的数据没有和标准数据对齐的情况下,如果标准是 "I took a long walk" 且模型虽然已经输出 "I took a walk",可能会被迫学习为 "I took a walk walk"。
但是这样的训练中不管你随机选了哪个作为输入,预测目标依然是来自标准数据。在已生成的数据没有和标准数据对齐的情况下,如果标准是 "I took a long walk" 且模型虽然已经输出 "I took a walk",可能会被迫学习为 "I took a walk walk"。
Vintage NLP for Work
Bengio 等还设计了一个退火规划(annealing schedule),一开始选择标准输入,逐渐逐渐改为使用模型的预测作为下一时刻的输入。 但是这样的训练中不管你随机选了哪个作为输入,预测目标依然是来自标准数据。在已生成的数据没有和标准数据对齐的情况下,如果标准是 "I took a long walk" 且模型虽然已经输出 "I took a walk",可能会被迫学习为 "I took a walk walk"。
本文先提出了一个直接的端到端模型(E2E),将本轮的最高可能的 k 个词及打分送到下一轮作为输入,下一时刻预测时把 k 打分作为权重来生成本轮的 top-k 预测,又交给下一轮。类似 Beam Search 但计算量小了很多。
但是,哪怕这样做,模型的指标依然是词级别的交叉熵,没有用句子级别的指标。
但是,哪怕这样做,模型的指标依然是词级别的交叉熵,没有用句子级别的指标。
Vintage NLP for Work
本文先提出了一个直接的端到端模型(E2E),将本轮的最高可能的 k 个词及打分送到下一轮作为输入,下一时刻预测时把 k 打分作为权重来生成本轮的 top-k 预测,又交给下一轮。类似 Beam Search 但计算量小了很多。 但是,哪怕这样做,模型的指标依然是词级别的交叉熵,没有用句子级别的指标。
最后提出的 MIXER 模型使用强化学习,按 REINFORCE 算法的正常套路,用采样选择句子,然后最终将最终指标 BLEU 值直接作为 reward 更新句子。
Vintage NLP for Work
最后提出的 MIXER 模型使用强化学习,按 REINFORCE 算法的正常套路,用采样选择句子,然后最终将最终指标 BLEU 值直接作为 reward 更新句子。
他们做了两个改进,一个是先正常用交叉熵预训练一个模型(否则随机初始化的 REINFORCE 根本学不动),另一点是他们也设计了一个 schedule,一开始前面用标准数据和交叉熵训练、最后几步采用 REINFORCE,逐渐变化为整个序列全部用 REINFORCE 训练。
A Deep Reinforced Model for Abstractive Summarization
https://arxiv.org/abs/1705.04304
Romain Paulus, Caiming Xiong, Richard Socher
本文在 CNN/Daily Mail 数据集上做生成式摘要。Socher 大家应该很熟悉他的 CS224d 课程了。
现有的 RNN encoder-decoder 框架生成的摘要常有两种问题:重复结巴、不连贯。
他们通过一种新的 attention 来避免结巴问题,以及一个新的 self-critical 训练算法来解决不连贯问题。
https://arxiv.org/abs/1705.04304
Romain Paulus, Caiming Xiong, Richard Socher
本文在 CNN/Daily Mail 数据集上做生成式摘要。Socher 大家应该很熟悉他的 CS224d 课程了。
现有的 RNN encoder-decoder 框架生成的摘要常有两种问题:重复结巴、不连贯。
他们通过一种新的 attention 来避免结巴问题,以及一个新的 self-critical 训练算法来解决不连贯问题。
Vintage NLP for Work
Photo
他们先提出了一个对于 encoder 输出向量的 intra-temporal attention,上标 e 表示 encoder。
可以直观理解为每个词当前时刻 attention weight 对过去所有时刻的 weight 做 softmax,然后再对所有词做 normalization。
得到的 alpha 就综合考虑了所有输入在过去所有时间上的 attention 值,就能避免重复 attend 到过去已经 attend 过的 encoder 结果上,从而减少重复。
可以直观理解为每个词当前时刻 attention weight 对过去所有时刻的 weight 做 softmax,然后再对所有词做 normalization。
得到的 alpha 就综合考虑了所有输入在过去所有时间上的 attention 值,就能避免重复 attend 到过去已经 attend 过的 encoder 结果上,从而减少重复。
Vintage NLP for Work
他们先提出了一个对于 encoder 输出向量的 intra-temporal attention,上标 e 表示 encoder。 可以直观理解为每个词当前时刻 attention weight 对过去所有时刻的 weight 做 softmax,然后再对所有词做 normalization。 得到的 alpha 就综合考虑了所有输入在过去所有时间上的 attention 值,就能避免重复 attend 到过去已经 attend 过的 encoder 结果上,从而减少重复。
再用一个传统的 attention 对 decoder 已经生成的词做 attention,防止因为 decoder 的隐层重复导致结巴。
Vintage NLP for Work
Photo
最后,他们提出的 self-critical 学习如上。在传统的最大似然损失上加上了强化学习的部分。
如果当前序列采样的 reward(y^s)比贪婪搜索得到的 基准reward (\hat y) 要高,那么最小化这个loss就会等同于最大似然,因此增加了 reward 的期望值。
但是,只优化最大似然容易有前面提到的 exposure bias 问题,只优化强化学习部分使用 ROUGE 等最终指标做 reward 由可能造成语言不流畅,因此他们选择了将两个 loss 加权求和。
如果当前序列采样的 reward(y^s)比贪婪搜索得到的 基准reward (\hat y) 要高,那么最小化这个loss就会等同于最大似然,因此增加了 reward 的期望值。
但是,只优化最大似然容易有前面提到的 exposure bias 问题,只优化强化学习部分使用 ROUGE 等最终指标做 reward 由可能造成语言不流畅,因此他们选择了将两个 loss 加权求和。
From Language to Programs: Bridging Reinforcement Learning and Maximum Marginal Likelihood
https://arxiv.org/abs/1704.07926
Kelvin Guu, Panupong Pasupat, Evan Zheran Liu, Percy Liang
https://arxiv.org/abs/1704.07926
Kelvin Guu, Panupong Pasupat, Evan Zheran Liu, Percy Liang
Vintage NLP for Work
From Language to Programs: Bridging Reinforcement Learning and Maximum Marginal Likelihood https://arxiv.org/abs/1704.07926 Kelvin Guu, Panupong Pasupat, Evan Zheran Liu, Percy Liang
本文发表在 ACL2017 来自 Stanford 的 Percy Liang 组。全文流畅,思路清楚,一句废话都没有,非常值得一读。
本文并不是一篇特别 NLP 的文章,处理的是序列决策的问题,比较偏 ML 理论,下面花几段说一下背景。
这里做的序列决策的问题是指模型必须做出一系列的决策,然而只有当整个决策序列全部生成,才能评价其好坏。传统的解决方法就是 强化学习(reinforcement learning)和最大边际似然(maximum marginal likelihood)两种。
这里的具体任务用的是 SCONE 是他们组在 ACL2016 上发表的一个文章中新建的数据集,有三个 domain,其中一个如上图所示,每个样本会给定一个初始的状态(world state),通过几句话来改变这个状态,得到一个最终的状态。
每一句话(utterance)都会对应一段改变状态的代码,如上图说的一句话就会被翻译为一个预定义 DSL 上的代码。
这种任务可以认为是 code generation 或者 semantic parsing,即从自然语言句子生成所要求的代码段。
因此,这里的序列决策就是指生成代码的全部 token,决定生成哪个 token 就是一个分类决策。
只有当代码的所有 token 全部生成,才能获得代码最终执行结果,才能评价生成代码的结果。
这个问题的难点在于,首先 token 序列是随长度指数增长的,其次每个样本有千级别的代码是结果碰巧对了但是逻辑不对(spurious program),最后,真正逻辑正确的代码只有几个。哪怕学习生成了答案碰巧对了的代码,将来放到测试集上就露出马脚了,这可以看成是一种过拟合的情形。本文最主要解决的就是这类虚假代码(spurious program)的问题。
本文并不是一篇特别 NLP 的文章,处理的是序列决策的问题,比较偏 ML 理论,下面花几段说一下背景。
这里做的序列决策的问题是指模型必须做出一系列的决策,然而只有当整个决策序列全部生成,才能评价其好坏。传统的解决方法就是 强化学习(reinforcement learning)和最大边际似然(maximum marginal likelihood)两种。
这里的具体任务用的是 SCONE 是他们组在 ACL2016 上发表的一个文章中新建的数据集,有三个 domain,其中一个如上图所示,每个样本会给定一个初始的状态(world state),通过几句话来改变这个状态,得到一个最终的状态。
每一句话(utterance)都会对应一段改变状态的代码,如上图说的一句话就会被翻译为一个预定义 DSL 上的代码。
这种任务可以认为是 code generation 或者 semantic parsing,即从自然语言句子生成所要求的代码段。
因此,这里的序列决策就是指生成代码的全部 token,决定生成哪个 token 就是一个分类决策。
只有当代码的所有 token 全部生成,才能获得代码最终执行结果,才能评价生成代码的结果。
这个问题的难点在于,首先 token 序列是随长度指数增长的,其次每个样本有千级别的代码是结果碰巧对了但是逻辑不对(spurious program),最后,真正逻辑正确的代码只有几个。哪怕学习生成了答案碰巧对了的代码,将来放到测试集上就露出马脚了,这可以看成是一种过拟合的情形。本文最主要解决的就是这类虚假代码(spurious program)的问题。
Vintage NLP for Work
本文发表在 ACL2017 来自 Stanford 的 Percy Liang 组。全文流畅,思路清楚,一句废话都没有,非常值得一读。 本文并不是一篇特别 NLP 的文章,处理的是序列决策的问题,比较偏 ML 理论,下面花几段说一下背景。 这里做的序列决策的问题是指模型必须做出一系列的决策,然而只有当整个决策序列全部生成,才能评价其好坏。传统的解决方法就是 强化学习(reinforcement learning)和最大边际似然(maximum marginal likelihood)两种。 这里的具体任务用的是…
模型是很简单的 encoder-decoder,用 bi-LSTM 做编码,解码器简单用一个带 attention 的前馈网络。