从 Token 到 Transformer:大语言模型如何训练与生成

大语言模型每天都在回答问题、写代码、总结文档。不过,从输入一句话到收到一段回答,中间究竟发生了什么?Token、Embedding、Attention、训练、推理这些词,又是怎样连在一起的?

这篇文章从一段斯坦福课堂视频出发,按初学者更容易理解的顺序,把这些概念重新组织起来。目标是建立一条能够前后贯通的理解路径:先看模型处理什么,再看它怎样计算、怎样学习,最后理解它怎样生成文字,以及为什么会慢、会占显存、会出错。

视频出处:Dobby(@lesliedqbb)在 X 分享的斯坦福课堂视频,帖子发表于 2026 年 10 月 26 日,视频约 2 小时 35 分钟。本文依据视频英文自动字幕整理,并结合 Stanford CS229 讲义与文末原始论文校对。正文调整了讲解顺序,图示、计算示例和标为“延伸”的内容为补充讲解,不是课堂逐字翻译;配图均为本文绘制。

视频前半段讲语言模型和注意力,约 1:16:47 后转入神经网络基础。阅读本文不需要跟随视频时间线;文末保留回看索引,便于找到对应片段。

1. 先看全貌:模型反复解决什么问题

先考虑最常见的自回归语言模型。它反复做一件事: 根据已经出现的内容,计算下一个 token 的概率分布,再从中选择一个 token。

这个过程不是只有“猜一个词”那么简单。为了做出有用的预测,模型需要在训练中学会利用语法、语义、事实关联、代码结构等大量模式。一个简单的训练目标,可以驱动一个很复杂的计算系统;训练目标本身也不能保证模型掌握的每个模式都正确。

大语言模型的数据流:文字经分词和向量表示进入多层 Transformer,再经词表投影、概率计算和选择得到新 token,新 token 回到上下文。
图1  从文字输入到下一个 token。选中的 token 会加入上下文,供下一轮生成使用。

可以先记住三个不同层次:

  1. 表示 :怎样把文字变成数字和向量。
  2. 计算与学习 :怎样利用上下文产生预测,以及怎样调整参数。
  3. 选择 :拿到候选概率后,具体输出哪个 token。

Tokenizer 主要负责第一层,神经网络与训练处理第二层,解码策略负责第三层。相同模型使用不同解码策略,可能给出不同回答;改变温度并不等于重新训练模型。

下文用 n 表示序列长度,用 d 表示隐藏向量维度,用 V 表示词表。为了便于阅读,部分例子按中文词语展示, 不代表某个真实分词器的切分结果 。

2. 从文字到向量:Token 与 Embedding

2.1. 为什么不直接按完整单词处理

神经网络执行的是数值运算,不能直接把字符串当成矩阵相乘。第一步通常是分词:把文本转成有限词表中的 token 序列,再映射成整数 ID。

Token 可以是完整单词、单词片段、汉字、标点,或者包含前导空格的组合。它不是一个固定的语言学单位。

方案 好处 主要代价
按字符或字节 基本单位较少,容易覆盖输入 相同文字往往需要更长序列
按完整单词 常见词表示紧凑 罕见词、新词、复合词不容易覆盖
按子词 在词表大小与序列长度之间折中 切分不一定符合人的词义边界

例如,一个罕见长词可以拆成几个常见片段。即使模型没有充分见过完整长词,也可能利用片段及其上下文形成有用表示。这是子词方法的一项动机,但不意味着分词器本身“理解了词义”。分词器主要按规则或统计做切分,语义关系主要由后续模型学习。

2.2. 延伸:用一个完整小例子理解 BPE

BPE(Byte Pair Encoding)的一种常见训练方式是:从较小单位开始,统计相邻 token 对的频次,反复合并最高频的对,直到达到目标词表大小或其他停止条件。

假设语料只有 low low lower ,为便于说明,先按字符切分,并禁止跨词边界合并:

阶段 第一个 low 第二个 low lower
初始 l · o · w l · o · w l · o · w · e · r
合并 l + o lo · w lo · w lo · w · e · r
合并 lo + w low low low · e · r

表中的 · 只用于标出 token 边界,不属于原始文本。每个单元格表示同一个词在该步骤的切分结果。

第一步中, l,o 和 o,w 都出现三次;假设按预先约定的并列规则选择前者。合并后, lo,w 成为高频相邻对,再把它合并为 low 。真实分词器还可能使用字节表示、预切分、特殊 token 等机制。

