写在前面

许多大模型具有推理参数,用于控制输出的“随机性”。常见的几个是 Top-K、Top-p,以及温度。比如我们常用的 Dify 平台就支持 Top-p 和 温度 的设置:

鼠标放到问号上面,可以看到各自的解释:

Top-p:

  • 含义:Kernel sampling threshold. Used to determine the randomness of the results. The higher the value, the stronger the randomness. The higher the possibility of getting different answers to the same question.
  • 翻译过来就是:核采样阈值。用于决定结果的随机性。值越高,随机性越强。对于同一个问题,得到不同答案的可能性越高。

温度:

  • 含义:The probability threshold of the nucleus sampling method during the generation process. The larger the value is, the higher the randomness of generation will be. The smaller the value is, the higher the certainty of generation will be.
  • 翻译过来就是:在生成过程中,核采样方法的概率阈值。值越大,生成的随机性越高。值越小,生成的确定性越高。

看起来,他们都可以控制模型输出内容的随机性。那么它们有什么不同呢?以及作用机制又有哪些区别呢?本文将一探究竟。

前置知识:LLM 输出概率分布

LLM 通常对一系列 token 进行操作,这些 token 可以是单词、字母或子词单元。操作后得到的 token 集,称为 LLM 的词汇表。

LLM 接收一个输入的 token 序列,然后尝试预测下一个 token。它通过使用 Softmax 函数作为网络的最后一层,为所有可能的 token 生成离散概率分布来实现此目的。这是 LLM 的原始输出。

例如,如果我们的词汇量为 5,则输出可能如下所示(大多数 LLMs 的词汇量显然要大得多):

t0→0.4
t1→0.2
t2→0.2
t3→0.15
t4→0.05

由于这是一个概率分布,因此所有值的总和为 1。一旦我们有了这个概率分布,我们就可以决定如何从中采样,这就是 Top-K 和 Top-p 的作用所在。

小记:Top-K 和 Top-p 是两种不同的采样方法。

Top-K 采样

Top-K 采样的工作原理如下:

  1. 按概率的降序排列token。
  2. 选择前 K 个 token 来创建新的分布。
  3. 从这些 token 中抽取样本。

例如,假设使用上述示例中的 Top-3 策略进行采样。排名前 3 的是:

t0→0.4
t1→0.2
t2→0.2

但是,概率加起来不再等于 1 ,所以必须用前 3 个 token 的总和来进行规一化。我们将每个概率除以 0.4+0.2+0.2=0.8,得到前 3 个 token 的新概率分布:

t0→0.5
t1→0.25
t2→0.25

现在可以通过从中采样来选择一个 token。

如果设置 K=1,那么会得到所谓的贪婪策略,因为总是选择最可能的token。

Top-p 采样

这种策略(也称为核采样,英文通常为 Nucleus sampling 或 Kernel sampling)与 Top-K 类似,但我们不是选择一定数量的 token,而是选择足够多的 token 来“覆盖”由参数 p 定义的一定概率,方式如下:

  1. 按概率的降序排列 token。
  2. 选择最少数量的顶级 token,使得它们的累积概率至少为 p。
  3. 从这些 token 中抽取样本。

例如,假设我们使用 p=0.5 和 top-p 策略进行采样,同样取自上述示例。该过程如下:

  1. 最上面的 token t0 被选中。它的概率是 0.4,我们的累积概率也是 0.4。
  2. 累积概率小于 p=0.5 ,因此我们选择下一个token。
  3. 下一个token t1 的概率为 0.2,现在我们的累积概率为 0.6。
  4. 累积概率至少为 p=0.5 的值,因此我们停止。

结果是只有前 2 个 token 被选中:

t0→0.4
t1→0.2

再次,我们必须通过除以总和 0.4+0.2=0.6 来对概率进行归一化,得到:

t0→0.67
t1→0.33

我们现在可以从该分布中采样,就像之前使用 Top-K 所做的那样。

再次理解核采样的定义

核采样只关注概率分布的核心部分,而忽略了尾部部分。因为它只关注概率分布的核心部分,而忽略了尾部部分。

例如,如果 p=0.9,那么我们只从累积概率达到 0.9 的最小单词集合中选择一个单词,而不考虑其他累积概率小于 0.9 的单词。 这样可以避免采样到一些不合适或不相关的单词,同时也可以保留一些有趣或有创意的单词。

Top-p 值通常设置为比较高的值(如0.75),目的是限制低概率 token 的长尾。

有兴趣的同学可参阅论文“THE CURIOUS CASE OF NEURAL TEXT DeGENERATION”,详细了解核采样。

温度对采样的影响

温度会影响模型输出的“随机性”,其作用与前两个参数不同。虽然 Top-K 和 Top-p 直接作用于输出概率,但温度会影响 Softmax 函数本身,因此需要简要回顾一下其工作原理。

