文章核心观点 - 文章通过追踪一个具体提示“The capital of France is”在GPT-2 Small模型中的处理过程,详细拆解了大语言模型(LLM)从输入文本到输出下一个token的完整计算管线,揭示了其核心工作原理是纯粹的数值计算,而非基于规则的逻辑判断[1][2][3][4] - 模型的核心能力,如知识存储和逻辑推理,并非通过显式的代码或条件分支实现,而是编码在1.24亿个浮点数组成的权重矩阵中,通过12层Transformer Block的矩阵乘法与非线性变换逐层计算得出最终答案[10][11][12] - 整个处理流程可以类比为一个运行在GPU上的特殊程序:权重是只读的常量数据,每次推理是一次函数调用,输入token序列,输出下一个token的概率分布[12] 模型架构与处理管线 - 管线全景:处理流程可概括为Tokenization(CPU)→ Embedding(GPU)→ 12层Transformer Block(GPU,每层包含Self-Attention和FFN)→ LM Head(GPU)→ 采样,最终输出一个Token ID[19][20] - 数据形态变换:输入文本“The capital of France is”(24字节)经分词变为5个Token ID(如464对应‘The’),再通过Embedding层膨胀为形状为[1, 5, 768]的浮点张量(约15 KB),最终经12层计算后坍缩回一个代表“Paris”的整数Token ID 6342[19][24][29] - 关键参数:GPT-2 Small模型拥有1.24亿个参数,隐藏维度为768,词表大小为50257,采用12层Transformer结构,每层包含12个注意力头[4][26][32][61] 分词与向量化 - 分词(Tokenization):模型使用Byte Pair Encoding(BPE)算法将文本切分为子词单元,GPT-2的词表包含50257个token,分词过程是将字符串映射为整数ID的查表操作,例如“The capital of France is”被编码为[464, 3139, 286, 4881, 318][24][26][27] - 词嵌入(Embedding):将离散的Token ID通过一个形状为[50257, 768]的嵌入矩阵(wte)映射为768维的连续向量,该操作本质上是GPU上的内存聚集(gather)操作,使语义相近的token在向量空间中方向接近[29][32][33] - 位置编码(Positional Encoding):通过一个形状为[1024, 768]的位置编码矩阵(wpe)为每个token的向量注入位置信息,使模型能区分同一token在不同位置的出现,最终输入向量是词嵌入与位置编码的逐元素和[41][42] 注意力机制 - 自注意力(Self-Attention)功能:让序列中每个位置的向量能够“看见”并聚合来自其他位置(主要是前序位置)的上下文信息,以进行语义消歧和关系建模,例如让“is”通过看到“France”和“capital”来明确此处“capital”应取“首都”之义[44][45][69] - 多头注意力(Multi-Head Attention)机制:在每一层,768维的输入被均分给12个独立的注意力头,每个头拥有独立的查询(Q)、键(K)、值(V)投影矩阵(形状均为[768, 64]),并行学习不同的信息路由模式,最后将12个头的输出拼接回768维[49][62][66] - 注意力计算过程:每个头计算Query与所有Key的点积得分,经过缩放(除以√64)和因果掩码(屏蔽未来位置)后,通过softmax归一化为注意力权重,最后对Value进行加权求和得到该头的输出,整个过程是一个可学习的信息路由网络[51][52][54][55] 前馈网络与知识存储 - 前馈网络(FFN)功能:在注意力机制完成跨token信息路由后,FFN对每个位置的向量进行独立的、非线性的加工,负责检索和注入具体的世界知识,是模型参数的主要承载者[71][72] - FFN作为键值查找表:FFN可视为一个写死在权重中的键值记忆表,其计算分为三步:输入向量与W1矩阵([768, 3072])中的3072个“模式”键进行点积匹配;通过GELU激活函数过滤掉不匹配的负分数;将过滤后的分数与W2矩阵([3072, 768])中对应的“知识”值加权求和,注入到输出中[74][75][76][78] - 参数量与知识容量:在GPT-2 Small中,每层FFN的参数量(约4.72M)约为注意力部分(约2.36M)的两倍,12层FFN总计占模型约三分之二的参数,更多的层和更宽的中间维度(如3072 = 768 × 4)意味着更大的知识存储容量[72][75][78] 深层处理与残差流 - 残差连接(Residual Connection)机制:模型主干是一条从嵌入层直通输出层的“残差流”,注意力(Attn)和前馈网络(FFN)每个子层只计算一个增量(delta),并通过残差加法叠加到主干流上,这解决了深度网络中的信息遗忘和梯度消失问题[83][86][89] - 分层加工趋势:研究表明,Transformer的不同层存在粗略的功能分工,浅层(如0-3层)倾向于处理基本语法和局部绑定,中层(4-7层)识别语义结构,深层(8-11层)则富集具体的预测信号,各层增量接力,共同将隐藏状态雕刻成指向目标答案的方向[91][96] - 最终预测的形成:以追踪的句子为例,经过12层变换后,代表“is”的768维向量从仅编码系动词含义,逐步累积了句法、语义关系(“法国-首都”)等信号,最终在词表空间中强烈指向“Paris”的方向[92][96] 输出生成与推理优化 - 语言模型头(LM Head)与采样:只取序列最后一个位置(唯一看过完整上下文)的768维向量,与一个形状为[768, 50257]的LM Head矩阵相乘,得到词表中所有50257个候选token的logits,经softmax转为概率分布,本例中“Paris”以74.67%的概率断崖式领先,最后通过采样(如贪婪解码)确定输出token[98][100][103][106] - 自回归生成:LLM以自回归方式生成文本,每次前向传播只预测下一个token,并将该token追加到输入序列中作为下一步的输入,生成N个token需进行N次串行推理,这导致了推理的“解码(Decode)”阶段[110][111][114] - KV缓存(KV Cache):为避免在解码阶段重复计算已生成token的Key和Value向量,系统将其缓存起来,每一步只需为新token计算Q、K、V,并将新K、V追加到缓存中,此举以显存空间换取计算时间,是提升推理效率的关键,但长上下文会带来巨大的显存压力[118][119] - 批处理(Batching)优化:将多个请求批量处理,使一次从显存搬运的模型权重能被多个输入共享复用,大幅提升GPU计算单元的利用率(算术强度),连续批处理(Continuous Batching)技术进一步允许请求动态进出批次,优化了资源利用和吞吐量[127][130][132] 工程启示与行业洞察 - 模型本质与调试:LLM是一个高维黑箱数值系统,其内部状态虽可获取但难以直接解释,当前可靠的评估方法仍是基于输入输出的行为测试,而非内部状态分析[137][138] - 系统优化方向:在实际部署中,应善用KV缓存和提示词缓存(Prompt Cache)提升性能,将固定前缀(如系统提示)置于输入开头以最大化缓存复用,同时意识到输出token的推理成本远高于输入token[120][140] - 提示词工程本质:提示词工程本质上是操控模型内部数值计算的起点和路径,通过提供示例(few-shot)或指令(system prompt)来影响矩阵乘法的结果走向,而非改变模型本身[141] - 硬件利用瓶颈:在解码阶段,由于每个token的计算量小但需搬运整个模型权重,GPU的瓶颈在于内存带宽而非计算能力,算术强度极低,导致GPU利用率常常不足1%,这是当前推理成本结构(输出token更贵)和优化方向(如批处理)的根本原因之一[116][125][126]
Life of a Token:像调试代码一样看懂大模型如何生成 Token
AI前线·2026-04-17 15:33