训练得到合并规则后,对新输入分词时通常按已学到的规则与优先级执行, 不是每次收到用户输入都重新统计一遍全语料频次 。子词方法的经典论文是 Neural Machine Translation of Rare Words with Subword Units。

分词器与语言模型有两种不同的“训练”:前者确定词表和切分规则,后者学习神经网络参数。常规流程先确定分词器,再训练语言模型。

2.3. Token ID 只是编号,Embedding 才是可学习的表示

假设一段文本被转换成 [17, 356, 82] 。这些数字只是查表索引。编号 356 不比编号 17“语义更大”,编号相近也不意味着含义相近。

模型维护一张 Embedding 表。假设词表有 50,000 个 token,每个 token 用 768 维向量表示,这张表的形状就是 [50000, 768] 。编号 356 的 token,读取表中对应的一行即可得到向量。向量初始值通常来自随机初始化,随后与其他模型参数一起学习。

这里有一个很重要的前后区别:同一 token 的 初始向量 通常相同,但经过 Transformer 后的 上下文表示 可以不同。“苹果发布了新产品”和“我吃了一个苹果”中的“苹果”,会受到不同周围内容影响。

也不要把向量维度理解成固定的人类标签。我们不能一般性地说“第 1 维表示水果,第 2 维表示科技公司”;有用的信息通常分布在多个维度及其组合中。

3. 神经网络的基本积木:矩阵乘法与非线性

理解注意力之前,先看普通神经网络怎样处理一个向量。最基本的变换可以写为:

a = activation(x W + b)

本文统一按行向量来理解:输入 x 的形状是 [1, d_in] ,权重 W 是 [d_in, d_out] ,偏置 b 是 [d_out] ,输出 a 是 [1, d_out] 。W 与 b 是训练中要学习的参数,激活函数逐元素作用于数值。

只看一个输入数值时,ReLU 就是一个很直观的例子:负数变成 0,正数保持原值,即 ReLU(z) = max(0, z) 。

为什么要加激活函数?如果连续堆叠的全是线性或仿射变换,它们仍然可以合成一个仿射变换。加入非线性后,网络才有能力表达更复杂的关系。GELU、SiLU 等是其他常见激活函数;选择哪一种,还涉及模型效果和实现效率。

MLP(多层感知机)就是多次组合这些运算。Transformer 中常见的一种两层前馈网络可以简写为:

MLP(x) = activation(x W1 + b1) W2 + b2

例如,把一个 768 维向量先映射到 3,072 维,经非线性处理后再投影回 768 维。中间维度较宽,可以提供更丰富的变换空间;这个比例只是示例,并非固定要求。采用 SwiGLU 等门控形式的模型,其具体计算式也会不同。

这时还没有解决跨位置的信息交流。如果对句子中每个 token 独立应用同一个 MLP,“它”对应的向量仍然无法利用前文知道它指谁。我们稍后会用注意力解决这个问题。

4. 训练怎样让参数变得有用

4.1. 从整段文本的概率,拆到每个位置的预测

假设一句话由 x₁ 到 xₙ 组成,概率链式法则允许我们这样分解:

\[ P_\theta(x_1,\ldots,x_n)=\prod_{t=1}^{n}P_\theta(x_t\mid x_{1:t-1}) \]

这里 x_{1:t-1} 的含义是位置 t 之前的所有 token,θ 表示模型参数。这组条件分布定义了模型自己的联合分布 Pθ。链式法则本身是恒等式;模型学习的是对真实数据分布的近似。

把一整段文字作为训练样本时,可以用其已有前缀作为输入,用紧接着的 token 作为目标。训练标签就在原文里,这通常称为自监督学习。

输入位置: <开始>    我      喜欢      学习
预测目标:   我     喜欢     学习     <结束>

4.2. Logits、Softmax 和交叉熵各做什么

网络不会直接输出“学习”两个字。它先为词表中的每个 token 输出一个分数,称为 logit;再通过 Softmax 转成概率。假设只有三个候选,分数是 [2, 1, -1] ,得到的概率约为 [0.705, 0.259, 0.035] 。

如果真实答案是候选 B,损失只取 B 的预测概率,计算 -ln(0.259) ,约为 1.35。给真实答案的概率越低,惩罚越大。

