文本生成自回归解码策略总结

news2024/12/28 8:22:44

当今文本生成的主流方式还是自回归式的语言建模,本篇文章对文本生成常用的几种自回归采样&解码策略进行总结(以下统称为采样)。

采样方式

  • 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 就是在归一化过程中优化解码器输出的概率分布。

softmax公式

实现方式:在归一化的过程中添加超参数,称为温度 τ , 通过改变 τ 来控制概率分布的形貌,使得概率分布变得更加均匀或集中。

关于超参数 τ 的选取

  • 超参数 τ 的值越小,越能够放大高概率词的概率,降低低概率词的概率,此时概率密度趋向集中,随机性降低,采样方式更加接近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集合的概率密度之和在整个概率分布中的比例,也就是构造一个最小候选集,使得

top-p采样核心思想

实现方式:给定超参数 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的时候是按照概率分布计算的。

参考资料

  1. 贪心搜索(greedy search)、集束搜索(beam search)、随机采样(random sample)
  2. Nucleus Sampling与文本生成中的不同解码策略比较
  3. 语言生成:搜索 or 采样,that is the question
  4. Beam Search-吴恩达讲解
  5. [RL] PyTorch中根据概率选取action
  6. 采样——解决数据类别不平衡问题
  7. 从不同解码策略看机器如何生成文本
  8. 基于seq2seq文本生成的解码/采样策略
  9. 文本生成中的decoding strategy整理
  10. 生成模型-解码策略小结
  11. 非自回归式生成模型对比总结(LevT, POINTER,CBART)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/80493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Neo4J入门笔记[2]---Neo4J GDS 图数据科学库

Neo4J 提供了GDS的库,里面包括了很多算法。GDS的英语全称是Graph Data Science(图数据科学库),其句法流程如下: stream Returns the result of the algorithm as a stream of records. stats Returns a single recor…

【VUE3】保姆级基础讲解(二)计算属性,vue组件,vue-cli脚手架,组件通讯,插槽slot

目录 计算属性computed 侦听器watch 对象监听 组件 注册全局组件 注册局部组件 Vue-CLI脚手架 安装和使用 .browserslistrc main.js jsconfig.json 组件通讯 父组件传递给子组件 props基础 非prop的attribute 子组件传递给父组件 插槽slot 基础使用 具名插槽 …

前端整合ECharts

1、简介 ECharts是百度的一个项目,后来百度把Echart捐给apache,用于图表展示,提供了常规的折线图、柱状图、散点图、饼图、K线图,用于统计的盒形图,用于地理数据可视化的地图、热力图、线图,用于关系数据可…

图数据库 Neo4j 学习之SpringBoot整合

Neo4j 系列 1、图数据库 Neo4j 学习随笔之基础认识 2、图数据库 Neo4j 学习随笔之核心内容 3、图数据库 Neo4j 学习随笔之基础操作 4、图数据库 Neo4j 学习随笔之高级操作 5、图数据库 Neo4j 学习之JAVA-API操作 6、图数据库 Neo4j 学习之SpringBoot整合 文章目录Neo4j 系列前…

Docker与Linux之间的关系——Namespace,Cgroups, 网络通信总结

文章目录一、前言二、NamespaceNamespace Linux内核操作方法容器隔离性与 Linux Namespace 关系Linux Namespace 常用操作三、CgroupsCgroups 子系统CPU 子系统cpuacct 子系统Memory 子系统Linux 调度器使用 cgroup 限额实践四、DockerDocker的文件系统OCI 容器标准Docker 引擎…

php+vue基于微信小程序的房屋租赁小程序

当今社会房屋租赁买卖是必不可少的,人们不管走到哪里都需要有一个温馨的家,有一个落脚之地,所以房屋租赁市场也是非常火爆!不管是房屋租赁公司或者是个人都需要一套完整的管理系统来掌握整个市场信息。针对这一需求,本…

微信小程序框架(三)-全面详解(学习总结---从入门到深化)

目录 事件系统 什么是事件 事件的使用方式 Event对象 事件分类 冒泡事件(bind) 非冒泡事件(catch) 事件类型 事件类型列表 事件携带参数 currentTarget 携带参数 mark 携带参数 条件渲染 wx:if wx:else wx:elif hidden wx:if vs hidden 区别 列表渲染 基本使用 复杂数…

C++用unordered_map查表代替if else/switch case多判断语句

一、引言 在C中我们写判断逻辑一般会用if else或switch case语句&#xff0c;比如以下例子&#xff1a; #include <iostream>using namespace std;class CTest { public:enum class ConditionType{TYPE1 0,TYPE2,TYPE3,};CTest() default;~CTest() default;void exe…