也即:温度影响的环节,更靠前一些。

Softmax 函数接收一个由 n 个实数组成的向量,然后将其标准化为这 n 个元素的离散概率分布,且概率的总和为 1。标准 Softmax 函数定义如下:

\[\sigma(\vec{x})_i = \frac{e^{x_i}}{\sum_{j=1}^{n} e^{x_j}}
\]

该函数应用于输入向量\(\vec{x}\)中的每个元素,以生成相应的输出向量。即:

  1. 指数函数应用于元素\(x_i\)。
  2. 然后将结果值通过所有元素\(x_j\)的指数和进行归一化。这确保了结果值的总和为 1,从而使输出向量成为概率分布。

除了将输出转换为概率分布之外,Softmax还会改变每个元素之间的相对差异。Softmax 函数的效果取决于输入元素的范围\(x_i\):

  • 如果被比较的两个输入元素都是\(x_i\)< 1,那么它们之间的差异就会缩小
  • 如果被比较的元素中至少有一个大于 1,那么它们之间的差异就会被放大。这可以使模型对预测更加“确定”。

这可以使模型对预测更加“确定”。这句话怎么理解呢?

简单理解就是:不同 token 之间的差异越大,那么模型输出时,总是倾向于选择头部 token,自然就表现得更为“确定”。

我们看看这个标准 Softmax函数的输入和输出值,看看相对差异是如何改变的。当输入值小于 1 时,输出值的相对差异会减小:

相反,当某些输入值大于 1 时,它们之间的差异在输出值中会被放大:

我们已经知道,输出值的缩小或放大会影响模型预测的“确定性”。那么,如何控制 Softmax 函数输出的概率分布的“确定性”呢?这就是“温度”参数的作用所在。考虑以下形式的“缩放” Softmax 函数:

\[\sigma(\vec{x})_i = \frac{e^{\frac{x_i}{T}}}{\sum_{j=1}^{n} e^{\frac{x_j}{T}}}
\]

唯一的区别是:指数函数中应用了逆缩放参数 \(\frac{1}{T}\) ,其中 T 定义为温度。让我们考虑 T 对输出的影响:

  • 如果为 0 < T < 1,则 \(x_i\) 输入值与 0 之间的距离会进一步拉大,差异也会被放大
  • 如果为 T > 1 ,则 \(x_i\) 输入值将被推向 0,差异就会减少

让我们再次绘制 Softmax函数的输出,但这次我们将比较 T 的不同值:

可见,温度 T 的值越小,输入值之间的差异就越大。相反,温度 T 的值越大,差异就越小。

还可以考虑极端情况下发生的情况,以更直观地了解温度如何影响输出:

  • 如果是 T 趋近于 0,那么我们将处理极大的指数,因此具有最大值的\(x_i\)元素将占主导地位,即它的概率将接近 1,而所有其他元素的概率将接近 0。这相当于一种贪婪策略,其中始终选择顶部token,非常“确定”。
  • 如果是 T 趋近无穷大 ∞,则指数全部变为\(e^0\)= 1,这会使输出变为均匀分布,即所有概率变为\(\frac{1}{n}\) 。也就是说,所有token的概率都相等。当然,这显然不再是一个有用的模型。

本质上,温度会改变概率分布的形状。随着温度升高,概率差异会减小,从而导致模型输出更“随机”。这表现为 LLM 输出更具“创造性”。相反,较低的温度会使输出更具确定性。

顺便说一句,该参数之所以被称为“温度”,与热力学中的概念有关:在较高温度下,气体或流体的浓度会比在低温下扩散(扩散)得更快。有兴趣的同学可参阅模拟退火中的温度概念,下图引用了 Simulated annealing - Wikipedia 的图片(随着温度的降低,跳跃越来越不随机,最优解也越来越稳定)。

总结

Top-K、Top-p 和温度都是影响生成token方式的推理参数,它们都作用于大模型的输出概率分布。

  • Top-K 和 Top-p 均为采样策略。它们并非特定于 LLMs,甚至根本不特定于神经网络。它们只是从离散概率分布中采样的方法。
  • Top-K 将我们要考虑的特定token限制为一定数量(K)。
  • Top-p 将我们限制在特定的累积概率(p)内。

相比之下,温度的作用方式不同:

  • 温度不是一种采样策略,而是网络最后一层的 Softmax 函数的一个参数。
  • 温度影响概率分布的形状。
  • 高温使 token 概率彼此接近,这使得输出更加随机、“有创意”。
  • 低温通过放大概率差异,这使得输出更加确定。

扩展阅读