对于一段文本,典型的平均损失是:

\[ \mathcal{L}=-\frac{1}{n}\sum_{t=1}^{n}\log P_\theta(x_t\mid x_{1:t-1}) \]

这就是下一 token 预测中的交叉熵,也可以从最大似然估计得到。训练并不要求每个上下文只能有唯一的合理续写:很多上下文确实有多种可能,模型需要在大量样本上学习这种分布。

一个便于比较的指标是困惑度(Perplexity):使用自然对数且按 token 平均损失时, PPL = exp(loss) 。但不同分词器的 token 粒度不同,因此跨分词器直接比较 token 级 PPL 很容易产生误导;低困惑度也不等于问答一定正确。

4.3. 反向传播、梯度下降与小批次

训练反复执行:取一批数据、前向预测、计算损失、反向传播、更新参数。

反向传播利用链式法则,计算损失对参数的导数。梯度下降再沿着让损失局部下降的方向更新参数。最简单的形式为 θ ← θ − η × gradient ,其中 η 是学习率。AdamW 等优化器会进一步处理梯度与更新尺度。

为了直观看出导数在做什么,考虑只有一个参数的玩具模型:预测 ŷ = w x ,样本是 x = 2, y = 6 ,损失 L = (w x − y)² / 2 。若初始 w = 1 ,预测为 2,损失为 8;梯度 dL/dw = (w x − y)x = -8 。学习率取 0.1,更新后 w = 1.8 ,预测变成 3.6,损失下降到 2.88。

大型网络的导数更复杂,但仍然由这些基础运算的导数按链式法则组合而成。自动微分负责系统地完成计算,并不需要手工为整个模型写一条巨大公式。

如果每次更新都遍历全部训练数据,代价太高,因此通常使用 mini-batch。随机小批次的平均梯度,是整体平均梯度的一种估计。批次太小可能噪声较大、硬件利用率不足;批次变大又会增加显存与同步开销。实际训练还要共同调整学习率和其他参数。

神经网络优化通常是非凸问题。这里不能推导出“梯度下降保证找到全局最优”,也不应把 SGD 的有效性简单归结为“噪声一定能跳出坏的局部最小值”。

5. 注意力:让一个位置利用其他位置的信息

5.1. Q、K、V 是怎样来的

以“把书交给小李,因为他需要参考”为例。处理“他”附近的位置时,模型可能需要利用“小李”等前文信息。注意力提供了一种可学习的信息汇总机制。

对于每个位置的输入向量 h,分别乘上三个权重矩阵:

Q = H WQ      K = H WK      V = H WV

可以暂时把 Query 理解为“当前在找什么”,Key 理解为“每个位置提供什么匹配线索”,Value 理解为“匹配后实际汇入的内容”。三者都是学习出来的向量;Q、K、V 不是人预先填好的问题、关键词和答案。

注意力先计算当前 Query 与各个 Key 的匹配分数,经缩放、遮罩和 Softmax 得到权重,再对 Value 加权求和。示例权重为零点二、零点三、零点五。
图2  单头注意力的计算过程。示例分数与向量为教学构造,不是模型实测数据。

计算可以分成三步:先对 Query 与各个 Key 做点积得到分数;对分数缩放并应用遮罩,随后通过 Softmax 得到权重;最后用权重对 Value 加权求和。

5.2. 手算一次信息汇总

假设某个位置得到的注意力权重是 [0.2, 0.3, 0.5] ,三个 Value 分别为 v1 = [1, 0] 、 v2 = [0, 2] 、 v3 = [2, 2] ,则输出是:

output = 0.2 × [1, 0] + 0.3 × [0, 2] + 0.5 × [2, 2]
       = [1.2, 1.6]

Value 3 的影响更大,但输出并不是把 Value 3 原样复制过来,而是一个加权混合。这个向量还会继续经过输出投影、其他模块和后续层。

标准的缩放点积注意力写为:

\[ \operatorname{Attention}(Q,K,V)=\operatorname{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}+M\right)V \]

这里 dₖ 是 Query 和 Key 的维度,M 是遮罩。若分量近似独立、均值为 0、方差为 1,点积的方差会随维度增长;除以维度的平方根,有助于控制分数尺度,避免 Softmax 过度饱和。这是理解该缩放项的一个经典动机,详见 Attention Is All You Need。

