预训练:大模型能力从哪里来

开篇问题

一个没有接入搜索引擎、没有连接数据库、没有调用 API 的模型,为什么能写代码、解释概念、翻译文本,甚至做一些简单推理?

如果只把它理解成“背了很多资料”,就解释不了另一个现象:模型能组合出训练集中未必逐字出现过的答案,也能在陌生上下文里延续风格、补全代码、识别模式。

预训练就是理解这些能力来源的第一站。它不是让模型记住一本百科全书,而是让模型在海量文本中学习“在某个上下文之后,什么样的 Token 更可能出现”。这个目标看起来朴素,却会逼迫模型压缩语言、事实、代码结构和世界规律。

本章你会理解什么

读完本章,你会理解:

  • 预训练到底训练了什么,而不是只知道“喂很多数据”。
  • 为什么“预测下一个 Token”能带来语言理解、知识表达和代码能力。
  • 参数、训练数据、损失函数和算力在预训练中的角色。
  • 模型能力为什么来自统计规律,但又不等于简单记忆。
  • 开发者常见的几个误解:模型是不是数据库、是不是只会背答案、是不是训练完就会聊天。

核心概念

预训练

预训练是大模型训练的第一大阶段。它通常发生在指令微调和对齐之前,目标是让模型从大规模通用文本中学习语言和模式。

这里的“通用文本”可以包括网页、书籍、论文、代码、问答、文档、论坛内容等。不同模型的数据配比不同,但核心任务通常类似:给定前面的 Token,预测下一个 Token。

训练数据

训练数据是模型学习的原材料。它不是运行时的知识库,而是在训练过程中被反复读取,用来更新模型参数。

数据质量会深刻影响模型能力。高质量代码、严谨文档、清晰教材、真实讨论和结构化资料,会让模型更容易学到稳定模式。低质量、重复、错误、噪声数据则会让模型学到混乱信号。

参数

参数可以理解为模型内部可调整的数字。训练开始时,这些数字大多没有意义。随着模型不断预测、犯错、被纠正,参数会被更新,逐渐形成对语言和模式的压缩表示。

模型回答问题时,并不是去训练数据里查找原文,而是使用这些参数对当前上下文进行计算。

损失函数

损失函数衡量模型预测错得有多离谱。

如果上下文是:

HTTP 状态码 404 表示资源

训练文本中的下一个 Token 可能对应“未找到”。如果模型把高概率给了“成功”,损失就会较大;如果把高概率给了“未找到”,损失就会较小。

训练的目标就是持续降低这种预测错误。

表示学习

表示学习指模型把文本中的对象、关系和模式压缩到参数和中间向量中。

例如,模型会逐渐学到:

  • functionreturnconst 常出现在代码语境中。
  • “巴黎”和“法国”之间有首都关系。
  • “因为”“所以”常连接因果结构。
  • Markdown 标题后面通常跟着解释性段落。
  • 单元测试、错误日志、修复建议之间存在工程语义关联。

这些不是人工写进去的规则,而是在大量预测任务中被逼出来的内部结构。

机制拆解

1. 文本先被切成 Token

预训练不会直接处理原始字符串。所有文本会先经过 Tokenizer,被切成模型词表里的 Token,并转换成 Token ID。

例如,一段代码:

const count = items.length

在模型内部会变成一串数字 ID。模型训练和推理都围绕这些 ID 进行。

这意味着模型最先学习的不是“词典意义上的单词”,而是 Token 序列之间的统计关系。

2. 模型读取一段上下文

训练时,模型会看到一段 Token 序列。它不能看到未来 Token,只能根据当前位置之前的内容预测下一个 Token。

这种限制很重要。它让训练目标和生成过程保持一致:训练时预测下一个 Token,推理时也一个 Token 一个 Token 地生成。

3. 模型给所有候选 Token 打分

在每一个位置,模型都会对词表中的候选 Token 计算一组分数。分数越高,表示模型认为这个 Token 越适合作为下一个 Token。

这组分数还不是最终概率。后续会经过归一化,变成可以采样的概率分布。第 10 章会详细解释 logits、softmax 和采样。

4. 预测结果和真实下一个 Token 比较

训练数据里有真实的下一个 Token。模型预测之后,训练系统会比较模型给真实 Token 的概率是否足够高。

如果模型没有把正确 Token 排在前面,损失就会增加。优化器会根据这个损失调整模型参数。

你可以把这个过程想象成一次极大规模的自动代码补全训练:模型不断尝试补全下一小段,如果补错,就微调内部参数,让下次更接近训练文本中的分布。

5. 重复数万亿次后,规律被压进参数

一次预测学不到太多东西。预训练的威力来自规模。

当模型在极大量文本上重复预测下一个 Token,它为了降低整体错误率,不得不学习许多层次的规律:

  • 拼写、标点、语法。
  • 段落结构和文体。
  • 常见事实和概念关系。
  • 代码语法和库用法。
  • 问答、解释、证明、反驳等文本模式。
  • 长距离依赖,例如前文定义的变量、角色、条件和约束。

这就是为什么一个简单目标会长出复杂能力。模型不是被明确教会“什么是函数调用”或“如何解释递归”,而是在大量代码和解释文本中,为了预测得更准,学到了这些结构。

6. 能力是分布式的,不在某个固定文件里

开发者容易想象模型内部有一张隐藏表:

问题 -> 答案

但预训练后的知识不是这样存放的。它分散在大量参数之间,表现为对上下文的响应倾向。

这也是为什么模型有时能泛化,有时又会产生幻觉。它不是在精确查询数据库,而是在当前上下文下生成最像合理续写的内容。

预训练学到的能力类型

语言能力

