当今文本生成的主流方式还是自回归式的语言建模,本篇文章对文本生成常用的几种自回归采样&解码策略进行总结(以下统称为采样)。
采样方式
- Argmax Decoding(贪婪采样)
- Greedy Search(贪心搜索)
- Beam Search(集束搜索)
- Stochastic Decoding(随机采样)
- Temperature Sampling
- Top-k Sampling
- Top-p Sampling(Nucleus Sampling)
- 总结
- 参考资料
采样的定义是:在一个条件概率分布上通过搜索或随机选择的方式输出一个值的过程。其实除文本生成这一任务,强化学习中每次action的选择也会考虑使用不同的方式来选择出当下最合适的action. 目前采样方式大致分为两类:贪婪采样和随机采样,下面分别对这两类采样方式进行介绍。
Argmax Decoding(贪婪采样)
核心思想:将每个时间步的采样范围限制在概率最靠前的的有限(k
)个token. 当k=1
时,采样方式称作Greedy Search;当k>1
时,采样方式称作Beam Search. 所以Greedy Search可以看作是Beam Search的特例。
Greedy Search(贪心搜索)
核心思想:每个时间步都选择概率最大的token作为输出,直至出现结束符或达到最大句子长度停止输出。
Beam Search(集束搜索)
BeamSearch是GreedySearch和枚举的折中。
具体过程:给定超参数集束宽度(Beam Size)k
,每个时间步保留 k
个取值路径,最终会生成k个完整的句子。在这 k
个完整的句子中,选择总分最高的句子作为输出。这里,Beam 可以理解为候选容器,存放当前时间步中概率最高的一些候选token,而容器容量就叫做 Beam Size.
# Beam Search 算法伪代码
while k:
取当前时间步下总分最大的 k 个候选 token 放入 beam
if 候选中有结束符:
将对应的候选句拿出
k = k - 1
从候选句子中取得分最高的作为最终结果输出
缺点:束搜索中排序用的分数一般会用 log_(prob) 的加和,即Score = log_(prob1*prob2*...*probN)
。但因为 log_(prob) 为负数,如果采用这种方式计算分数,生成结果中短句分数就会比较大,所以该采样方式倾向于生成短句。虽然对于集束搜索有一些基于惩罚因子的改进(如分数直接除以生成长度等),但该采样方式还是具有贪婪采样的通病,即生成的文本不够多样。
在Sequence2sequence模型[中,Beam Search 只用于测试阶段,即 decoder 解码阶段,因为在训练过程中,每一个decoder的输出是有正确答案的,也就不需要Beam Search去加大输出的准确率。
从这篇博文我了解到,也有专门针对贪婪采样进行效率和效果层面改进的工作,如class-factored softmax等,相关论文:
- Pragmatic Neural Language Modelling in Machine Translation(NAACL,2015)
- Get To The Point: Summarization with Pointer-Generator Networks(ACL,2017)
Stochastic Decoding(随机采样)
与贪婪采样不同,随机采样将每个时间步的采样范围扩大到整个词表,由此便引入更多的随机性。随机采样分两步,首先通过超参数改变解码器输出的概率分布或重新划定采样范围,然后在新的候选词集中随机选取一个值进行输出。随机采样容易产生前后不一致的问题,而在开放闲聊领域,生成文本的长度都比较短,这一问题便被淡化了。随机采样有三种:Temperature Sampling、Top-k Sampling 和 Top-p Sampling. 这三种采样方式可以按需结合起来使用。
采样原则:
- 减熵性:变换后的概率分布小于变换前的概率分布;
- 保序性:元素排列顺序不变
- 保斜率性:分布的斜率不变
Temperature Sampling
核心思想:解码器的输出层后面通常会跟一个softmax函数(公式如下)将输出概率进行归一化。Temperature Sampling 就是在归一化过程中优化解码器输出的概率分布。
实现方式:在归一化的过程中添加超参数,称为温度 τ
, 通过改变 τ
来控制概率分布的形貌,使得概率分布变得更加均匀或集中。
关于超参数 τ
的选取:
- 超参数
τ
的值越小,越能够放大高概率词的概率,降低低概率词的概率,此时概率密度趋向集中,随机性降低,采样方式更加接近Greedy Search. - 超参数
τ
的值越大,随机性越大,修改后的概率分布越趋近于均匀分布。
这种采样方式仅仅通过控制超参数对概率分布进行了放缩,并没有改变采样范围即候选词集,所以概率低的单词还是有可能输出。
Top-k Sampling
参考论文:Hierarchical Neural Story Generation(ACL 2018)
核心思想:在采样前,将解码器输出的概率分布截断,把采样范围缩小到概率比较高的词,并通过超参数的方式直接限制新候选词的个数。
实现方式:给定超参数 k
,预选出当前时间步下 k
个概率最高的 token 形成新的候选集,然后对对该词集中的概率进行重归一化之后,再进行随机采样。top-k 采样可结合Temperature Sampling 抑制当前时间步下低概率token的输出。
难点:超参数 k
的选择比较困难。由于解码器生成的概率分布变化比较大,有时很均匀,有时较集中。对于概率分布比较均匀的情况, 若k
较小,则容易丢掉很多优质候选词;但如果 k
太大,这种采样方式又会退化回普通的随机采样。对于概率分布比较集中的情况,上述问题有所淡化,但合适 k
值的选择还是比较困难。
Top-p Sampling(Nucleus Sampling)
参考论文:The Curious Case of Neural Text Degeneration(ICLR,2020)
论文中指出,一般而言,解码出的概率分布中往往是少数 token 的出现概率已经占据了绝大部分概率空间,这部分核心词可称为nucleus.
核心思想:与top-k相似,top-p 也是缩小采样范围,只不过是通过指定概率上限的方式,即固定候选token集合的概率密度之和在整个概率分布中的比例,也就是构造一个最小候选集,使得
实现方式:给定超参数 p
作为概率阈值,首先对当前概率分布中的全部 token 按照概率值进行降序排列,然后依次选择 token 直到累加概率超过预设的概率阈值 p
, 由此便得到新的候选集,对该词集中的概率进行重归一化之后,再进行随机采样。top-p 采样可结合Temperature Sampling 抑制当前时间步下低概率token的输出。
优点:(1)在不同的时间步,随着解码词的概率分布不同,候选词集合的大小会动态变化,相较于top-k采样更加灵活;(2)由于解码词还是从头部候选集中筛选,这样根据概率动态调整的方式可以使生成的句子在满足多样性的同时又保持通顺。
总结
(1)贪婪采样的本质是使用概率最大化的原则生成文本,与人类正常对话的句子相比,缺乏多样性。
(2)随机采样的本质是通过优化解码词概率分布,使得生成的文本在兼顾流畅性的同时更具多样性。但随机采样会引入新的超参数 (τ/k/p
),所以需要进一步的启发式选择。
采样本质上就是在生成文本的质量(Quality)和多样性(Diversity)间寻求平衡。Quality 可用 BLEU 等指标进行评价,Diversity 可用 PPL 、distinct 等指标进行衡量。文本生成客观评价指标总结可参考此篇博文。
解码器输出的值是第t
个词Xt
的概率分布,具体选择哪种采样策略还要视具体任务而定。训练阶段计算loss的时候是按照概率分布计算的。
参考资料
- 贪心搜索(greedy search)、集束搜索(beam search)、随机采样(random sample)
- Nucleus Sampling与文本生成中的不同解码策略比较
- 语言生成:搜索 or 采样,that is the question
- Beam Search-吴恩达讲解
- [RL] PyTorch中根据概率选取action
- 采样——解决数据类别不平衡问题
- 从不同解码策略看机器如何生成文本
- 基于seq2seq文本生成的解码/采样策略
- 文本生成中的decoding strategy整理
- 生成模型-解码策略小结
- 非自回归式生成模型对比总结(LevT, POINTER,CBART)