注意力权重描述的是某层、某头中的信息混合比例。把一张注意力图直接当成模型完整的“思考过程”或严格的因果解释,通常超出了这张图能够证明的范围。

5.3. 因果遮罩:不能让模型偷看答案

在自回归语言模型中,位置 t 的表示用于预测位置 t+1,因此可以读取自己以及过去的位置,但不能读取未来位置。

实现时,在注意力分数矩阵的未来位置加上负无穷。经过 Softmax 后,这些位置的权重变成 0。这里说“位置 t 不能看未来”,不意味着它连当前位置的输入 token 也不能读取;真正要避免的是看到尚待预测的目标。

左侧展示下三角因果遮罩,当前位置只能读取自己与过去;右侧展示训练可以同时预测各个已知位置的目标,常规生成则逐步扩展前缀。
图3  训练时所有目标已知,但每一行都通过遮罩限制可见范围;常规生成时则要等待新 token 出现。

这也解释了一个常见疑问: 自回归描述的是概率依赖关系,不意味着训练时必须逐个位置串行计算。 训练时整段真实文本已知,可以在遮罩约束下并行计算多个位置的损失。这种使用真实前缀的训练方式通常称为 teacher forcing。

生成时,新 token 还没确定,后续前缀也尚未确定,所以常规解码需要逐步推进。投机解码等工程方法可以一次验证多个候选,但并不把基础目标改成“所有未来 token 相互独立”。

5.4. 多头注意力与两个不同的 Softmax

多头注意力使用多组不同投影并行计算注意力,再把各头的结果拼接和投影。每个头可以在不同表示空间中汇总信息。把它类比成“不同视角”很有帮助,但“某个头永远专管语法,另一个头永远专管情感”不是架构所保证的分工。

还要区分两处经常遇到的 Softmax:

所在位置 在什么候选之间分配概率或权重
注意力内部 上下文中的各个位置
模型最终输出 词表中的各个 token

它们使用相同类型的数学运算,却承担不同任务。

6. 把积木组合起来:一个 Transformer Block

Attention 负责跨位置汇总信息,MLP 负责对各个位置的表示进一步加工。二者交替堆叠,再配合残差连接和归一化,就构成 Transformer 的主体。

Pre-norm Transformer Block 先归一化并计算注意力,再加回残差;随后归一化并经过 MLP,再加回残差,输出进入下一层。
图4  一种常见的 Pre-norm Transformer Block。位置机制未在模块内部重复画出;不同模型的具体结构会有差异。

这个图对应的简化表达为:

u = h + Attention(Norm(h))
y = u + MLP(Norm(u))

它展示的是一种 Pre-norm 组织方式。原始 Transformer 论文采用的归一化顺序不同;实际模型还可能使用不同激活、门控、注意力变体等设计。

6.1. 残差连接与归一化

残差连接 h + F(h) 让模块可以在已有表示上学习修正。它给信息和梯度提供了更直接的传播路径,有助于深层网络的优化,但不保证任意深度、任意初始化都能稳定训练。

LayerNorm 通常沿每个位置的隐藏特征维度计算均值与方差,先减均值、按标准差缩放,再配合可学习的缩放与偏移。它不是在整篇文章的 token 之间统一做归一化。

RMSNorm 则不减均值,按均方根进行缩放,并通常保留可学习的缩放参数。可以简写为:

RMSNorm(h) = gamma * h / sqrt(mean(h * h) + epsilon)

其中 * 表示逐元素乘法,epsilon 是很小的数值稳定项。不要把 RMSNorm 的分母误写成“减均值后的标准差”,也不要理解成归一化之后每个数都必须处于 0 到 1 之间。

6.2. 延伸:词序怎样进入模型

“狗咬人”和“人咬狗”具有不同含义。除 token 内容之外,模型还需要利用顺序信息。常见方法包括可学习位置向量、正弦位置编码,以及 RoPE(旋转位置编码)。

这里不能把所有做法都概括为“给 Embedding 加一个位置向量”。例如,RoPE 通常对注意力中的 Query 和 Key 应用与位置相关的旋转,使它们的匹配分数能够反映相对位置。具体位置机制与因果遮罩分别承担不同作用,也不能相互混为一谈。

从矩阵形状看,经过多层 Block 后,隐藏表示仍通常为 [n, d] 。最后再通过输出投影变成 [n, |V|] ,使每个位置都能为整个词表打分。生成时通常只需要最后一个有效位置的分数来选出下一个 token。