最直接的能力是语言延续。模型会学会句子如何组织、段落如何展开、不同风格如何切换、上下文中的指代如何解析。

这不是简单语法检查,而是对上下文的连续建模。例如模型能理解“它”“这个函数”“上面的错误”指向什么,是因为训练中有大量类似文本结构。

知识表达

模型在预训练中见过大量关于世界的文本。为了预测文本,它会学习事实之间的关联。

但这种知识表达有两个限制:

  • 它不是实时更新的。
  • 它不保证像数据库一样精确可追溯。

所以预训练让模型“知道很多模式”,但不等于让模型成为可信事实源。

代码能力

代码是高度结构化的语言。变量、作用域、缩进、类型、错误信息、注释、测试都形成稳定模式。

当训练数据包含大量代码和技术文档时,模型会学到:

  • 常见语法。
  • API 使用习惯。
  • 错误日志和修复方式之间的关系。
  • 测试用例和实现之间的对应。
  • 代码风格和项目结构。

代码能力依然来自下一个 Token 预测,只是代码本身的结构让这种预测任务携带了大量工程规律。

推理雏形

推理能力也可以部分来自预训练。因为许多文本本身包含推导过程、证明、调试记录、数学解题、因果解释和程序执行轨迹。

模型为了预测这些文本,会学习某些中间步骤的模式。

但这不意味着模型天然拥有稳定可靠的逻辑引擎。它学到的是“如何产生类似推理的文本”,其中一部分能对应真实推理,一部分可能只是表面模式。

开发者常见误解

误解一:预训练就是把互联网压缩成数据库

模型确实会压缩训练数据中的大量信息,但它不是数据库。

数据库强调精确存储、可查询、可更新、可追溯。预训练模型强调在上下文中生成概率上合理的续写。两者的工程属性完全不同。

所以不要用“模型应该记得某条数据”来理解它的行为。更准确的说法是:如果某类信息在训练中出现得足够清晰、频繁、稳定,模型更可能在相关上下文中生成它。

误解二:模型能力都来自人工标注

预训练主要依赖自监督学习。所谓自监督,就是训练文本本身提供了答案:前面的 Token 是输入,下一个 Token 是标签。

人工标注在后续指令微调、偏好对齐、安全训练中很重要,但基础语言能力和大量知识模式主要来自预训练规模。

误解三:模型训练完就自然会聊天

预训练模型更像一个强大的续写器。给它一段文本,它会继续写下去。

它未必知道应该扮演助手,未必遵守用户指令,也未必用对话格式回答。让模型从“续写器”变成“可用助手”,通常需要指令微调和对齐。

误解四:更多数据一定更好

数据规模重要,但质量、去重、配比和过滤同样重要。

重复垃圾内容会让模型浪费容量;错误信息会污染预测目标;低质量代码会降低代码能力;偏见和有害内容会影响输出倾向。

预训练不是把所有文本倒进模型里,而是在规模、质量和覆盖面之间做取舍。

误解五:模型学到事实就能保证事实正确

预训练优化的是预测概率,不是真实性。

一个说法如果在训练文本中常见,模型可能更容易生成它;但常见不等于正确。真实世界变化后,模型参数也不会自动更新。

这就是为什么预训练能力需要和检索、工具、评估、人工审查等工程机制区分开来。它提供基础能力,不提供事实保证。

小实验/思考实验

实验一:只靠补全能学到什么

拿下面这段文本:

用户点击“提交”按钮后,前端会先校验表单。如果邮箱格式不正确,页面应该显示

你不需要完整产品文档,也能猜到后面可能是“错误提示”。

再看:

function add(a, b) {
  return

你大概率会补出 a + b

这说明只做“下一个片段预测”,也会迫使系统利用语义、代码结构和上下文目标。

实验二:记忆和泛化的边界

想象两个训练样本:

张三的员工编号是 A-9173。
李四的员工编号是 B-2048。

如果模型能回答“张三的员工编号是什么”,这更接近记忆。

再看另一类样本:

如果数组为空,应该返回空结果。
如果用户未登录,应该返回 401。
如果参数缺失,应该返回校验错误。

当模型遇到“如果文件不存在,应该返回什么”时,即使训练集中没有原句,它也可能根据模式推断出合理回答。

预训练能力常常混合了记忆和泛化。开发者要警惕把二者混为一谈。

实验三:为什么数据配比会改变模型性格

假设两个模型结构完全一样:

  • 模型 A 的训练数据里有大量教程、文档、代码和严谨问答。
  • 模型 B 的训练数据里有大量闲聊、广告、重复网页和低质量论坛内容。

它们的训练目标一样,都是预测下一个 Token。但最终能力会明显不同。

这说明模型不是只由架构决定。训练数据的分布,会变成模型输出的倾向。

本章小结

预训练是大模型能力的基础来源。它用海量 Token 序列训练模型预测下一个 Token,通过不断降低预测错误,把语言结构、事实关联、代码模式和推理文本的规律压缩进参数。

这个过程让模型具备强大的生成和泛化能力,但也决定了它的基本限制:它不是数据库,不保证事实正确,不天然遵守指令,也不会自动知道最新世界状态。

理解预训练后,再看指令微调和对齐,就会更清楚:后续阶段不是凭空创造基础能力,而是在已有能力之上,把模型塑造成更像助手、更符合人类偏好的系统。

自测题

  1. 为什么“预测下一个 Token”这样简单的目标,可能产生语言理解和代码能力?
  2. 预训练模型和数据库在工程属性上有什么区别?
  3. 为什么模型在训练中见过大量事实,也仍然可能生成错误事实?
  4. 参数在预训练中扮演什么角色?
  5. 为什么说预训练模型更像“续写器”,而不是天然的“聊天助手”?