1 引子:从“字典”到“坐标” 

想象一下,函数 y = f(x) 里的 x 和 y 必须是数字。而我们的“Prompt”(比如“你好”)是一串文字符号。为了让函数能处理它,需要一个步骤:把文字“向量化”

这就像我们在现实世界中把地址(如“南京市鼓楼区XX号”)映射成地图上的经纬度坐标(118.7°E, 32.0°N)。地址是文字,坐标是数字。

输入 → 函数f计算 → 原始分数(Logits) → Softmax转换 → 概率分布 → 采样选择

2 工作流程

2.1 第一步:把输入 x(Prompt)变成数字

当你输入“苹果好吃吗?”,大模型并不会读到笔画,而是会做这三件事:

  1. 分词(Tokenization):先把句子切成一个个最小的语义单元(Token)。例如:["苹果", "好吃", "吗", "?"]

  2. 查表(Embedding):每个Token去一张巨大的“数字地图”里,查找自己对应的向量。这个向量通常是一长串小数,比如 [0.12, -0.56, 0.78, ..., 0.33](可能有几百或几千个维度)。

  3. 打包:整句话就变成了一个向量列表(矩阵)

所以,你输入的 x 实际上是一个矩阵 ,矩阵里的每个元素都是数字 。只不过人类看到的是文字,计算机看到的是这个数字矩阵。

2.2 第二步:函数 f 如何运作(纯数学计算)

现在我们有了输入 x(一堆数字组成的矩阵),接下来把它送入函数 f。这个 f 由几十层甚至上百层“神经元”组成。每一层都在做同一件事:
输出 = 激活函数( 输入 × 权重矩阵 + 偏置 )

  • 输入:上一层的数字结果。

  • 权重矩阵:模型里那几百上千亿个参数,本质上全是小数

  • 激活函数:一个简单的数学公式(比如 ReLU:max(0, x)),用来决定哪些数字被保留。

  • 运算:主要就是矩阵乘法加法

在这个过程中,没有任何“理解”、“思考”或“灵感”。有的只是源源不断的浮点数计算。计算机疯狂地做着 (0.12 * 0.34) + (0.56 * 0.78) ... 这样的运算。

2.3 第三步:把输出 y(数字)变回文字

