当前位置: 首页 > news >正文

temperature top-p

如果你经常使用大模型,那你肯定见过temperature和top_p这两个参数。比如在google studio聊天界面,你就可以找到设置这两个参数的地方,这里是temperature,这里就是top_p。除了聊天界面之外,它们也经常会在大模型api的入参中出现,比如chatgpt的入参中就有它们俩的身影。但它们到底到底是什么?temperature是温度,大模型还分冷热?top_p这又是什么神秘代码?有些细心的同学可能会去查一查,然后就得到了答案,这俩都是用来控制大模型回答的随机性的。

temperature和top_p越高,回答就越随机,越有创造力;越低就越确定,越保守。


看到这,很多同学可能觉得已经明白了,原来是控制随机性的。等等,你真的明白了吗?为什么越高越随机,越低越稳定?而且如果它们控制的都是随机性,为什么还需要两个参数?试想一下,如果我们把一个调高,再把另外一个调低,结果会中和吗?还是说它们是从两个完全不同的维度来影响模型的输出?今天我们就彻底揭开这两个黑盒子,用最直白的例子让你一眼看懂它们是怎么影响大模型选词的。
不过想要准确的了解它们,我们得先稍微花点时间研究一下大模型的工作原理,看看它到底是如何回答问题的。只有弄懂了原理,你才知道这两个参数到底是应用在了哪个环节。虽然大模型的内部结构比较复杂,但它执行的核心任务其实非常朴素,那就是预测下一个最有可能出现的词。


我们可以把这个预测过程拆解为三个关键步骤:生成分数、转换概率、加权采样。

在我们讲完了这三步,弄明白大模型的工作原理之后,我们再来看看这两个参数的作用。没错,这五部分就构成了我们今天文章的全部内容,跟随我的脚步,让我们彻底搞明白这两个参数的功能。

• 首先来看第一步:生成分数。让我们来看一个具体的例子,这里我们假定用户的问题是:可以给我推荐一个讲ai的技术频道吗?这个时候大模型就会把它所认识的词全部给扫一遍,然后给每个词都打个分。比如说分数最高的词可能是这些,每个词的分数我也标在旁边了。打分过程比较复杂,好在跟我们今天所讲的内容没什么关系,你可以暂且忽略,只需要知道每一个词都有个分数就好了。
顺便提一嘴,这个分数在ai领域还有一个专门的术语叫做logits,不过这个单词可能过于专业了,一看都不知道是什么意思,所以在这个文章里面我们还是叫它们分数。

另外要强调的是,大模型会给它所认识的所有词打分,分词的总数量大概是在几万到几十万左右。为了方便展示,我们这里只显示分数最高的前五个,其余的全部省略。

• 分数是拿到了,下一步模型的任务就是从这些词中选出一个最合适的输出。怎么选?一个简单的想法就是谁分高我们就选谁。按照这个规则,大模型下一个要输出的词就是马克了,毕竟他的分数是最高的。输出马克之后,他会把马克放到输入里面,没错,现在模型的输入中不仅有问题,还有我们所生成的部分答案。

在这之后,模型会再次把所有的词都打个分,这次排在前几名的词有这些,大模型再取其中最高的,也就是“的”,然后再把“的”这个词放入到输入中,再打分,再选。大模型会不停的重复这个流程,逐个输出每一个词,直到输出了一个特殊的结束标识符为止。

此时大模型就知道该停下来了,因此最后我们得到的完整回答就是:马克的技术工作坊。


看起来好像很完美的样子,或者真的很完美吗?试想一下,谁的分高我就选谁,而打分的逻辑又是基本固定的,那对于这个用户问题来说,大模型的最终输出就几乎一定是马克的技术工作坊了,不管你问多少遍都一样。虽然马克的视频很优秀,但是我们也得给别的频道一个机会。
比如我们回到选第一个词的时候,此时仅排在马克后面的这几个词其实也都挺合适的,毕竟很多技术频道就是以科技或者是AI开头,所以我们还是要给这些词一些机会的。但问题来了,给多大机会?我们选择马克的概率是多少?选择科技的概率又是多少?我们现在只有分数,没有概率,所以我们下一步的工作就是把分数转换为概率,让模型按照概率来预测下一个词。


