苦猿的大模型日记 · Day08 · GPT 预训练到底怎么烧钱-帮普通人把AI学进简历系列前言GPT 干的事跟手机输入法没本质区别我先说一句可能让你不爽的话——GPT 干的事跟你在手机上打字时输入法联想下一字没本质区别。都是同一件事给一段前文猜下一个词。你打今天天气真好我们去输入法给你弹出公园 / 散步 / 吃饭。GPT 干的也是这事——只是它把这事练了 5000 亿遍。听起来很low 对吧这么low的事凭啥撑起一个万亿市值答案是——GPT 不是算法突破是规模突破。同一个 next-token prediction参数从百万堆到千亿语料从几本书堆到整个互联网堆着堆着涌现就来了——它突然会写代码、会做数学题、会跟你聊哲学了。Day07 我埋了个钩子——Decoder 赢了舞台聚光灯BERT 仍守着企业落地的后厨。BERT 是完形填空双向看一句话猜中间被盖住的词。GPT 是接龙单向看前文猜下一个词。方向上的这点差异最终决定了——谁站在聚光灯下谁守在后厨。今天就把这半句补完。读完 Day08你能——搞懂 next-token prediction 的数学机制不再停留在它就是预测下一个词的字面理解手算交叉熵损失知道模型是怎么知道自己猜得准不准的理解 Scaling Law为啥它是 LLM 时代的摩尔定律参数越多模型越聪明看懂 KV Cache这一招是怎么把 GPT 生成速度翻几十倍的这四个概念是 LLM 工程师面试时的四件套——少一个都聊不踏实。PART 01Next-token prediction——GPT 在干的就这一件事把生成这两个字拆开看每一步都只是——给前文预测下一个词的概率分布。注意——不是预测下一个词是预测下一个词的概率分布。这两个说法差一个字理解上差十万八千里。一个具体例子全程贯穿输入今天天气真好我们去GPT 不是直接吐出公园两个字。它在最后一位的位置上给词表里每一个词都打了一个分——{ 公园: 0.45, 散步: 0.20, 吃饭: 0.10, 玩: 0.05, 逛街: 0.04, ... (剩下几万个候选词瓜分剩下的 0.16) }这一串分数加起来 1.0这就是概率分布。模型最终吐哪个词取决于你怎么采样——贪心采样永远取最高那个 → 一定是公园但每次生成结果都一样写文章特别死板temperature 采样调高低概率词的相对权重 → 偶尔选散步、偶尔选玩有创造力top-p 采样只在前 N% 累积概率的候选词里挑 →既有变化又不离谱这就是为啥同一个 prompt 多次生成结果不一样——因为概率分布不是确定答案是给所有候选词打分。跟 Day07 BERT 的根本差异维度BERT (MLM)GPT (next-token)预测方向双向看前后猜中间单向只看前猜后训练目标完形填空接龙天然适合理解型任务分类、NER生成型任务对话、写文章能做生成吗不能逻辑上不成立这就是它干的事BERT 不能做生成的根本原因——生成是一个一个往后吐的过程每一步只能基于已生成的前文。BERT 的双向机制允许它看到未来但这未来还没生成呢逻辑上就崩了。所以 GPT 的 Masked AttentionDay06 PART 06 讲过那个三角掩码不是设计缺陷是生成的必要条件——强迫模型只能看前面跟边写边读的生成动作天然契合。用 PyTorch 看一眼 logits 长啥样光说不练假把式。看看 next-token prediction 在代码里是什么样——import torch import torch.nn.functional as F # 假设我们已经有了一个训好的 GPT 模型和 tokenizer # 这里只看 forward 的关键部分 input_ids tokenizer(今天天气真好我们去, return_tensorspt).input_ids # 模型 forward with torch.no_grad(): outputs model(input_ids) # outputs.logits 形状: [batch_size, seq_len, vocab_size] # 最后一位的 logits就是预测下一个词的原始分数 next_token_logits outputs.logits[0, -1, :] # 形状 [vocab_size] # 把原始分数转成概率分布 probs F.softmax(next_token_logits, dim-1) # 看一下 top 5 候选词 top5 torch.topk(probs, k5) for score, idx in zip(top5.values, top5.indices): print(f{tokenizer.decode(idx):6} {score.item():.3f}) # 公园 0.450 # 散步 0.200 # 吃饭 0.100 # 玩 0.050 # 逛街 0.040outputs.logits这一位长得像[1, 序列长度, 词表大小]——最后那一维就是给每个候选词打的分。softmax把分数压成概率加起来 1。topk取最高那几个。整个 GPT 生成就这三行代码的循环。是不是有点反高潮就这么个事堆到 1750 亿参数就变成了 ChatGPT。金句GPT 不是在想它只是在算下一个词的概率——但算得足够准看起来就像在想。PART 02交叉熵损失——模型怎么知道自己猜得准不准PART 01 留了个问题——模型给公园打了 0.45 的分它怎么知道该把公园的概率往高拉答案是——靠 loss 数字。模型不会猜对/猜错自我反省它只会看一个数字这一位的预测跟真实答案差多远。这个数字就叫loss具体是交叉熵损失Cross-Entropy Loss。从概率分布到 loss——一步步手算模型预测的概率分布之前那个例子真实答案公园 模型预测{公园: 0.45, 散步: 0.20, 吃饭: 0.10, ...}loss 这么算——第一步取出正确答案那个词的概率。这里是 0.45。第二步取负对数。-log(0.45) ≈0.80第三步这个数就是这一位的 loss。loss 0.80完事。整个交叉熵就这三步——取出真实答案的概率取负对数结束。为啥用负对数直接用概率不行吗为啥要绕一圈取对数还加个负号因为概率有个反直觉的特性——模型给真实答案的概率-log(概率)含义0.990.01模型非常自信且猜对了 → loss 几乎 00.450.80模型半信半疑猜对了 → loss 0.800.102.30模型很没底气但猜对了 → loss 2.300.014.60模型几乎不认为这是答案结果就是 → loss 爆炸看出来了吗——概率越接近 1-log 越接近 0概率越接近 0-log 趋向无穷大。这就是交叉熵的核心机制——它不在意你猜对没猜对它只在意你对正确答案有多自信。猜对但很虚0.45→ loss 0.80模型被罚。猜对且很自信0.99→ loss 0.01模型被奖。猜错还特别自信给错答案 0.99→ loss 直接爆炸。训练就是反复调权重让 loss 一路往下走。一个反直觉点loss 不是错多深是对自己的正确答案有多不自信。0.45 的概率哪怕猜对了loss 还是 0.80——因为模型不够自信。这才是 loss 的真面目。新人常把它理解成模型错了多少这是误解——模型哪怕每次都猜对只要不够自信loss 还是高。训练的目标不是猜对是对每一个正确答案都极度自信。用代码验证一遍import torch import torch.nn.functional as F # 模型预测的 logits假设词表只有 5 个词 # 真实顺序[公园, 散步, 吃饭, 玩, 逛街] logits torch.tensor([[2.0, 1.5, 0.5, -0.5, -1.0]]) # 真实答案是 公园对应 index 0 target torch.tensor([0]) # 用 PyTorch 的交叉熵 loss F.cross_entropy(logits, target) print(floss {loss.item():.4f}) # 手算验证 probs F.softmax(logits, dim-1) print(f公园 的概率 {probs[0, 0].item():.4f}) print(f-log(prob) {-torch.log(probs[0, 0]).item():.4f}) # 输出 # loss 0.8028 # 公园 的概率 0.4483 # -log(prob) 0.8028完全一致。PyTorch 内部就是干了 softmax 取负对数这两件事。跟 Day07 BERT 微调的 loss 曲线对上号还记得 Day07 PART 05 那条 loss 曲线吗——Epoch 1: train_loss0.32 Epoch 2: train_loss0.14 Epoch 3: train_loss0.08现在能翻译成人话了——0.32≈ 模型对正确答案的平均概率是73%0.14≈87%0.08≈92%loss 从 0.32 跌到 0.08本质就是模型对正确答案的自信度从 73% 爬到了 92%。这就是为啥训练要看 loss——它是模型自信度的实时温度计。金句loss 不是错多深是对自己的答案有多不自信——训练就是把这份不自信一点点磨掉。PART 03Scaling Law——为啥参数越多越聪明LLM 时代的摩尔定律next-token prediction 懂了交叉熵懂了——那一个新问题来了——凭啥同一个算法参数堆到千亿就突然涌现出会写代码的能力这个问题OpenAI 在 2020 年用一篇论文给出了答案——Scaling Law缩放定律。这篇论文是 LLM 时代真正的开山论文——比 Attention Is All You Need 还决定方向。为啥这么说Attention 那篇是 2017 年提出了 Transformer 架构但当时没人知道Transformer 大数据能不能换来大智能——它只是个架构。Scaling Law 是 2020 年第一次把算力、数据、参数跟模型 loss的数学关系画了出来——告诉所有人只要堆就能预测它变多强。三个变量一个幂律Scaling Law 涉及三个变量——CCompute算力训练用的 FLOPs跟 GPU 数量 × 训练时间成正比DData数据训练 token 数量NParameter参数量模型大小OpenAI 用大量实验拟合出一条幂律——loss ∝ 1 / N^α参数越大 loss 越低loss ∝ 1 / D^β数据越多 loss 越低loss ∝ 1 / C^γ算力越多 loss 越低α、β、γ 都是 0.05-0.1 之间的小数——幂律指数很小意味着回报是渐进的不是爆发式的。但幂律有个可怕特性——可预测。OpenAI 拿小模型做实验就能外推出大模型训完后的 loss 是多少。这就是为啥 GPT-3 敢直接上 1750 亿参数——因为他们提前算好了这个规模训完 loss 能压到某个值能力会上一个台阶。为啥这事震撼了整个 AI 圈Scaling Law 之前AI 圈的主流信仰是——算法突破才能让模型变强。新架构、新损失函数、新优化器、新 trick——大家都在等下一个灵感时刻。Scaling Law 之后信仰被改写——算法没那么重要肯堆就行。这句话把 AI 从灵感驱动变成了工程驱动。OpenAI 押注堆规模赌赢了整个时代。三个反直觉点反直觉 1小模型上不去不是它笨是它小。同样算法、同样数据参数从 1 亿堆到 100 亿能力就解锁了。很多人觉得小模型不够聪明是因为算法不行——不是是因为它没堆到那个量级。反直觉 2涌现现象Emergence。某些能力多步推理、in-context learning、指令遵循在某个参数量级之前几乎没有过了阈值突然出现——不是渐变是阶跃。就像水温从 99°C 到 100°C看着只差 1 度但相变就发生在这一度。GPT-3 论文里那张图最经典——几位数加法任务模型从 10 亿参数到 100 亿参数准确率几乎没动从 100 亿到 1000 亿突然从随机水平飙到 90%。这就是涌现。反直觉 3数据质量 数据数量Chinchilla 定律。DeepMind 在 2022 年发了 Chinchilla 论文对 Scaling Law 做了一个关键修正——训练数据量跟参数量要匹配盲目堆参数效率低。之前大家以为参数越大越好Chinchilla 证明——每个参数应该看大约 20 个 token。GPT-3 是 1750 亿参数看了 5000 亿 token配比失衡其实训得不够饱。Chinchilla 用 700 亿参数 1.4 万亿 token反而打败了 GPT-3。这就是为啥后来 Llama、Qwen、DeepSeek 都疯狂堆数据质量——清洗一亿条高质量数据比加一亿参数更值。钱的视角——GPT-3 那 460 万美金买了啥把规模感拉满——模型参数量训练数据训练成本训练硬件Day05 LSTM230 万IMDb 25K 条0 元笔记本 CPUDay06 mini-Transformer600 万IMDb 25K 条0 元笔记本 CPUDay07 BERT-base1.1 亿ChnSentiCorp 7.6K 条微调0 元笔记本 GPUBERT-base预训练1.1 亿33 亿词1 万美金4 张 TPU v3GPT-215 亿40GB 文本5 万美金32 张 TPU v3GPT-31750 亿5000 亿 token460 万美金上万张 V100GPT-4估算1.8 万亿MoE13 万亿 token1 亿美金上万张 A100看出来了吗——每往前走一格钱和资源都是 10-100 倍地涨。这就是为啥普通人不能自己训 GPT——烧不起那个钱。但 Scaling Law 也给普通人留了车别灰心——Scaling Law 的另一面是大厂烧了几千万美金替你预训练好的模型开源出来你拿来微调就行。Llama 3、Qwen 2.5、DeepSeek-V3——这些模型单训一个都是几千万到亿级美金。你拿来微调GPU 时租几块钱。这就是 2026 年做 AI 的标准姿势——别人烧钱预训练你蹭车微调。金句Scaling Law 把 AI 从灵感艺术变成了工程科学——你不信它你就跟不上这个时代。PART 04KV Cache——推理加速的命脉同一段前文别算两遍next-token prediction 懂了Scaling Law 也懂了——那 next-token prediction 在工程上有啥命门命门就在一个一个往后吐这件事本身——每生成一个新词模型都得把整段前文重新算一遍。痛点具象化假设你现在让 GPT 生成一篇文章输出 1000 个 token。朴素的做法是这样——生成第 1 个词forward(输入) → 词1 生成第 2 个词forward(输入 词1) → 词2 生成第 3 个词forward(输入 词1 词2) → 词3 ... 生成第 1000 个词forward(输入 前999个词) → 词1000看出来了吗——生成第 100 个词时前 99 个词的 attention 计算跟生成第 50 个词时几乎完全一样——但模型没记忆每次都从头重算。第 1000 个词时前 999 个词被算了 1000 次。这就是为啥朴素 GPT 生成特别慢——算力被重复浪费在已经算过的前文上。延迟具体多少朴素生成 1000 token几十秒到几分钟。KV Cache 是来治这个的核心思想一句话——已经算过的就别算了存起来。回忆 Day06 自注意力的公式——attention(Q, K, V) softmax(Q·K^T / √d) · V每个 token 在每层 attention 里会算出三个向量Qquery、Kkey、Vvalue。KV Cache 干的事——把每个位置算出的 K 和 V 缓存下来下一次 forward 直接复用只算新 token 那一位的 Q/K/V。第 1 次 forward 输入 [词1, 词2, 词3] → 算出 K1 K2 K3 V1 V2 V3 → 缓存 → 输出 词4 第 2 次 forward 输入 [词4] → 算出 K4 V4 → 加进缓存 → K1-K4 V1-V4 复用 → 输出 词5 第 3 次 forward 输入 [词5] → 算出 K5 V5 → 加进缓存 → K1-K5 V1-V5 复用 → 输出 词6每次 forward 的输入只有新那一个 token前面那些 K/V 已经在缓存里了。一个类比就像你看一本书每读一页不需要把前面所有页重新读一遍——你的记忆KV Cache替你存着。Transformer 没有记忆KV Cache 是我们替它造的记忆。加速比有多大推理方式1000 token 延迟加速比朴素 forward无 cache30-60 秒基线KV Cache forward1-3 秒20-50 倍跟 Day07 BERT 那个 ONNX 加速 2-3 倍比KV Cache 加速是几十倍——根本不是一个量级。为啥差这么多因为 BERT 是一次性输入一次性输出本来就没重复计算可省。GPT 是一个一个往后吐重复计算是它的命门省下来就是几十倍。用代码看一眼 API 长啥样HuggingFace 的 GPT 系列模型都支持 KV Cache用past_key_values参数传递——# 第一次 forward无 cache outputs model(input_ids, use_cacheTrue) next_token outputs.logits[0, -1, :].argmax() # 关键拿出 past_key_values past_kv outputs.past_key_values # 第二次 forward只传新那一个 token 上次的 cache next_input next_token.unsqueeze(0) outputs model(next_input, past_key_valuespast_kv, use_cacheTrue) next_token outputs.logits[0, -1, :].argmax() # 更新 cache循环下去 past_kv outputs.past_key_valuespast_key_values是一个嵌套 tuple形状跟层数 × 注意力头数挂钩里面装的就是每层每个头的 K 和 V。第二次起forward 只算新 token速度直接起飞。三个工程坑衔接 Day07 PART 07 踩坑风格坑 1batch_size 不一致导致 cache 失效。线上服务里不同请求长度不齐直接拼 batch 会报错或 cache 错位——要么用 padding 把长度补齐要么用 Continuous BatchingvLLM 那一套。这是为啥生产环境用 vLLM / TGI 这种推理框架而不是直接 HF Transformers——它们的批处理逻辑替你处理了 cache 长度问题。坑 2max_length 撑爆显存。KV Cache 占显存跟序列长度成正比。很多人显存爆了第一反应是模型太大——错了是 cache 太大。公式粗略估算cache 显存 ≈ 2 × 层数 × 隐藏维度 × 序列长度 × batch_size × 字节数。Llama-7B 处理 8K 上下文 batch32cache 显存轻松吃掉 30GB比模型权重还大。长上下文场景显存爆掉的不是模型权重是 cache。坑 3量化对 KV Cache 的影响。FP16 cache → INT8 cache体积砍半吞吐再翻一倍。但代价是——精度可能掉。某些层对 KV Cache 量化敏感掉 1-2 个点 accuracy。这是为啥 vLLM、SGLang 都提供了 KV Cache 量化选项——生产部署的高频取舍。金句Transformer 没有记忆KV Cache 是我们替它造的记忆——没它长文生成就是烧钱游戏。结尾Decoder 不是赢在算法是赢在 Scaling 工程闭环Day07 我说Decoder 赢了舞台聚光灯BERT 仍守着企业落地的后厨。今天讲清楚了——Decoder 不是赢在 next-token prediction 这个算法多神。BERT 的 MLM 和 GPT 的 next-token prediction算法上各有所长。Decoder 赢在押对了堆规模 工程化这条路——敢把参数堆到千亿敢把语料堆到整个互联网配套 KV Cache、Continuous Batching、量化把推理成本打下来整条链路打通才有了今天的 ChatGPT、Claude、Qwen、DeepSeek。简历视角的钩子普通人不需要自己训 GPT——那条路对普通人关死了除非你进了大厂预训练团队。但懂这四件套——next-token prediction交叉熵损失Scaling LawKV Cache面试时聊 LLM 就有底气。这是 LLM 工程师的四件套少一个都聊不踏实。面试官问为啥 GPT 比 BERT 强——你能从算法差异单向 vs 双向聊到 Scaling Law再到 KV Cache 工程加速——这就是普通会调 API的人和真正懂 LLM的人的差距。Day09 预告预训练是地基。但 GPT-3 那个原始版本其实不会跟你对话——它只会接龙。你给它说今天天气真好它可能给你续一句明天也不错而不是回答你的问题。真正让接龙模型变成对话模型的是 SFT 监督微调 RLHF 人类反馈强化学习。Day09 我们进LLM 三段式训练的第二段——SFT——SFTSupervised Fine-Tuning用问题-答案对教模型该回答而不是接龙指令跟随为啥 SFT 后的模型能听懂帮我写一封请假信这种指令LoRA / QLoRA普通人也能跑得起的微调技术单卡微调 7B 模型揭开 ChatGPT 从接龙机器变成对话助手的关键一步。GPT 不是更聪明是更肯堆——堆参数、堆数据、堆算力堆到涌现出现堆到所有人都得跟上。互动时间你面试时被问过为啥 GPT 比 BERT 强这种题吗或者被问过 LLM 相关的什么高频题评论区告诉我Day09 拆 SFT 时会把高频追问写进去。下一篇预告Day09 | SFT 监督微调——把接龙机器变成对话助手— END —苦猿 · 帮普通人把 AI 学进简历