经过上百层的矩阵乘法后,函数 f 输出了一大堆数字。但这些数字还不是最终的“苹果很好吃”。

  1. 概率分布:最后一层通常会输出一个和字典大小一样的向量,例如 [0.0001, 0.0003, ..., 0.85, 0.01]。这个向量里的每个数字,代表字典里对应那个词的概率。比如,[0.85] 对应的位置是“很”字。(输出所有词的概率

  2. 采样:模型根据这些概率抽一个词(通常是概率最高的那个)。抽到“很”。

  3. 迭代:把“很”加回输入,再跑一遍函数 f,得到下一个词“好”,然后是“吃”。

  4. 反查:最终把 ["很", "好", "吃"] 这些数字索引,通过字典反查回文字“很好吃”。

3 总结:完整的类比表

函数中的要素 大模型中的对应物 它是数字吗?
自变量 x 你输入的 Prompt(如“你好”) 。它被映射为了一个高维向量(浮点数列表)。
函数 f 上百层的 Transformer 网络 。它由权重矩阵(数字)、偏置(数字)、激活函数(数学公式)构成。
因变量 y 模型预测出的 Token 概率分布 。它是几千个概率值(0.0到1.0之间的数字)。
反函数 g(y) 解码器(将概率变成汉字) 。这是最后一步查表映射,将数字索引变回“好”这个文字。

4 极简例子

4.1 设定

  • 字典大小:4个词 ["苹果", "好吃", "很", "吗"],索引分别是 [0, 1, 2, 3]

  • 词向量维度:2维(为了手算简单)

4.2 第一步:输入转换为向量

输入"苹果 好吃 吗":

  • "苹果" → [1, 0]

  • "好吃" → [0, 1]

  • "吗" → [1, 1]

输入 x = [[1,0], [0,1], [1,1]]

4.2 第二步:通过函数f计算

假设函数f对最后一个Token"吗" [1,1] 进行处理,输出原始分数(Logits),长度等于字典大小(4):

# 假设的线性变换:Logits = W × [1,1] + b
# W是一个 4×2 的权重矩阵,b是长度为4的偏置

W = [[2, 0],   # 对应“苹果”的权重
     [0, 2],   # 对应“好吃”的权重  
     [1, 1],   # 对应“很”的权重
     [0, 0]]   # 对应“吗”的权重

b = [0.5, 0.5, 0, -1]

# 计算
Logits = W × [1,1] + b
= [2×1 + 0×1 + 0.5,    # “苹果”的分数
   0×1 + 2×1 + 0.5,    # “好吃”的分数
   1×1 + 1×1 + 0,      # “很”的分数
   0×1 + 0×1 + (-1)]    # “吗”的分数

= [2.5, 2.5, 2, -1]

4.3 第三步:Softmax转换成概率

4.3.1 输出概率

Softmax公式P(i) = e^(logit_i) / Σ e^(logit_j),j从0到3

logits = [2.5, 2.5, 2, -1]

# 计算e^(logit)
e^2.5 ≈ 12.18
e^2.5 ≈ 12.18  
e^2   ≈ 7.39
e^-1  ≈ 0.37

# 求和
sum = 12.18 + 12.18 + 7.39 + 0.37 = 32.12

# 得到概率分布
P(苹果) = 12.18 / 32.12 ≈ 0.379 (37.9%)
P(好吃) = 12.18 / 32.12 ≈ 0.379 (37.9%)
P(很)   = 7.39 / 32.12  ≈ 0.230 (23.0%)
P(吗)   = 0.37 / 32.12  ≈ 0.012 (1.2%)

输出 → 概率分布,最终的输出 y 是:[0.379, 0.379, 0.230, 0.012]。这才是一个标准的概率分布

  • 每个值在0到1之间

  • 所有值的和等于1

  • 模型认为“苹果”和“好吃”的概率最高(各37.9%)

4.3.2 采样选择下一个词

模型会根据这个概率分布来“抽”下一个词:

  • 有37.9%的概率选“苹果”

  • 有37.9%的概率选“好吃”

  • 有23.0%的概率选“很”

  • 有1.2%的概率选“吗”

最常见的方式是贪心采样:选概率最大的(“苹果”或“好吃”)。但如果总选最大的,回复会变得机械。所以现代模型会用温度采样(Temperature Sampling)让低概率词也有机会被选中,增加回答的多样性。

4.4 完整的输入— 输出流程

输入x: "苹果 好吃 吗"
         ↓
    [Token IDs]
    [1, 2, 4]  (假设的ID映射)
         ↓
    [向量化]
[[1,0], [0,1], [1,1]]
         ↓
    [函数f]
    (矩阵乘法)
         ↓
   [原始分数]
    [2.5, 2.5, 2, -1]
         ↓
    [Softmax]
         ↓
输出y: [0.379, 0.379, 0.230, 0.012]
         ↓
    [采样]
         ↓
下一个词: "苹果" 或 "好吃"

4.5 真实模型的输出规模

  • GPT-3:输出是50,257维的概率向量(对应字典中50,257个不同的Token)

  • LLaMA:输出是32,000维的概率向量

  • GPT-4:估计约100,000维

每次生成一个Token,模型都要计算这几十万个概率值,找到最合适的下一个词。这就是为什么大模型生成文本时“一个词一个词往外蹦”。

5 为什么必须输出所有词的概率?

5.1 决策需要完整的选项空间

模型不能直接知道哪个词“最好”,它需要评估字典里的每一个词,才能做出最优选择。就像你选餐厅,必须先浏览所有选项才能决定。

5.2 概率分布承载了不确定性

  • 高概率(如37.9%):模型很确定

  • 低概率(如1.2%):模型不太确定

  • 相近概率(如37.9% vs 37.9%):模型困惑,多个选择都合理

这种“不确定性信息”对后续生成很重要。比如在对话中,概率分布接近时,模型可以生成更多样化的回复。

5.3 训练需要对比

训练时,模型需要知道:

  • 它预测的概率 [0.379, 0.379, 0.230, 0.012]

  • 正确答案(比如应该是“很”)[0, 0, 1, 0]
    通过对比这两个分布,计算损失函数,模型才知道如何调整参数。

5.4 采样需要概率基础

无论是贪心、随机采样还是更复杂的Beam Search,都需要每个词的概率作为决策依据。​​​​​​

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