URL:https://www.aclweb.org/anthology/D16-1137

lua源代码: https://github.com/harvardnlp/BSO

注释

EMNLP2016 最早提出用束搜索(beam search)优化seq2seq测试时效果,一定程度上克服训练与测试间的模型获知信息偏差和损失于指标间的偏差。

算法

束搜索是在解码的时候每一步保留期望前k大的序列,然后下一步的生成在和前面组合出新的前k优序列。 作者构造了关于束搜索的损失函数,使得训练的损失不只是词级别,也包含序列级别。

fig1
\( \sum\limits_{t=1}^T \Delta(\hat{y}^{(K)}_{1:t}) [1 - f(y_t, h_{t-1}) + f(\hat{y}^{(K)}_t, \hat{h}^{(K)}_{t-1})] \) 这个损失函数公式写的难以理解,大体上是要和评价指标(如BLEU)相反,然后用最优序列的候选是否排在前面作为微调。 细节上采用softmax前未归一化的输出。 反向传播采用了双向RNN的方式。 最终期望通过这种损失函数,使得模型将最优序列的每一步都能保持在前k位。 一个接一个生成似然词的解码器可以看作k=1的束搜索。

模型

基线和本文算法都采用加入全局attention的由LSTM组成编解码器的seq2seq模型。

数据集

任务 数据集 介绍
乱序重拍 Penn Treebank 语言模型标注
依赖解析 Penn Treebank 语言模型标注
机器翻译 IWSLT 2014 平行语料

实验与对比

新模型不能直接初始化,需要用基线方法预训练模型。 在训练的时候从2到K,每轮逐渐增加beam search的尺寸。 对于有硬约束的任务(如乱徐重拍的序列一定是原序列的排列),将硬约束加入束搜索的约束中。

在乱序重排、依赖解析、机器翻译三个任务中对于朴素基线都有明显的提升。 其中,乱序重排束搜索中加入硬约束(输出序列是输入序列的排列)还有进一步提升; 其中,依赖解析中,k=1不如朴素基线。

思考

本文巧妙的将序列的指标融入到了损失函数,分析了序列模型训练和测试的不一致。 现在束搜索似乎主要仅用在测试中。 将序列的指标用于损失函数自然会提升模型的指标,但是不是也会使得神经语言模型在"流畅"方面过拟合?