目 录CONTENT

文章目录

大型语言模型如何选择词汇:Logits、Softmax和采样的实用指南

Administrator
2025-12-14 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

📢 转载信息

原文链接:https://machinelearningmastery.com/how-llms-choose-their-words-a-practical-walk-through-of-logits-softmax-and-sampling/

原文作者:Yoyo Chan


大型语言模型(LLMs)即使在接收到相同的提示词时,也能产生多样化、富有创造性、有时甚至令人惊讶的输出。这种随机性并非缺陷,而是模型从概率分布中采样下一个词元的核心特性。在本文中,我们将分解关键的采样策略,并演示温度(temperature)Top-kTop-p 等参数如何影响输出的一致性创造性之间的平衡。

在本教程中,我们将通过实践方式来理解:

  • Logits如何转化为概率
  • 温度(temperature)、Top-k 和 Top-p 采样的工作原理
  • 不同的采样策略如何塑造模型的下一个词元分布

读完之后,您将理解LLM推理背后的机制,并能根据需要调整输出的创造性或确定性。

让我们开始吧。

How LLMs Choose Their Words: A Practical Walk-Through of Logits, Softmax and Sampling
Photo by Colton Duke. Some rights reserved.

概述

本文分为四个部分:

  • Logits如何转化为概率
  • 温度(Temperature)
  • Top-k 采样
  • Top-p 采样

Logits如何转化为概率

当您向LLM提问时,它会输出一个Logits向量。Logits是模型为其词汇表中每个可能的下一个词元分配的原始分数。

如果模型的词汇表包含 $V$ 个词元,它将为每个下一个词位置输出一个包含 $V$ 个Logits的向量。Logit是一个实数。它通过 softmax 函数转换为概率:

$$
p_i = \frac{e^{x_i}}{\sum_{j=1}^{V} e^{x_j}}
$$

其中 $x_i$ 是词元 $i$ 的Logit,$p_i$ 是相应的概率。Softmax将这些原始分数转换为一个概率分布。所有的 $p_i$ 都大于零,并且它们的总和为 1。

假设我们给模型提供以下提示:

Today’s weather is so ___

模型会考虑词汇表中每个词元作为下一个可能的词。为简化说明,假设词汇表中只有 6 个词元:

模型为每个词元产生一个Logit。这是一个模型可能输出的Logit示例,以及基于Softmax函数的相应概率:

词元 (Token) Logit 概率 (Probability)
wonderful 1.2 0.0457
cloudy 2.0 0.1017
nice 3.5 0.4556
hot 3.0 0.2764
gloomy 1.8 0.0832
delicious 1.0 0.0374

您可以使用PyTorch中的Softmax函数来验证这一点:

根据此结果,概率最高的词元是“nice”。LLM并不总是选择概率最高的词元;相反,它们会从概率分布中采样以产生每次不同的输出。在上述情况下,“nice”出现的概率为46%。

如果您希望模型给出更具创造性的答案,如何更改概率分布,使“cloudy”、“hot”和其他答案出现的频率更高呢?

温度(Temperature)

温度($T$)是一个模型推理参数。它不是模型参数,而是生成输出算法的一个参数。它在应用Softmax之前对Logits进行缩放:

$$
p_i = \frac{e^{x_i / T}}{\sum_{j=1}^{V} e^{x_j / T}}
$$

当 $T<1$ 时,您可以预期概率分布会更具确定性,因为每个 $x_i$ 值之间的差异会被夸大。另一方面,如果 $T>1$,分布会更随机,因为每个 $x_i$ 值之间的差异会被减小。

现在,让我们可视化温度对概率分布的影响:

此代码生成词汇表中每个词元的概率分布,然后根据概率对词元进行采样。运行此代码可能产生以下输出:

以及显示每个温度下概率分布的以下图表:

The effect of temperature to the resulting probability distribution

如果将温度设置为 10,模型可能会产生“Today’s weather is so delicious”这样不合逻辑的输出!

Top-k 采样

模型的输出是输出序列中每个位置的Logits向量。推理算法将Logits转换为实际的词语,或用LLM术语来说,就是词元。

选择下一个词元的最简单方法是贪婪采样(greedy sampling),它总是选择概率最高的词元。虽然高效,但这通常会导致重复且可预测的输出。另一种方法是从Logits推导出的Softmax概率分布中采样词元。然而,由于LLM的词汇量非常大,推理速度会变慢,并且有很小的几率产生无意义的词元。

Top-k 采样在确定性和创造性之间取得了平衡。它不从整个词汇表中采样,而是将候选池限制在概率最高的 $k$ 个词元中,并从中进行采样。位于此 Top-$k$ 组之外的词元被赋予零概率,永远不会被选中。它不仅通过减小有效词汇量来加快推理速度,还消除了不应被选中的词元。

通过过滤掉极不可能的词元,同时仍然允许最合理的词元之间存在随机性,Top-$k$ 采样有助于在不牺牲多样性的情况下保持连贯性。当 $k=1$ 时,Top-$k$ 简化为贪婪采样。

以下是如何实现Top-$k$采样的示例:

此代码修改了前面的示例,将一些词元的Logits填充为 $-\infty$,使这些词元的概率为零。运行此代码可能产生以下输出:

以下图表显示了Top-$k$过滤后的概率分布:

The probability distribution after top-k filtering

您可以看到,对于每个 $k$,恰好有 $V-k$ 个词元的概率为零。在相应的Top-$k$设置下,这些词元永远不会被选中。

Top-p 采样

Top-$k$采样的缺点在于,无论它们集体占了多少概率质量,它总是从固定数量的词元中选择。即使只从概率最高的 $k$ 个词元中采样,也可能允许模型从低概率选项的长尾中选择,这通常会导致输出不连贯。

Top-p 采样(也称为核采样(nucleus sampling))通过根据其累积概率而非固定数量来采样词元来解决这个问题。它选择累积概率超过阈值 $p$ 的最小词元集,有效地为每个位置创建了一个动态的 $k$ 值,以过滤掉不可靠的尾部概率,只保留最合理的结果。当模型尖锐且集中时,Top-$p$产生的候选词元较少;当分布平坦时,它会相应地扩展。

将 $p$ 设置得接近 1.0 会接近从所有词元中完全采样。将 $p$ 设置为一个非常小的值会使采样更加保守。以下是如何实现Top-$p$采样的方法:




🚀 想要体验更好更全面的AI调用?

欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。

0

评论区