从零开始理解大模型(六):训练——70 亿个参数是怎么"学"出来的

举报
AGENT魔方 发表于 2026/04/17 14:15:00 2026/04/17
【摘要】 本文是「从零开始理解大模型」系列第六篇,系列共十篇,从 “下一个词预测” 逐步构建完整的大模型心智模型,每篇均配备可运行代码。本篇聚焦大模型训练,深度解析 70 亿级参数的学习与生成过程,带你掌握大模型的核心训练原理。

专栏1.png

欢迎阅读「从零开始理解大模型」系列 —— 十篇文章,从"下一个词预测"到完整的大模型心智模型。每篇配可运行代码。

* 本系列配套运行代码,可在公众号后台回复“大模型”完整获取。

作者:十一

前五篇讲的是大模型的"身体结构"——Token、Embedding、Attention、FFN 怎么组装在一起。但结构只是骨架,参数才是灵魂

一个刚初始化的模型,所有参数都是随机数。问它 "Thank you very" 后面是什么?完全瞎猜——50257 个 token 概率差不多。训练之后呢?99.2% 的概率输出 "much"。

从随机到精准,中间发生了什么?


一、先说结论

1.png


句话版本:训练 = 喂数据 → 预测 → 算误差 → 调参数 → 重复几万亿次。


二、训练的核心循环

想象你在调一台有 70 亿个旋钮的收音机。目标是调到某个电台(让预测尽可能准),但你不知道每个旋钮该转到什么位置,只能靠试:

  1. 随便拧 —— 给所有旋钮一个随机初始位置
  2. 听一下 —— 用当前参数预测下一个词
  3. 对答案 —— 看预测和真实文本差多远(算 Loss)
  4. 微调旋钮 —— 每个旋钮稍微转一下,方向是让差距变小
  5. 重复 —— 换下一段文本,再来一轮

重复几万亿次。每次只调一点点,但积累下来,70 亿个旋钮就逐渐到了正确的位置。

下面把每一步展开。


三、Loss——“猜得有多离谱”

模型输出 50257 个概率。训练时我们知道正确答案,所以可以量化"猜得有多差"——这个数叫 Loss(损失)

3.1 具体例子

输入 "Thank you very",正确答案是 "much"。

                    随机初始化的模型         训练好的模型
"much" 的概率:         1/50257 ≈ 0.002%     0.992 (99.2%)

3.2 Loss 的计算公式

Loss = -log(P(正确答案))

代入数字:

随机模型:   Loss = -log(1/50257) = 10.8    ← 很大,猜得很离谱
训练好的:   Loss = -log(0.992)  = 0.008  ← 接近 0,猜得很准

为什么用负对数?两个好处:

  • 概率从 0 到 1,取负对数后变成 0 到正无穷——数值范围更适合做优化
  • 猜得越离谱(概率越小),Loss 越大,惩罚力度和"离谱程度"成正比

你不需要记公式,只需记住:Loss 是一个数字,越小越好。训练的目标就是让它不断变小。


四、梯度——“每个旋钮该往哪边转”

知道了 Loss(猜得有多差),下一个问题是:70 亿个参数,每个该往哪个方向调?调多少?

4.1 梯度是什么

回到收音机。你现在 Loss 是 10.8(信号很差)。把某个旋钮稍微往右转一点点,听听 Loss 变了没:

  • 变成 8.3 → 往右转是对的,继续
  • 变成 8.7 → 方向反了,应该往左

梯度就是这个信号:告诉每个参数"往哪个方向调"以及"调多大步"。 数学上,梯度是 Loss 对每个参数的偏导数。但不需要理解偏导数——只要知道它给出了方向和幅度。

4.2 反向传播——从输出往回推

模型的计算方向是:

输入 → Embedding → Layer 1 → Layer 2 → ... → Layer 12 → 输出 → Loss

梯度的计算方向是反过来的

Loss → 输出 → Layer 12 → ... → Layer 2 → Layer 1 → Embedding

从 Loss 出发,通过链式法则,把"该怎么调"的信号一路传回每一层的每一个参数。这叫反向传播(Backpropagation)

就像多米诺骨牌倒着推——Loss 推倒最后一块,连锁反应一路传到第一块。每个参数都收到了自己该怎么调的信号。

4.3 梯度下降——一步一步走下山

有了梯度,就可以更新参数:

新参数 = 旧参数 - 学习率 × 梯度

学习率(learning rate) 是一个很小的数(比如 0.0001),控制每步走多远。太大会跨过最优解来回震荡,太小训练太慢。