7. 文本怎样真正生成:自回归与解码

训练阶段调整参数;常规推理阶段通常固定参数,只根据当前上下文计算输出。对话中补充一段资料,可以改变当前上下文及答案,不意味着这段资料已经通过梯度更新写入模型权重。

生成大致分为两个阶段:

  • Prefill :处理已有提示词,建立其上下文表示,并通常建立 KV Cache。提示词的多个位置可以并行处理。
  • Decode :根据最后位置的输出概率选择新 token,追加上下文,再进行下一步。遇到结束标记、停止条件或长度上限时结束。

因此,“模型逐个生成 token”不等于“模型必须逐个读取提示词”。这是两种不同的计算阶段。

7.1. 温度改变的是概率分布

对 logits z 使用温度 τ 后,候选 i 的概率为:

\[ p_i=\frac{\exp(z_i/\tau)}{\sum_j\exp(z_j/\tau)} \]

对于正温度,候选排序不变,但概率的集中程度改变。下方固定三个候选的 logits 为 [2, 1, -1] 。网页版可以拖动滑块观察概率变化,表格列出三个温度下的结果,便于对照和在其他格式中阅读。

温度与候选概率

候选 A70.5%
候选 B25.9%
候选 C3.5%

τ = 1,保留原始分布。数值为教学示例。

温度 候选 A 候选 B 候选 C
0.5 87.9% 11.9% 0.2%
1.0 70.5% 25.9% 3.5%
2.0 54.7% 33.1% 12.2%

温度趋近于零时,在最高分候选唯一等条件下,概率趋向集中于它。工程接口中常把温度 0 约定为贪心解码,但公式本身不能直接除以零。即使采用贪心策略,实际服务也可能因数值实现、并列分数处理等因素而无法保证跨环境逐字复现。

另外,降低温度不能补上模型缺失的知识。它可以让选择更集中,却不保证选择的内容更真实。

7.2. Top-k 与 Top-p

Top-k 保留概率最高的 k 个候选,重新归一化后抽样。Top-p 则保留累计概率达到阈值 p 所需的最小高概率候选集合,再重新归一化后抽样。

例如分布为 [0.50, 0.30, 0.15, 0.05] ,Top-k 的 k=2 保留前两个;Top-p 的 p=0.9 则需要前三个,因为前两个累计只有 0.8。它们控制的是采样候选范围,而不是知识量。1

每步选择局部概率最高的 token,也不保证最终整段序列具有全局最高概率,更不保证它是最有用或最正确的回答。文本生成的目标和评价标准,比单步概率排序更复杂。

8. 延伸:理解性能、显存与上下文长度

8.1. 为什么长上下文计算昂贵

标准稠密注意力需要比较位置之间的两两关系。若 Q 与 K 都有 n 行,匹配分数矩阵就是 [n, n] 。注意力部分的计算量大致为 O(n²d) ;序列长度翻倍,这部分运算大致变成四倍。

这不是整个 Transformer 所有操作的完整复杂度。MLP、QKV 投影等还有自己的计算量;不同阶段、模型宽度和硬件条件下,瓶颈可能不同。也不能把整段 Prefill 的二次成本,直接当成有缓存时单步 Decode 的成本。

8.2. FlashAttention 优化了什么

朴素实现会产生很大的注意力中间矩阵,并在显存中读写。FlashAttention 通过分块与在线计算等方法,减少高带宽显存和片上存储之间的数据搬运,避免完整物化这个巨大矩阵,从而改善实际速度与内存占用。

它仍然可以计算精确的稠密注意力。 减少中间存储与显存读写,不等于把稠密注意力的算术复杂度变成线性。 线性注意力、稀疏注意力等是另外的结构或算法取舍。

8.3. KV Cache 为什么能加速,又为什么占显存

生成下一个 token 时,模型需要利用前面所有位置的信息。如果每生成一步,都把整个前缀重新送进模型,就会重复计算大量历史表示。KV Cache 的做法是: 把各层历史位置已经算好的 Key、Value 留下来,下一步直接复用。

为什么历史结果可以复用?关键是前面介绍的 因果遮罩 :每个位置只能看到自己和更早的位置。对于固定的模型、相同前缀和位置设置,后面追加 token 不会改变前面位置的表示,因此也不会改变它们的 K、V。这里缓存的是 每一层注意力所使用的 K、V ,由该层的输入表示计算得到,并非只保存一次词嵌入。