LLM中的Top-K/Top-p/温度都是怎么发挥作用的?的更多相关文章

  1. 海量数据处理之top K问题

    题目: CVTE笔试题https://www.1024do.com/?p=3949 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节. 假设目前有一千万 ...

  2. top(k,n)—db kernel队解题思路

    0. 比赛 公司里的第三届XX中间件性能挑战赛 我和另外两个P5组队参加,队名为"db kernel".最后获得了第八,应该是P5里的最高排名. 以下简单扼要地介绍一下题目,以及我 ...

  3. 算法题解:最大或最小的K个数(海量数据Top K问题)

    题目 输入 n 个整数,找出其中最小的 k 个数.例如输入4.5.1.6.2.7.3.8 这8个数字,则最小的4个数字是1.2.3.4. 初窥 这道题最简单的思路莫过于把输入的 n 个整数排序,排序之 ...

  4. 简谈” Top K“

    Top K 快速选择和堆排序都可以求解 Kth Element 和 TopK Elements 问题. 题见215. Kth Largest Element in an Array (Medium) ...

  5. 算法题解:最小的K个数(海量数据Top K问题)

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 题目 输入 n ...

  6. 海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)

    前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小堆比较好一些. 先拿10000个数建堆, ...

  7. 海量数据中找top K专题

    1. 10亿个数中找出最大的1000个数 这种题目就是分治+堆排序. 为啥分治?因为数太多了,全部加载进内存不够用,所以分配到多台机器中,或者多个文件中,但具体分成多少份,视情况而定,只要保证满足内存 ...

  8. 【分步详解】两个有序数组中的中位数和Top K问题

    (这也是一道leetcode的经典题目:<LeetCode>解题笔记:004. Median of Two Sorted Arrays[H] 问题介绍 这是个超级超级经典的分治算法!!这个 ...

  9. pig中查询top k,返回每个hour和ad_network_id下最大两个记录(SUBSTRING,order,COUNT_STAR,limit)

    pig里面是有TOP函数,不知道为什么用不了.有时间要去看看pig源码了. SET job.name 'top_k'; SET job.priority HIGH; --REGISTER piggyb ...

  10. 数组中的第K个最大元素leetcode(Top K的问题)

    在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...

随机推荐

  1. 深度学习基础理论————CV中常用Backbone(Resnet/Unet/Vit系列/多模态系列等)以及代码

    主要介绍在CV中常用的Backbone原理简易代码(代码以及原理经常更新),参考论文中的表格,对不同的任务所使用的backbone如下: 针对上面内容分为两块内容:1.基于卷积神经网络的CV Back ...

  2. 0515-BufferedInputStream缓存输入输出流

    package A10_IOStream; import java.io.*; /* 作为IO流的入门,今天我们见识一些更强大的流.比如能够高效读写的缓冲流,能够转换编码的转换流,能够持久化存储对象的 ...

  3. lxl-北京总结

    这是 lxl 讲课的总结. lxl lxl 讲课水平很高,相较之下,刚高中毕业以及毕业三年的集训队选手讲课水平不佳. 北京时候: 树上问题:学了点分治和 Boruvka,补了若干奇怪题. DP:学了 ...

  4. spring boot配置mybatis-plus

    一.maven配置 <mybatis-plus.version>3.2.0</mybatis-plus.version> <mysql-connector.version ...

  5. ClickHouse 常用语句

    一.常用操作 1.建数据库 连接数据库:clickhouse-client -h 10.0.0.0 --port 9000 -u test_user --password test_password  ...

  6. Luogu P11036 GCD 与 LCM 问题 [ 绿 ] [ 构造 ] [ 数论 ] [ adhoc ]

    Luogu P11036 GCD 与 LCM 问题:梦熊的题真是又神又逆天. 思路 观察到有个奇数的特殊性质,我们尝试从奇数构造入手. 先来尝试带入极端数据,对于 \(\gcd\),我们可以把 \(b ...

  7. Luogu P7250 BalticOI 山峰 题解 [ 蓝 ] [ 模拟 ] [ 并查集 ] [ BFS ]

    Luogu P7250 BalticOI 山峰. 一道大模拟,很暴力,也很难写.建议紫或蓝,标签为模拟.广度优先搜索.并查集. 思路 首先观察到答案取决于路线上的最低点,所以我们可以把所有点的高度丢进 ...

  8. .Net Core3.1 集成Log4net

    1.准备 首先nuget添加下引用  Microsoft.Extensions.Logging.Log4Net.AspNetCore 目前的版本为v3.1.0 ,添加完成后我们开始注册. 2.注册 2 ...

  9. Windows系统安装Ollama超简教程(附DeepSeek R1实战)

    一.Ollama下载指引 官网地址:https://ollama.com/download 选择Windows版本直接下载(推荐64位系统),安装包745MB左右,支持Win10/11系统.点击&qu ...

  10. babel-loader 如何工作? 什么是babel-loader插件? babel-loader插件可以干什么? 如何制作一个babel-loader插件?

    本文会介绍比较基本的编译知识和babel-loader运作原理 babel-loader 是什么? 作为老一派的打包工具, babel-loader 想必大家已经非常熟悉了.它长这样子 // webp ...