整个过程就像在一个 70 亿维的山谷里找最低点:梯度告诉你哪边是下坡,学习率决定每步多远,一步一步走,最终走到(接近)谷底——也就是 Loss 最小的地方。


五、代码实验:亲手训练一个微型模型

GPT-2 太大,没法在笔记本上训练。附件 train_tiny.py[1] 实现了一个微型 Transformer——2 层、4 个头、128 维,在 10 句话上训练,CPU 几分钟跑完。

训练循环的核心只有四行,所有大模型的训练都是这四行

# 1. 前向传播:用当前参数做预测
logits = model(x)

# 2. 算 Loss:预测和正确答案差多远
loss = F.cross_entropy(logits.view(-1, vocab_size), y.view(-1))

# 3. 反向传播:算出每个参数的梯度(该往哪调)
loss.backward()

# 4. 更新参数:沿梯度方向微调一步
optimizer.step()

不管模型有 10 万参数还是 1 万亿参数,训练循环都是这四步。差别只在每一步的计算量。

运行效果

 Step    0: Loss = 83.250  (0.1s)  
  Step   50: Loss = 2.395  (0.5s)  ████████████
  Step  100: Loss = 1.767  (0.8s)  ████████████████
  Step  150: Loss = 1.311  (1.0s)  ████████████████████
  Step  200: Loss = 0.976  (1.3s)  ██████████████████████
  Step  250: Loss = 0.834  (1.7s)  ███████████████████████
  Step  300: Loss = 0.527  (2.0s)  ██████████████████████████
  Step  350: Loss = 0.312  (2.3s)  ███████████████████████████
  Step  400: Loss = 0.263  (2.6s)  ████████████████████████████
  Step  450: Loss = 0.264  (2.8s)  ████████████████████████████
  Step  499: Loss = 0.219  (3.1s)  ████████████████████████████

训练后测试:
  输入: 'The capital of '  →  输出: 'The capital of Italy is Rome.'  ✓
  输入: 'Thank you very'   →  输出: 'Thank you very much for your help.'  ✓

这说明了什么

Loss 从 83.250 降到 0.219——模型从瞎猜变成了能续写训练数据中的句子。前 100 步下降最快(容易的规律先学到),后面越来越慢(难的规律需要更多迭代)。

但它只是在"背课文"——我们只喂了 10 句话,模型记住了这 10 句话的模式。问它训练数据里没有的内容,它就会胡说。

真正的大模型在几万亿个 token 上训练,覆盖了互联网上的海量文本。所以它"记住"的不是具体句子,而是语言的统计规律——语法结构、事实知识、推理模式。数据量的差异,决定了"背课文"和"学会语言"的区别。

完整可运行代码见附件 train_tiny.py,纯 PyTorch 实现,不需要 transformers 库。

* 本系列配套运行代码,可在公众号后台回复“大模型”完整获取。


六、真实的大模型训练:三个阶段

我们的微型模型只经历了一个阶段。真实的大模型要经过三个阶段,每个阶段解决不同的问题。

6.1 预训练(Pre-training)——“广泛读书”

目标:让模型学会语言——语法、知识、推理能力。

数据:几万亿个 token 的互联网文本——网页、书籍、论文、代码、维基百科……

任务:就是我们讲过的"预测下一个词"。把文本切成片段,每个位置预测下一个 token,算 Loss,调参数。

规模感受

1.png

训练完成后,模型已经能生成流畅的文本,知道大量事实,能做简单推理。但它有个问题:不会好好回答问题。

你问它一个问题,它可能不回答,而是继续生成看起来像网页的内容——因为在训练数据里,一段文本后面跟的通常是另一段文本,不是"回答"。

6.2 SFT(监督微调)——“入职培训”

目标:教模型"好好回答问题"。

数据:人工编写的高质量问答对,通常几万到几十万条:

用户:法国的首都是哪里?
助手:法国的首都是巴黎。巴黎位于法国北部...

用户:写一个 Python 斐波那契函数
助手:def fibonacci(n):
    if n <= 1: return n
    return fibonacci(n-1) + fibonacci(n-2)

训练方式:和预训练完全一样——预测下一个 token,算 Loss,调参数。只是数据换成了对话格式,模型就学会了"看到问题后给出回答"的模式。

SFT 的数据量比预训练小得多(几万条 vs 几万亿 token),但它让模型从"续写机器"变成了"能回答问题的助手"。

