[LLM]大语言模型文本生成—解码策略(Top-k Top-p Temperature)

{"top_k": 5,"temperature": 0.8,"num_beams": 1,"top_p": 0.75,"repetition_penalty": 1.5,"max_tokens": 30000,"message": [{"content": "你好","role": "user"}]
}

1.Temperature
用于调整随机从生成模型中抽样的程度,因此每次点击“生成”时,相同的提示可能会产生不同的输出。温度为 0 将始终产生相同的输出。温度越高随机性越大!

2.Top p
动态设置tokens候选列表的大小。 将可能性之和不超过特定值的top tokens列入候选名单。
Top p 通常设置为较高的值(如 0.75),目的是限制可能被采样的低概率 token 的长度。

3.Top k
允许其他高分tokens有机会被选中。 这种采样引入的随机性有助于在很多情况下生成的质量。 top-k 参数设置为 3意味着选择前三个tokens。
将如果 k 和 p 都启用,则 p 在 k 之后起作用。

在大模型训练好之后,如何对训练好的模型进行解码(decode)是一个火热的研究话题。

在自然语言任务中,我们通常使用一个预训练的大模型(比如GPT)来根据给定的输入文本(比如一个开头或一个问题)生成输出文本(比如一个答案或一个结尾)。为了生成输出文本,我们需要让模型逐个预测每个 token ,直到达到一个终止条件(如一个标点符号或一个最大长度)。在每一步,模型会给出一个概率分布,表示它对下一个单词的预测。例如,如果输入的文本是“我最喜欢的”,那么模型可能会给出下面的概率分布:

那么,我们应该如何从这个概率分布中选择下一个单词呢?以下是几种常用的方法:

  • 贪心解码(Greedy Decoding):直接选择概率最高的单词。这种方法简单高效,但是可能会导致生成的文本过于单调和重复。
  • 随机采样(Random Sampling):按照概率分布随机选择一个单词。这种方法可以增加生成的多样性,但是可能会导致生成的文本不连贯和无意义。
  • Beam Search:维护一个大小为 k 的候选序列集合,每一步从每个候选序列的概率分布中选择概率最高的 k 个单词,然后保留总概率最高的 k 个候选序列。这种方法可以平衡生成的质量和多样性,但是可能会导致生成的文本过于保守和不自然。

以上方法都有各自的问题,而 top-k 采样和 top-p 采样是介于贪心解码和随机采样之间的方法,也是目前大模型解码策略中常用的方法。

top-k采样

在上面的例子中,如果使用贪心策略,那么选择的 token 必然就是“女孩”。

贪心解码是一种合理的策略,但也有一些缺点。例如,输出可能会陷入重复循环。想想智能手机自动建议中的建议。当你不断地选择建议最高的单词时,它可能会变成重复的句子。

Top-k 采样是对前面“贪心策略”的优化,它从排名前 k 的 token 中进行抽样,允许其他分数或概率较高的token 也有机会被选中。在很多情况下,这种抽样带来的随机性有助于提高生成质量。

top-k 采样的思路是,在每一步,只从概率最高的 k 个单词中进行随机采样,而不考虑其他低概率的单词。例如,如果 k=2,那么我们只从女孩、鞋子中选择一个单词,而不考虑大象、西瓜等其他单词。这样可以避免采样到一些不合适或不相关的单词,同时也可以保留一些有趣或有创意的单词。

下面是 top-k 采样的例子:

通过调整 k 的大小,即可控制采样列表的大小。“贪心策略”其实就是 k = 1的 top-k 采样。

下面是top-k 的代码实现:

import torch
from labml_nn.sampling import Sampler# Top-k Sampler
class TopKSampler(Sampler):# k is the number of tokens to pick# sampler is the sampler to use for the top-k tokens# sampler can be any sampler that takes a logits tensor as input and returns a token tensor; e.g. `TemperatureSampler`.def __init__(self, k: int, sampler: Sampler):self.k = kself.sampler = sampler# Sample from logitsdef __call__(self, logits: torch.Tensor):# New logits filled with −∞; i.e. zero probabilityzeros = logits.new_ones(logits.shape) * float('-inf')# Pick the largest k logits and their indicesvalues, indices = torch.topk(logits, self.k, dim=-1)# Set the values of the top-k selected indices to actual logits.# Logits of other tokens remain −∞zeros.scatter_(-1, indices, values)# Sample from the top-k logits with the specified sampler.return self.sampler(zeros)