用一个简化例子串起 Prefill 和 Decode。假设“我”“喜欢”“学习”“数学”分别是一个 token,提示词是“我喜欢”,模型接下来依次选中了“学习”和“数学”:

阶段 本轮送入模型的 token 本轮完成后的 KV Cache 本轮输出用于选择
Prefill 我、喜欢 我、喜欢对应的各层 K、V 第一个新 token:学习
第一次 Decode 学习 追加学习对应的各层 K、V 第二个新 token:数学
第二次 Decode 数学 追加数学对应的各层 K、V 再下一个 token

Prefill 一次处理提示词的所有位置,建立缓存,并用最后一个提示词位置的输出预测第一个新 token。“学习”被选中时,还没有它的 K、V;它在下一轮作为输入经过模型时,才产生自己的 K、V 并加入缓存。

在普通逐 token Decode 的某一层中,新位置 t 先算出自己的 q、k、v,再把新的 k、v 接在该层历史缓存后面。新 q 与所有相关位置的 K 计算匹配程度,得到权重后对 V 加权求和:

\[ K_{\mathrm{cache}}=[K_{\mathrm{past}};k_t],\qquad V_{\mathrm{cache}}=[V_{\mathrm{past}};v_t] \]

\[ o_t=\operatorname{softmax}\!\left( \frac{q_t K_{\mathrm{cache}}^{\mathsf T}}{\sqrt{d_h}} \right)V_{\mathrm{cache}} \]

这里分号表示沿序列长度方向拼接,d_h 是每个注意力头的维度,o_t 是这个头在新位置的注意力输出。各层分别维护自己的缓存;新位置的表示逐层向后传递,最后用于预测下一个 token。

为什么通常不缓存 Q? 历史位置的 Query 用来计算历史位置自己的注意力输出,那些输出已经处理完了。下一步需要的是新位置如何读取历史,因此只需要新 Query,以及历史和当前的 K、V。历史 Q 不参与这次读取,保留它们没有必要。

这是一种 用显存换取速度 的方法。它缓存的是中间向量,不是“模型已经写好的下一句话”,也不是保存最终答案的知识库。修改前缀中的早期 token 时,受影响位置之后的缓存通常需要重新计算,不能直接沿用原来的结果。

普通未压缩 KV Cache 的大小可以粗略估算为:

KV 字节数 ≈ 2 × B × L × n × Hkv × dh × s

其中,2 表示 Key 和 Value 两份;B 是批量大小,L 是层数,n 是缓存长度,Hkv 是 KV 头数,dh 是每头维度,s 是每个元素的字节数。这个估算忽略了分配、元数据等额外开销,也不适用于所有压缩或特殊缓存结构。

假设单请求、32 层、8 个 KV 头、每头 128 维、FP16,缓存 16,384 个 token:

2 × 1 × 32 × 16,384 × 8 × 128 × 2
= 2,147,483,648 字节
= 2 GiB

这还没有包括模型权重、工作缓冲区等占用。增加并发请求时,缓存也会成为重要的资源开销。Grouped-Query Attention 等设计通过减少 KV 头数,在结构上改变这一项成本。

有缓存时,标准稠密注意力每个新 token 仍需读取相关历史 Key、Value。在层数、头数和维度固定时,这部分注意力计算量随缓存长度近似线性增长;KV Cache 避免了重复算历史表示,却不意味着上下文变长后,每步耗时都完全不变。普通自回归 Decode 也仍需逐步选出新 token。可进一步阅读 Hugging Face 的 KV Cache 原理文档。

8.4. 上下文窗口与长期知识不是一回事

模型权重、当前上下文和外部存储,可以粗略理解为三种不同的信息来源:

信息来源 如何影响回答 是否通常在这次对话中更新模型参数
模型权重 提供训练中学到的模式 否
当前上下文 直接参与本次计算 否
检索或工具结果 被引入上下文后参与回答 通常否

上下文窗口的限制不仅涉及显存与计算,还涉及位置机制、训练覆盖、具体模型结构与服务设置。窗口能够容纳一段文字,也不保证模型对其中所有细节都能可靠利用。把上下文摘要压缩得更短,可以节省资源,但摘要本身可能丢失信息。

8.5. 为什么训练大模型昂贵

