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调小和调大看看最后的结果会发生什么变化。• 首先回顾下T1时的分数和概率等信息。先看分数我们用z_i来表示分数然后是z_i除以T的值由于T1所以这一列的值与z_i相同。然后是Softmax(z_i)也就是根据z_i除以T所算出的概率其实这个值我们之前都算过了我们把它也显示在这里这个就是T1的情况了。• 下面让我们先看一下把T调低会发生什么比如让T0.1。首先代表分数的z_i肯定还是不变的而z_i除以T那就不一样了它现在是T1的时候的10倍。注意看原本马克只比科技这个词高出了0.1分差距微乎其微但是经过temperature的放大他们现在的差距变成了1分。你可能会说才差1分那也不大呀别忘了Softmax里面还有一个e这样的指数在等着呢在指数的世界里面线性的差距会被疯狂的放大。经过计算这个时候的概率分布会变成什么样子首先是马克他的概率大概是71%相比原来T1时的36%有了显著的上升。而科技现在是26%比原来的32%要低一些。AI变成了可怜的4%这就降的太多了根本就不能跟之前的26%相比。而剩下两个词的概率就太小了接近于0基本上已经没有了输出的可能性。所以总结下除了马克这个词的概率有了显著上升之外别的词的概率全部都在下降可以说现在马克占据了绝对的统治地位因此最后输出马克的可能性就大了太多了。所以当我们调低了T的值之后高分值和低分值的差距就会拉大这通常会造成一种赢家通吃的局面此时模型的回答会变得保守、稳定甚至有点死板因为他会只盯着那个分最高的词看。再来看看把temperature调高会发生什么比如说是2.0。照例还是这些词z_i的值也没有变化但是z_i除以T的结果就变成了原来的一半毕竟除以2的嘛。经过这么一除大家的分数都变小了原本马克和自行车的巨大差距现在也被缩小了。这一缩不要紧经过Softmax计算之后概率分布发生了剧变。马克由T1时的36%降到了现在的30%科技是降到了28%AI这个词倒没有什么变化跟T1的时候差不多。而自行车和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_p0.9为例给大家讲了top_p的应用流程。那我问个问题如果我们把top_p设为0.6呢没错那保留的就是马克和科技这两个词了这下连AI都不会考虑在内了最后的获胜者就只会从马克和科技这两个词里面选。看懂了吗top_p就像是一个动态的“入围门槛”它主要用来切断尾部的那些不靠谱的长尾词保证回答不跑题。到这里我们终于把这两个参数彻底拆解完了我们来做一个最终的总结。• 首先是temperature当我们调低temperature的时候每个词的差距会被拉大赢家通吃输出相对更加稳定。当我们调高temperature的时候每个词的差距会缩小机会会趋于均等输出也更加随机与多样。• 而对于top_p而言调低这个值会去掉长尾垃圾词只保留头部这样输出更趋于稳定。而调高它会放宽门槛兼容并包输出更加随机与多样。所以总结起来就是这两个参数值越大输出就越多样这比较适合写小说做头脑风暴等需要发散的情况。而值越小输出就越稳定这比较适合写代码做数学题等需要严谨的情况。虽然无论是temperature还是top_p调高都会让输出更加多样而调低都会让输出更加稳定但是你可以看到它们的原理其实是不一样的所带来的效果也会有着微妙的区别。temperature控制的是不同词的概率差距而top_p控制的是长尾词的概率阈值。具体要调整哪个怎么调这个还是得根据具体的情况甚至具体的模型而定。比如说OpenAI就建议只调其中一个就够了。