假设我们要补全 “The sun rises in the…(太阳升起在…)” 这个句子。那么,在没有 top-k sampling 的情况下,模型会将词汇表中的每个 token 都视为可以放置在序列之后的可能结果。然后,就会有一定的概率写出一些荒谬的内容,比如“The sun rises in the refrigerator.(太阳升起在冰箱里)”。通过进行 top-k sampling ,模型会筛选这些真正糟糕的选择,只考虑前 k 个最佳 token。通过截断大部分糟糕的 token,我们会失去一些内容多样性,但是内容的质量会大幅提高。

总结一下,top-k 有以下有点:

  • 它可以根据不同的输入文本动态调整候选单词的数量,而不是固定为 k 个。这是因为不同的输入文本可能会导致不同的概率分布,有些分布可能比较平坦,有些分布可能比较尖锐。如果分布比较平坦,那么前 k 个单词可能都有相近的概率,那么我们就可以从中进行随机采样;如果分布比较尖锐,那么前 k 个单词可能会占据绝大部分概率,那么我们就可以近似地进行贪心解码。
  • 它可以通过调整 k 的大小来控制生成的多样性和质量。一般来说,k 越大,生成的多样性越高,但是生成的质量越低;k 越小,生成的质量越高,但是生成的多样性越低。因此,我们可以根据不同的任务和场景来选择合适的k 值。
  • 它可以与其他解码策略结合使用,例如温度调节(Temperature Scaling)、重复惩罚(Repetition Penalty)、长度惩罚(Length Penalty)等,来进一步优化生成的效果。

但是 top-k 也有一些缺点,比如:

  • 它可能会导致生成的文本不符合常识或逻辑。这是因为 top-k 采样只考虑了单词的概率,而没有考虑单词之间的语义和语法关系。例如,如果输入文本是“我喜欢吃”,那么即使饺子的概率最高,也不一定是最合适的选择,因为可能用户更喜欢吃其他食物。
  • 它可能会导致生成的文本过于简单或无聊。这是因为 top-k 采样只考虑了概率最高的 k 个单词,而没有考虑其他低概率但有意义或有创意的单词。例如,如果输入文本是“我喜欢吃”,那么即使苹果、饺子和火锅都是合理的选择,也不一定是最有趣或最惊喜的选择,因为可能用户更喜欢吃一些特别或新奇的食物。

因此,我们通常会考虑 top-k 和其它策略结合,比如 top-p。

top-p采样

top-k 有一个缺陷,那就是“k 值取多少是最优的?”非常难确定。于是出现了动态设置 token 候选列表大小策略——即核采样(Nucleus Sampling)。

top-p 采样的思路是,在每一步,只从累积概率超过某个阈值 p 的最小单词集合中进行随机采样,而不考虑其他低概率的单词。这种方法也被称为核采样(nucleus sampling),因为它只关注概率分布的核心部分,而忽略了尾部部分。例如,如果 p=0.9,那么我们只从累积概率达到 0.9 的最小单词集合中选择一个单词,而不考虑其他累积概率小于 0.9 的单词。这样可以避免采样到一些不合适或不相关的单词,同时也可以保留一些有趣或有创意的单词。

下图展示了 top-p 值为 0.9 的 Top-p 采样效果:

top-p 值通常设置为比较高的值(如0.75),目的是限制低概率 token 的长尾。我们可以同时使用 top-k 和 top-p。如果 k 和 p 同时启用,则 p 在 k 之后起作用。

下面是 top-p 代码实现的例子:

import torch
from torch import nnfrom labml_nn.sampling import Samplerclass NucleusSampler(Sampler):"""## Nucleus Sampler"""def __init__(self, p: float, sampler: Sampler):""":param p: is the sum of probabilities of tokens to pick $p$:param sampler: is the sampler to use for the selected tokens"""self.p = pself.sampler = sampler# Softmax to compute $P(x_i | x_{1:i-1})$ from the logitsself.softmax = nn.Softmax(dim=-1)def __call__(self, logits: torch.Tensor):"""Sample from logits with Nucleus Sampling"""# Get probabilities $P(x_i | x_{1:i-1})$probs = self.softmax(logits)# Sort probabilities in descending ordersorted_probs, indices = torch.sort(probs, dim=-1, descending=True)# Get the cumulative sum of probabilities in the sorted ordercum_sum_probs = torch.cumsum(sorted_probs, dim=-1)# Find the cumulative sums less than $p$.nucleus = cum_sum_probs < self.p# Prepend ones so that we add one token after the minimum number# of tokens with cumulative probability less that $p$.nucleus = torch.cat([nucleus.new_ones(nucleus.shape[:-1] + (1,)), nucleus[..., :-1]], dim=-1)# Get log probabilities and mask out the non-nucleussorted_log_probs = torch.log(sorted_probs)sorted_log_probs[~nucleus] = float('-inf')# Sample from the samplersampled_sorted_indexes = self.sampler(sorted_log_probs)# Get the actual indexesres = indices.gather(-1, sampled_sorted_indexes.unsqueeze(-1))#return res.squeeze(-1)

       top-p sampling 与 top-k sampling 非常相似,只是它使用可能性分数(likelihood scores)而不是 token 排名(token ranks)来决定应保留哪些 token。更具体地说,它只考虑那些可能性分数超过阈值 p 的排名靠前的 token,而将其余的 token 丢弃。
       与 top-k sampling 相比,top-p sampling 的优势在有许多较差或平庸的序列后续词时就会显现出来。 例如,假设下一个 token 只有几个比较好的选择,却有几十个只是隐约挨边的选择。如果我们使用 k=25 的 top-k sampling(译者注:k 代表的是保留的 token 数量) ,我们将考虑许多较差的 token 选择。相比之下,如果我们使用 top-p sampling 来过滤掉概率分布中最底层的 10%(译者注:将 token 的可能性概率从大到小排序,只保留从概率最大开始、累积概率之和达到 90%为止的 tokens),那么我们可能只需要考虑那些分数较高的 token,同时过滤掉其他的 token。
       在实际应用中,与 top-k sampling 相比,top-p sampling 往往能够获得更好的效果。 它能够更加适应输入的上下文,并提供更灵活的筛选。因此,总的来说,top-p 和 top-k sampling 都可以在非零的 temperature 下使用,以较低的质量成本获取输出内容的多样性,但 top-p sampling 通常效果更好。

Temperature采样

Temperature 采样受统计热力学的启发,高温意味着更可能遇到低能态。在概率模型中,logits 扮演着能量的角色,我们可以通过将 logits 除以温度来实现温度采样,然后将其输入 Softmax 并获得采样概率。

越低的温度使模型对其首选越有信心,而高于1的温度会降低信心。0温度相当于 argmax 似然,而无限温度相当于均匀采样。

Temperature 采样中的温度与玻尔兹曼分布有关,其公式如下所示:

 有机器学习背景的朋友第一眼看到上面的公式会觉得似曾相识。没错上面的公式跟 Softmax 函数 :

很相似,本质上就是在 Softmax 函数上添加了温度(T)这个参数。Logits 根据我们的温度值进行缩放,然后传递到 Softmax 函数以计算新的概率分布。

上面“我喜欢漂亮的___”这个例子中,初始温度T = 1,我们直观看一下 T取不同值的情况下,概率会发生什么变化:

通过上图我们可以清晰地看到,随着温度的降低,模型愈来愈越倾向选择”女孩“;另一方面,随着温度的升高,分布变得越来越均匀。当 T =50

时,选择”西瓜“的概率已经与选择”女孩“的概率相差无几了。

通常来说,温度与模型的“创造力”有关。但事实并非如此。温度只是调整单词的概率分布。其最终的宏观效果是,在较低的温度下,我们的模型更具确定性,而在较高的温度下,则不那么确定

下面是 Temperature 采样的代码实现:

import torch
from torch.distributions import Categoricalfrom labml_nn.sampling import Samplerclass TemperatureSampler(Sampler):"""## Sampler with Temperature"""def __init__(self, temperature: float = 1.0):""":param temperature: is the temperature to sample with"""self.temperature = temperaturedef __call__(self, logits: torch.Tensor):"""Sample from logits"""# Create a categorical distribution with temperature adjusted logitsdist = Categorical(logits=logits / self.temperature)# Samplereturn dist.sample()

联合采样(top-k & top-p & Temperature)

通常我们是将 top-k、top-p、Temperature 联合起来使用。使用的先后顺序是 top-k->top-p->Temperature。

我们还是以前面的例子为例。