提到转换概率,我们就不得不提一下大名鼎鼎的softmax函数,它就是专门用来把分数转换为概率的。它长这样,看起来有点复杂,对吧?各种e,各种求和符号,是不是有点上数学课的感觉?别担心,这个公式其实使用起来非常的简单。它这里面的z_i代表的就是第i个词的分数,k代表的是词的总量,而这个输出值就代表第i个词的概率了。


让我用具体的例子来给大家演示一下。为了简化整个计算流程,我们假设大模型的整个词汇表里面只有刚才那五个词,他们对应的分数我也显示在这里了。这些分数可以分别用z1到z5这五个符号来表示。在只有五个词的情况下,k就等于五,此时我们就可以把softmax函数的分母展开,这样看得更清楚一些。
下面我们把z1到z5这五个分数带入到公式中,算出每一个词的概率。比如说这是第一个词马克的输出概率计算公式,最终结果是36%。这个是科技的计算过程,结果是32%


我们刚才算出了每个词的输出概率,马克是36%,科技是32%,AI是26%,它们形成了一个三足鼎立的局面。而自行车和hello虽然概率很低,但依然存在一点点被选中的可能性。到这里,生成概率的这一步就算是结束了。

• 有了概率之后,我们要做什么?对,我们要根据概率来生成下一个预测的值。用现在屏幕上的例子来说,我们就是要保证输出马克的概率是36%,输出科技的概率是32%,以此类推。我们一般称这个通过概率来生成预测值的过程为加权采样,没错,下面我们就来到这个文章的第三部分了。

• 首先我们把每个词以及对应的输出概率展示在屏幕上。概率有了,怎么才能做到根据这些概率来输出?很简单,我们可以用一个数轴来举例。我们只关注从0到100这段区间就行,然后看一下我们之前给每个词算的概率,马克的输出概率是36%,我们就给它分配0到36这段区间。科技的概率是32%,我们就给它分配随后的长度为32的这段区间。以此类推,后面的词也都这么分配,一直到我们把每一个词都放在这个数轴上。
然后我们生成一个0到100的随机数,这个随机数落到了哪个区间就选择哪个数字。比如说随机数是8,落到了这个区间,我们就选择马克。如果随机数是60,落到了这个区间,我们就选择科技。这个就叫做给每一个词分配与概率相等的机会,这样的模型可能有时候会输出马克,有时候会输出科技,这样的回答既合理又充满了变化和新鲜感,是不是很完美?


相信大部分同学到这里都会点点头,确实很完美,看起来大模型的原理就都讲完了。但是temperature和top_p在哪里?好像模型的整个输出过程都没有涉及到这两个变量吧?其实它们一直都在,只不过为了让大家能够一眼看透核心逻辑,我刚才把这两个参数都设为了默认值,也就是让它们暂时处于隐身状态,不对结果产生干扰。为什么要这么做?因为如果一开始就把所有变量都塞进来的话,这个文章估计就没法看了,太复杂了。
但现在既然大家已经掌握了大模型的骨架,我们就把这两个参数给填进去,看看它们到底是怎么起作用的。现在我们就来到文章的第四部分,先来看看temperature是用来干什么的。temperature与我们之前讲过的softmax函数密切相关,所以我们首先回顾下softmax函数,它长这样,应该还记得吧?这个其实并不是它最完整的样子,它最完整的样子是这个样的。它跟我们之前公式的区别就在于所有的z_i值都会先除以T,再加入到整体的运算过程中,这里面的T就是temperature。只不过我们把T设为1的话,它就变成了我们一开始讲的那个版本了。


如果T不是1,我们把T调大或者是调小,会对结果有什么影响吗?当然有。简单来说,T可以改变不同词的概率差距。这句话可能一时半会难以理解,没关系,我们来试着把T调小和调大,看看最后的结果会发生什么变化。

• 首先回顾下T=1时的分数和概率等信息。先看分数,我们用z_i来表示分数,然后是z_i除以T的值,由于T=1,所以这一列的值与z_i相同。然后是Softmax(z_i),也就是根据z_i除以T所算出的概率,其实这个值我们之前都算过了,我们把它也显示在这里,这个就是T=1的情况了。