双倍NB!阿里一线架构师花7天肝出的这份620页“MyBatis源码解析绝密文档” 太震撼了!

前言 都知道MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain Old Jav…

非零基础自学计算机操作系统 第1章 操作系统概述 1.1 操作系统的概念

非零基础自学计算机操作系统 文章目录非零基础自学计算机操作系统第1章 操作系统概述1.1 操作系统的概念1.1.1 操作系统的地位1.1.2 操作系统的作用1.1.3 操作系统的定义第1章 操作系统概述 1.1 操作系统的概念 关于什么是操作系统&#xff0c;目前尚无统一的定义。这里只能从…

基于Java的JSP电动车维修管理系统

随着我国电动车数量的不断增加&#xff0c;如果能够在电动车出现故障的时候及时的解决这些故障问题&#xff0c;并且能够让电动车的维修人员更好的对维修信息进行管理是本系统主要研究的问题&#xff61; 本项目利用软件工程原理&#xff0c;采用面向对象的编程方法&#xff0c…

会话技术

会话技术 今日目标 理解什么是会话跟踪技术 掌握Cookie的使用 掌握Session的使用 完善用户登录注册案例的功能 1&#xff0c;会话跟踪技术的概述 对于会话跟踪这四个词&#xff0c;我们需要拆开来进行解释&#xff0c;首先要理解什么是会话&#xff0c;然后再去理解什么是…

二叉树的构造(如何唯一确定一棵二叉树?附证明)

二叉树的构造(如何唯一确定一棵二叉树?附证明) 一些直观的认识 ▪ 同一棵二叉树具有唯一先序序列、中序序列和后序序列。 ▪ 不同的二叉树可能具有相同的先序序列、中序序列和后序序列。 通过上面两个例子的验证&#xff1a; ▪ 仅有一个先序序列&#xff08;或中序序列、后…

C++类和对象--封装

目录 1.封装 1.1封装的意义一--将属性和行为作为一个整体 1.1.1成员属性&#xff0c;成员变量&#xff0c;成员函数&#xff0c;成员方法 1.2封装的意义二--将属性和行为加以控制&#xff0c;公共权限&#xff0c;保护权限&#xff0c;私有权限 1.3struct和class区别 1.4成员…

物联网-异步控制多个设备

物联网-异步控制设备 背景 在这个万物互联的时代&#xff0c;物联网设备起到了关键性的作用&#xff0c;那我们怎么去联动一个个物联网设备。比如一个家庭&#xff0c;里面有很多的设备&#xff0c;比如洗衣机&#xff0c;加湿器、空调、除湿机、灯光等等这些智能设备。假如在…

攻击类型分布

执行摘要 从 1987 年 9 月 14 日&#xff0c;中国向世界发出第一封电子邮件到如今&#xff0c;中国的互联网 发展已过去整整 31 个年头。从消费互联、产业互联到万物互联&#xff0c;互联网正在加速改变我们的交流方式和交易方式&#xff0c;一次次 004.重塑了国家的经济形态和…

【Flutter 组件】001-关于 Widget 的一切

【Flutter 组件】001-关于 Widget 的一切 文章目录【Flutter 组件】001-关于 Widget 的一切一、概述1、Widget 基本概述2、Flutter Framework 里的 Widget架构图说明3、根 Widget二、Widget 类1、Widget 的功能2、Widget 类源码说明Widget 的标识符&#xff1a;KeyFlutter 中如…

【云原生 | Kubernetes 实战】10、K8s 控制器 Deployment 入门到企业实战应用(上)

目录 一、Deployment 控制器&#xff1a;概念、原理解读 1.1 Deployment 概述 1.2 Deployment 工作原理&#xff1a;如何管理 rs 和 Pod&#xff1f; 补充&#xff1a;什么叫做更新节奏和更新逻辑呢&#xff1f; 二、Deployment 资源清单文件编写技巧 三、Deployment 使…

Java线程 (使用Callable实现多线程),看完你发现多线程多么简单!

1.Thread 与 Runnable 的关系 2.Callable实现多线程 3.线程运行状态 1.Thread 与 Runnable 的关系 经过一系列的分析之后可以发现&#xff0c;在多线程的实现过程之中已经有了两种做法&#xff1a;Thread类、Runnable接口&#xff0c;如果从代码结构本身来讲&#xff0c;使…

电子学会2020年9月青少年软件编程(图形化)等级考试试卷(一级)答案解析

青少年软件编程&#xff08;图形化&#xff09;等级考试试卷&#xff08;一级A卷&#xff09; 分数&#xff1a;100.00 题数&#xff1a;37 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 1. 下面哪个积木能够调节左右声道的音…