首先我们设置 top-k = 3,表示保留概率最高的3个 token。这样就会保留女孩、鞋子、大象这3个 token。

  • 女孩:0.664
  • 鞋子:0.199
  • 大象:0.105

接下来,我们可以使用 top-p 的方法,保留概率的累计和达到 0.8 的单词,也就是选取女孩和鞋子这两个 token。接着我们使用 Temperature = 0.7 进行归一化,变成:

  • 女孩:0.660
  • 鞋子:0.340

接着,我们可以从上述分布中进行随机采样,选取一个单词作为最终的生成结果。

大模型文本生成——解码策略(Top-k & Top-p & Temperature) (zhihu.com)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言学习过程总结(18)——指针(6)

一、数组指针变量 在上一节中我们提到了&#xff0c;指针数组的存放指针的数组&#xff0c;那数组指针变量是什么呢&#xff1f; 显而易见&#xff0c;数组指针变量是指针 同样类比整型指针变量和字符指针变量里面分别存放的是整型变量地址和字符变量地址&#xff0c;我们可以…

元宇宙VR数字化艺术展降低办展成本

元宇宙AI时代已经来临&#xff0c;越来越多人期待在元宇宙数字空间搭建一个属于自己的虚拟展厅&#xff0c;元宇宙虚拟展厅搭建平台是VR公司深圳华锐视点为企业研发的可编辑工具&#xff0c;那么元宇宙虚拟展厅搭建平台有哪些新突破? 元宇宙虚拟展厅搭建平台采用了先进的web3D…

Navicat:设置mysql数据库表的主键为uuid

文章目录 1 问题描述2 解决方案3 其他方法 1 问题描述 当我使用Navicat新建表test_table之后&#xff0c;想通过导入向导将excel表中的数据导入到表test_tab中&#xff0c;由于没有excel表中没有主键对应的字段&#xff0c;导致导入失败&#xff0c;提示Field id doesnt have …

利用二分法求方程在某个范围内的根

问题描述&#xff1a; 利用二分法求方程在&#xff08;-10,10&#xff09;的根。 方法&#xff1a;先求出两端点的中点&#xff0c;然后将中点带入方程中检查是否等于0&#xff0c;如果等于0说明找到了根&#xff0c;如果大于0&#xff0c;说明根在左半部分&#xff0c;将rig…

自学rabbitmq入门到精通

交换机的fault &#xff08;发布与订阅模式&#xff09; 因为消息是由生产者发送给excahnge&#xff0c;exchange发送给队列&#xff0c; 然后由队列发送给消费者的。 展示使用图形化界面使用fanout模式。 创建交换机 然后创建三个队列&#xff0c;绑定对应的交换机&#xff…

速通Markdown基础写法(含安装Typora)

什么是Markdown Markdown是一种轻量级标记语言&#xff0c;它允许人们使用易读易写的纯文本格式来编写文档&#xff0c;然后转换成格式丰富的HTML页面。这种语言吸收了很多在电子邮件中已有的纯文本标记的特性。 Markdown的语法简洁明了、学习容易&#xff0c;而且功能比纯文…

学成在线_视频处理_视频转码不成功

问题 当我们用xxljob进行视频处理中的转码操作时会发现视频转码不成功。即程序会进入下图所示的if语句内。 问题原因 在进行视频转码时程序会调用Mp4VideoUtil类下的 generateMp4方法&#xff0c;而result接收的正是该方法的返回值。那么什么时候generateMp4方法的返回值会…

【3D reconstruction 学习笔记 第二部】

三维重建 3D reconstruction 4. 三维重建与极几何三角化&#xff08;线性解法&#xff09;三角化&#xff08;非线性解法&#xff09;多视图几何极几何极几何约束基础矩阵估计 5. 双目立体视觉重建6. 多视图重建7. SFM 系统设计8. SLAM系统设计 4. 三维重建与极几何 三角化&…

机器人路径规划:基于霸王龙优化算法(Tyrannosaurus optimization,TROA)的机器人路径规划(提供MATLAB代码)

一、机器人路径规划介绍 移动机器人&#xff08;Mobile robot&#xff0c;MR&#xff09;的路径规划是 移动机器人研究的重要分支之&#xff0c;是对其进行控制的基础。根据环境信息的已知程度不同&#xff0c;路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或…

蓝桥杯单片机快速开发笔记——特训2 按键的长按与短按

