深入理解 GPT 大模型
从 Token、Embedding、Attention、KV Cache 到输出预测的全链路拆解。
- AI
- 大模型
深入理解 GPT 大模型:从 Token 到文本生成的全链路解析
在现代自然语言处理领域,大语言模型(LLM)看似是一个神秘的“黑盒”,但如果我们潜入其底层架构,会发现它其实是一条极其严密、优雅的数学与工程流水线。
本文将以一个标准 GPT 模型的架构为例,带你一步步穿透它的大脑,看看一句话是如何变成向量、如何经过千锤百炼的思考,最终预测出下一个词的。
第一阶段:数据的入场与初始化 (Embedding)
1. Tokenization 与查表映射
模型的输入 $X$ 是一段人类语言,但机器只认识数字。我们的首要目标是预测这句话的下一个内容。
- 首先,我们将这句话切分为多个 Token,并转化为数字索引(
idx)。 - 接着,我们通过词嵌入层(
wte,Word Token Embedding),将每一个离散的 Token 转化为一个维度为 $C$(即n_embd)的密集语义向量。 - 工程黑科技: 为了压榨 GPU 的 Tensor Core 算力,我们通常会在初始化时,将
vocab_size向上填充取整到 64 的倍数(padded_vocab_size)。
2. 确定输入维度
此时,我们输入模型的数据维度正式确定为:$(B, T, C)$
- $B$ (Batch):同时输入了几句话(批次大小)。
- $T$ (Time):每句话包含多少个 Token(序列长度)。
- $C$ (Channel):每个 Token 的特征维度(即
n_embd)。
3. 预埋“位置罗盘” (RoPE)
因为 Transformer 天生是“路痴”,我们在初始化模型时,会提前计算好一条长度为我们所能接受的序列长度 10倍 的“旋转角度卷尺”(包含了 cos 和 sin 矩阵),方便后续精准注入位置信息。
第二阶段:模型的心脏 (Transformer Block 内部流转)
数据 $(B, T, C)$ 准备就绪后,开始依次穿过模型的核心——由多层(例如 12 层)Transformer Block 组成的深层网络。每个 Block 内部主要包含两部分:因果自注意力机制 (Causal Self-Attention) 和 多层感知机 (MLP),它们之间由前置归一化 (Pre-Norm) 和残差连接 (Residual Connection) 紧密串联。
1. 注意力机制的精密计算 (Attention)
- 参数初始化: 注意力层内的 $Q$、$K$、$V$ 权重矩阵通常采用均匀分布初始化,并严格限制边界 $s$ 以防止极端值。
- 归一化: 数据 $X$ 首先经过
LayerNorm进行稳压。 - 生成 Q、K、V: * 通过线性映射,生成 Query (查询)、Key (标签) 和 Value (内容)。
- 这里引入了前沿的 GQA (Grouped Query Attention) 机制:$Q$ 分配了
n_head个头,而 $K$ 和 $V$ 只分配了少量的n_kv_head个头,以此大幅节省显存。
- 这里引入了前沿的 GQA (Grouped Query Attention) 机制:$Q$ 分配了
- 维度拆解与注入位置: * 将通道维度 $C$ 拆解为
head和head_dim,此时形状变为 $(B, T, \text{head}, \text{head_dim})$。- 对 $Q$ 和 $K$ 的
head_dim向量分组,乘以预先计算好的cos和sin角度矩阵,完成旋转位置编码 (RoPE) 的注入。 - 交换维度,使形状变为 $(B, \text{head}, T, \text{head_dim})$。
- 对 $Q$ 和 $K$ 的
- 记忆缓存 (KV Cache): 将当前的 $K$、$V$ 追加到历史缓存中。此时取它们的序列长度维度,就能精确知道本次查询涉及多少个新 Token ($T_q$),以及历史累积了多少个 Token ($T_k$)。
- 缩放点积与注意力分数:
- $Q$ 与历史 $K^T$ 做内积运算,此时消掉了
head_dim,得到注意力分数矩阵,形状为 $(B, \text{head}, T_q, T_k)$。这代表了每个当前 Token 对历史所有 Token 的关注度。 - 将分数矩阵乘以内容矩阵 $V$(形状为 $(B, \text{head}, T_k, \text{head_dim})$),得到融合后的特征,形状变为 $(B, \text{head}, T_q, \text{head_dim})$。
- $Q$ 与历史 $K^T$ 做内积运算,此时消掉了
- 组装出厂: (注:此处修正了原总结中的微小形状失误)
- 将结果转置重排,并使用
.view()将所有的头拉平拼接在一起,使形状重新恢复成最初的 $(B, T, C)$。 - 经过最后的线性投影层(
c_proj),完成 Attention 计算。
- 将结果转置重排,并使用
2. 闭门深思 (MLP)
从 Attention 出来的数据,加上原始的 $X$(残差连接)后,再次经过归一化,进入 MLP。
- 在这里,数据维度会被放大 4 倍展开,经过激活函数(如 Squared ReLU)过滤强化后,再压缩回原来的维度 $C$。
- 最终再次与主干道的 $X$ 相加,形成这个 Block 的最终输出 $(B, T, C)$,送入下一层。
第三阶段:从思维到表达 (输出与预测)
当数据走完全部 12 个 Block 后,它已经是一团包含了极其丰富上下文逻辑的思维向量 $(B, T, C)$。
语言翻译机 (lm_head): (注:此处纠正了非线性运算的误解)
- 这团数据进入
lm_head层。这是一个纯线性的全连接层(Linear),它的权重矩阵形状为 $(C, \text{padded_vocab_size})$。 - 经过矩阵相乘,我们得到了形状为 $(B, T, \text{padded_vocab_size})$ 的 Logits(原始得分)。
- 为了防止数值溢出导致训练崩溃,现代大模型通常会在这里加一个 Softcap 操作(平滑截断),将极其庞大的得分限制在一个安全范围内(如 $[-15, 15]$)。
第四阶段:完整的训练与优化循环 (Training Loop)
(注:这部分补全了你未写完的优化器闭环)
模型是如何变聪明的?在训练阶段,模型会进行成千上万次的迭代循环,每次循环严格执行以下五步:
- 前向传播 (Forward): 将题目 $X$ 输入模型,拿到预测得分 Logits。
- 计算误差 (Loss): 拿到标准答案 $Y$(即 $X$ 往后错位一个字的序列),将 Logits 和 $Y$ 一起送入交叉熵损失函数(Cross Entropy)。在这个函数内部,Logits 会被 Softmax 转换为加起来等于 1 的概率,并与正确答案对比,计算出一个误差分数(Loss)。
- 清空旧记忆 (Zero Grad): 通知优化器(如 AdamW 或 Muon)擦除上一次计算的梯度记录。
- 反向传播 (Backward): 调用
loss.backward(),根据微积分链式法则,从后往前算出模型里每一个权重矩阵对这次误差负有多少责任(计算梯度)。 - 更新权重 (Step): 优化器根据算出的梯度,结合动态缩放的学习率(Learning Rate),对模型大脑里的参数进行微调。
就这样,Loss 一点点下降,模型对语言规律的掌握越来越精准。
第五阶段:自回归生成 (Inference / Generation)
当模型训练完毕,进入实战聊天时,我们不再计算 Loss,而是让模型“开口说话”。
- 拿到当前最后一个 Token 面对整个词表生成的 Logits 得分。
- Top-K 截断: 淘汰掉得分排名靠后的废词(将它们的分数设为负无穷),只保留前 K 个最合理的候选词。
- 温度缩放 (Temperature): 根据我们设定的 Temperature 调整分数差距。
- Softmax 概率化与抽奖: 将分数转化为概率分布,然后像转盘抽奖一样(Multinomial),按照概率大小随机抽取出这一个字。
- 自回归拼接: 把刚抽出的这个字,无缝拼接到原来的输入 $X$ 后面,重新扔进模型预测下一个字,直到完成整句话。
结语: 从一句简单的输入,到亿万参数矩阵中的穿梭,再到精准的概率输出。大语言模型并没有魔法,它只是将极其暴力的数学计算与极其精妙的工程架构完美结合。当你能手写并闭眼推演这一切时,你就已经站在了通往通用人工智能(AGI)的基石之上。
留言讨论
0 条留言
正在加载留言...