6.3 RLHF(基于人类反馈的强化学习)——“师傅带徒弟”

目标:让回答更符合人类偏好——更有帮助、更安全、更诚实。

SFT 教模型"怎么回答",RLHF 教模型"什么样的回答更好"。

分两步做:

第一步:训练一个"打分模型"。同一个问题让模型生成两个回答 A 和 B,人类标注员选更好的那个。用大量这种偏好数据训练一个打分模型,让它能自动给回答打分。

第二步:用打分模型优化语言模型。模型生成回答 → 打分模型打分 → 分数作为奖励信号 → 调整参数让模型倾向于生成高分回答。

6.4 三阶段的效果变化

预训练前:   "jk2#x..."                          ← 随机噪声
预训练后:   "...the city is known for..."         ← 流畅续写,但不会回答问题
SFT 后:    "巴黎是法国的首都。"                    ← 能回答了,但质量参差不齐
RLHF 后:   "法国的首都是巴黎。巴黎位于法国北部..."   ← 回答详细、有帮助、安全

1.png


七、训练的工程挑战

原理不复杂,但真把一个 70B 模型训出来,工程上很难。

7.1 显存装不下

一个 7B 模型的训练需要多少显存?

参数本身:    7B × 4 字节 = 28 GB
梯度:       同样大小    = 28 GB
优化器状态:  Adam 需要额外存两份 = 56 GB
激活值:     中间计算结果 = 数十 GB
──────────────────────────────
总计:       远超 100 GB

一张 A100 GPU 有 80 GB 显存,连参数和优化器都装不下——一张卡根本没法训 7B 模型

解决办法是分布式训练:把模型切成几块,分到不同的 GPU 上,几千张 GPU 通过高速网络协同工作。这就是为什么训大模型要花数百万美元——大部分是算力成本。

7.2 数据质量比数据数量更重要

训练数据里如果充满错误信息、恶意内容或低质量文本,模型就会学到这些"坏习惯"。

所以训练前要做大量清洗:去重(互联网上到处是重复内容)、过滤垃圾页面、去除隐私信息、平衡语言和领域的比例。数据配比(多少英文、多少中文、多少代码、多少数学)是各家模型团队的核心秘方。


八、训练改变了什么

回顾前五篇,训练到底改变了哪些东西:

Embedding 表(第三篇):训练前是随机数。训练后,"France" 和 "Paris" 的向量变得接近,"国王 - 男人 + 女人 ≈ 女王" 自动形成。

Attention 的 Q/K/V 权重(第四篇):训练前,注意力分数是随机的,每个词对所有词的关注度差不多。训练后,"very" 学会了重点关注 "Thank you" 这个搭配。

FFN 的权重(第五篇):训练前,FFN 做的是随机变换。训练后,FFN 学会了存储和调用知识——看到 "Thank you very" 就激活 "much"。

所有这些变化,都来自同一个训练信号:预测下一个词。 没有人告诉模型 "France 的首都是 Paris",也没人告诉它 "Thank you very 后面接 much"。它只是在几万亿次预测中自动发现了这些规律,编码进了参数里。


九、结语

训练的本质简单得令人意外:预测 → 算误差 → 调参数 → 重复。

复杂的不是算法,而是规模——70 亿个参数、几万亿个 token、数千张 GPU、数月时间。把一个简单过程推到极致的规模,涌现出了看起来像"理解语言"的能力。

"Deep learning is just gradient descent on a loss function. Everything else is engineering."

深度学习就是在 Loss 上做梯度下降。剩下的全是工程。

下一篇,我们从训练切换到使用——你按下回车后的这一秒,模型内部发生了什么?为什么第一个字等得久、后面快了?KV Cache 是什么?


本文配套代码:train_tiny.py(微型 Transformer 从零训练)。纯 PyTorch 实现,不需要 transformers 库,CPU 几分钟跑完。


容器模仿.png

扫码回复“大模型

获取本系列文章完整配套代码

「从零开始理解大模型」是「从零开始理解 Agent」的姊妹系列。Agent 系列讲"四肢",本系列讲"大脑"。建议对照阅读 专栏入口


相关链接

[1] train_tiny.py: https://github.com/GitHubxsy/nanoAgent/blob/claude/organize-teaching-materials-4hnRP/llm-from-scratch/train_tiny.py

   今日推荐  

关注AGENT魔方公众号,回复大模型

领取「从零开始理解大模型」实操配套代码

加速入门和掌握Agent:

0大模型配图.jpg


【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。