一、题目要求 在CT107D单片机综合训练平台上&#xff0c;通过I/O模式编写代码&#xff0c;实现以下功能&#xff1a; 系统上电后&#xff0c;关闭蜂鸣器、继电器和全部指示灯&#xff0c;数码管显示初始值为28&#xff0c;仅显示数码管最右边两位。利用定时器0实现10ms间隔定…

美摄科技剪同款SDK解决方案全面升级

视频内容已成为企业宣传、品牌塑造和市场营销的重要载体。然而&#xff0c;如何快速、高效地制作出高质量的视频内容&#xff0c;成为摆在众多企业面前的一大难题。针对这一挑战&#xff0c;美摄科技凭借深厚的技术积累和创新能力&#xff0c;推出了全新的剪同款SDK解决方案&am…

如何注册 onlyFans? onlyFans 如何订阅教程

一、onlyFans 介绍 OnlyFans 是一个在线平台&#xff0c;允许创作者为他们的内容提供订阅服务&#xff0c;通常是成人内容或独家内容。该平台于2016年成立&#xff0c;起初被认为是一个用于演员、模特、艺术家和其他创意行业从业者分享内容的地方。随着时间的推移&#xff0c;O…

21 OpenCV 直方图均衡化

文章目录 直方图概念均衡的目的equalizeHist 均衡化算子示例 直方图概念 图像直方图&#xff0c;是指对整个图像像在灰度范围内的像素值(0~255)统计出现频率次数&#xff0c;据此生成的直方图&#xff0c;称为图像直方图-直方图。直方图反映了图像灰度的分布情况。 均衡的目的…

全国农产品价格分析预测可视化系统设计与实现

全国农产品价格分析预测可视化系统设计与实现 【摘要】在当今信息化社会&#xff0c;数据的可视化已成为决策和分析的重要工具。尤其是在农业领域&#xff0c;了解和预测农产品价格趋势对于农民、政府和相关企业都至关重要。为了满足这一需求&#xff0c;设计并实现了全国农产…

摘录笔记——2024年3月20日

这位大佬介绍的技术PM方面心得&#xff0c;有一定的启发意义&#xff08;虽说我现在只是搬砖的&#xff0c;跟PM还有一定差距&#xff09;&#xff0c;现在摘录出来作为记录&#xff1a; 一文聊聊我理解的技术PM作为技术同学&#xff0c;不仅要写好自己的代码&#xff0c;做好…

OpenAI 首席执行官Altman透漏GPT-5最新细节

关注文章底部的公众号,获取每日AI最新新闻 获取每日资讯 Altman透漏GPT-5细节 在最近的一次采访中,美国知名播客 Lex Friedman 邀请 OpenAI 首席执行官 Sam Altman 进行专访。在 Altman 眼中 GPT-4 还是很糟糕的,他预计 5 和 4 之间的差值将与 4 和 3 之间的差值相同。具体…

时代教育期刊投稿发表

《时代教育》是由成都传媒集团主管主办&#xff0c;中华人民共和国新闻出版总署批准国内公开出版发行的专业教育类期刊&#xff0c;主要刊登各类高等院校、职业技术学校、中小学教师及研究生、教育科研工作者的教育实践研究成果&#xff1b;教育教学行业的最新动态&#xff1b;…

Python爬虫案例-爬取主题图片(可以选择自己喜欢的主题)

2024年了&#xff0c;你需要网络资源不能还自己再慢慢找吧&#xff1f; 跟着博主一块学习如何利用爬虫获取资源&#xff0c;从茫茫大海中寻找那个她到再妹子群中找妹子&#xff0c;闭着眼睛都可以找到合适的那种。文章有完整示例代码&#xff0c;拿过来就可以用&#xff0c;欢迎…

【智能算法】多元宇宙优化算法(MVO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2016年&#xff0c;Mirjalili 等人受到宇宙膨胀理论启发&#xff0c;提出了多元宇宙优化算法(Multi-verse Optimization, MVO)。 2.算法原理 2.1算法思想 MVO基于宇宙膨胀的原理&#xff0c;利用…

python 教你如何创建一个自定义库 colorlib.py

目录 Colorlib 生成代码 模块代码 导入测试 测试一 测试二 应用测试 颜色列表 colorList 随机颜色元组 randcolorTuples 随机颜色字串 randcolorStrings Color类测试 测试一 测试二 题外话 Colorlib 有没有碰到过这样的场景&#xff1a;写代码时想要用上丰富的色…