• 下面让我们先看一下把T调低会发生什么,比如让T=0.1。首先代表分数的z_i肯定还是不变的,而z_i除以T那就不一样了,它现在是T=1的时候的10倍。注意看,原本马克只比科技这个词高出了0.1分,差距微乎其微,但是经过temperature的放大,他们现在的差距变成了1分。


你可能会说才差1分,那也不大呀?别忘了Softmax里面还有一个e这样的指数在等着呢,在指数的世界里面线性的差距会被疯狂的放大。经过计算,这个时候的概率分布会变成什么样子?首先是马克,他的概率大概是71%,相比原来T=1时的36%有了显著的上升。而科技现在是26%,比原来的32%要低一些。AI变成了可怜的4%,这就降的太多了,根本就不能跟之前的26%相比。而剩下两个词的概率就太小了,接近于0,基本上已经没有了输出的可能性。


所以总结下,除了马克这个词的概率有了显著上升之外,别的词的概率全部都在下降,可以说现在马克占据了绝对的统治地位,因此最后输出马克的可能性就大了太多了。所以当我们调低了T的值之后,高分值和低分值的差距就会拉大,这通常会造成一种赢家通吃的局面,此时模型的回答会变得保守、稳定,甚至有点死板,因为他会只盯着那个分最高的词看。
再来看看把temperature调高会发生什么,比如说是2.0。照例还是这些词,z_i的值也没有变化,但是z_i除以T的结果就变成了原来的一半,毕竟除以2的嘛。经过这么一除,大家的分数都变小了,原本马克和自行车的巨大差距现在也被缩小了。这一缩不要紧,经过Softmax计算之后,概率分布发生了剧变。
马克由T=1时的36%降到了现在的30%,科技是降到了28%,AI这个词倒没有什么变化,跟T=1的时候差不多。而自行车和hello这两个词则分别是涨到了9%和7%左右。所以总结下,这个时候原本第一名的优势已经不再明显了,而像自行车和hello这样的“差生”现在也分到了一大块蛋糕。


这说明当我们调高了T值之后,词语之间的差距就会减小,输出的机会也更加趋于均等,因此输出值也就更加的多样化。毕竟现在各个词之间的概率差距太小了,就连hello这个离谱的词都有比较大的被选中的概率。
讲到这里,你可能会恍然大悟,难怪这个参数叫temperature,这名字起的太贴切了。我们可以回想一下,物理课上的知识,在低温的状态下,物质的分子运动是迟缓的,安静的,就像是水结成了冰,结构稳固,一切都是确定的,也就是低温稳定。而到了高温状态,分子吸收了能量,开始剧烈活动,到处乱窜,变得混乱且不可预测,也就是高温活跃。大模型也是一样,低温让他冷静理智,高温让他热情奔放。
temperature我们已经搞懂了,那么top_p又是干什么的?既然temperature已经能够控制随机性了,那为什么还要top_p这个备胎?下面我们就来讲今天的最后一个话题:top_p。要解答这个问题,我们就必须回到之前的采样环节。在这个环节中,我们根据每一个词的概率给他们分配了对等的区间,然后生成了一个随机数,随机数落到哪个区间就输出哪个区间的值,这样回答就会变得多种多样。
但是隐患也就在这里,虽然自行车只有3%的概率,但只要你试的次数足够多,或者是运气足够好,大模型最后还是很有可能输出自行车这三个字的。那你就可能看到大模型这样回答:自行车的维修与保养。这个不是胡说八道吗?这跟AI频道有什么关系?


大模型的词汇表里面有几十万个词,除了头部的几个合理词,后面基本上都是拖着长长的一串低概率的垃圾词,我们管这些词叫做长尾词。比如在我们这个例子中,自行车和hello就是与用户输入毫无关系的长尾垃圾词。为了防止模型去选这些长尾词,我们需要一个“保安”把这些离谱的选项都拦在门外,这个时候top_p就出场了。
top_p的全称是Top Cumulative Probability,也就是最高累加概率。这个p指的就是一个概率阈值,它的逻辑是:我要从第一名开始往下数,只要是凑够了p这么大的概率,门内的词就留下,门外的长尾词不管有多少个通通不要。
比如说我们可以将top_p设为0.9,此时我们保留的就是马克、科技和AI这几个词,后面的词全部丢掉。丢弃后,模型会把头部这三个词的概率按比例重新放大,让它们加起来重新等于100%,然后再进行我们之前所说的数轴采样环节,从中抽取一个最终的赢家。