训练不仅要读取权重进行前向计算,还要反向传播、存储梯度和优化器状态,并处理激活值、设备通信和检查点。模型参数多、训练 token 多、序列长,都会增加不同方面的成本。

因此,在固定预算下,不能只问“模型能做多大”,还需要问“用多少高质量数据训练多久”。Chinchilla 论文系统研究了模型规模与训练数据量的预算分配。它给出的经验规律有实验设定和适用范围,不能作为所有模型、数据和部署目标下的固定配方。

9. 延伸:为什么会幻觉,怎样成为一个助手

9.1. 流畅、可信和正确是不同属性

从训练目标可以理解一部分局限:模型被优化为提高真实训练文本的预测概率,这个目标本身没有附带一个对任意输出都可靠的事实验证器。模型可能学会一种解释或引用的表达形式,却在知识不足时仍生成看似合理的细节。

这不是说模型没有学到知识,也不意味着每一次错误都能归结为同一个原因。训练数据质量、知识覆盖、上下文利用、后续训练和任务设置,都会影响实际表现。

RAG(检索增强生成)的一条思路,是把外部检索到的材料引入生成过程,帮助模型利用可更新、可追溯的信息。但检索可能找错材料,材料本身可能过时,模型也可能误读证据,所以“用了 RAG”仍然不能等同于“答案一定正确”。

9.2. 从基础模型到可用助手

视频重点解释的是语言模型与神经网络基础。完整助手通常还涉及后续训练与系统组件:

环节 主要作用
预训练 从大量数据中学习语言和各种模式
指令微调(SFT) 学习按照指令、问答与对话示例回应
偏好或奖励驱动的训练 进一步调整回答行为和任务表现
检索、工具与应用层 获得外部信息、执行操作、管理上下文

这些环节不是每个模型都采用完全相同的顺序和方法。SFT 等内容可进一步对照 CS229 讲义的后续章节。

提示词之所以有效,是因为它改变了模型当前看到的条件。给出任务、边界、材料和例子,可能让模型更容易形成符合需要的续写;它无法替代缺失知识、可靠证据或适当训练。

10. 怎样把这些概念真正学会

读完后,可以试着完成几个小练习,比记住所有名词更有帮助:

  1. 给出 [2, 1, -1] 三个 logits,手算一次 Softmax,再比较温度为 0.5 和 2 时的结果。
  2. 给出一个包含四个位置的序列,画出因果遮罩,并标明每个位置预测哪个目标。
  3. 用 [0.2, 0.3, 0.5] 的权重和三个二维 Value,重新算一次注意力输出。
  4. 给出 Q、K、V 的矩阵形状,检查为什么 Q 与 K 的转置相乘,会得到一个位置对位置的矩阵。
  5. 用 KV Cache 的估算式,计算上下文翻倍、并发翻倍、KV 头数减半分别怎样影响内存。

如果还不能从文字输入一路解释到下一个 token,可以回到第一张流程图,逐个说明每个箭头上的数据是什么形状、哪些量是参数、哪些量是本次输入计算得到的。能把这条链路讲顺,后续学习模型实现、推理优化和分布式训练会容易许多。

11. 视频出处与回看索引

原帖:Dobby(@lesliedqbb)分享的视频。下列时间均为帖子内视频的位置,部分边界取近似值。

视频位置 内容
00:00—约 09:50 Token、子词、BPE
约 09:50—25:44 概率链式分解、Embedding、Softmax
25:44—35:40 自回归生成、温度、Top-k
35:40—约 38:30 最大似然与语言模型损失
约 38:30—1:16:47 注意力、遮罩、多头、残差归一化及效率
1:16:47—约 1:50 非线性模型、分类损失、梯度下降与 SGD
约 1:50—2:20 神经元、MLP、激活函数和矩阵表示
约 2:20—结尾 残差连接、LayerNorm、RMSNorm,简述卷积

相关官方课堂可对照 Stanford Online 发布的 CS229 Lecture 14: Transformers, In-Context Learning 与 Lecture 7: Neural Networks 1 (Architecture)。它们是相关课程来源入口,本文时间索引以 X 内嵌视频为准。

12. 参考资料

脚注:

1

Hugging Face: Generation strategies,包含贪心解码、采样等策略的说明。本文示例说明数学行为,不对应某个产品的默认参数。

Kumu2026-11-01 Sun 00:00Atom 订阅Generated with Emacs + Org