让我们再回到五个候选词的情况,我们刚才用top_p=0.9为例,给大家讲了top_p的应用流程。那我问个问题,如果我们把top_p设为0.6呢?没错,那保留的就是马克和科技这两个词了,这下连AI都不会考虑在内了,最后的获胜者就只会从马克和科技这两个词里面选。看懂了吗?top_p就像是一个动态的“入围门槛”,它主要用来切断尾部的那些不靠谱的长尾词,保证回答不跑题。


到这里,我们终于把这两个参数彻底拆解完了,我们来做一个最终的总结。

• 首先是temperature,当我们调低temperature的时候,每个词的差距会被拉大,赢家通吃,输出相对更加稳定。当我们调高temperature的时候,每个词的差距会缩小,机会会趋于均等,输出也更加随机与多样。

• 而对于top_p而言,调低这个值会去掉长尾垃圾词,只保留头部,这样输出更趋于稳定。而调高它会放宽门槛,兼容并包,输出更加随机与多样。
所以总结起来就是,这两个参数值越大,输出就越多样,这比较适合写小说,做头脑风暴等需要发散的情况。而值越小,输出就越稳定,这比较适合写代码,做数学题等需要严谨的情况。
虽然无论是temperature还是top_p,调高都会让输出更加多样,而调低都会让输出更加稳定,但是你可以看到它们的原理其实是不一样的,所带来的效果也会有着微妙的区别。temperature控制的是不同词的概率差距,而top_p控制的是长尾词的概率阈值。


具体要调整哪个,怎么调,这个还是得根据具体的情况甚至具体的模型而定。比如说OpenAI就建议只调其中一个就够了。

http://www.jsqmd.com/news/1068092/

相关文章:

  • AI Agent 面试题 794:Agent的评估中的多轮对话质量评估方法
  • 软件|Navicat Premium16 免费安装配置教程(附安装包)
  • 简谈循环神经网络(RNN)以及现代变体
  • Linear自动化_linear-automation
  • 奥迪 AUDI 案例:母品牌和新业务怎么拆?
  • 山东大学软件学院项目实训:基于AI大模型的智能考研助手(五)
  • C# Binary读写流 / BufferedStream缓存流 全套笔记
  • PyTorch Tensor 完全指南:从基础概念到高级操作实战
  • 微信 iPad 协议登录认证与鉴权机制深度解析
  • 己所不欲勿施于人
  • 多源BFS最短路---矩阵 | 飞地的数量 | 地图中的最高点 | 地图分析
  • C语言学习笔记20260519—如何判断输入的自然数是否为素数
  • OpencvSharp 算子学习教案之 - Cv2.DrawContours 重载1
  • 3A分子筛乙醇脱水的实验装置设计方案
  • 2026年第一、二季度最新最全热门网站建设工具全面对比评测
  • SpringCloud Alibaba Sentinel 限流+熔断完整实战教程
  • 电阻、电容、电感,二极管、三极管、mos管
  • 江科大PWM笔记:呼吸灯、舵机控制、电机调速
  • Linux 实时优化的端到端延迟:从中断到任务执行的全链路优化
  • 2026山东大学软件学院创新项目实训(团队——6)
  • 山东大学项目实训6月20日
  • 【编号317】西安城市边缘区土地利用数据
  • 计算机毕业设计之取保候审人员管理系统设计与实现
  • (一)站稳脚:用Scikit-learn跑通第一条Pipeline
  • SQL必知必会——使用游标
  • 【Springboot毕设全套源码+文档】基于springboot蛋糕店线上预订销售系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • TAP/TUN与自定义网络协议栈
  • c#软件开发学习笔记--Winform窗体第二期
  • NAT导致视频监控平台无法拉取视频流故障一例
  • 上下文窗口、KV Cache 与长上下文问题