← 极客知识库本地镜像
大模型通识 · 机器学习 / 深度学习 / 生成式 AI / 基础概念

AI 理论基础

从机器学习到生成式 AI,补齐读懂大模型的前置知识。

来源 time.geekbang.org/space/wiki/AI_Basic 14 讲 大模型通识

01 学习交流群

知识库之外,我们还建了「大模型通识交流群」。

进群和大家一起交流大模型的发展脉络、基础原理和应用方向,梳理 AI 与大模型领域的核心概念,也会同步知识库最新更新和延伸学习资料。

扫码加入,一起建立对大模型更完整、更清晰的认识。

【知识库】大模型通识交流群


02 先建立一张地图:AI、机器学习、深度学习与大模型是什么关系

假设你想做一个小工具:导入自己的学习笔记,让它生成几张复习卡片,确认后保存,第二天再提醒你复习。

搜索实现方法时,你可能接连遇到这些建议:用机器学习给笔记分类,用深度学习理解文字,接一个大模型生成问题,再做成一个 Agent。听起来每个词都很重要,却很难判断:它们是四种不同方案,还是同一件事的四个名字?

要回答这个问题,先把几种不同的讨论分开。有些词描述研究领域,有些描述学习方法,有些描述训练好的模型,还有些描述如何把模型组织成应用。把这些层次混在一起,就容易以为“想做一个 AI 应用,必须先训练一个大模型”,或者“接入了一个强模型,整个软件就会自动可靠”。

这一篇先建立概念地图。读完后,你应该能解释 AI、机器学习、深度学习与大模型的关系,也能指出复习助手里哪些事情由模型承担,哪些仍由程序完成。不需要安装软件,也不要求先学数学;下面的复习助手是教学构造,并非已经运行的产品。

AI 是一个领域,范围比聊天模型大得多

AI 是 Artificial Intelligence,通常译为“人工智能”。不同教材的定义有所侧重,但共同关心的是:怎样构建能够感知信息、进行推断、作出选择或采取行动的计算系统,让它在某些任务上表现出有用的智能行为。

例如,识别一张图片中的物体、为一个目标寻找可行计划、根据条件推断结论,都可以成为 AI 研究的问题。《Artificial Intelligence: Foundations of Computational Agents》就从在环境中行动的计算主体来组织这一领域,讨论怎样构建能够适应任务与限制的系统。教材中的 AI 定义

AI 并不只靠一种方法。搜索、逻辑推理、知识表示、规划和机器学习,都在其中承担过或仍然承担重要作用。有的系统主要依据人写下的规则,有的主要依靠从数据中学到的规律,还有的把不同方法结合起来。

因此,AI 不是一种特定的软件外壳。一个界面带有聊天框,不能说明里面采用什么技术;一个系统没有聊天框,也可能使用了机器学习模型。

对我们的复习助手来说,定时提醒完全可以由普通程序完成:到了规定时间,就发送提醒。只有日期判断与通知发送,并不需要大模型。另一方面,“从这段笔记里挑出值得复习的概念,并写成清楚的问题”,包含更复杂的语言处理,才是考虑使用模型的地方。

划清这两件事,会直接影响你的开发方式:明确的规则交给明确的程序,难以穷举的语言变化再交给适合处理它的模型。它们可以在同一个应用里配合。

机器学习:让一部分规律从数据中形成

机器学习,英文是 Machine Learning,常缩写为 ML。它是 AI 中非常重要的一类方法:通过数据或经验形成模型,使模型能够处理新的输入。Google 机器学习入门

先用“给笔记分类”理解它。

你可以手写规则:笔记出现“CSS”就归到前端,出现“SQL”就归到数据库。这种方式清楚、容易检查,但会遇到例外。一篇讨论“如何在网页里展示 SQL 查询结果”的笔记,同时出现两个关键词;一篇讲样式布局的笔记,又可能一次都没写 CSS。

另一条路线是准备一批已经分类的笔记,让学习程序从这些例子中调整一个分类模型。模型接到新笔记时,再根据学到的规律判断类别。它可能利用比几个关键词更丰富的线索,也可能因为训练样本偏少或分类标准混乱而判断错误。

这里发生了一个重要变化:开发者不再逐条写出所有分类规则,而是设计学习过程、准备数据,并检查得到的模型是否适合任务。人的工作没有消失,只是有一部分从编写规则转到了数据、目标和验证上。

而且,机器学习不只有大模型。线性模型、决策树等也是常见方法。对于输入结构清楚、任务范围有限的问题,一个较简单的模型就可能有用。后面的文章会再解释模型怎样从样本中学习,这里先记住:“使用机器学习”描述的是一类获得能力的方法,并不说明模型一定很大。

深度学习:机器学习中的一条重要路线

深度学习,英文是 Deep Learning,常缩写为 DL。它使用具有多层计算结构的神经网络,从数据中学习表示和任务规律。

“神经网络”这个名字容易让人联想到人脑。学习时可以暂时把它理解为:许多带有可调整参数的计算单元,按一定结构连接起来。它受到生物神经系统的部分启发,但不能把每个部件与人脑直接对应,更不能因为名字里有“神经”就认定它具有意识。

多层结构有什么意义?输入经过不同层的变换后,可以形成更适合任务的内部表示。例如,图像模型可能逐步形成对局部图案及其组合的表示。这个例子帮助理解多层变换,但不意味着每层一定有一个人类能够明确命名的职责。

深度学习的重要特点之一,是可以把表示的学习也纳入训练,而不只依赖人为指定的一小组特征。《动手学深度学习》将其放在多层表示学习的脉络下解释。深度学习教材导论

它与机器学习的关系,可以这样画:

人工智能 AI:更广的研究领域
├─ 搜索、规划、逻辑推理等方法
└─ 机器学习 ML:从数据或经验中学习
   ├─ 线性模型、决策树等方法
   └─ 深度学习 DL:用多层神经网络学习
      ├─ 图像、语音等任务中的神经网络模型
      └─ 当代主流大语言模型 LLM

这是一张帮助入门的关系图,列出的方向并不完整,各分支也可以组合。它要说明的是:深度学习属于机器学习,而 AI 的范围更大。图中的模型类别也存在交叉,例如大语言模型可以进一步具备图像处理能力。

“深”与“大”同样不是一个指标。“深”主要关联计算层次;“大”可能涉及参数规模及训练投入。一个深度学习模型可以很小,也可以很大。

大模型、大语言模型、基础模型,分别强调什么

我们日常说的“大模型”,通常是在讨论规模较大、经过较大规模训练的模型。但这个词没有一个适用于所有领域、所有时期的统一参数分界。不能仅凭名字带“大”字,就认定它在所有任务上都更好。

大语言模型的英文是 Large Language Model,简称 LLM,强调语言建模这条技术路线。当代主流 LLM 使用深度神经网络,通过训练形成处理和生成语言的能力。它可以帮助改写、总结、生成代码或回答问题,但具体能力与训练方式、输入资料和使用环境有关。

“语言模型”也不等于“只会聊天”。代码、结构化文本和工具调用参数都可以通过文本形式表达。另一方面,一些模型又扩展了图像、音频等输入或输出能力。这时需要逐项看它支持什么,不能只依据一个总名称推断。

还有一个常见词是基础模型,Foundation Model。相关研究用它描述在广泛数据上训练、可以适配多种下游任务的模型,重点在于它能够成为多种应用的基础。基础模型可以用于语言,也可以用于视觉等领域。基础模型研究报告

这几个名称观察的是不同方面:“大”强调规模,“语言”强调建模对象或技术路线,“基础”强调广泛适配与复用的作用。

同样,“生成式 AI”主要强调生成内容的用途或能力。能生成文字的语言模型、能生成图片的模型,都可能被归入这个范围。它不是在前面的关系图末尾再接一层,就能囊括所有情况。

所以,看到一款新模型时,与其急着给它贴齐所有标签,更值得问:它接受什么输入、产生什么输出、能处理哪些任务、有哪些使用条件?这些答案才会帮助你设计应用。

模型、算法与应用:先把交付的对象分清楚

前面几节讨论技术关系,现在回到开发现场。

一个模型通常包含计算结构,以及通过训练获得的参数。参数可以先理解为控制计算行为的一组数值。训练过程会依据数据和目标调整这些数值;使用一个已经训练好的模型处理新输入,通常称为推理,inference。

这里的“推理”是运行模型的技术用语。即使只是生成一句简单问候,也属于 inference;它与“经过多步思考解一道难题”所说的推理能力,并不是完全相同的概念。

算法则是完成某类计算或解决问题的方法。训练算法用于调整模型,搜索算法用于寻找结果;模型运行时也需要具体的计算步骤。因此,“算法”和“模型”有关,但不能随意互换。

应用则把模型放进用户可以完成事情的流程。拿复习助手来说,可以做出下面的分工:

应用中的环节 可以由谁承担 完成后的可检查结果
导入笔记 文件读取与解析程序 能看到正确读取的原文
生成复习卡片草稿 语言模型 每张卡片的问题与答案可以对照原文
检查必填字段、显示预览 普通程序 缺少问题或答案时能够提示
确认后保存 界面逻辑与存储程序 重新打开仍能找到确认过的卡片
到时间提醒 调度与通知程序 在设定时间收到对应提醒

这是一个教学设计,不是说每款复习产品都采用同样架构。它说明了一点:用户拿到的是整个应用的结果,模型只承担其中一部分工作。

如果卡片写错了,需要检查原始资料和生成过程;如果卡片内容正确,关闭页面后却消失了,问题可能出在保存流程。后者通常不会因为换一个更贵的模型就自行解决。

这也是应用开发与模型训练的分工。你可以使用别人已经训练好的模型,通过 API,也就是程序之间调用能力的接口,来开发自己的应用。是否需要进一步训练,是另一个问题,并不是开始开发的前置条件。

Agent:模型怎样进入行动与反馈的过程

Agent 这个词在 AI 研究中早已有之,广义上指能够在环境中行动的主体。本教程讨论大模型应用时,主要关注由模型参与决定后续步骤、使用工具并根据结果继续推进任务的系统。

仍以复习助手为例。一种设计总是依次执行“读取三篇笔记—生成十张卡片—展示预览”。主要路径由程序提前确定,可以理解为固定工作流。

另一种设计允许助手先检查资料:如果概念解释不完整,就请求检索相关笔记;找到补充材料后再生成卡片;如果两篇笔记冲突,就把问题交给用户确认。哪些步骤需要发生,会受到模型判断和中间结果影响。

Anthropic 在其工程文章中采用过类似的实用区分:工作流主要按预先编写的路径组织,Agent 则让模型更动态地决定流程和工具使用。不同团队对 Agent 的用词可能更宽或更窄,因此阅读产品介绍时仍应看具体机制。工作流与 Agent 的工程区分

工作流也可以包含分支、重试和模型调用。这里的区别在于,下一步的选择主要由预先设计的控制逻辑安排,还是更多交给模型根据任务和反馈决定;真实应用也可以把两者结合。

Agent 不是比大模型“再大一级”的模型类别。它描述一种系统组织方式,可能包含一个或多个模型,也包含工具、状态、执行环境和停止条件。

模型提出“保存这些卡片”,程序才会尝试写入;程序返回成功或失败后,系统才能决定下一步。模型生成一句“已经保存”,本身不是文件或数据库已写入的证明。要确认成功,仍需读取实际结果。

这种区别对使用 Vibe Coding 工具尤其有帮助。你可以让编程 Agent 写保存功能,但验收时要重新打开页面,检查卡片是否还在。自然语言让提出任务更方便,真实软件的完成条件仍然存在。

用几个判断,检查这张地图是否清楚

先独立判断下面五句话,再看解释。不需要调用模型替你作答。

  1. 一个程序按固定规则每天提醒复习,因此它一定使用了机器学习。
  2. 一个笔记分类模型使用决策树,因此它属于机器学习,但未必属于深度学习。
  3. 我的网页通过 API 调用大语言模型,所以我正在开发 AI 应用,即使没有训练模型。
  4. 系统把旧笔记读出来交给模型,因此模型参数一定已经学会并永久保存了这些笔记。
  5. 助手表示卡片已保存,因此保存功能已经验收通过。

第 1 句不成立。定时规则本身不能证明系统从数据中进行了学习。

第 2 句成立。机器学习包含多种方法,决策树并不因此变成深度神经网络。

第 3 句成立。调用已有能力、组织用户流程和实现数据保存,本来就是应用开发的重要部分。

第 4 句不成立。把资料作为当前输入,与通过训练改变参数,是不同操作。应用即使把笔记长期保存在数据库里,也不能因此推断模型参数已经更新。后面会逐步区分上下文、检索和训练。

第 5 句不成立。需要独立检查保存结果,例如重新读取卡片,并确认内容与用户批准的版本一致。

如果第 1、2 题容易混淆,可以回看机器学习与深度学习的关系;如果第 4 题不确定,要重点区分数据进入当前输入与参数更新;如果第 5 题拿不准,就回看模型、程序与应用的分工。

现在,再回到开头的项目。你可以用一个大语言模型生成卡片,用普通程序完成保存和提醒,在确有需要时加入动态检索和工具选择。它们不必按照流行名词的数量叠加,而应围绕用户要完成的任务组合。

下一篇会把“从数据中学习”拆开来看:模型究竟学到什么,一个样本怎样参与学习,以及学到的规律怎样用于从未见过的新输入。


下一篇:02|机器学习:程序怎样从数据中学到规律

返回:第一部分大纲

关联:第 0 部分:大模型发展史;第二部分大纲


03 机器学习:程序怎样从数据中学到规律

假设你想给自己的邮箱加一个垃圾邮件过滤器。最初的规则很简单:正文里出现“免费”或“中奖”,就放进垃圾箱。

很快,你发现一封正常邮件也被拦住了:“你已购课程的免费补课安排。”于是补上一条:熟悉的发件人不拦截。随后又遇到陌生地址发来的正常验证码,以及看起来很像正常通知的广告。规则越来越多,例外也越来越多。

机器学习提供了另一种处理方式:整理一批已经判断过的邮件,让程序依据这些例子选择判断方式。但“依据例子选择”究竟发生了什么?模型会把邮件背下来吗?它如何处理下一封邮件?

这一篇用一个小到可以手算的分类器,把样本、特征、标签、参数和预测连起来。读完后,你应该能指出哪些信息来自输入,哪些数值通过学习确定,以及为什么模型在旧数据上表现好,还需要接受新数据的检验。

下面的邮件、参数与结果都是为解释机制而构造的教学例子,不是真实邮箱的实验,也不能用于判断实际产品效果。 不需要安装软件,只需会加减乘法。

从一封邮件开始:样本、特征与标签

我们先准备六封邮件,并约定两种分类结果:垃圾邮件记为 1,正常邮件记为 0。表中的判断由整理数据的人根据背景给出。

编号 邮件内容或背景 发件人在通讯录中 已知分类
A 未请求的推销:“恭喜中奖,点击领取” 否 垃圾,1
B 未请求的推销:“免费领取礼品,立即登记” 否 垃圾,1
C 已购课程通知:“你已购课程的免费补课安排” 是 正常,0
D 同事通知:“明天的会议改到下午” 是 正常,0
E 正规服务:“你刚申请的登录验证码” 否 正常,0
F 已报名活动:“你报名的免费公开课即将开始” 是 正常,0

这里的一封邮件及其相关记录,就是一个样本,sample 或 example。把许多样本放在一起,形成一个数据集,dataset。

为了看清计算过程,我们暂时不让模型直接处理整段文字,而是只给它两个数字:

  • u:内容里是否出现“免费”或“中奖”这两个指定字符串中的任意一个。出现记为 1,否则记为 0。
  • v:发件人是否在通讯录中。在记为 1,否则记为 0。

这两个供模型判断的输入叫作特征,feature。已经给出的分类结果叫作标签,label,用 y 表示。样本、输入特征和目标标签,是理解监督学习的基本概念。Google:监督学习基础

经过转换,模型面对的是下面这张表:

样本 特征 u:出现指定词 特征 v:在通讯录中 标签 y:是否垃圾
A 1 0 1
B 1 0 1
C 1 1 0
D 0 1 0
E 0 0 0
F 1 1 0

请留意:模型的判断公式只接收 u 和 v,不会把这一行的 y 当作判断依据。标签用于检查它猜得对不对。如果先把正确答案交给它,再问分类准不准,就失去了检验意义。

这张表也暴露了我们的主动取舍。模型不知道 C 中的课程是否真的购买过,不知道 E 的验证码是否真的申请过;这些背景帮助人确定标签,却没有进入这两个特征。人看过原文,不等于模型获得了原文里的全部信息。

模型先要有一种可以调整的判断方式

我们给模型安排一个简单结构:先算分,再按分数分类。

分数 = a × u + b × v + c

分数 ≥ 1:预测为垃圾邮件
分数 < 1:预测为正常邮件

先别被字母吓住。u 和 v 是这一封邮件带来的输入;a、b 和 c 是控制计算方式的三个数。

a 决定指定词对分数的影响,b 决定通讯录信息对分数的影响,它们叫作权重,weight。c 是无论输入如何都会加上的偏移量,通常叫作偏置,bias。这里的“偏置”是数学名称,并不是在说社会偏见。

这些可由训练确定的数值,统称为参数,parameter。加权相加再加偏置,是许多模型里会遇到的基本计算形式;Google 的线性回归教材也用这种形式解释权重和偏置。我们这里又加了分类阈值,因此整个例子是一个简化分类器,不是用来预测连续数值的线性回归任务。权重、偏置与加权计算

本例把分类阈值固定为 1,只学习 a、b、c。真实系统也可能另外选择阈值,但那是另一个设计决定。

例如,暂时取 a=1、b=-1、c=0。邮件 C 的两个输入都是 1,算出来是:

分数 = 1 × 1 + (-1) × 1 + 0 = 0
0 小于 1,因此预测为正常邮件。

这里的分数不是概率。分数为 0 不代表“垃圾邮件概率为 0%”,分数为 -1 也没有数学矛盾;它只是这套判断规则的中间数值。

更关键的问题还没回答:为什么选这三个参数值,而不是别的值? 只有说明它们怎样由数据确定,才真正进入了“学习”。

用数据选择参数,就是一次极简的学习

为了让整个过程可以看完,我们只允许程序考虑三组候选参数。候选范围由人预先设定,程序的任务是:对每一组参数,把六封邮件都算一遍,数出预测错误的数量,选错误最少的一组。

候选 a b c 对应分数 六封邮件中判断错误的样本
甲 1 0 0 u C、F,共 2 封
乙 1 -1 0 u − v 无,共 0 封
丙 0 -1 1 1 − v E,共 1 封

可以检查一下甲为什么出错。它只看指定词,C 和 F 都有“免费”,分数都是 1,于是被判成垃圾邮件。但标签显示它们是正常邮件,所以计为两次错误。

再看丙。它完全不看内容,只要不在通讯录中,分数就是 1。A、B 确实是垃圾邮件,但 E 是用户刚申请的正规验证码,因此丙错了一次。

乙在这六个样本上没有错误,于是程序选择 a=1、b=-1、c=0。学习的结果可以保存为这三个参数,之后继续用于新邮件。

整个过程可以画成两条路径:

学习阶段:
六封已分类邮件 → 提取特征 → 逐组尝试参数
                              ↓
                    将预测与标签比较,数错误
                              ↓
                       保存错误最少的参数

使用阶段:
一封新邮件 → 提取相同特征 → 使用已保存参数 → 给出预测

这里,数据、模型结构、评价好坏的目标,以及搜索参数的方法,已经齐了。《动手学深度学习》也用数据、模型、目标函数和优化算法来组织机器学习的基本组成。教材:机器学习的组成

我们的目标是减少训练样本上的错误数量,方法是穷举三组参数。它非常简陋,却足以展示一个完整的学习过程。如果换一批邮件或换一套标签,程序可能选中另一组参数。

反过来,如果开发者不让程序比较样本,只凭经验直接写死 a=1、b=-1、c=0,那么即使最后得到同样的公式,也不能说这三个数是本次程序从数据中学到的。判断是否发生学习,要看参数或判断方式怎样获得,而不只看最后的公式长什么样。

真实训练通常不会只在三组数中挑选。许多模型会依据目标逐步更新大量参数,也常使用比“数错了几次”更适合优化的损失函数。第 06 篇会讲如何衡量误差,第 08 篇再解释参数如何一步步更新。现在不需要提前掌握那些公式。

使用模型时,变的是输入,不一定是参数

参数选定后,一封新邮件到来,我们只需按相同方式提取 u、v,放进 分数=u−v,再看是否达到阈值。

这个计算过程叫作预测,prediction,也是运行已训练模型进行推理的一种情形。“预测”不一定在猜未来:判断当前这封邮件属于哪类,也叫预测。

此时,邮件可以一直变化,参数却保持不变。新邮件不会仅仅因为被分类过,就自动成为新的训练材料。即使用户点了“判断错误”,也还需要有保存反馈、整理标签和重新训练等机制,反馈才可能进一步改变参数。

这能帮助你分清五个常见词在同一个任务里的位置:

概念 本例中指什么 什么时候会变化
样本 一封邮件及其相关记录 换邮件就换样本
特征 这封邮件的 u、v 随邮件内容和发件人信息变化
标签 已知的垃圾或正常分类 来自标注;不由当前模型预测自动保证正确
参数 控制打分的 a、b、c 在本例的学习阶段选定
预测 模型本次给出的分类 用当前输入和参数计算得到

标签也可能标错。例如,整理者没有注意到用户主动报名了活动,把 F 标成垃圾邮件,训练过程就会接收到另一种信号。学习程序并不会天然知道标签背后的现实事实。这个问题会在数据篇继续展开。

六封全部答对,为什么还不能放心使用

现在取三封没有参与参数选择的新邮件,检验乙的表现:

新邮件 u v 分数 u−v 预测 根据背景确定的分类
G:通讯录里的同事说“下午三点开会” 0 1 -1 正常 正常
H:陌生人发送未请求的“中奖补贴请领取” 1 0 1 垃圾 垃圾
I:课程方的新地址发来“你已报名课程的免费回放” 1 0 1 垃圾 正常

模型错在 I 上。课程方换了地址,暂时不在通讯录里,而正文又包含“免费”,两个特征恰好与 A、B 一样。

从人的角度,A 和 I 有明显区别:一封是未请求的推销,一封是已报名课程的通知。但对只接收 (1,0) 的模型来说,它们是同一个输入。只要判断方式固定,同一个输入就会得到同一个输出,无法同时满足两个相反的标签。

这是一个比“参数还不够好”更具体的问题:用来区分它们的信息,没有进入模型。 可以考虑增加报名记录、域名信息,或让模型读取更完整的内容,再检验是否有效。仅仅把处理这两个数字的模型做大,并不能凭空恢复缺失的信息。

这三封新邮件是说明问题的反例,不是有统计代表性的测试集。“三封答对两封”不能据此宣传真实邮箱准确率约为三分之二。

但它说明了评估的基本原则:用来学习的数据表现好,并不能单独证明模型对未见输入也表现好。scikit-learn 的评估文档特别区分了训练数据与留出数据;反复依据同一份测试结果改模型,也会破坏最终检验的独立性。训练与独立评估

在实际项目里,若已经用 I 这个错误指导修改,它就成了开发过程中见过的案例。修改后仍应准备另外的、没有参与这些决定的数据,检查改进能否成立。第 09 篇会进一步区分训练集、验证集和测试集。

从邮件分类,回到大模型应用开发

看完这个例子,容易产生另一种误会:既然模型能学规则,以后是不是所有规则都应交给它学习?

仍要看任务。“分数超过阈值后显示一个提示”是清楚的程序逻辑,“哪些邮件看起来像垃圾邮件”则存在许多难以穷举的变化。二者可以配合。模型预测为垃圾邮件后,应用可以标记、移入可恢复目录,或者请用户确认;预测结果本身并不等于必须采取某个动作。

换成前一篇的个人复习助手,道理一样。你可以训练一个小模型给笔记分类,也可以调用已经训练好的大语言模型,让它根据当前笔记判断类别。后一种情况下,你在使用已有模型的能力,不必先完成一套模型训练。

给语言模型几个分类示例,让它照着处理当前笔记,也不等于你已经执行了参数训练。它可能根据输入中的示例调整本次回答,但这与前面“依据数据选定并保存新参数”的操作不同。第二部分会解释这种在上下文中利用示例的机制。

对应用开发者来说,本篇最有用的习惯是:当模型答错,先明确它实际看到了什么、你希望它输出什么、依据哪些例子认为它应该能做到。这样的排查,比只说“它还不够聪明”更容易找到可改进的地方。

理解检查:亲手走完一次判断

先用选出的参数 a=1、b=-1、c=0、阈值 1 回答,再看后面的解释。

  1. 一封来自通讯录好友的邮件包含“免费”,分数是多少?模型预测什么?这个结果能否证明邮件一定正常?
  2. 两封邮件的两个特征完全相同,标签却相反。保持这个固定模型及输入不变,它能同时正确分类吗?
  3. 训练数据六封全部答对,是否可以宣布模型已适合真实邮箱?
  4. 用户纠正了一次分类结果,但应用只把这条纠正写进日志,没有再次训练。三个参数会自动改变吗?

第 1 题: u=1、v=1,所以分数是 0,预测正常。它只是模型依据两个特征作出的判断,不能证明现实中的邮件一定正常;分数也不是概率。

第 2 题: 不能。固定模型对同一输入给出相同预测,因此至少会错一个。需要检查特征是否遗漏信息,也要检查标签是否一致,而不是只继续微调这三个数。

第 3 题: 不能。六个样本可能过少、过于单一;模型也可能利用了在新邮件中不成立的线索。需要独立且符合使用场景的评估。

第 4 题: 不会。保存反馈和用反馈更新模型,是两个步骤。反馈可以成为后续改进的材料,但日志文件的变化不等于模型参数已经变化。

如果这四题能解释清楚,你已经能把“模型从数据中学习”拆成可检查的环节。下一篇还要追问一个问题:这里每封邮件都有人给答案,其他机器学习也必须如此吗?我们将从训练信号的来源出发,理解监督学习、无监督学习与自监督学习。


上一篇:01|先建立一张地图:AI、机器学习、深度学习与大模型是什么关系

下一篇:03|监督学习、无监督学习与自监督学习:训练信号从哪里来

返回:第一部分大纲


04 监督学习、无监督学习与自监督学习:训练信号从哪里来

上一篇的邮件分类器,有人提前告诉它哪些邮件正常、哪些是垃圾邮件。程序比较预测与这些答案,再选择参数。

现在回到我们的个人复习助手。假设你积累了一千篇笔记,想让工具帮忙整理。你可能提出三个不同的要求:

  • 我已经给一部分笔记标好了“前端”“数据库”等类别,希望工具按这个标准分类。
  • 我还没想好分类目录,希望先看看这些笔记里有哪些相近的内容。
  • 我想利用大量没有分类标签的文本,让模型学习语言规律,之后再用于具体任务。

三种要求都涉及数据,但程序据以改进的线索不同。这个线索就是本篇关心的训练信号:学习过程依据什么判断当前做法是否更好,以及应当怎样调整。

读完后,你应该能通过“输入是什么、目标从哪里来、训练在改善什么”区分三类学习,而不只是记住三个名字。下面的笔记、分组和句子都为教学构造,没有运行真实训练;读者无需准备数据集或安装软件。先理解上一篇的特征、标签和参数即可。

监督学习:先有任务答案,再学习怎样预测

先看第一种需求。你确定笔记只能放入“前端”或“数据库”两个目录,并整理了一些样本:

笔记内容摘要 你给出的类别
用 CSS 调整页面布局 前端
排查按钮点击后没有响应的问题 前端
用索引减少数据库查询时间 数据库
用事务保证多次数据库修改一起成功 数据库

训练时,模型接收笔记内容或从中提取的特征,预测类别,再与已有类别比较。它要学的是:怎样从输入得到与目标相符的输出。这就是监督学习,supervised learning。

这里的“监督”,不是要求一个人盯着每一步计算。把成对的输入与目标准备好后,训练程序可以反复计算、比较和调整。上一篇的垃圾邮件分类,就是这种思路。

监督学习也不只用于分类。如果你想根据笔记长度、难度等信息估计阅读需要多少分钟,目标变成了一个数值,这通常属于回归,regression。分类回答“属于哪类”,回归回答“数值是多少”。Google:监督学习中的分类与回归

注意,“已有目标”不等于“全部目标必须人工逐条填写”。阅读时长可以来自合适的行为记录,设备的某个数值可以来自测量。不过,这些记录是否准确、是否对应你真正关心的问题,仍需检查。例如,网页开着二十分钟,不等于用户认真读了二十分钟。

更容易忽略的是,分类标准也来自人。一篇“在网页里显示数据库查询结果”的笔记,究竟归前端还是数据库?如果不同整理者判断不一致,模型接收到的目标也会互相冲突。训练可以帮助复现标准,却不能替你自动决定最适合自己的知识目录。

所以,监督学习适合回答一个已经说清楚的问题:我希望得到某种输出,并且有一些可用于学习的输入—目标示例。

无监督学习:没有类别答案,也可以寻找结构

再看第二种需求。你有很多笔记,但还没有一个满意的分类体系。此时逐篇指定“正确类别”可能太早,你只是希望先发现相近内容。

一种办法是聚类,clustering:依据选定的表示和相似性,把比较接近的样本放到一起。聚类是无监督学习,unsupervised learning的一种常见方法,但无监督学习的范围并不限于聚类。

例如,我们有六篇笔记:

编号 笔记标题
A CSS 布局入门
B 按钮交互排错清单
C JavaScript 事件机制
D 数据库事务入门
E SQL 查询排错清单
F 数据库索引机制

按主题看,一个可能的分组是 A、B、C 在一起,D、E、F 在一起。但按写作形式看,也可以把 A、D 的“入门”文章放一起,把 B、E 的“排错清单”放一起,把 C、F 的“机制”文章放一起。

这不是两个真实算法的实测结果,而是让你看到:同一批材料可以具有多种结构。 输入如何表示、怎样计算相似、允许分成多少组,都会影响找到的结构。仅仅说“自动分组”,还不足以确定你需要什么。

那么,没有正确类别,算法怎么知道分得好不好?它仍然需要一个可计算的目标。

以常见的 K-means 为例,可以先把每篇笔记表示为一组数字,再指定组数 K。算法为每组寻找一个中心,调整样本归属和中心位置,使样本到所属中心的平方距离总和尽量小。这是一个明确的优化目标,并不需要提前知道“这篇应该是前端”。具体的数字表示留到第 05 篇解释。scikit-learn:K-means 的目标与过程

但距离小,并不自动意味着目录对人有用。如果表示方法主要反映文章长度,算法可能把长文分到一起;如果它主要反映词语或语义关联,结果又可能不同。算法算出的“组 0”也不会天然等于“前端”,类别名称和实际用途需要进一步解释。

因此,“无监督”在这里意味着没有逐篇提供目标类别,不意味着没有目标函数、没有设计选择,或没有人来评估结果。如果目的是整理复习资料,就应实际检查:同组笔记是否值得一起复习,混合主题是否需要多标签,分组是否方便查找。

自监督学习:把原始数据变成练习题

第三种需求更加接近大语言模型:手上有大量文本,但没有人为每句话写一道题、配一个答案,能训练吗?

可以。关键是从文本本身构造输入和目标,这叫作自监督学习,self-supervised learning。例如隐藏一部分内容,让模型根据可见部分预测被隐藏的内容。训练信号来自原始数据的结构,无需为每个这样的目标额外做人工标注。Meta AI:自监督学习的信号来源

拿一句非常短的话看整个过程:

原句:我用卡片复习概念
教学切分:[我] [用] [卡片] [复习] [概念]

这里为了便于阅读,手动切成五个单位。真实语言模型处理的单位叫 Token,实际分词未必与汉字或词语一一对应;第二部分会专门解释。现在只需把方括号里的内容看成可以预测的单元。

第一种出题方法,是根据前面的内容预测下一个单元:

模型可用于当前预测的内容 从原句取得的目标
我 用
我 用 卡片
我 用 卡片 复习
我 用 卡片 复习 概念

并没有人额外写四个答案。程序移动切分位置,就从原句中取得了四对输入与目标。训练程序让模型对下一个单元给出预测,再根据原文实际出现的单元衡量预测好坏,调整参数。

这也是语言建模中根据已有序列预测下一个 Token 的基本思路。训练关注的是原文目标获得的概率,而不只是每次挑出的第一名是否答对;概率和损失函数会在第 06 篇展开。《动手学深度学习》:语言模型与训练目标

这里还有一道必须遵守的边界:预测“卡片”的这个位置,不能直接看到待预测的“卡片”和它后面的答案。 实际训练可以在一次计算里处理多个位置,但必须限制每个位置能使用的信息,不能靠偷看目标完成任务。具体机制留到第二部分。

第二种出题方法,是遮住中间的一部分:

模型看到:我 用 [遮住] 复习 概念
训练目标:卡片

这次模型可以利用缺口两侧的内容。BERT 的预训练任务之一就是预测经过遮蔽处理的 Token,通常称为掩码语言建模,masked language modeling。上面的句子只是机制示意,不代表 BERT 的完整遮蔽规则,也不是说所有语言模型都以这种方式训练。BERT 原论文:预训练任务

两种方法的可见信息不同,适合的模型组织方式也不同;它们的共同点是,训练程序从已有文本中拿出了可检查的目标。

已经拿到原文答案,为什么还需要学习

你可能会问:答案本来就在文件里,为什么不直接复制?

因为训练程序和模型当前预测所能看到的信息不同。训练程序持有原句,用它构造题目并检查答案;模型在某个预测位置,只能使用被允许看到的部分。就像出题的人知道填空答案,但答题的人拿到的是遮住内容后的题目。

单看“我用卡片复习”这一题,模型确实可能记住它。训练的目的却是让它在大量不同上下文中形成可复用的规律,在没有见过的文本上也能作出有用预测。至于实际学到了规律还是主要记住材料,需要另外评估,不能由“用了自监督”这个名称保证。

而且,“原文目标”不等于“唯一合理答案”。“我用卡片复习”后面也可以接“英语”。在我们这条训练材料里,目标是“概念”,只是因为作者当时写了这个词。语言模型通过大量实例学习不同续接的可能性,而不是获得一本列尽所有合法句子的标准答案册。

更进一步,原文也可能写错事实。假如某条材料把活动日期记错,自动构造训练目标的程序仍可以把错误日期当作目标。这解释了一个重要边界:能够自动得到训练答案,不等于自动得到经过核实的事实。

自监督学习显著减少了为每一个预测位置手工标注的需求,但没有消除收集、筛选、清洗数据,以及设计任务、投入计算和检验效果的工作。大量文本能变成训练材料,是因为建立了从数据到训练目标的转换过程,而不是因为模型“随便看一遍就什么都懂了”。

这三个名字,并不是三个完全隔离的箱子

阅读资料时,你可能发现一些文章把语言模型预训练叫作“无监督学习”,另一些叫作“自监督学习”。两者未必在描述不同的训练过程。

有的用法把“不依赖额外人工标注”的学习广泛放在无监督范畴里;强调自监督时,则更具体地指出训练目标由数据本身构造。Meta 的解释也讨论了用“自监督”澄清训练信号存在的动机。遇到名称差异,先看作者到底让模型预测什么,再判断其含义。

在本教程里,我们采用下面的区分,方便讨论实际机制:

学习方式 本篇中的训练依据 最容易混淆的地方
监督学习 提供任务输入及其目标,例如笔记和类别 目标不一定全部人工填写
无监督学习,以聚类为例 没有指定类别答案,按设定标准寻找结构 没有类别标签,不等于没有优化目标
自监督学习 从数据自身构造预测目标,例如原句的后续或被遮住部分 有目标,但通常无需逐个额外人工标注

这张表不是给整个机器学习领域画一棵唯一正确的分类树,也没有覆盖所有方法。例如强化学习还会利用行动产生的奖励信号,第 10 篇再展开。

同一个模型也可以经历多种训练。先通过自监督任务学习可复用的文本表示,再用带类别的笔记继续进行监督训练,是可以衔接起来的路线。在已有参数基础上,为具体任务继续训练,通常称为微调,fine-tuning。BERT 论文就讨论了预训练后再针对下游任务微调的方式。这里的“下游任务”,指在已有训练基础上要完成的具体用途,例如文本分类。BERT:微调阶段

因此,不能给一个模型贴上“自监督模型”的标签,就推断它从未接受过监督训练;也不能看到应用现在用于分类,就反推出此前每个训练阶段都是按这个类别表进行的。

对个人项目,先问你究竟缺什么

如果你想做的是复习助手,这些区别能帮助你更准确地提出需求。

当目录已经确定,但分类不稳定时,可以先收集一批明确的输入与期望类别,用于检查现有模型;确有需要时,再考虑是否训练或微调。准备了带标签样本,不代表一定要从零训练,它们也可以首先用于评估。

当目录本身还没有想清楚时,探索分组可能比过早给所有笔记定类别更合适。但要查看分组依据,不能把机器分出的组当成唯一合理的知识结构。

当你只是把笔记交给现成聊天模型,让它输出分类,当前操作通常是推理。即使这些笔记没有标签,也不能因此把这次调用叫作无监督训练;模型是否在更新参数、采用什么训练目标,是另外的事实。

同样,让一个模型给材料自动贴标签,再用这些标签训练分类器,也不能只因“标签不是人写的”就称为自监督。这属于使用模型生成的标签;它与从原始数据自身取得后续内容或隐藏部分的目标,有不同的来源和错误风险。

这些判断最终都回到三个问题:模型实际看到什么,训练目标从哪里来,以及这里是否真的发生了训练。

理解检查:为同一批笔记安排不同任务

请先独立判断以下情形,并说明依据。

  1. 给两百篇笔记标注“前端”或“数据库”,用这些成对数据训练分类器,属于哪种学习?
  2. 不提供类别,把笔记按某种表示的距离分组。既然没有标签,是否可以不设计任何好坏标准?
  3. 取原句“我 用 卡片 复习 概念”,让模型根据“我 用 卡片”预测下一个教学单元。目标是什么,为什么叫自监督?
  4. 把没有标签的笔记发给已经训练好的聊天模型,请它分类,没有更新参数。这次操作是不是无监督训练?
  5. 原句中的事实写错了,自动生成的下一个单元目标会自动纠正它吗?

第 1 题: 监督学习。训练有输入笔记和对应目标类别,程序依据预测与目标之间的差异改进。

第 2 题: 不可以。还需要定义表示、相似性或其他优化依据。即使某个算法提供默认配置,这些选择也仍然存在;得到结果后还要检查它是否适合整理笔记。

第 3 题: 目标是“复习”。它从原句取得,没有为这个预测位置另请人编写答案。预测时不能让该位置直接使用目标本身,否则就破坏了这道题的设置。

第 4 题: 不是。这是在用已有模型进行推理。输入有没有标签,不足以判断发生了哪一种训练,甚至不足以判断是否发生训练。

第 5 题: 不会。这个构造过程取得的是原文中出现的内容,没有另外核实事实。模型最终是否会在其他情境中复现该错误,还受其余数据和训练影响,但这一步本身没有纠错保证。

下一篇会沿着第 5 题继续:既然模型接受的信号来自数据,那么数据的质量、覆盖范围、重复和错误,会怎样影响它能学到什么?


上一篇:02|机器学习:程序怎样从数据中学到规律

下一篇:04|数据怎样决定模型能学到什么

返回:第一部分大纲


05 数据怎样决定模型能学到什么

假设你正在给复习助手做笔记分类。你找来一批文章,又把自己的笔记导出,凑成几千条数据。训练结束后,分类成绩看起来很好,可真正放进几篇随手记下的学习笔记,结果却不理想。

这时,你可能想换更大的模型,或者继续增加数据。但检查材料后,也许会发现:许多文章来自同一份教程的转载,数据库笔记很少,有些代码在导出时丢了,还有一列“原目录”几乎直接写出了正确类别。

这些问题产生的影响不同。重复可能改变样本在训练中的分量,缺少某类内容会留下覆盖空白,导出错误会改变模型看到的输入,而原目录可能让评估变成一道现实中不存在的简单题。

本篇就从这些区别入手。读完后,你应该能对一小批数据做初步检查,解释“更多数据为什么不一定更好”,并分清训练数据、评估数据与用户上传资料。下面的数字、记录和结果都是教学构造,不是真实模型的测试报告;无需安装软件或调用 API。

先看数据走了哪条路

上一篇解释了训练信号从哪里来。这一篇再向前走一步:信号经过怎样的收集与处理,才交到模型手里?

现实中的任务与资料
        ↓ 选择来源、收集样本
原始文件与记录
        ↓ 解析、清洗、标注、组织
模型实际使用的输入与目标
        ↓ 训练
得到的参数
        ↓ 在新输入上使用
用户看到的结果

每个箭头都可能改变信息。你收藏的是图文完整的教程,程序读到的可能只有标题;人标注的是整篇文章的主题,训练时送入的却可能是第一句话。

所以,“我有这些资料”与“模型能从这些资料中学习到相关规律”之间,还有几个具体条件:资料有没有选对,内容有没有读全,输入与目标有没有配对,任务需要的信息有没有留下。

数据也不是能力的唯一决定因素。模型结构、训练目标、计算投入和使用方法同样重要。本篇标题中的“决定”,强调数据对学习机会和信号质量的约束,不表示给定一份数据就能唯一推算出最终效果。

质量:首先确认模型收到的东西没有变样

“高质量数据”听起来像要求所有文章都写得漂亮。对开发者而言,更实用的判断是:这份数据能否帮助完成指定任务。Google 的教材也把数据质量放在任务目标下讨论,并列出错误标签、错误特征、缺失和重复等常见问题。Google:数据质量与可靠性

仍以笔记分类为例,可以先找三种错误。

第一种是内容错误。 一篇 JavaScript 笔记主要靠代码说明问题,导出后代码块却全部消失。整理者看过完整文章,知道它属于前端;模型收到的只剩“下面这样写即可”,几乎没有判断依据。这不是模型一定理解不了代码,而是代码根本没送进去。

第二种是标签错误。 数据库事务笔记被误标成前端,或者两份内容相同的记录被标成两个互相排斥的类别。模型训练时会受到冲突信号。它可能仍从其他数据中学到有用规律,但错误标签会让学习任务更困难。

第三种是字段含义错误。 记录中的阅读时长有的用秒,有的用分钟,混在一起却没有单位;“没有记录时长”又被写成 0。模型可能把真正的零值、没有采集到的值,以及不同单位的值当作可直接比较的数字。

这些不可靠的变化常被称为数据噪声。现实数据很难完全没有噪声,关键是知道噪声在哪里、是否系统性地影响某一类材料。处理缺失、单位与标注问题时,也应保留修改记录,方便回查。Google:数据质量与解释

不过,清洗并不等于“把不好处理的数据全部删掉”。用户真实笔记本来就可能包含错别字、半句话和中英文混写。如果只保留排版完美的教程,数据看起来整齐了,却可能离实际使用更远。应当区分采集损坏与真实输入特点:丢掉的代码需要修复,真实的简略表达则可能需要保留。

覆盖:模型反复看到的世界,可能与你要用的世界不同

假设准备的数据大多是正式教程,未来用户输入的却主要是课堂速记和排错记录。即使所有标签都正确,也不等于数据已经覆盖了任务。

“覆盖”关心的是出现过哪些情况,包括主题、写作方式、长度、来源、语言和时间。它不要求穷举每一种输入,但要求你识别经常出现、或者出错代价较高的情况,避免它们在数据里几乎缺席。

拿自己的复习助手来说,可以先做一个小表:

实际会遇到的输入 数据里是否有代表性例子 缺少时可能遇到的问题
正式的前端入门文章 较多 容易误以为整个任务都很简单
SQL 排错片段 很少 数据库类的错误被总成绩掩盖
同时涉及网页与数据库的笔记 没有 强行二选一,遇到边界就混乱
没有标题的随手记录 没有 依赖标题线索的做法失效

这不是普适的必备样本清单,而是根据预期使用场景构造的检查表。换成语音应用,就需要考虑不同说话方式、背景声音等条件。

还有一种情况是比例失衡。假设一份评估材料有 90 篇前端笔记、10 篇数据库笔记。一个永远输出“前端”的程序,也能答对 90 篇:

总体正确比例 = 90 ÷ 100 = 90%
数据库笔记答对比例 = 0 ÷ 10 = 0%

这不意味着所有不均衡数据都该强行改成一半一半。真实需求本来就可能以前端为主。但如果你希望数据库笔记也能正常处理,就必须单独查看这部分表现;一个总数无法替你表达所有需求。完整指标会在第 12 篇讲,这里先看清比例怎样遮住问题。

数据来源也会带来偏差。如果只收集一个论坛上的高赞教程,实际取得的是“那个论坛中被发布、被推荐、又被你选中的内容”,不等于所有学习笔记。这种选择造成的偏差,不是给每条记录纠正错别字就能解决的。

更多同来源样本可能继续强化原来的覆盖方式。补数据时,应先问缺少哪类经验,而不只问还能下载多少文件。

重复:一万条记录,不一定是一万份新经验

假设你收集了一百篇不同的文章,其中一篇热门教程又被转载了九百次。文件总数变成一千,内容覆盖却仍主要是原来那一百篇。

如果训练按记录等概率抽取,这篇教程及其副本就占了 901 条,出现机会约为 90.1%。这样的数据并非简单地“多了九百份知识”,而是让某一份内容在学习过程中占了很大分量。

这也解释了为什么重复不只有“浪费存储”这一种影响。它可能改变不同来源的权重,使模型更多记住某些表达,还可能让训练与评估材料互相重叠。关于语言模型训练数据去重的研究,也讨论了重复、记忆性输出和训练—评估重叠之间的问题;其具体实验结果不应直接套用到任意模型。原论文:Deduplicating Training Data Makes Language Models Better

实际检查时,文件名不同并不能证明内容不同。一篇笔记导出成 Markdown 和 PDF,换个标题再保存,甚至把段落顺序稍作调整,都可能仍来自同一份原始材料。

去重也需要任务判断。两条真实的阅读记录发生在不同日期,即使对应同一篇文章,也可能是两次有用的行为观察;为了照顾少数类别而有意识地增加抽样次数,也不同于不知道材料被重复导入。应当弄清重复的来源和用途,再决定合并、保留或调整权重。

泄漏:模型可能提前拿到了本来不该知道的信息

现在看开头那列“原目录”。假设你从已经分类的文件夹导出笔记,把路径也作为输入:

/前端/CSS布局.md      → 标签:前端
/数据库/事务笔记.md   → 标签:数据库

模型不必理解正文,只要利用路径中的类别名称,就能在这批数据上取得好成绩。可真正的新笔记来自“待整理”文件夹,根本没有这个信息。

这种做法使用了实际预测时拿不到的线索,是数据泄漏,data leakage的一种情况。泄漏会使评估过于乐观;它也可能发生在数据划分或预处理环节,不只是直接把答案写进输入。scikit-learn:数据泄漏

另一个例子是,把同一篇教程的原文放进训练集,把改了标题的副本放进测试集。原本想检查“面对新材料能否判断”,实际检查的却可能是“见过这段内容后还能不能认出来”。这类重叠会削弱评估的独立性。

如果要测试对全新笔记的处理能力,应把同源副本视为一组,避免拆到训练和最终测试两侧。若要检查面对未来资料的效果,还要注意时间顺序,不能把未来才知道的信息塞进过去的预测输入。具体怎样划分数据,第 09 篇再展开。

这里有一个容易过度纠正的地方:不是所有“输入里有答案”都叫泄漏。如果你的应用承诺“阅读用户给出的资料,再回答其中的问题”,用户资料本来就是允许使用的信息。测试时提供这份资料,是任务设置的一部分;把参考答案偷偷放进模型原本不允许看到的地方,才改变了考题。

所以,判断泄漏要先明确:真正使用时,模型在这个时刻允许得到什么信息? 数据中存在某个字段,并不说明预测时就能得到它。

训练数据、评估数据与上传资料,作用并不一样

做大模型应用时,常会听到“把资料喂给模型”。这句话太模糊了,至少可能指以下三件事:

数据的用途 实际发生的操作 应该怎样理解效果
训练或微调材料 按训练目标计算并更新参数 材料参与形成或调整模型行为
评估材料 在固定条件下运行模型,再比较结果 用来检查能力,不能仅凭运行就认为已更新参数
当前回答的参考资料 把内容放进本次输入,或先检索再提供相关段落 改变这次回答可利用的信息,不等同于参数训练

“先从资料库找相关段落,再交给模型回答”,通常称为检索增强生成,RAG。相关原始研究就区分了模型参数中的信息与外部可检索资料。RAG 原论文

对于一个仅做检索和生成、没有另行训练步骤的复习助手,新上传的笔记可以保存在资料库里,并在下次被检索出来,但这不等于大语言模型的参数已经学会了它。

反过来,做了微调,也不能理解成“把每条资料准确写进一个永不出错的数据库”。训练是在调整模型行为,能否正确回答相关问题仍要检查。

这三种用途都需要好数据,但出问题后的修复位置不同。如果新笔记解析时丢了代码,应先修解析;如果检索给出了旧版本内容,应检查资料选择和版本;如果训练标签长期混乱,才需要回头处理训练信号。仅凭“回答错了”,无法判断是哪一层出了问题。

用六条记录,练习一次数据检查

下面是一份虚构的笔记数据清单。任务约定:让分类器处理未来新写的、尚未归档的笔记。最终测试希望检查它对新材料的表现。

记录 内容或来源情况 当前安排
01 CSS 布局教程,内容完整,来源组 A 训练;标签“前端”
02 01 的 PDF 副本,只换了标题,来源组 A 最终测试;标签“前端”
03 数据库事务说明,正文明确讨论数据库修改 训练;误标为“前端”
04 JavaScript 代码笔记,导出后代码块全部消失 训练;标签“前端”
05 尚未归档的 SQL 排错速记,内容可读但不完整 尚未安排;标签待确认
06 正常教程,输入中额外保留“原目录=数据库” 训练;标签“数据库”

先想一想:你会优先检查哪几条?其中哪些可以修复,哪些不该简单删除?

01 与 02 要一起看。 如果用于检验新材料能力,就不应因为文件格式不同而把同源内容拆到训练和最终测试两侧。应先识别来源组,再决定整组的用途;需要另外寻找独立材料补充测试。

03 要核对并改正标签,同时记下修改依据。 不能仅因当前模型也判断为前端,就反过来认定原标签正确。模型可能正受这些标签影响,验标签应回到资料和分类标准。

04 要回查原文件与解析结果。 优先恢复丢失代码;确实无法修复时,标记原因并决定是否排除。直接增加训练轮数,并不能把未输入的代码变回来。

05 不应仅因不够工整就删除。 它接近未来真实输入,可能正好补足覆盖。但要判断现有内容是否足够分类,必要时补充上下文或标为待确认,而不是强行造一个确定答案。

06 要核对字段在使用时能否取得。 本题的新笔记尚未归档,原目录不应作为预测依据。可以保留它用于内部追溯,但要与交给分类器的输入分开。

这次练习没有要求先选一个更强模型。它做的是把材料、目标和实际使用条件对齐,让后面的训练与评估有可解释的基础。

给资料留一张简短说明

个人项目不必一开始建立复杂的数据管理平台,但至少应记住这一批材料是什么、为什么这样处理。研究论文《Datasheets for Datasets》提出为数据记录来源、组成、收集过程和建议用途等信息;小项目可以借鉴这个思路,采用简短版本。Datasheets for Datasets

例如,为上述练习写下一段说明:

用途:给未来尚未归档的个人笔记分类。
来源:个人笔记与收藏教程;保留来源组和资料日期。
输入:实际可取得的正文;不提供已分类目录。
标签:按主题标注;混合主题和信息不足的记录待确认。
已知缺口:数据库排错速记较少。
处理记录:修复代码丢失,纠正已核实错标,识别同源副本。
评估边界:最终测试使用未参与训练和调试的独立材料。

它不是完成质量检查的证明,而是一份可回查的约定。下次发现模型在速记上表现差,你可以先检查已知覆盖缺口;数据增加之后,也能知道新材料是否真的补上了缺口。

到这里,你已经能把“数据不好”拆成不同问题:内容或标签不可靠,场景覆盖不足,同源重复改变了分量,或者评估使用了不该提前获得的信息。下一篇会继续追问:即使内容正确、来源合适,文字和图片又怎样变成模型可以计算的数字与向量?


上一篇:03|监督学习、无监督学习与自监督学习:训练信号从哪里来

下一篇:05|模型怎样表示信息:从数字、向量到学到的特征

返回:第一部分大纲


06 模型怎样表示信息:从数字、向量到学到的特征

你的复习助手现在已经有了一批来源清楚、内容完整的笔记。接下来,你希望它在打开一篇笔记时,推荐几篇相关材料。

人看到“网页布局”和“CSS 排版”,容易判断它们可能相关;程序却需要一种可计算的比较方式。直接比较文件名不够,数相同的字也不一定有效。另一边,一张纸质笔记的照片又完全不是一串普通文字。

要处理这些信息,必须先解决“表示”的问题:用什么数字保存输入,又用什么计算把它变成适合任务的形式?

本篇从可以手算的小例子解释标量、向量、矩阵,以及模型学到的表示。读完后,你应该能看懂一组数字的形状,完成一次简单的相近程度比较,并解释为什么向量不等于语义、向量维数也不等于模型参数量。下面的数据全部是教学构造,没有调用真实嵌入模型,不需要安装软件。

一个数字,怎样变成一组数字

先暂时离开电子笔记,看看两本纸质笔记本。

假设你想按页数与价格寻找相近商品,可以约定:每本用两个数字记录,第一个是页数,第二个是以元计的价格。

笔记本甲:[80, 12]
笔记本乙:[100, 10]
约定顺序:[页数, 价格(元)]

单独的一个数,例如价格 12,可以称为标量,scalar。按照固定顺序排列的一组数,例如 [80, 12],可以用作一个向量,vector。这里向量包含两个分量,也就说它是二维向量。

在机器学习的这个语境里,可以先把向量理解为一条有固定位置含义的数字记录;矩阵则把数字按行和列组织起来。这些是后续模型计算常用的基本对象。《动手学深度学习》:线性代数基础

顺序不能随便变。[80, 12] 与 [12, 80] 包含相同的两个数,在刚才的约定下却描述不同商品。单位也不能混用:把 12 元记成 1200 分之后,比较方法就必须相应处理,不能直接拿它与按元记录的数据相减。

因此,“变成向量”并不是某种理解过程。我们还没有训练模型,只是规定了一种表示。它保留了页数和价格,却没有保留封面颜色、纸张手感和装订方式。如果推荐结果忽略了你最在意的纸张,可能是表示里根本没有相关信息。

给笔记做一个最简单的向量

回到电子笔记。我们先采用很粗糙的规则:只数正文中 CSS 和 SQL 两个字符串出现的次数,并固定顺序为 [CSS 次数, SQL 次数]。

假设三篇笔记得到以下计数:

笔记 CSS 次数 SQL 次数 向量
A:以网页样式为主 8 1 [8, 1]
B:以页面布局为主 7 2 [7, 2]
C:以数据库查询为主 1 8 [1, 8]

这些次数为演示而设定,不是对本表标题进行实际统计。它们表示假想正文的计数。

如果把三条向量按行放在一起,会得到一个三行两列的矩阵,matrix:

         CSS  SQL
笔记 A    8    1
笔记 B    7    2
笔记 C    1    8

形状:3 × 2,即 3 个样本、每个样本 2 个特征。

这里的行与列承担不同职责。新增一篇笔记,会多一行;增加一个统计词,会多一列。三个样本不意味着“三维特征”,它们仍然各自用二维向量表示。

程序里的形状信息,也就是常见的 shape,就是在说明这些轴上各有多少元素。先读清每个轴代表什么,比背“模型输入是一个矩阵”更有用。

数字准备好了,怎样计算“更接近”

对这三个向量,我们选一种简单比较方式:同位置相减,把差平方,再加起来。

A 与 B 的差异值:
(8 − 7)² + (1 − 2)² = 1 + 1 = 2

A 与 C 的差异值:
(8 − 1)² + (1 − 8)² = 49 + 49 = 98

上标 2 表示这个数乘以自身,例如 (-1)²=1。这个差异值叫作欧氏距离的平方。真正的欧氏距离还要开平方,不过这里只比较大小,开平方不会改变排序,所以可以省掉这一步。

按照选定的表示与比较方式,B 比 C 更接近 A。于是,一个极简的推荐程序就可以把 B 排在 C 前面。

这一步说明,向量让某些比较变成了明确的计算。但它只证明两组关键词计数接近,没有证明文章一定讨论同一个问题。

例如,一篇只写“样式、排版、布局”的笔记可能一次也没出现 CSS,得到 [0,0];一篇介绍数据库但主要写“查询、索引、事务”的笔记,也可能得到 [0,0]。在这个表示中,它们的差异值为 0,尽管内容未必相近。

问题不是距离公式算错了,而是两个数字丢掉了太多信息。同样,把 A 全文复制一遍,就可能得到 [16,2]。主题没变,原始计数与距离却变了。用不用词频比例、怎样处理文章长度,都是表示设计的一部分。

前面的商品例子还有单位问题。直接比较“页数差”和“价格差”,实际上已经隐含了两种差异如何相互权衡;把元换成分会大幅改变价格项的数值。距离的意义依赖表示、尺度和任务,不能脱离这些条件理解。

图片也是数字,但数字排列有意义

文字可以先数词,图片又怎么办?

先看一张只有 2×2 个像素的灰度小图。约定每个像素用 0 到 255 之间的整数表示,0 是黑,255 是白:

视觉位置:     对应数值:
黑  白         0   255
白  黑       255     0

它可以表示为两行两列的矩阵。如果约定逐行读取,也可以展开成 [0,255,255,0]。只要保留读取顺序和原始形状,展开本身不必丢失像素信息;但后续计算是否有效利用上下、左右的关系,是另一件事。

彩色图片通常还要记录红、绿、蓝三个颜色通道。按“高、宽、通道”的约定,一张 2×2 的 RGB 图片可以组织为形状 2×2×3 的数组,共 12 个数。这里的“通道”,就是在同一像素位置分别存放不同颜色分量。

有更多轴的这类数组,在深度学习代码中通常统称为张量,tensor;向量与矩阵也可以看成它的简单情形。不同软件可能把通道放在不同轴,因此读代码时还要确认约定,不能只数出几个维度就直接使用。

这里容易混淆两种“维”:说一个向量是四维,指它有四个分量;说一个数组有三个轴,指需要三个位置索引来找到一个元素。2×2×3 有三个轴、十二个数,并不是一个只有三个分量的向量。

像素值仍然只是输入表示。它们没有直接写着“这是猫”或“这是课堂笔记”。同一张照片换个光照,许多像素都会改变;任务通常需要模型进一步提取比逐像素相等更有用的特征。

从人挑特征,走向学习怎样表示

刚才的关键词次数是人决定的:看哪两个词、怎样计数,都提前写在程序里。这种办法容易检查,但遇到同义表达、语序或上下文变化时,往往需要不断补规则。

另一条路线是把生成表示的过程也放进模型,让训练根据任务需要调整它。这个方向通常叫作表示学习,representation learning。相关研究关注的正是:怎样获得有助于后续任务的表示,而不完全依赖人为指定的一小组特征。表示学习研究综述

可以把两种路线放在一起看:

人工特征路线:
笔记 → 按预设规则统计 CSS/SQL → [8,1] → 比较或分类

学习表示路线:
笔记 → 可训练的编码过程 → 一组学到的特征值 → 比较或分类
                 ↑                         │
                 └──── 训练目标提供改进信号 ───┘

“编码过程”在这里就是把输入变成另一种表示的计算过程,不是指加密。

举一个训练目标的示意:如果希望找出表述不同但主题接近的笔记,可以准备相近与不相近的文本对,用目标函数鼓励适合匹配的文本表示更接近、不适合匹配的表示更容易区分。模型通过调整参数改变这种映射。实际方法有很多种,并不是所有表示学习都采用成对比较。

这与上一篇并不矛盾:训练目标和数据决定了模型受到什么信号,表示学习让模型有机会调整“利用哪些线索、怎样组合线索”。它并不能保证自动保留所有重要信息。

对图片也一样,学习的表示可以用于突出与识别任务有关的图案,减少某些无关变化的影响。但没有必要假定每一层必定对应一个人能准确命名的概念;更不能认为只要层数够多,就自然学到了我们想要的特征。神经网络怎样完成这些变换,第 07 篇再拆开讲。

Embedding:把对象放进可以比较的表示空间

接触大模型应用时,你会频繁看到 Embedding,嵌入。在这里,可以把它理解为把词、句子或其他对象映射为向量表示;常见的学习型嵌入希望通过向量之间的关系,表达对任务有用的联系。

比如,对一个适合语义匹配的模型,我们希望“怎样调整网页排版”和“CSS 布局方法”的向量比较接近,即使两句话几乎没有相同词。但能否做到、哪些表达容易出错,要用实际模型检查。本篇没有生成它们的真实向量,也不预设相似度分数。

词向量研究曾展示从文本学习连续向量表示的路线;Sentence-BERT 则研究了适合句子比较的嵌入。这提醒我们,词、句子和整篇材料可以有不同的表示方式,不能随便取一个模型的内部数字,就认为它天然适合检索。词向量原论文、Sentence-BERT 原论文

学习到的向量往往不像 [页数,价格] 那样,每个位置都有清楚的中文名字。不能看到一个三维演示,就推断真实嵌入的第一个数字是“前端程度”、第二个是“数据库程度”。它们的各个分量通常共同参与表达关系,单独一维未必能被简单解释;表示也会随任务而不同。Google:实际嵌入空间

这里还有三条直接影响开发的边界。

第一,维数相同,不代表可以混用。 两个不同模型都输出几百个数字,不说明它们采用相同的表示空间。就像两套商品记录都写两个数,一套是页数和价格,另一套是重量和厚度,直接逐项比较就失去了原来的意义。实际使用应采用彼此兼容、按模型要求生成的查询与资料表示。

第二,接近不等于事实相同。 “这个操作需要登录”和“这个操作不需要登录”讨论相同对象,关键结论却相反。即使某个模型把它们排得很近,也不能据此认定它们互相支持。相似度通常帮助找候选资料,最终还要阅读内容。

第三,生成一个向量不等于训练一次模型。 已训练的编码模型处理新笔记时,可以在参数不变的情况下输出新向量。把向量存进资料库,改变的是保存的数据,不等于模型参数发生变化。判断一个数组是不是参数,要看它在计算中的作用,不能只看它是不是一组数字。

至于欧氏距离、余弦相似度等比较方法怎么选择,以及嵌入如何参与检索,第二部分第 10 篇会结合应用讲。本篇先建立表示与计算之间的关系。

用几个小问题,检查自己有没有把数字看明白

仍然使用前面的三个向量:A=[8,1],B=[7,2],C=[1,8]。新笔记 Q 的计数为 [6,2]。

  1. 按“对应分量相减、平方、求和”的方法,Q 与哪篇最接近?
  2. 把 Q 加进三行两列的表,矩阵形状变成什么?每篇笔记变成三维了吗?
  3. 两篇内容完全不同的文章都没有出现 CSS 或 SQL,它们在这个表示下距离为 0,能说明内容相同吗?
  4. 一个模型输出 768 个数的笔记向量,能否据此说这个模型只有 768 个参数?
  5. 一张 2×2 的 RGB 图片按“高、宽、通道”保存,共有几个轴、几个数?

第 1 题: 与 B 最接近。计算如下:

Q 与 A:(6−8)² + (2−1)² = 5
Q 与 B:(6−7)² + (2−2)² = 1
Q 与 C:(6−1)² + (2−8)² = 61

这个答案只在当前计数表示和比较方法下成立,不能把它当作真实语义匹配结果。

第 2 题: 变成 4×2,四个样本、每个两个特征。增加样本与增加特征,是不同操作。

第 3 题: 不能。两个表示相同,可能只是这套表示没有保留区分它们的信息。

第 4 题: 不能。768 描述这次输出向量的维数;模型参数是决定如何计算的内部数值,其数量不能从输出长度直接推断。这个数字只是假定的输出长度,不指某款产品。

第 5 题: 三个轴,2×2×3=12 个数。若把它们按确定顺序展开,可以得到十二个分量的向量;要还原像素位置,仍须知道原来的形状和顺序。

现在,当你再看到“把资料转成向量”时,已经可以追问:哪些信息被保留了,形状与顺序是什么,表示是人工设计还是训练得到的,比较方法能支持什么结论?下一篇会继续解释训练过程的另一半:模型给出预测后,怎样用概率与损失衡量它需要改进多少。


上一篇:04|数据怎样决定模型能学到什么

下一篇:06|概率、预测与损失:模型怎样知道自己需要改进

返回:第一部分大纲


07 概率、预测与损失:模型怎样知道自己需要改进

复习助手收到一篇前端笔记。两个分类模型都选了“前端”,但内部给出的结果不同:

模型甲:前端 0.51,数据库 0.49
模型乙:前端 0.99,数据库 0.01

如果只数答案对不对,它们这一次都得一分。如果最后发现标签其实是“数据库”,它们又都错一次。这样的计分方式,没有表达两组预测之间的差别。

训练时,我们往往希望获得更细的反馈:模型给目标类别分配了多少概率,预测偏离目标有多远,这种错误该计多大的代价。损失函数就是把这些要求变成可计算数值的一种方法。

本篇会把概率、类别预测、误差与损失分开,再用两个小算例把它们连起来。所有概率和记录均为教学构造,不是真实模型测试。你只需要会四则运算;对数公式会给出直觉与数值表,不要求先学高等数学。

概率分布表达什么,最终答案又是什么

先约定一个简化任务:每篇笔记只能属于“前端”或“数据库”中的一个类别。暂时不处理混合主题,也不把这两个类别当作所有真实笔记的完整分类体系。

模型可以为两个候选分别给出概率。下面是同一篇笔记的三种假想输出:

输出 前端 数据库 若总选概率较高的类别
甲 0.51 0.49 前端
乙 0.99 0.01 前端
丙 0.20 0.80 数据库

在这种互相排斥、从中选一的设置中,各概率不能为负,总和为 1。这一整组概率就是候选类别上的概率分布。0.8 可以写成 80%。

概率分布和选出的类别是两个层次。甲与乙选出的类别相同,但分布不同;把分布压缩为一个类别,会丢掉一部分信息。

还要区分概率与普通分数。第 02 篇的分类器可以算出 -1,这个数只是中间分数,不是负概率。有些模型先计算不受 0 到 1 限制的分数,再通过适当变换得到概率。例如 Softmax 可以把一组分数转成非负且总和为 1 的分布;其具体公式现在可以先不展开。《动手学深度学习》:分数、Softmax 与分类概率

因此,看到一个数字时,先问它表示什么。检索相似度、分类分数、类别概率和聊天回答里写出的“可信度”,不能只因为都能显示成小数就互换。

模型给出 80%,不等于每一次都有现实保证

概率输出描述的是模型基于当前输入作出的估计,不是模型直接读到了现实中的确定答案。

怎样判断这种估计可信?一种检查方式是观察一批类似预测:如果模型把许多样本属于前端的概率都报在 0.8 附近,那么在与使用场景相符、数量足够的样本中,实际属于前端的比例是否也接近 80%?这种预测概率与实际频率的对应关系,涉及概率校准,calibration。scikit-learn:概率校准

这里要看一批样本,不能因为某一篇“80% 前端”的笔记恰好是数据库,就单凭这一次证明模型概率有问题。同样,也不能因为一次猜对,就证明它的概率一直可靠。

模型可能报得过于确定。假设它把一批样本的前端概率都报成 0.99,实际只有大约六成是前端,那么这些概率就没有准确反映这批数据上的情况。换了来源或使用场景以后,原来观察到的对应关系也未必保持。

对聊天模型还要多分清一步:让它在答案后写“我有 90% 的把握”,首先得到的是一句生成文本。除非另外定义并验证了这类报告的含义,否则不能直接把它等同于经过校准的答案正确概率。

这并不是说概率输出没有价值,而是说:概率的数值、它是否校准,以及某次结论是否正确,需要分别检查。

损失函数:把“这次表现怎样”变成一个数

损失,loss,是按照指定规则,对预测与目标之间的不符进行计分。损失函数,loss function,就是产生这个分数的规则。下面使用的损失都按“越小越好”设计。

为什么不总用“答错记 1,答对记 0”?这种规则很直观,第 02 篇穷举少量参数时就足够使用。但在许多需要逐步调整参数的模型里,它给出的信息比较粗:前端概率从 0.51 提高到 0.99,类别没变,计分也完全不变。

如果我们希望训练能利用这些变化,就需要更细的目标。分类概率常用交叉熵一类损失;预测阅读时长这样的数值,则可以用平方误差等损失。选什么规则,要结合输出形式和希望惩罚的错误。

损失函数本身并不会自动判断用户满意不满意,也不会负责确认标签是不是事实。它按照你给出的目标计算。标签错了,降低相对于这个标签的损失,甚至可能让模型朝错误方向调整。

先看容易手算的情况:预测时长差了多少

假设我们要预测阅读两篇笔记的时长,已核实的目标与预测如下:

笔记 目标时长 预测时长 预测减目标
A 6 分钟 4 分钟 -2 分钟
B 10 分钟 12 分钟 +2 分钟

如果直接把两个带符号的误差求平均,得到 (-2+2)÷2=0,但模型显然没有两篇都预测准确。正负相抵掩盖了偏离。

一种做法是把每个误差平方,再求平均:

A 的平方误差:(-2)² = 4
B 的平方误差:(+2)² = 4
平均平方误差:(4 + 4) ÷ 2 = 4

这叫作均方误差,Mean Squared Error,MSE。这里的结果单位是分钟的平方,不能把数值 4 直接读成“平均错了 4 分钟”。Google:平方误差与均方误差

平方还会改变对大误差的重视程度:错 4 分钟的平方误差是 16,错 2 分钟是 4,前者是后者的四倍。假如某个样本时长因为采集错误变得特别大,它就可能对这种损失产生较大影响。这也把本篇与数据质量联系起来。

平方并不是唯一选择。例如取误差绝对值,也能避免正负相抵。我们暂时不比较所有损失,只需理解:损失函数规定了怎样把不同程度的错误算进目标里。

分类时,为什么给正确类别的概率很重要

回到笔记分类。对于每个样本只有一个目标类别的常见分类任务,可以取出模型分配给这个目标类别的概率,记作 p,再计算:

单个样本的交叉熵损失 = -ln(p)

这里 ln 表示自然对数。你可以暂时把这条公式看成一条换算规则:目标概率越接近 1,损失越接近 0;目标概率越接近 0,损失越大。它也常被称作对数损失。多个样本可以再对各自的损失求平均。scikit-learn:Log loss 的定义与自然对数

不用亲手计算对数,先看这张数值表:

分配给目标类别的概率 p 损失 -ln(p),约数
0.99 0.010
0.90 0.105
0.60 0.511
0.50 0.693
0.40 0.916
0.10 2.303
0.01 4.605

关键是取目标类别的概率,不是每次取最大的那个数。

例如,一篇笔记的目标标签是数据库,模型给出“前端 0.99、数据库 0.01”。这次用于计算的 p 是 0.01,损失约为 4.605。它没有因为“对某个类别很确定”而受到奖励;它非常确定地偏向了错误类别,反而付出较大损失。

如果同一篇改成“前端 0.60、数据库 0.40”,最终仍可能选错前端,但损失降为约 0.916。模型至少给目标类别留下了更多概率。

这里“对”或“错”始终是相对于提供的标签而言。损失不会越过标签,直接检查现实事实。

从数学上说,当 p 趋近 0 时,-ln(p) 会越来越大。实际软件需要用稳定的数值计算处理极小概率;本篇用的概率都严格大于 0,不要求读者处理这些实现细节。

正确率相同,损失仍然可以不同

用两篇笔记比较两个候选模型。每行括号内的顺序都是 [前端概率, 数据库概率],两者都采用“选概率较高类别”的规则。

样本 目标类别 模型甲 模型乙
A 前端 [0.60, 0.40] [0.99, 0.01]
B 数据库 [0.60, 0.40] [0.99, 0.01]

两个模型都把两篇归为前端,因此都只答对 A,正确率均为 50%。但它们的平均损失不同:

甲:(-ln(0.60) - ln(0.40)) ÷ 2 ≈ 0.714
乙:(-ln(0.99) - ln(0.01)) ÷ 2 ≈ 2.308

甲在这个损失下更好。乙在 A 上很小的损失,没有抵消它在 B 上极大的损失。

这不是建议模型永远输出 0.5,也不是让模型“尽量模糊”。如果模型真能区分这两篇,把 A 的前端概率、B 的数据库概率都提高到 0.99,平均损失就会约为 0.010。目标是让概率分配符合数据,而不是统一提高或降低所有回答的确定程度。

这个例子还说明,损失与正确率回答的是不同问题。正确率只看最终类别对了多少;这里的交叉熵还关心模型给目标分配了多少概率。因此训练损失下降时,正确率未必立刻上升;反过来,也不能只凭正确率相同就断言两个概率模型完全一样。

语言模型也在对概率分配计分

第 03 篇把一句话切成教学单位:

我 用 卡片 复习 概念

在“我 用 卡片”之后,原句目标是“复习”。训练时,模型会对可能的下一个 Token 分配概率,再依据“复习”对应目标的概率计算损失。常见的自回归语言建模会在多个预测位置汇总这种负对数概率。《动手学深度学习》:语言模型的交叉熵目标

这里沿用教学切分,不代表真实分词器一定把“复习”当作单个 Token。它只帮助你看出:把“前端、数据库”换成更多可能的文本单元,概率与目标之间的比较思路仍然存在。

也正因为如此,Token 概率不等于整段回答的事实正确概率。“答案是”可能是很容易续写的开头,后面的日期却可能写错;一个目标位置概率提高,也不能独立证明整张复习卡片已经准确、完整、适合学习。

在原文中找出目标,再计算损失,使训练可以规模化进行;实际应用是否可靠,还需要任务层面的检查。

训练目标与用户目标,为什么会有距离

复习助手的用户可能关心:卡片是否忠于原文,题目能否帮助复习,是否遗漏关键条件,生成后能不能正确保存。一个文本预测损失很难单独覆盖所有这些要求。

即使只做分类,也可能存在不同代价。例如,把正常邮件误放进垃圾箱与漏掉一封广告,对用户造成的影响未必一样。是否在训练中加权、怎样选择最终决策阈值、哪些情况需要确认,都属于另外的设计选择,不能期待一个默认平均损失自动包含它们。

可以把训练与检查的分工画出来:

输入 → 模型 → 预测
               │
目标标签 ──────┤
               ↓
          按损失函数计分
               ↓
       训练算法据此调整参数

另用未参与训练与调试的材料,检查实际任务是否完成。

损失是训练算法的重要依据,不是用户满意度的同义词。训练集损失下降,也只说明模型在当前目标和这些样本上的得分改善了;它对新资料是否有效,仍要看独立评估。第 09 篇会解释泛化,第 12 篇会继续讲任务指标。

当你看到一条下降的训练曲线,可以具体追问:用的是什么损失、算在什么数据上、是否与之前采用相同单位和平均方式,以及真实使用的问题有没有改善。脱离这些条件,不同任务的损失数字不能直接排大小。

理解检查:你会选择哪个数字

  1. 某样本标签是数据库,模型输出“前端 0.9、数据库 0.1”。计算本篇的单样本交叉熵,应取 0.9 还是 0.1?损失约为多少?
  2. 两次时长预测误差分别是 -3 分钟和 +3 分钟。均方误差是 0、3 还是 9?
  3. 两个模型正确率一样,交叉熵是否一定相同?
  4. 聊天模型写下“我有 90% 把握”,能否直接认为它每十次这样的回答会对九次?
  5. 训练损失降低,是否足以证明复习卡片的事实更准确、保存功能也正常?

第 1 题: 取目标类别数据库的概率 0.1,损失约为 2.303。取最大概率 0.9 会把“对错误类别很确定”误算成好的预测。

第 2 题: 是 9,因为 ((-3)²+3²)÷2=9,单位为分钟的平方。带符号平均为 0 并不表示没有误差。

第 3 题: 不一定。两个模型可以作出相同类别选择,却给目标分配不同概率;前面的甲乙例子就是反例。

第 4 题: 不能直接这样解释。这首先是一句输出文本,需要另外验证其报告与实际正确率的关系,不能因为格式像概率就认为已经校准。

第 5 题: 不足以。需要检查损失的定义、所用数据及任务结果。事实准确性要对照资料核实,保存功能要读取实际保存结果,它们不会仅靠训练曲线得到证明。

现在,我们已经知道输入怎样表示、预测怎样计分。下一篇先打开模型内部,看看神经网络如何用多层计算把输入变成输出;再下一篇才会把这些计算与损失连接起来,解释梯度下降、反向传播和参数更新。


上一篇:05|模型怎样表示信息:从数字、向量到学到的特征

下一篇:07|神经网络与深度学习:多层计算怎样形成能力

返回:第一部分大纲


08 神经网络与深度学习:多层计算怎样形成能力

你把复习笔记分别保存在两份清单里,想找出“只出现在其中一份”的笔记,以便检查两份清单是否同步。

对每篇笔记,只记录两个数字:x₁ 表示它是否在清单 A 中,x₂ 表示它是否在清单 B 中;在记作 1,不在记作 0。希望输出的结果如下:

x₁:在 A 中 x₂:在 B 中 是否需要检查
0 0 0
1 0 1
0 1 1
1 1 0

这个规则写成普通程序很简单:两个值不一样就标记。我们借它提出一个不同的问题:模型能否通过分层计算,表示“两个条件怎样组合才算成立”?

本篇会搭出一个可以手算的神经网络,解释权重、偏置、激活函数和隐藏层。例子中的参数由我们直接指定,用来展示机制,本篇没有进行训练实验;实际开发清单同步功能,也没有必要为这种明确规则训练网络。

读完以后,你应该能看懂一个小网络怎样产生输出,并分清“网络能表示什么”“训练能否找到合适参数”“真实项目是否可靠”这三个问题。

从一个计算单元开始:加权相加,再做变换

前面几篇已经出现过按特征计算分数的模型。一个常见的神经网络计算单元,也可以先从这一步理解:

中间分数 z = w₁ × x₁ + w₂ × x₂ + b
单元输出 h = 激活函数(z)

x₁、x₂ 是输入;w₁、w₂ 是权重,weight,决定输入怎样参与相加;b 是偏置,bias,是在加权结果上再加的一个数。权重和偏置通常属于训练要调整的参数。

例如,暂时取 w₁=2、w₂=-1、b=-0.5。输入 [1,0] 时,中间分数是 2×1-1×0-0.5=1.5。权重为负,并不是出现了“负概率”;我们此时算的是一个中间分数。偏置也不是“数据偏见”的意思,而是这个公式里的平移项。

如果输入全为 0,没有偏置时分数只能是 0;有偏置时,它可以是 b。这让模型不必把所有输入关系都限制在经过零点的形式中。

这里的“神经元”可以先理解为计算单元,不需要把它想象成一颗会思考的小脑细胞。把多个单元放在一起,一次得到一组输出,就是构建一层的基本方式。Google:神经网络的节点与隐藏层

为什么还需要激活函数

激活函数,activation function,是对中间分数进行的变换。先认识一种最容易手算的选择:ReLU。

ReLU(z) = max(0, z)

z 小于 0:输出 0
z 大于或等于 0:保留 z

因此 ReLU(-2)=0,ReLU(0)=0,ReLU(1.5)=1.5。它不是“负数变成 0、正数变成 1”,也不会把所有输出限制在 0 到 1 之间。Keras:ReLU 的定义

这一步引入了非线性。这里不必先学抽象定义,可以看输入增加 1 时会怎样:从 -2 变成 -1,输出仍为 0;从 1 变成 2,输出则增加 1。同样的输入增量,在不同区域产生不同效果。

这种变化让后续层能够有条件地利用前面算出的信号。ReLU 只是一个易懂的例子,神经网络还有其他激活函数;本篇不要求背名字,也不意味着所有大模型都使用同一种激活函数。

单纯多算几层,为什么还不够

假设没有这种非线性变换,第一层只算:

h = 2x + 1

第二层再算:

y = 3h - 4

把第一层的结果代进去,就得到:

y = 3(2x + 1) - 4 = 6x - 1

看上去经历了两层,结果却能合并成一次同类计算。在只由“乘权重、相加、加偏置”组成的串联网络里,这种合并同样适用于向量输入。因此,多堆这样的层,并不会自动获得非线性关系的表达能力。严格说,带偏置的这类变换叫作“仿射变换”;入门资料里也常把它归在“线性层”这一说法中。《动手学深度学习》:从线性到非线性

这解释了激活函数的位置为什么重要:它插在计算之间,让整个映射不再总能被压回一层加权相加。

不过,加入非线性也不是自动成功的保证。如果参数设置让所有单元始终只在 ReLU 的同一段上工作,网络在那些输入范围里仍可能表现得很简单。结构提供了可能性,参数和数据决定实际用上了什么。

用两个隐藏单元,完成开头的判断

现在返回两份复习清单。我们设置两个单元:

h₁ = ReLU(x₁ - x₂)
h₂ = ReLU(x₂ - x₁)

最终输出 y = h₁ + h₂

第一单元的两个权重为 [1,-1],第二单元为 [-1,1],偏置都取 0。输出层的权重为 [1,1],偏置取 0,直接相加。

先手算“只在 A 中”的情况,也就是输入 [1,0]:

h₁ = ReLU(1 - 0) = 1
h₂ = ReLU(0 - 1) = 0
y  = 1 + 0 = 1

再看两份清单里都有,即 [1,1]:两个差值都是 0,输出也是 0。

四种情况全部展开如下:

输入 [x₁,x₂] h₁ h₂ 输出 y 与目标是否一致
[0,0] 0 0 0 一致
[1,0] 1 0 1 一致
[0,1] 0 1 1 一致
[1,1] 0 0 0 一致

在这个二值输入范围内,h₁ 检出“只在 A 中”,h₂ 检出“只在 B 中”,输出层把两种需要检查的情况合并起来。这就是一个完整的计算过程:

输入层                  隐藏层                     输出层
[x₁, x₂] ────────→ [ReLU(x₁-x₂), ReLU(x₂-x₁)] ────────→ 相加
 清单记录                两个方向的差异                  是否检查

这里的“隐藏”,是说这些值处在输入与最终输出之间。它们不是我们直接提供的原始记录,也不是最终要求的目标;有模型内部访问权限时,完全可以把它们读出来。“隐藏”不等于系统不允许查看。

这套逻辑也叫异或,XOR。它揭示了组合关系的重要性:当 B 中没有记录时,把 A 从 0 改成 1,会让目标从 0 变成 1;当 B 中已有记录时,同样修改 A,却让目标从 1 变成 0。一个对 A 始终采用固定正向或负向影响的加权打分器,再配固定阈值,不能同时完成这四项判断。

可以再做一个反例:把网络里的两个 ReLU 去掉,输出就变成 (x₁-x₂)+(x₂-x₁)=0,无论输入是哪一种都得 0。非线性在这里确实做了工作。

注意,我们只证明了这组指定参数能完成四种输入的规则。输出恰好是 0 或 1,并不意味着这是经过校准的概率模型;输入如果改成任意实数,这个公式也不保证输出落在 0 到 1 之间。

层、宽度与参数量,分别在数什么

上面这个网络包含两个输入值、一个有两个单元的隐藏层,以及一个输出单元。从输入依次算到输出,叫作一次前向传播,forward propagation。

为了避免数层数时混乱,本篇把“带参数的隐藏层和输出层”计入层数,输入层不算计算层。因此它是一个有两个参数层、一个隐藏层的小网络。不同资料可能采用不同计数口径,读结构图比只看“几层”更可靠。

对于这里这种全连接层,下一层的每个单元都接收上一层的全部输入,各连接有自己的权重。多个单元的权重可以排成矩阵,偏置排成向量;软件就能批量完成这些运算。第 05 篇的矩阵在这里有了具体用途。Keras:Dense 全连接层的计算形式

假设保留所有权重和偏置作为可调整参数,即使当前数值为 0 也计算在内,那么参数数量是:

位置 权重数量 偏置数量 合计
两个输入到两个隐藏单元 2×2=4 2 6
两个隐藏单元到一个输出单元 2×1=2 1 3
总计 6 3 9

两个输入值不是参数,某一次算出的 h₁、h₂ 也不是参数。换一篇笔记,中间值会改变,权重却可以保持不变。参数决定怎样算,中间值是这一次算出的结果。

层的宽度通常关注它有多少单元或表示维度;网络的深度关注串联了多少层计算。增加宽度与增加深度不是一回事,参数多也不一定代表层数更多。

多层表示怎样帮上忙

第 05 篇提到,表示决定哪些信息容易被后续模型使用。这个小网络给出了一个看得见的例子:输入描述“各清单是否存在记录”,隐藏层把它改写成“哪个方向存在差异”。在新表示上,最后一步只要相加。

更复杂的任务也可以利用这种分层组合。以识别手写数字为直觉例子,局部像素变化可以组合成笔画,再组合成更大的形状模式。深层网络允许后续计算反复使用前面形成的表示,而不是每一步都重新从原始像素开始。对某些函数,这样的组合能比非常宽的浅层网络表达得更紧凑。《动手学深度学习》:隐藏表示与多层结构

但不能把这个直觉写成固定分工表,认为“第一层一定认识笔画、第二层一定理解文字、第三层一定掌握逻辑”。实际中间表示由结构、数据和训练目标共同影响,并不保证每个单元都有一个人类能命名的含义。一个概念也可能由多个数值共同表达。

本篇恰好能给 h₁、h₂ 命名,是因为我们亲手设计了它们。通常训练神经网络时,不必逐个告诉中间单元应该识别什么,而是给最终任务设定目标,让参数更新逐步改变这些中间计算。具体怎样更新,将在下一篇讲。

“深度学习”关注的正是利用多层计算学习表示与映射。这里的一层隐藏层小例子帮助理解组成方式,不应被当作现代大模型的规模或完整结构。

从小网络到大模型,需要跨过哪些距离

大语言模型中的计算规模更大,连接方式也更复杂。Transformer 使用注意力机制以及前馈网络等组件组织信息,不能把本篇的两输入网络简单放大,就当作它的完整架构。第二部分会分别解释这些组件。Transformer 原始论文:Attention Is All You Need

但我们已经获得了几个继续学习的支点:输入要变成数值表示;参数参与计算;中间表示层层变化;最终输出还要根据任务解释成分数、概率或其他结果。

多层结构也会带来训练难题。更深不等于自然更好训;残差网络的研究就专门针对深层网络的优化困难,提出让层学习相对于输入的变化,以帮助训练更深的模型。这里无需掌握具体结构,只需知道网络设计还要考虑“怎样学得动”。原始论文:Deep Residual Learning for Image Recognition

把这些区别放回个人项目中,会更容易判断问题发生在哪一层:

你看到的现象 需要进一步检查什么
某种网络在数学上能表达所需映射 训练是否真的找到了合适参数
模型在训练样本上表现很好 对新的笔记是否仍然有效
模型能生成一张看起来不错的卡片 内容是否忠实、文件是否真的保存
新模型参数更多、结构更深 在自己的任务上,质量、速度和成本是否合适

因此,架构提供表达方式,训练决定学到的参数,评估检验实际表现,应用程序还要完成文件、界面和流程。它们彼此相关,却不能相互代替。

理解检查:自己算一遍这个小网络

  1. 计算单元先算 z=2x₁-x₂-0.5,再经过 ReLU。输入 [0,1] 时,z 和单元输出各是多少?
  2. 清单网络输入 [0,1] 时,两个隐藏值和最终输出分别是多少?
  3. 若把清单网络中的两个 ReLU 去掉,再增加几个只做加权相加与偏置的串联层,是否就能获得非线性表达能力?
  4. 一个全连接网络有 2 个输入、3 个隐藏单元、1 个输出单元;隐藏层与输出层都使用偏置。共有多少参数?
  5. 某层输出一个 100 维向量,是否意味着它有 100 个参数,或者其中每一维都代表一个固定概念?

第 1 题: z=2×0-1-0.5=-1.5;ReLU 输出 0。中间负分数是合法的,它不是负概率。

第 2 题: h₁=ReLU(-1)=0,h₂=ReLU(1)=1,因此 y=1,表示两份清单的记录不一致。

第 3 题: 不能。这样的串联仍能合并成一个仿射变换。增加层数本身不能替代非线性操作。

第 4 题: 隐藏层有 2×3+3=9 个参数,输出层有 3×1+1=4 个,共 13 个。输入值和当前隐藏值不另算参数。

第 5 题: 都不意味着。100 是该输出的维度;产生它需要多少参数取决于层的结构与输入大小。每个坐标的意义也不能仅凭维度推断。

现在你已经能把“输入 → 模型 → 输出”中的模型拆开了。不过,本篇的权重是我们手选的,真实训练往往有太多参数,不能靠人逐个试。下一篇就把这里的前向计算与第 06 篇的损失接起来:梯度下降、反向传播和参数更新,分别负责什么?


上一篇:06|概率、预测与损失:模型怎样知道自己需要改进

下一篇:08|训练究竟在做什么:梯度下降、反向传播与参数更新

返回:第一部分大纲


09 训练究竟在做什么:梯度下降、反向传播与参数更新

复习助手想估计读完一篇笔记需要多久。我们先用一个极简模型:笔记长度乘以一个系数,就得到预测时长。

假设一篇 2000 字的笔记,目标阅读时长是 6 分钟。当前模型的系数是“每千字 1 分钟”,于是预测只有 2 分钟。它偏低了,接下来应该怎么改?

这个小问题,人可以直接把系数改成 3。但上一篇的网络已经有多个参数,大模型的参数更多;每个参数又通过不同计算影响最终结果。训练需要一套能够重复执行的方法,计算哪些参数该怎样调整。

本篇把这套过程拆成四步:前向计算、计算损失、计算梯度、更新参数。我们会真正算出几次更新,但全部使用教学构造的数据与公式,不代表对真实阅读时长或大模型做了实验。你不需要安装软件,也不用先掌握微积分;涉及导数的地方会解释它在回答什么问题。

先把“要改什么”和“按什么改”分开

给笔记长度换一个便于手算的单位:x=字数÷1000,所以 2000 字对应 x=2。模型暂时没有偏置,只有一个参数 w:

预测时长 ŷ = w × x
目标时长 y = 6
损失 L = (ŷ - y)²

ŷ 读作“y 帽”,这里只表示预测值,与目标 y 区分。损失沿用第 06 篇的平方误差;因为当前只有一个样本,不需要另外求平均。时长以分钟计,损失单位就是分钟的平方。

当 w=1 时:

预测:ŷ = 1 × 2 = 2
损失:L = (2 - 6)² = 16

输入 x 和目标 y 在这次训练计算中固定。我们要改的是参数 w,希望改完以后,按同一条损失规则重新计算的结果更小。

这与修改标签凑出低损失完全不同。训练目标是调整模型,让它适应提供的数据,而不是把“6 分钟”偷偷改成它已经预测的“2 分钟”。

梯度:轻轻改动参数,损失会怎样变化

先试着把 w 从 1 增加到 1.01:

新预测:1.01 × 2 = 2.02
新损失:(2.02 - 6)² = 15.8404

参数增加 0.01,损失下降 0.1596。两者的变化量相除,得到约 -15.96。这提示我们:在当前点附近,稍微增加 w,损失会降低。

如果考察越来越小的参数改动,就得到这里所说的导数:损失相对于这个参数的局部变化率。对有许多参数的模型,每次固定其他参数,分别考察一个参数的这种变化率,再组成一组数,就是损失相对于参数的梯度,gradient。

本例的精确计算规则是:

损失对 w 的梯度 g = 2 × (w×x - y) × x

代入 w=1、x=2、y=6:
g = 2 × (2 - 6) × 2 = -16

暂时不会推导也没关系。记住它告诉我们的方向:梯度为负,表示在这个点附近增加 w 会降低损失;梯度为正,则减小 w 是局部下降方向。这里的“附近”很重要,不能据此断言参数增加得越多越好。Google:梯度下降与平方误差的参数导数

梯度不是损失本身。损失 16 描述当前计分,梯度 -16 描述当前对参数变化的敏感程度,恰好绝对值相同只是这个算例的巧合。它也不是模型用语言写下的一段“反省”。

梯度下降:按方向走多远

最基础的更新规则叫作梯度下降,gradient descent:

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

学习率,learning rate,控制更新幅度,常用希腊字母 η 表示。这里先取 η=0.1:

新 w = 1 - 0.1 × (-16) = 2.6
新预测 = 2.6 × 2 = 5.2
新损失 = (5.2 - 6)² = 0.64

减去一个负数,参数反而增大,这正是我们需要的方向。下一步必须在新参数处重新计算梯度,不能一直重复使用最初的 -16:

新梯度 = 2 × (5.2 - 6) × 2 = -3.2
再更新 w = 2.6 - 0.1 × (-3.2) = 2.92

把过程列成表,就能看出训练循环在做什么:

完成的更新次数 参数 w 当前预测时长 当前损失
0 1 2 16
1 2.6 5.2 0.64
2 2.92 5.84 0.0256
3 2.984 5.968 0.001024

对于这一个样本,理想的系数是 3,我们的更新正在接近它。这还没有证明“所有笔记每千字都需要 3 分钟”,只证明这条规则在当前样本上逐步降低了损失。

学习率通常由训练设置指定,属于超参数;w 则是被优化的模型参数。软件可以按计划改变学习率,但它与普通梯度更新中的权重仍是不同角色。Google:学习率与其他超参数

同一个梯度,步子太大也会走错

都从 w=1、梯度=-16 出发,换几个学习率,看看一次更新后的结果:

学习率 更新后的 w 更新后的预测 更新后的损失
0.01 1.16 2.32 13.5424
0.10 2.60 5.20 0.64
0.30 5.80 11.60 31.36

0.01 让损失有所下降,但这一步改善较小;0.30 则跨过了合适位置,新的预测过高,损失甚至比原来的 16 更大。

所以“沿下降方向更新”和“更新之后一定下降”不能混为一谈。方向是局部信息,步幅还需要合适。这里的 0.1 也不是通用推荐值:输入单位、损失缩放、网络结构和更新算法改变后,合适的数值都可能不同。

在深层网络里,损失随参数变化的形状远比本例复杂。梯度下降也不承诺找到全局最好的参数。看到梯度接近 0,需要结合更多信息判断,不能仅凭这一点认定已经获得最好的模型。

多层网络里的梯度,怎样算回去

前面的模型只有一个参数,公式很短。现在增加一层,但暂时不加非线性,方便看清梯度沿途怎样传递:

输入 x → h = a×x → 预测 ŷ = b×h → 损失 L = (ŷ-y)²

a、b 是两个不同层的权重,均暂取 1;这里的 b 是乘法权重,不是上一篇公式中的偏置。仍用 x=2、y=6,前向结果就是 h=2、ŷ=2、L=16。

先看离损失最近的一步:预测值稍微增加时,损失怎样变?平方误差对预测值的变化率是 2×(ŷ-y),当前为 -8。

再往前看:

  • 改变 b,会先通过 ŷ=b×h 影响预测。在当前 h=2 的位置,预测对 b 的变化率是 2。因此损失对 b 的梯度是 -8×2=-16。
  • 改变 a,要经过 a → h → ŷ → L。沿途的变化率分别是 x=2、b=1、-8,相乘得到损失对 a 的梯度 -8×1×2=-16。

这种把沿途变化率连接起来的规则叫作链式法则。在这个例子中,我们可以把它读成“参数先影响中间值,中间值再影响预测,预测最后影响损失”。

反向传播,backpropagation,就是沿计算关系反向组织这些梯度计算的方法。它从损失开始,逐步计算更早的中间值和参数如何影响损失,复用已经算出的结果;如果一个参数通过多条路径影响损失,就需要汇总这些路径的贡献。《动手学深度学习》:反向传播与计算图

上一篇说过,纯线性层可以合并。本例保留两层只是为了展示链式计算,不是为了增加表达能力。实际网络有激活函数时,也要把相应的局部变化率纳入链条。

反向传播不需要让每个隐藏单元先得到一个人工标签,也不是把正确答案“倒着塞回去”。它计算的是给定损失对各参数的梯度。

反向传播和更新参数,是两件事

这几个词经常同时出现,但职责不同:

环节 做什么 是否已经改变参数
前向传播 用当前参数计算中间值和预测 没有
计算损失 对照目标,给本次预测计分 没有
反向传播 计算损失对参数的梯度 通常还没有
优化器更新 使用梯度和更新规则修改参数 是

优化器,optimizer,是执行参数更新规则的组件。最简单的更新可以用刚才的梯度下降公式;其他优化器还可能利用历史梯度等信息,不必都严格等于这一条公式。

现代深度学习框架可以自动记录运算关系并计算梯度,这叫作自动微分。例如 PyTorch 的自动微分教程把梯度计算展示为单独一步;得到梯度,并不等于已经执行参数更新。自动微分也不同于对每个参数都加一点、重新试跑整个模型的数值差分方法。PyTorch:Automatic Differentiation with torch.autograd

本篇一开始把 w 增加 0.01,是为了帮助理解变化率,不是在建议大型网络按这种方式逐个试探所有参数。

把训练循环画完整,就会看到目标和参数进入了不同的位置:

取一批输入和目标
        ↓
当前参数 → 前向计算 → 预测 → 与目标比较 → 损失
   ↑                                      ↓
   └──────── 优化器更新 ← 参数梯度 ← 反向传播

然后取下一批数据,用更新后的参数重新计算。

为什么训练常常一批一批进行

真实训练通常不会只看一篇笔记。若有大量样本,每更新一次都计算全部数据,可能太慢;每次只看一个样本,又可能难以充分利用硬件。小批量,mini-batch,是一次处理一组样本的常见折中。

例如,一批里有 20 篇笔记,可以先得到各样本损失,再对它们求平均并计算梯度。对于这种平均损失,其梯度也相应汇总了这些样本的贡献。有些样本希望参数变大,有些希望变小,合在一起决定这一步的更新。《动手学深度学习》:小批量随机梯度下降

假设训练集恰有 100 篇,每批 20 篇,每批更新一次,不重复抽样、不跨批累计梯度:

处理 1 批并更新一次:1 个优化步骤,step
100 篇全部处理一次:1 轮,epoch
这个例子中:1 epoch = 5 个更新步骤

这是特定设置下的对应关系,不是通用等式。有些系统会把多批梯度累计后才更新,也有持续采样的数据流,因此阅读日志时要看具体定义。

换了一批数据,计算的损失也换了样本依据。它偶尔比上一批高,并不足以证明训练出故障。应结合一段时间的趋势和固定评估数据判断,而不是要求每一批的数字都严格下降。

训练不稳定,不一定只是学习率的问题

前面的“大步跨过目标”解释了一种常见问题。深层网络还可能遇到梯度消失或梯度爆炸:沿多层传播以后,某些梯度变得极小,参数几乎不动;或者变得过大,更新幅度失控。初始化方式、激活函数和网络结构都会影响这些现象。《动手学深度学习》:数值稳定性与初始化

作为应用开发者,先能区分现象与结论即可:

现象 可能需要检查的方向
损失持续剧烈增大 学习率、梯度大小、异常输入与数值计算
损失长期几乎不变 参数是否真的在更新、梯度是否过小、设置是否合适
训练损失下降,实际笔记效果却变差 数据代表性、过拟合、训练目标与任务是否一致

这张表不是凭曲线确诊原因的规则。尤其是最后一种情况,可能训练本身运行正常,只是它优化的内容没有转化成我们想要的能力。下一篇会专门讨论泛化和过拟合。

使用模型时,为什么通常没有这一整套循环

在通常的推理过程中,我们加载已经训练好的参数,把新输入送进去,计算输出。中间值会变化,但不会因为这次回答自动执行上述参数更新。

复习助手把你的新笔记作为参考资料,模型据此生成卡片,属于使用输入信息;把新笔记整理为训练样本,再计算损失、梯度并更新参数,则属于另一条训练流程。是否保存聊天记录、是否以后把反馈用于训练,又是产品和数据流程的安排,不能仅从“它记住了上一句话”推断。

同样,推理模型生成较长的思考过程,或者 Agent 多次调用工具,也不能因此就叫作反向传播。多做几次计算与改变模型参数,是两个不同维度。

理解检查:轮到你更新参数

  1. 沿用 ŷ=w×x、L=(ŷ-y)²,令 x=2、y=6、w=4。梯度是多少?学习率为 0.1 时,新参数和新损失是多少?
  2. 反向传播已算出梯度,但没有执行任何参数更新规则。能否说权重已经学到了这批数据?
  3. 在本篇 100 篇、每批 20 篇、每批更新一次的设置下,完成 3 个 epoch,共更新多少次?
  4. 某一批损失比上一批高,是否足以证明学习率太大?
  5. 用户上传一篇笔记后,模型能回答其中的新信息,是否证明其权重刚刚改变?

第 1 题: 当前预测为 8,梯度为 2×(8-6)×2=8。新参数 4-0.1×8=3.2,新预测为 6.4,新损失为 0.4²=0.16。梯度为正,所以本次更新减小参数。

第 2 题: 不能。梯度是更新依据;按题设,权重还没有改变。需要区分“算出该怎么改”与“真正改了参数”。

第 3 题: 每轮 5 次,3 轮共 15 次。这个答案依赖题目约定,若使用梯度累计等设置就要重新计算。

第 4 题: 不足以。不同批次可能难度不同,随机更新也可能有波动,需要观察趋势和相关训练状态。

第 5 题: 不能。新笔记可能只是进入了本次上下文,模型用已有参数处理了新输入;有无参数更新,要看是否实际运行了训练流程。

到这里,数据、表示、网络、损失与参数更新已经连成一条线。下一篇要问一个更贴近使用的问题:模型在练习材料上越来越熟练,为什么遇到新笔记还是会出错?


上一篇:07|神经网络与深度学习:多层计算怎样形成能力

下一篇:09|学会与背会有什么区别:泛化、过拟合与分布变化

返回:第一部分大纲


10 学会与背会有什么区别:泛化、过拟合与分布变化

你的复习助手终于能给笔记分类了。开发时反复使用的 60 篇笔记,它全部分对。于是你换上 20 篇没有拿来训练的新笔记,结果只分对 14 篇。

100% 变成 70%,究竟发生了什么?模型可能记住了这批材料的细节,也可能依赖了一个恰巧有效的线索;新笔记还可能来自完全不同的领域。仅凭这两个数字,不能立刻确定原因,但它们已经说明:熟悉材料上的表现,不能直接当作新材料上的表现。

上一篇解释了怎样让训练损失下降。本篇接着讨论更重要的一步:这种改善能否带到真实使用中。我们会区分泛化、欠拟合、过拟合与分布变化,并给复习助手安排三组职责不同的材料。

下面的笔记数量、模型结果与分组方案都是教学构造,不是实测报告。不需要运行模型,你可以通过分组方案和小练习检查理解。

泛化:换成新样本,学到的规律还管不管用

泛化,generalization,关注模型对没有用于拟合的新样本的表现。

假设我们希望识别前端笔记和数据库笔记。模型若利用内容中与主题相关的模式,可能也能识别另一位作者的新笔记;如果它只是记住了每篇旧笔记的编号,就很难处理新编号。

“学会与背会”是帮助理解的比喻,不是在判断模型有没有人类意义上的理解。模型也可能同时记住一些样本、利用一些可迁移的规律。我们最终需要用新材料上的表现来判断哪些能力能够复用。Google:泛化、欠拟合与过拟合

这里的“新”,还要说明新到什么程度。另一篇风格相近的前端笔记,与一张模糊的手写化学笔记照片,虽然都没用于这次训练,却是很不一样的挑战。一个模型在前一种材料上表现好,不保证它能够处理后一种。

因此,评价泛化时,不能只说“测试的是新样本”,还需要说明:来自哪些人、哪些主题、哪些格式,是否接近未来打算处理的材料。

为什么降低训练损失,可能学到不可靠的线索

假设开发材料里,前端笔记都由小林整理,标题总以“前端学习”开头;数据库笔记都由小周整理,标题总以“数据库整理”开头。

模型根据标题分类,在这些材料上可以做得很好。后来你导入网页剪藏,标题只写“第六讲”,原来的线索消失,它就不一定还能正确判断主题。

这并不要求模型逐字背下训练材料。过拟合,overfitting,也可以表现为过度依赖训练样本里的偶然关系、噪声或某些局部细节,使新样本上的表现落后于训练表现。损失函数只对提供的目标计分,不会自动区分“内容规律”和“碰巧相关的标题格式”。

还要注意:标题本身不是天然的坏特征。如果真实任务就是按可靠标题路由文件,它可能很有用。问题在于,你想证明的是“能够根据笔记内容识别主题”,却只提供了通过标题就能完成的材料。训练和测试方案没有真正考查所声称的能力。

解决办法也不一定是先换更大的模型。可以先加入不同作者、不同标题格式的材料,并检查模型对去掉标题、换一种表达后的笔记是否仍然有效。这里应保持主题和标签不变,避免把测试改写成另一个任务。

三组材料,分别承担三种职责

假设已经整理了 100 篇有主题标签、彼此没有近重复的笔记,准备训练一个小分类器。可以先用下面的分配理解基本流程:

数据组 教学例子中的数量 主要用途
训练集,training set 60 篇 计算训练损失和梯度,更新模型参数
验证集,validation set 20 篇 比较方案、选择训练轮次、调整超参数
测试集,test set 20 篇 方案确定后,估计其在留出材料上的表现

验证集通常不直接参与梯度更新,但你根据它决定使用哪个模型、什么时候停止训练,所以它已经影响了开发决策。测试集则应从这种反复选择中留出来。Google:训练集、验证集与测试集的划分

可以把三者想成三种用途:日常练习、练习后的方案比较、最后的独立检查。关键在用途,不在文件夹的名字。把参与调参的材料命名成 test,不会让它重新变成独立测试集。

训练集 → 更新参数 → 产生候选模型
                        ↓
验证集 → 比较候选表现 → 确定模型和设置
                        ↓
测试集 ─────────────→ 做留出检查并记录结果

60/20/20 只是便于说明的分配,不是固定最佳比例。材料很少时,还可以在开发数据内做交叉验证,让不同部分轮流承担验证角色;但选择过程与最终独立检查仍要区分。本篇不要求实施交叉验证。

看一组训练结果,什么时候该停下来

假设我们在第 1、10、100 轮各保存了一个模型版本,并用相同规则检查固定的训练集和验证集:

保存时的训练轮次 训练集分对数 训练正确率 验证集分对数 验证正确率
第 1 轮 42/60 70% 13/20 65%
第 10 轮 54/60 90% 17/20 85%
第 100 轮 60/60 100% 14/20 70%

如果我们预先约定以验证正确率选择候选版本,那么在这三个版本中应选第 10 轮,而不是训练正确率最高的第 100 轮。这个选择暂时不需要查看测试集。

训练表现继续改善、验证表现却变差,是值得检查过拟合的信号。第 1 轮在两组材料上都不够好,则可能还没学到足够规律,表现出欠拟合,underfitting。不过,表现不佳也可能来自训练没充分进行、输入特征不足、标签有误等原因,不能仅凭一张表就决定“把模型加大”。

第 06 篇还解释过,正确率与损失不是同一件事。若监测的是损失,也可能看到训练损失持续下降,验证损失先降后升。选择依据要事先说清,不能一会儿用正确率、一会儿用损失,只挑对当前方案有利的数字。

一种常见做法是早停,early stopping:监测验证表现,连续一段时间没有足够改善,就停止继续训练,并按约定保留或恢复验证表现较好的版本。它不是“某一轮验证损失稍微上升就立刻停止”。实现时还要明确是否真的恢复了较好的权重,停止训练本身不等于自动回到最好的一轮。Keras:EarlyStopping 的监测、等待与权重恢复

而且,这里验证集只有 20 篇,多分对一篇就改变 5 个百分点。第 10 轮只是这个小例子里按既定规则选出的版本,不能据此声称它在所有未来笔记上都稳定达到 85%。

划分前先想:哪些记录其实来自同一个东西

“把记录随机打散再分组”并非总能得到有效的独立检查。

例如,你有 10 篇长笔记,每篇切成 10 个片段,共 100 条记录。如果直接按片段随机分组,一篇笔记的开头可能进入训练集,中段进入验证集,末段进入测试集。这些片段共享术语、写法和主题;模型实际上可能已经熟悉这篇笔记。

如果想检查对新笔记的能力,应先按原始笔记分组,再把整组分配到不同用途。相似的原稿、修订版、摘要版,也需要检查是否属于高度相关的一组。若目标是服务新作者或新用户,就可能还要按作者或用户留出,而不是只按文件名分开。scikit-learn:分组划分与新主体的评估

另一种情况与时间有关。你想知道“用过去的材料开发后,下个月能否继续好用”,就应该考虑按时间安排开发和检查。把未来材料混入开发集后随机测试,回答的就不再完全是这个问题。scikit-learn:时间序列划分

第 04 篇提过数据泄漏。它不仅包括答案直接混入输入,也包括本应留出的信息参与了训练或选择。例如,用包括测试集在内的全部资料计算特征的均值和缩放系数,再声称模型完全没有利用测试信息,就不严谨。需要从数据中拟合的预处理步骤,应在相应训练材料上确定,再应用到留出材料。scikit-learn:避免预处理中的数据泄漏

这不意味着查看文件格式、检查重复项都不允许。关键是区分数据管理与利用留出结果优化方案,并如实记录哪些信息进入了开发过程。

过拟合与分布变化,为什么要分开看

假设模型在训练集、验证集和测试集上都表现不错,但上线后用户开始上传扫描件,文字识别经常出错。现在遇到的输入与原来的清晰文本不同,这属于分布变化,distribution shift的一种情形。

这里的“分布”可以先理解为:什么类型的输入经常出现,它们有什么特征,以及输入与正确结果之间有什么关系。这些条件改变,原来的评估结论就可能不再适用。《动手学深度学习》:环境与分布变化

放到复习助手中,至少有几种常见变化:

变化 对原结论的影响
清晰的短文本变成含识别错误的长扫描文档 输入质量、长度与结构发生变化
原来主要是编程笔记,后来大量出现外语和化学笔记 材料领域与相关模式发生变化
原来“待复习”指还没看过,后来改成最近答错过 标签的定义和判断标准发生变化

过拟合关注模型是否过度适应已有样本;分布变化关注实际面对的数据或关系是否改变。两者可以同时存在,但不能把所有上线失败都归为“背题”。即使原来泛化得很好,换了任务范围也需要重新验证。

如果扫描件失败,首先可能应该查看文字解析结果;如果标签定义变了,就要更新目标与评估标准。继续在旧材料上训练更多轮,未必能解决这些问题。

改善泛化,为什么不能只靠一种方法

确认问题以后,可以针对原因调整:补充目标场景中缺少的材料,修复标签,减少无关线索,或者改变模型与训练设置。数据数量本身不是目的,重复堆入相同来源的笔记,也不等于补齐了不同用户的写作方式。

训练中还有一类方法叫作正则化,regularization,它通过额外约束或训练设计,限制模型过度适应训练细节。例如,某些权重正则化会把对较大权重的惩罚加入训练目标,让优化同时考虑拟合样本与参数约束。它可能改善泛化,也可能在约束太强时妨碍学习,仍需验证。TensorFlow:过拟合、欠拟合与权重正则化

你现在不需要掌握一套正则化参数。先理解三种不同作用即可:补充资料是在改善学习依据,调整训练是在改变怎样学习,改善评估是在看清实际效果。评估分数变得更诚实,并不等于模型退步;它可能只是终于暴露了之前没有测到的问题。

如果只调用大模型 API,也要留出材料吗

要,但用途要说清。你没有训练模型权重,也可能反复用同一批笔记改提示词、调整资料切分、选择模型和输出格式。这批笔记已经成为应用的开发依据。

如果每次都拿那几篇试到满意,再用同一批结果宣布“复习助手很好用”,只能证明你把这些案例调好了。仍应另留一批没有参与这些决策的笔记,检查整个应用。

这里更准确的说法是应用方案对开发案例过度适应,不应因此声称底层模型权重刚刚发生了过拟合。留出的“新材料”也只是对你的开发过程而言;使用预训练模型时,若不了解其训练数据,不能保证它从未在更早阶段见过类似内容。

若查看最终测试结果后继续针对其中错误修改方案,这组材料就开始承担开发用途。修复当然有价值,但还应安排新的留出检查,或明确披露测试已参与迭代,而不是继续把旧分数当成独立证明。

对个人项目,可以先写下四行约定:准备服务哪些笔记;用哪些材料开发;哪些相关记录必须放在同一组;最终用哪些尚未参与调试的材料检查。它比只记一个“正确率 95%”更能说明结果适用的范围。

理解检查:这些结果能说明什么

  1. 前面的三个训练版本中,第 100 轮训练正确率最高。若预先约定按验证正确率选版本,应选择哪一轮?
  2. 把同一篇长笔记切成 20 段,再随机分到训练与测试中,能否直接证明对新笔记的能力?
  3. 模型一直能处理清晰中文文本,换成带识别错误的英文扫描件后变差,是否一定属于过拟合?
  4. 你没有改模型权重,只是反复根据 10 篇笔记修改提示词。最后拿这 10 篇作为独立测试,是否合适?
  5. 一份 20 篇笔记的测试中,17 篇分类正确,测试正确率是多少?能否把它当作未来所有材料的稳定正确率?

第 1 题: 第 10 轮,其验证正确率为 17/20,即 85%。训练集全对不自动代表对新材料更好;选择时不需要先查看最终测试集。

第 2 题: 不能直接这样判断。片段来自同一原始笔记,信息可能高度相关。若要评估新笔记,应按原始笔记分组留出,再检查近重复和其他关联。

第 3 题: 不一定。语言、格式和输入质量均发生了变化,应检查分布变化及解析流程。仅凭效果变差,不能确定模型过度拟合了原样本。

第 4 题: 不合适。这 10 篇已经影响了方案选择,可以继续作为回归检查案例,但需要其他未参与调试的材料评估泛化。没有更新权重,不代表应用评估就自动独立。

第 5 题: 是 85%。但样本少,一篇就占 5 个百分点,材料来源与覆盖范围也有限。应同时报告数量、来源与任务范围,而不是把一次小测试的比例当作保证。

现在,我们不仅知道参数怎样改变,也知道为什么必须检查这种改变能否迁移到新任务材料。下一篇换一种学习信号:如果没有逐题给出的标准答案,而是要通过行动后的奖励改进策略,模型又怎样学习?


上一篇:08|训练究竟在做什么:梯度下降、反向传播与参数更新

下一篇:10|强化学习:模型怎样从行动和反馈中改进

返回:第一部分大纲


11 强化学习:模型怎样从行动和反馈中改进

复习助手已经能生成题目,现在需要决定下一步:继续出一道用户已经很熟悉的题,还是复习刚才答错的概念?

简单题可能让用户立刻答对,页面上的正确率很好看;复习薄弱概念可能暂时更费力,却有机会改善之后的表现。系统如果只追求“这一题答对”,与追求“一段时间后掌握得更好”,可能会作出不同选择。

这就进入了强化学习,Reinforcement Learning,RL关心的问题:在环境中选择行动,观察后果和奖励,利用这些经验改进之后的决策。

本篇用构造的复习场景讲清基本机制,不声称某种出题顺序已经被教育实验验证。你不需要训练模型,只需能读懂表格、做简单加减乘法。我们也不会把一个普通复习应用都改造成强化学习系统;这个例子用来说明它适合描述什么问题。

先分清:谁在行动,谁在提供反馈

在这个例子中,需要学习决策的是出题助手,不是正在做题的用户。用户的反应是助手所处环境的一部分。

概念 在复习例子中怎样理解
智能体,agent 负责选择下一步复习活动的系统
环境,environment 用户、题库以及活动执行后产生反馈的过程
状态,state 对当前决策情形的描述,例如剩余时间、相关学习进展
动作,action 选择复习薄弱概念、出一道题、结束本次练习等
奖励,reward 按事先定义的规则,给行动后果计算的一个数值
策略,policy 根据当前可用信息选择动作的规则

动作会影响之后的情形。出过一道题以后,用户可能学到了新内容,也可能只是猜对,还可能感到疲劳;下一次决策面对的条件就变了。强化学习通常关注这种行动与后续结果相互关联的过程。《动手学深度学习》:状态、动作、转移与奖励

这里还有一个容易忽略的区别:助手并不能直接读取用户真实掌握了什么。它通常只能得到答题记录、耗时等观察,observation,再据此估计当前情况。为了建立简单模型,我们可能把这些记录组成一个“状态表示”,但它未必包含决定未来结果所需的全部信息。Hugging Face:状态与观察的区别

所以,用户连续答对两题,不必然意味着概念已经掌握。观察不完整,是决策本身需要面对的困难。

策略不是一句口号,而是怎样选动作

“帮用户学得更好”是目标,还不是可执行的策略。

一种具体策略可以是:最近两次都错了,就先展示概念解释;最近都答对,就换一道更难的题。另一种策略可以为几个动作分配概率,例如当前有 70% 的概率选择复习薄弱概念,30% 的概率选择巩固题。

前者可以是人工写出的规则,后者也不必然是学出来的。是否属于强化学习,关键在于是否利用行动、奖励及后续情形的经验,改进策略或支持策略的估计。

如果采用监督式模仿,示范可以直接告诉系统“在这种情形下应选择哪一个动作”。奖励反馈通常只评价实际选出的动作及其后果,不会同时告诉你没选的那些动作会怎样。系统的选择还会影响之后收集到什么经验,这也是探索会变得重要的原因。

一次交互可以画成下面这样:

当前观察 → 策略选择动作 → 环境执行并发生变化
   ↑                              ↓
   └──────── 新观察、奖励 ──────────┘

收集这些经历 → 训练更新策略或价值估计 → 再进行选择

第一圈表示执行任务;下面那条更新路径表示学习。已经训练好的策略也可以在参数固定的情况下运行,并不要求每执行一个动作就立即改一次模型。

奖励与回报:不要只看眼前这一分

奖励是某一步收到的计分,回报,return则汇总一段过程中的奖励。强化学习通常希望提高预期回报,也就是考虑可能发生的不同结果后,平均能得到多好的累计计分,而不是只追求某一次幸运的高分。

假设我们定义了一个教学用计分规则:两个练习阶段各记录奖励,第三阶段按延后检查的结果计分。两个构造轨迹如下:

轨迹 第一步奖励 第二步奖励 第三步奖励 直接相加的回报
A:先拿到两次即时得分 1 1 0 2
B:前面没得分,后面得分较高 0 0 4 4

只看第一步,A 更好;看完整过程,B 的总分更高。这里没有证明“先做难题一定更好”,我们只是用指定数值展示:即时奖励和累计目标可以给出不同判断。

有时还会使用折扣回报。把后续奖励乘以逐步累积的折扣因子 γ,可以表达对近期与远期奖励的不同权重。例如 γ=0.9:

三步折扣回报 = 第一步奖励 + 0.9×第二步奖励 + 0.9²×第三步奖励

A:1 + 0.9×1 + 0.81×0 = 1.9
B:0 + 0.9×0 + 0.81×4 = 3.24

越晚的奖励,在这个设定中权重越小。有限时长任务也可以直接汇总奖励,不一定非要折扣。折扣因子是目标定义的一部分,不是“未来奖励真实发生的概率”,更不是模型正确率。《动手学深度学习》:回报与折扣因子

延迟反馈:最后做对了,前面哪一步有帮助

如果用户在第三阶段表现更好,究竟是前面的解释有效,还是题目碰巧容易,或者用户本来就会?最终得到一个高分,并不会直接给出每一步动作的贡献。

这类问题通常叫作信用分配,credit assignment:把后续结果与前面的决策联系起来,学习哪些选择值得重复。这里的“信用”指贡献归因,与征信无关。

因此,一条成功经历不能证明里面每个动作都正确;一条失败经历也不代表每一步都应该避免。学习算法需要结合多次经历和估计来改进决策。

一种有用的中间概念是价值,value:在某种情形下,按某种策略继续行动,预期能得到多少回报。动作价值则进一步问“在这里先选这个动作,后面再继续,会怎样”。它估计的是未来回报,不是这一刻已经拿到的奖励。

可以用价值估计辅助挑动作,也可以直接调整策略给不同动作分配的概率,还有方法同时学习两者。本篇不展开算法清单,先把它们共同面对的问题记住:当前的好选择,可能需要靠后面的反馈才能判断。

一个能手算的更新:把新经验纳入估计

先把任务简化成单步情形:在相似的起始条件下,选择一种复习活动,完成后收到评分,本次任务就结束,没有后续奖励。

假设系统目前估计某个活动的平均奖励为 2,这次实际得到 6。一个简单的增量更新是:

新估计 = 旧估计 + 更新幅度 × (这次奖励 - 旧估计)

取更新幅度 0.25:
新估计 = 2 + 0.25×(6 - 2) = 3

它没有因为一次得到 6,就宣布以后都能得到 6;而是让估计从 2 朝新观察移动一部分。若之后一次评分为 0,同样更新会得到 3+0.25×(0-3)=2.25。

这里的更新幅度影响新经验的权重。固定幅度的这种更新,也不等于对所有历史记录取普通算术平均。

我们特意规定“动作后任务结束”,才可以只用本次奖励作为更新目标。多步任务中还要考虑后续回报;例如 Q-learning 会把即时奖励与下一状态的价值估计联系起来,并在真正终止时去掉后续项。《动手学深度学习》:Q-learning 的经验更新与终止状态

这个小表格式更新也说明:强化学习并不必然需要深度神经网络。用神经网络来表示策略或价值函数时,才会进一步结合第 07、08 篇的网络、损失、梯度和参数更新机制。

探索与利用:为什么不永远选当前最高分的动作

假设目前估计活动 A 平均能得 3 分,活动 B 能得 2 分。但 A 已经试了很多次,B 只试过一次,那一次用户恰好很疲劳。永远只选 A,系统可能一直没有机会修正对 B 的判断。

利用,exploitation,是根据已有估计选择当前看起来较好的动作;探索,exploration,是尝试其他可能值得选择的动作,以获得更多信息。

一种简单方法叫作 ε-greedy,可以先读成“多数时候按当前估计选择,少数时候随机尝试”。假设 ε=0.1,有两个动作,A 是当前唯一估计最好的动作:

  • 90% 的概率直接选 A;
  • 10% 的概率在 A、B 中等概率随机选一个。

因此总的选择概率是:A 为 0.9+0.1÷2=0.95,B 为 0.1÷2=0.05。不是 A 占 90%、B 占 10%,因为随机分支也可能选回 A。《动手学深度学习》:ε-greedy 探索策略

这些是选择概率,不保证每 100 次恰好出现 95 次 A 和 5 次 B。探索也不等于无条件地把任何动作都交给真实用户试验;具体项目可以先在可控的任务环境中验证动作和反馈是否合理。

奖励写偏了,学得越积极也可能离目标越远

现在回到开头:如果只奖励“用户答对一题”,系统可能总出已经会的题。得分越来越高,却没帮助用户掌握新内容。

其他看似方便的指标,也可能出现类似偏差:

只按这个指标奖励 可能得到的行为 被忽略的真实目标
生成卡片数量 把同一内容拆成大量重复卡片 有效覆盖知识、减少冗余
用户点击次数 不断安排需要点击的步骤 高效完成复习
回答长度 输出更长、重复更多的解释 准确、清楚、适合当前问题

这类利用计分规则的缺口获得高奖励、却没有完成真实意图的现象,常被讨论为奖励投机,reward hacking。它不要求模型有“故意作弊”的心理;优化一个不完整指标,就可能产生这种结果。原始论文:Concrete Problems in AI Safety

补上一项奖励也不能自动解决全部问题。例如奖励“延后测试答对”,还需要检查测试是否覆盖目标知识,是否因为总挑容易测试的内容而高估效果,以及不同用户的条件是否可比。

这与第 06 篇的原则相通:训练计分与用户目标有距离。也与第 09 篇相通:需要在没有用于反复调规则的材料和情形下检查效果。奖励更高,是优化结果的一个信号;它仍需要与真实任务表现对照。

大语言模型怎样用上强化学习

对语言模型,也可以把生成回答看成选择行为,再对生成结果提供奖励。根据任务建模的粒度,可以把整个回答看作一次动作,也可以把生成过程看作一系列 Token 选择。

奖励不一定来自用户每次亲自按赞。它可以来自明确的检查规则,也可以来自一个根据人类偏好训练出来的评分模型。以 InstructGPT 论文的方法为例,研究者先收集示范进行监督微调,再用回答比较数据训练奖励模型,之后利用奖励模型的评分进行强化学习优化。原始论文:Training language models to follow instructions with human feedback

这条路线通常称为基于人类反馈的强化学习,RLHF。其中,收集比较数据、训练奖励模型、根据奖励更新回答策略,是不同环节。“有人工标注”不意味着每个环节都是强化学习;“用了人类偏好”也不意味着一定采用同一种训练算法。第二部分会详细区分这些方法。

强化学习也并非必须完全没有标准答案。某些任务可以用已有答案或测试程序检查结果,再把检查结果转成奖励。区别在于训练怎样利用这个反馈改进行为,而不是表面上有没有一份参考答案。

同样,奖励模型偏好某个回答,不等于回答中的事实已经被证明;规则检查通过,也只说明满足了被检查的条件。奖励信号覆盖不到的错误,仍可能留下来。

Agent 执行循环,不自动等于强化学习训练

一个代码助手先读文件、再修改代码、运行测试、根据报错继续修改,看上去也有“行动与反馈”。但如果整个过程中模型参数和策略学习模块都没有进行训练更新,它是在使用已有能力执行任务,不能只凭循环形态就认定它正在强化学习。

固定模型可以根据新上下文改变下一步动作,这叫当前情境下的决策变化;训练则要利用经验改变之后决策所依赖的策略或估计。把一次执行记录保存下来,也只是获得了数据,还需要后续学习过程才会影响训练出的能力。

反过来,强化学习也不必每次在线现场探索:已有交互记录可以用于离线强化学习,但记录的覆盖范围等条件会限制学到的策略。研究教程:Offline Reinforcement Learning

对个人项目,先问清“谁在选动作、反馈是什么、哪里发生更新、用什么检查效果”,比看到一个 Agent 名称就判断它如何学习更有用。

理解检查:这个系统究竟在学什么

  1. 复习助手选择题目,用户作答。我们讨论的强化学习智能体是助手还是用户?助手是否一定能看到用户的真实掌握程度?
  2. 两条三步奖励序列分别为 [1,1,0]、[0,0,4]。当折扣因子为 0.9 时,哪条折扣回报更高?
  3. 一个单步、动作后即结束的任务中,旧奖励估计为 2,新奖励为 6,更新幅度为 0.25。新估计是多少?为什么不是直接改成 6?
  4. 只有 A、B 两个动作,A 当前最好。若 10% 概率在两个动作中均匀探索,B 的总选择概率是多少?
  5. 系统一直提高“生成卡片数量”的奖励,是否足以说明它越来越会帮助复习?代码助手根据报错改代码,是否足以说明它正在进行强化学习训练?

第 1 题: 是出题助手。用户及其反应属于环境的一部分;助手通常只有答题记录等观察,不能直接读取完整学习状态。

第 2 题: 第二条更高,分别为 1.9 与 3.24。这是指定奖励下的计算,不能直接推导出哪种真实教学方式更有效。

第 3 题: 是 2+0.25×(6-2)=3。一次奖励可能包含随机波动,增量更新只把估计向它移动一部分。该公式在这里没有包含后续奖励,因为任务已经结束。

第 4 题: 是 5%。10% 的探索分支还要在两个动作间各分一半;A 的总概率为 95%。

第 5 题: 两者都不足以证明。卡片数量可能因重复而增加,需要检查学习目标;代码助手的动作变化也可能只是固定模型利用新上下文,是否训练要看是否存在相应的学习更新。

这一篇说明了模型怎样利用行动后的评价改进决策。下一篇把视角转向输出本身:从判断类别、预测数值,到生成文字、图片等新内容,生成式 AI 在做什么?


上一篇:09|学会与背会有什么区别:泛化、过拟合与分布变化

下一篇:11|生成式 AI:模型怎样从识别内容走向生成内容

返回:第一部分大纲


12 生成式_AI:模型怎样从识别内容走向生成内容

上一篇,我们讨论了模型怎样根据行动的反馈改进策略。现在把目光转向复习助手的一项具体能力:它怎样写出一张原本不存在的卡片?

假设笔记里只有这样一句话:

训练时根据损失更新参数;普通推理时使用已经学到的参数进行计算。

你可以让助手判断这段话属于哪个主题,也可以让它改写成一道判断题:

判断:模型每回答一次问题,就一定会更新参数。答案:错误。

前一项任务给已有内容贴标签,后一项任务组织出新的表达。两者都需要计算,都可能用到学习过的规律,但我们希望得到的结果不同。这个变化,使 AI 从“帮我识别和筛选”走向“帮我起草和制作”。

本篇解释分类、预测与生成的关系,再认识两种重要的生成方式:自回归与扩散。所有卡片、概率和数字例子都是教学构造,不是某款模型的实测结果。无需安装工具。

分类、预测与生成,并不是三个互不相干的盒子

先把复习助手可能承担的工作放在一起:

任务 输入 希望得到的输出
分类 一段笔记 “训练”“评估”等预设类别
数值预测 文章长度等特征 预计阅读时间,例如 6 分钟
内容生成 笔记与“写一道判断题”的要求 完整的问题、答案和解释

分类通常在预设标签中选择;数值预测估计一个或多个数;生成则要形成文本、图像等内容。生成的输出空间往往很大,同一份笔记可以改写成多道不同但都合格的题。

不过,“预测”也有更广的含义:估计尚未给出的信息。按这个意思,分类是在预测类别,文字生成也可以通过不断预测下一个文字单元来实现。因此,不能把“模型在预测”与“模型在生成”当成相互否定的说法。

同样,任务与模型机制也不是一回事。让语言模型输出“训练”两个字,内部可以仍然是文字生成,而应用把结果当作分类标签使用。反过来,一个传统分类器也可以帮助生成系统筛掉不合格的候选结果。

从“识别”走向“生成”,描述的是应用能力的扩展,不意味着分类技术过时,更不意味着所有模型都必须依次经历这两个阶段。

生成模型要学的,不只是一份固定答案

复习助手不能只记住一条“笔记 → 卡片”的固定对应。笔记的主题、长短、措辞都会变化,用户也可能要求选择题、比喻或者配图。

可以把生成模型的目标直观地理解为:从训练材料中学习内容的规律,并据此形成可能的内容。对语言来说,规律包括词语搭配、句子结构和上下文关系;对图像来说,包括形状、颜色和物体之间的关系。“数据分布”这个术语,关注的正是哪些内容及组合更可能出现。

这不是说模型脑中存在一张完整的“所有答案表”。以语言模型为例,它可以用前面已有的内容,计算后续各个文字单元的概率,再逐步形成序列。《动手学深度学习》:语言模型

这里还要区分两种使用方式:

  • 无条件生成:没有指定具体目标内容,例如从学过的图片分布中生成一张图片。
  • 条件生成:给出额外条件,例如“根据这段笔记出题”或“画一只蓝色的纸鹤”。

“条件”可以是文字,也可以是图片、类别等。它改变这一次希望生成什么,并不等于这一次重新训练模型。潜在扩散模型的原始论文,就展示了让文字等条件参与图像生成的方法。Latent Diffusion Models 论文

对我们的助手来说,原始笔记与出题要求都是条件。但条件提供了依据和方向,不会自动成为绝对约束。模型仍可能误读笔记、遗漏限制,或者写出资料里没有的解释。

自回归:把已经生成的内容接回输入

自回归可以先理解成一个循环:依据已有内容预测下一项,把选出的这一项接上去,再预测下一项。

在语言模型中,这里的“一项”通常是 Token,即模型处理的文本单元。它可能对应一个字、一个词或词的一部分;具体分词将在第二部分讲。下面故意按几个容易阅读的片段演示,不代表真实分词器的结果。

笔记 + 要求:“写一句复习建议”
          ↓
预测下一个单元 → 选出“先”
          ↓
笔记 + 要求 + “先”
          ↓
预测下一个单元 → 选出“理解”
          ↓
笔记 + 要求 + “先 理解”
          ↓
预测下一个单元 → 选出“概念”
          ↓
继续,直到结束或达到长度限制

“自”体现在后续计算会用到自己此前生成的结果。普通的这个生成循环中,变化的是已经写出的文本与中间计算状态,模型参数通常保持不变。

为了看清概率怎样参与选择,构造一个极小的词表。假设目前已经生成“先”,下一项只有三个候选:

下一项 条件概率
理解 0.60
记住 0.30
忽略 0.10

程序可以每次选择概率最高的“理解”,这称为贪心选择。也可以按这组概率进行采样:像一个大小不等的抽签盘,“理解”占的份额最大,但另外两个仍可能被选中。采样不是让所有词机会均等。Hugging Face 的生成文档明确区分了这两类选择方式。Generation strategies

这也解释了为什么同样的问题有时得到不同表述:即使概率分布没变,抽取结果也可能变化。不能仅凭回答变化,就断定模型刚刚学到了新知识。

局部最可能,不等于整段最可能

继续做一个只有两步的玩具例子。规定输出恰好两个单元,第二步之后必定结束:

第一步 第一步概率 该分支第二步的选择及概率 完整路径概率
A 0.60 X:0.50;Y:0.50 AX:0.30;AY:0.30
B 0.40 X:0.90;Y:0.10 BX:0.36;BY:0.04

路径概率要沿着分支相乘。例如 BX 是 0.40 × 0.90 = 0.36。四条路径加起来是 1。

第一步贪心选 A,最后只能得到概率 0.30 的 AX 或 AY;整个玩具空间中概率最高的却是 BX。这说明逐步选最高概率,并不保证找到完整序列里概率最高的结果。

但不要接着得出“找到最高概率答案就一定正确”。这些概率描述模型倾向生成什么,不是答案符合事实的概率。把续写做得流畅,与核实某个知识点,是不同的要求。

训练时学接续,使用时真正接续

自回归生成让人很容易误以为:模型每写一个字,都在进行一次训练。回想第 08 篇的区分,就能看出不同。

设训练材料中有“先 理解 概念”这段序列。在常见的下一项预测训练中,可以构造“看见‘先’,目标是‘理解’”这样的学习任务。模型对目标给出的概率影响损失,训练程序再根据梯度更新参数。

而生成时,程序拿到的是模型给出的候选分布,需要实际选出一个结果接入后文。它没有一份事先写好的“这次回答标准全文”,也不必计算训练损失和更新参数。

环节 训练中的典型做法 普通生成中的典型做法
前文从哪里来 使用训练材料中的前缀 使用请求、上下文和已经生成的内容
下一项怎么处理 对照材料中的目标计算损失 按生成策略选出一个单元
参数是否更新 训练程序执行更新 通常不更新

这也带来一个应用问题:前面生成的失误可能影响后面的续写。假设复习助手先把“推理”写成了“训练”,后续解释就可能沿着错误前提展开。给它更多输出空间,并不会自动纠正这个前提。

这里是机制概览,不是在说模型只会机械模仿句式。下一项预测是训练目标,模型能从这个目标学到多复杂的规律,还取决于数据、结构、规模和训练过程。第二部分会专门解释这个问题。

扩散:从带噪的表示中逐步形成内容

文字可以一项一项接续,但图片也可以通过另一条路线生成:从噪声出发,经过多个步骤逐渐形成图像。

理解经典的去噪扩散模型,最好把训练与生成分开看。

训练时,先有真实图片。 程序按设定的噪声强度,把随机噪声混入图片,再让模型根据带噪图片和噪声阶段预测相关信息。在 DDPM 的常见训练形式中,目标是预测加入的噪声;程序知道自己加入了什么,因此能计算预测误差,并用它更新参数。DDPM 论文,训练算法与简化目标

想象复习助手需要画卡片插图。为了学会生成纸鹤,训练材料里可能包含纸鹤图片。轻度加噪后,轮廓还比较明显;重度加噪后,细节甚至主体都难以辨认。模型要在不同噪声水平上学习如何处理这种输入,而不是只学会一张图的修复。

这里的噪声是随机数造成的扰动,不是简单地把图片模糊一下。训练也不一定要对每张图一步一步做完整条加噪链:可以抽取某个阶段,直接构造对应的带噪样本。官方训练示例展示了抽取噪声、指定阶段、计算噪声预测均方误差的过程。Diffusers:训练扩散模型

生成新图时,通常从重新抽取的随机噪声开始。 模型给出预测,采样算法根据预测与当前阶段更新图像表示,再把更新后的表示送入下一步。并不是先偷偷拿到一张目标原图,再把它擦干净。

训练:真实图片 + 已知随机噪声 → 带噪样本
                                  ↓
                         模型预测 → 计算误差 → 更新参数

生成:新随机噪声 → 模型预测与采样更新 → 新的中间表示
                                         ↓
                                    重复若干步
                                         ↓
                                      输出图片

“逐步去噪”是整体直觉。实际更新含有系数、采样规则,某些步骤还会加入随机量,不能写成“每次直接减掉模型输出的噪声”就算完整算法。模型与采样调度器各自负责什么,可以在官方的管线拆解中看到。Diffusers:模型与调度器

同样,生成时反复使用网络,不表示反复训练网络。更新的是正在形成的样本;普通生成过程不因此改变模型参数。

文字要求怎样影响一张扩散生成的图

如果只有随机噪声,怎样让结果符合“蓝色纸鹤”这个要求?

文本条件生成系统会把要求转换成可计算的表示,并让它参与生成过程。可以把它理解为:每一步处理当前样本时,同时参考“这次想要什么”。模型必须通过相应训练学会利用这些条件;随便拿一个无条件模型,旁边附上一句文字,并不会自动获得文生图能力。

还有一个与成本有关的设计:不直接在完整像素上完成所有扩散步骤,而是在更紧凑的图像表示中计算,最后再把表示解码成图片。这里的内部表示称为潜在表示,不是一张缩略图的同义词。潜在扩散论文将这种设计用于减少高分辨率生成的计算负担,同时研究了文字等条件的接入。Latent Diffusion Models

因此,看到绘图界面从一团模糊内容变成清晰图片,可以把它当成生成过程的可视化;但不能认定内部一直保存着同样大小的可见图片,也不能据此判断模型每一步怎样计算。

对于开发复习助手的人,这些知识有一个实际用途:生成一张插图涉及的可能是一整套管线,包括文本编码、反复预测、采样更新和图像解码。产品界面上的一次“生成”,不等于模型只执行了一次计算。

两条路线的共同点与边界

比较点 本篇介绍的自回归文本生成 本篇介绍的扩散图像生成
常见起点 提示与已有文本 随机噪声,以及可选的文字等条件
中间过程 把选出的单元接入序列 多次更新正在形成的样本表示
生成时主要变化 序列及中间计算状态 样本表示及采样状态
参数是否必须更新 不需要 不需要
一项重要限制 前面的错误可能影响后续 形成清晰图像不保证细节与要求正确

这是两个典型例子的对照,不能据此把“文本”永远绑定自回归、“图像”永远绑定扩散。生成模型的路线也不只有这两种。例如 GAN,即生成对抗网络,通过生成器和判别器之间的训练配合学习生成内容;它并不要求使用本篇的逐项续写或扩散去噪流程。GAN 原始论文

还需要避免另外两个误解。

生成不等于查询数据库。 模型可以根据学到的规律组织输出;应用若要查询笔记库,需要安排相应的检索过程。但这也不代表每次输出都绝对原创。研究者曾从 GPT-2 中提取出与训练材料一致的文本,说明学习与记忆可能同时存在。这个研究结果不能直接变成对所有模型、所有输出的比例判断。Extracting Training Data from Large Language Models

生成得像,不等于完成得对。 给复习卡片配一幅想象中的蓝色纸鹤,允许多种合理画法;把“推理通常不更新参数”改成判断题,必须保持原意。两种任务都在生成内容,却需要不同的检查标准。

例如卡片写成“判断:推理过程中完全没有计算”,又把答案标成“正确”,它在格式上完整,却已经歪曲笔记。开发者需要检查事实、原文支持和题目是否可答,而不只是看输出有没有题目和答案两个字段。

五道理解检查

先自己回答,再看解释。不需要调用模型。

1.语言模型只输出“训练”两个字。它是在分类,还是生成?

2.在前面的两步玩具例子里,AX、AY、BX、BY 的概率分别是多少?第一步贪心选择能否得到最高概率路径?

3.同一模型、同一请求产生两种措辞,能否证明模型参数发生了更新?

4.扩散模型训练时使用真实图片,是否意味着每次生成新图片也必须拿到那张原图?去噪 30 步是否意味着训练了 30 次?

5.复习助手生成的卡片格式完整、句子自然,却增加了笔记没有支持的结论。能否仅凭前两点判定任务成功?

参考答案

  1. 应用任务可以是分类,模型执行机制可以是文字生成。要分别问“用户要什么结果”与“系统怎样得到结果”。
  2. 分别是 0.30、0.30、0.36、0.04。第一步贪心选 A,会错过 BX。即使选到 BX,也只是本玩具空间中的最高概率路径,不包含事实正确的保证。
  3. 不能。按概率采样就可能产生不同结果;上下文、生成设置等变化也可能影响输出。参数有没有更新,要看系统是否执行了训练更新。
  4. 不意味着。标准的从噪声生成新图流程使用新随机噪声;图片编辑等任务则可能另有输入图片。去噪步骤更新样本表示,普通推理并不因此更新模型参数。
  5. 不能。若任务要求忠实于笔记,就要检查新增结论是否有依据;形式完整和事实可靠是不同维度。

接下来:怎样判断生成结果真的有用

到这里,复习助手的几个能力已经能分开理解:分类帮助组织材料,数值预测给出估计,生成负责组织新内容,强化学习则是改进行动策略的一种学习方式。它们可以组合在同一个应用里。

最后一个问题是:怎样证明这个组合真的变好了?下一篇《怎样判断 AI 有没有进步:指标、基准与真实任务》会把“感觉不错”拆成可以检查的标准,也为进入大模型原理部分做好准备。


上一篇:强化学习:模型怎样从行动和反馈中改进 · 返回本部分大纲

资料观察基准:2026 年 10 月 3 日。本文介绍典型机制,不据此断言所有生成模型采用同一种结构或流程。


13 怎样判断_AI_有没有进步:指标、基准与真实任务

假设你给复习助手换了一个模型。新模型写出的卡片更长,解释更自然,你试了三篇笔记,感觉它进步很大。

第二天,你发现它把一个关键概念讲反了。再检查昨天的结果,旧模型虽然不够会表达,却没有犯这个错误。此时,“哪个模型更好”就不再是看一眼回答能决定的事。

上一篇解释了内容怎样生成。本篇接着回答:怎样知道生成结果值得使用,以及一次改动是否真的带来改善?我们会从可手算的分类指标出发,走到基准测试、人工评价和模型评分,最后为复习助手做一份小型评估方案。

文中的数据、卡片与比较结果都是教学构造,不是实际模型测评。无需安装软件;你只需要能计算比例,并愿意把“好不好”说得具体一点。

先明确,你要评估的究竟是什么

“这个 AI 很强”可能指几件不同的事:它在考试题上答对得多,写出的卡片忠实于资料,或者整个助手能把卡片正确保存下来。这些证据不能互相替代。

评估对象 具体问题 不能单独证明什么
模型的某种能力 在指定材料和规则下,答对多少题? 整个应用没有程序错误
一套生成方案 给定笔记与提示词,卡片是否合格? 换一批领域和格式仍然可靠
完整应用 导入、生成、修改、保存后,结果是否可用? 改善一定来自模型本身

假如同时换模型、改提示词、修复了笔记读取,你可以说“新方案表现改善”,但不能只凭这次比较,把全部改善归给模型。

因此,评估的第一步不是寻找指标,而是写下一个可以检查的目标。例如:

给定一段学习笔记,生成一道可回答的复习题;答案忠实于笔记,缺少必要信息时说明不足。

这句话没有“智能”“优秀”等宽泛形容词,却已经告诉我们该准备什么输入、检查什么结果。它是下面所有评分的起点。

准确率为什么可能掩盖真正的问题

设想助手还有一个“卡片检查器”:判断生成的卡片是否存在内容问题,把可疑卡片标出来。

先看一批假想的 100 张卡片,其中 90 张正常、10 张有问题。如果检查器一律说“正常”,它的准确率,Accuracy仍有 90%:100 次判断中有 90 次碰巧正确。

但它一张问题卡片也没发现。这个数字没有算错,只是没有充分回答“检查器能不能找到问题”。类别比例悬殊时,仅看整体准确率尤其容易产生这种误解。Google 机器学习课程:准确率、精确率与召回率

现在换一批更小、便于手算的 20 张卡片。我们先按明确标准人工复核,得到参考标签:8 张有问题,12 张正常。检查器的结果如下。这里把“有问题”规定为正类;正类只是我们重点检测的类别,不表示好事。

参考标签\检查器判断 标为有问题 标为正常 合计
实际有问题 6:找对了,TP 2:漏掉了,FN 8
实际正常 4:误报了,FP 8:正确放行,TN 12
合计 10 10 20

这叫混淆矩阵:把正确和错误按实际类别、预测类别拆开。TP、FP、FN、TN 分别是真正例、假正例、假负例、真负例。暂时不记英文缩写也没关系,先抓住“找对、漏掉、误报、正确放行”四种情况。

这里的“实际”指已经核查的参考标签。真实项目中,参考标签也可能标错或有争议,不能因为进入表格就变成不可质疑的真理。

三个指标,分别在数哪一堆卡片

准确率:所有判断里,判断正确的占多少?

准确率 =(找对的问题卡片 + 正确放行的正常卡片)÷ 全部卡片
       =(6 + 8)÷ 20 = 70%

精确率,Precision:被标为有问题的卡片里,真正有问题的占多少?

精确率 = 找对的问题卡片 ÷ 所有被标为有问题的卡片
       = 6 ÷(6 + 4)= 60%

召回率,Recall:所有实际有问题的卡片里,找回了多少?

召回率 = 找对的问题卡片 ÷ 所有实际有问题的卡片
       = 6 ÷(6 + 2)= 75%

最容易记住的区别在分母:精确率看“标出来的那一堆”,召回率看“本来应该找出来的那一堆”。 定义与公式也可对照 scikit-learn 的评估文档。分类指标定义

不要把“精确率”和日常口语里的“准确”混用。检查器说“我有 75% 的召回率”,不是说它发出的每次警报都有 75% 的可能正确;在这批数据中,警报的精确率是 60%。

指标之间的取舍,来自错误的代价

问题卡片漏过去,用户可能学错;正常卡片被标出来,用户要多花时间复核。这是两种不同损失。

如果检查器的作用只是提醒你再看一眼,可以接受一定误报,争取少漏问题。如果它会自动删除被标记的卡片,就应更加重视误报带来的损失。指标选择需要结合后续动作。

不少分类器先输出一个分数,再通过阈值决定是否标记。降低标记门槛,会让更多样本进入“有问题”一侧。它可能多找出问题,也可能多制造误报;精确率不保证随着门槛变化而严格单调变化。阈值是在模型预测之外作出的决策选择,应在开发或验证数据上选择,不能反复查看最终测试结果挑最好的门槛。scikit-learn:调整分类阈值

你可能还会见到 F1,它把精确率与召回率组合为调和平均:

F1 = 2 × 精确率 × 召回率 ÷(精确率 + 召回率)
   = 2 × 0.60 × 0.75 ÷(0.60 + 0.75)≈ 0.667

它不是两个百分比的普通平均,也没有包含真负例 TN。因此,F1 可以帮助比较,却不能替你决定“漏一张错误卡片”和“误报一张正常卡片”哪个更严重。

还有两个边界:如果检查器一张卡片也没标出来,精确率的分母是 0,不能擅自宣布它是 100%;如果评估材料里根本没有问题卡片,也无法通过这批材料检验问题卡片的召回能力。软件可能按约定返回数值,报告时仍应说明这个情况。

生成内容没有唯一措辞,怎样给分

分类可以核对类别,但复习题可能有很多正确表达。若只要求输出与某份参考答案逐字相同,就可能把合格改写判错。

仍用上一篇的笔记:

训练时根据损失更新参数;普通推理时使用已经学到的参数进行计算。

下面是三个构造的输出:

输出 可以怎样判定
问:普通推理是否通常需要更新参数?答:不需要。 抓住笔记要点,简短但可用
问:模型每回答一次就一定更新参数吗?答:不是。普通推理通常使用已有参数。 表达不同,同样可以合格
问:普通推理是否进行计算?答:完全不进行,只读取现成答案。 句子通顺,但内容错误

要评估它们,可以先定义一份评分规则,Rubric。下面是本教程为这个小任务设计的规则,不是某个通用标准:

维度 检查方法 本例的合格条件
忠实性 对照原文逐条检查结论 不歪曲、不增加无依据的知识结论
可回答性 只看题目与笔记尝试作答 题目清楚,资料足以确定答案
任务遵循 对照用户要求 确实生成一道题,并附答案
复习价值 看它考查什么 考查核心概念,不只问无关字面细节

对这个任务,可以预先规定:内容错误或题目无法回答,就不能算合格;表达风格另外记录。这比“内容 2 分、文采 5 分,平均还不错”更符合复习工具的用途。

人工评价也需要这样的明确标准。关于自然语言生成评估的研究发现,不同论文使用的质量术语与评估设计差异很大,报告不清楚会妨碍比较。写下“忠实性究竟怎样判”,比只给一个“人工评分 4.5 分”更容易复查。人工评价方法与报告研究

若两位检查者意见不同,先定位分歧:是原文含糊、评分规则含糊,还是某人漏看了一条信息?保留分歧和依据,再决定如何裁定。多人评分不会自动消除含糊的标准。

程序、人工和模型评分,各自适合做什么

评估生成内容时,不必把所有检查都交给同一种方法。

确定的条件,可以先用程序检查。 有没有问题字段、能否解析为规定格式、输出是否为空,都适合自动检查。但格式检查通过,只能证明对应格式条件成立。

需要理解资料的地方,要做内容核对。 个人项目起步时,可以自己对照原文检查一小批结果。如果没有足够背景判断,应引入可信参考材料或熟悉领域的人,而不是用自己的流畅感代替事实核查。

模型也可以帮助评分。 给另一个模型原始笔记、生成结果和评分规则,让它指出不被原文支持的结论,通常比只问“这张卡片好吗”更便于复核。它可以协助处理较多样本,但它给出的理由同样可能有错。

这类方法常称为 LLM-as-a-Judge,即用大语言模型充当评判者。MT-Bench 与 Chatbot Arena 的研究讨论了位置偏差、偏好冗长回答、自我偏好以及推理能力有限等问题:同一份答案,排在前面还是后面,都可能影响某些模型的比较判断。LLM-as-a-Judge 研究

对复习助手,可以采用下面的实际做法:先人工检查一批答案,再看评分模型在同一批材料上是否识别出那些错误;记录分歧,必要时修改评分规则。做两份答案的比较时,可以隐藏模型名称、交换展示顺序,检查结论是否变化。

这些措施降低某些干扰,不保证评分变得客观无误。尤其不能把“生成模型说自己正确”和“另一个模型也说正确”当成两份完全独立的事实证据。模型可能共享相似的盲点,最终仍需回到资料与可检查的结果。

基准测试能告诉你什么,不能告诉你什么

基准,Benchmark通常包含一组任务、数据和评测约定,让不同系统在相对一致的条件下比较。它的价值是提供共同参照,减少每个开发者从头出题的负担。

例如 MMLU 的原始设计覆盖 57 个学科任务,可用于观察模型在多种知识与问题上的表现。但学科题表现,并不能直接等价为“能根据我的中文笔记写出适合我的复习题”。MMLU 原始论文

读一项分数时,至少要把下面几个问题连起来看:

  • 题目来自什么语言、领域和难度?与自己的使用场景有多接近?
  • 测的是哪个模型版本,给了什么提示、上下文和工具?
  • 是一次作答,还是多次生成后选择结果?消耗的计算与时间是否可比?
  • 分数怎么汇总?平均数下面是否藏着某类任务的明显失败?

如果两个结果的测试条件不同,分数差不能直接解释为模型能力差。公开题目也可能进入训练或开发过程,材料重合会削弱用它估计“未见任务表现”的证据力度;但不能仅凭高分就断定存在数据污染。

HELM 的研究采用多场景、多指标评估,把准确性之外的校准、鲁棒性、效率等纳入比较,并强调标准化条件。这提示我们:模型表现有多个维度,用一个总榜名次描述全部能力会损失信息。HELM 论文

基准分数适合帮助形成候选范围。最终是否适合你的项目,还要让候选方案处理你真正会遇到的材料。

为复习助手准备一份最小评估方案

不必一开始就建庞大平台。先拿纸或表格,为项目设计一份能发现明显问题的检查集。

第一步:把任务和失败条件写下来。 沿用本篇目标:每段笔记生成一道可回答、忠实的题;必要信息不足时指出不足。提前说明哪些情况算失败,避免看完答案后迁就某个模型。

第二步:先设计 12 个案例。 下面是起步用的覆盖安排,不是足以代表所有用户的统计样本:

材料类型 数量 重点检查
内容完整、概念清楚 4 能否出题,并保留关键限定
含“不”“只有”“通常”等限定 3 是否颠倒意思或扩大结论
资料缺少必要条件 2 是否指出缺口,而非编造答案
表达凌乱但信息完整 2 能否整理后保持原意
两段内容相互冲突 1 是否揭示冲突,而非静默选一个说法

还可以选一段材料做配对检查:只改排版而不改含义,题目内容应保持合理;对同一个事实提问,把资料里的“会”改成“不会”,答案则应随含义变化。这属于检查特定行为的思路。CheckList 研究说明,围绕能力和输入变化设计测试,可以发现整体准确率没有暴露的问题。CheckList 论文

第三步:给每个案例记录预期依据。 不强制写一份唯一标准措辞,可以写“必须保留‘通常’”“不得声称推理没有计算”“应指出日期缺失”。这些记录比一句“答案差不多”更容易用于复核。

第四步:在相同条件下比较。 若要比较模型,就尽量固定材料、提示、工具权限和输出要求,并记录版本与生成设置。若输出有随机性,可以预先安排每个案例重复几次,保存全部结果,不只挑最好的一次。重复结果仍来自同一案例,不能假装成同等数量的独立任务。

第五步:看失败分布,再看总体比例。 记录每类问题、内容合格率、必要时的等待时间与调用成本。如果卡片内容正确却没有保存,完整应用仍然失败,应检查保存链路。

这 12 个案例一旦被你反复用来修改提示词,就属于开发检查集。最终再准备一批未参与这些决定的新材料,才能获得相对独立的检验。这里直接承接第 09 篇的数据分工,不是给文件夹换个“测试”名字就能实现独立。

一次提高,究竟说明多大范围的进步

假设在上述 12 个构造案例中,旧方案合格 8 个,新方案合格 9 个。

你可以准确地报告:在这次检查中,合格数从 8/12 变为 9/12,合格率从约 66.7% 变为 75%,提高约 8.3 个百分点。不能直接宣布“面对所有笔记都提高了 8.3 个百分点”。案例太少、覆盖有限,生成与评分也可能波动。

还要看是哪一个变好了、有没有别的变差。总数增加 1,既可能是修复 1 个,也可能是修复 3 个、同时弄坏 2 个。后者可能暴露值得重视的退步。

如果你的实际资料九成是技术笔记,评估集却九成是诗歌,即使样本很多,也不见得回答了实际问题。反过来,专门搜集困难反例很适合排错,但它们的失败比例也不能直接当作日常用户的失败率。

因此,一份有用的评估结论应说明:在什么材料、什么规则和什么条件下,哪方面改善了,哪方面还不确定。 小评估仍然有价值,只要不把它的结论扩张到证据之外。

五道理解检查

  1. 在本篇 20 张卡片的矩阵中,准确率、精确率、召回率分别是多少?若你最关心减少漏检,应重点观察哪个指标,同时留意什么代价?
  2. 检查器一张卡片也没标为有问题,能否说“它从未误报,因此精确率 100%”?
  3. 两份复习题措辞不同,但都忠实于资料、可回答且符合要求,是否一定要把其中一份判错?
  4. 某模型基准分数更高,评分模型也更喜欢它的长回答,是否足以证明它更适合你的复习助手?
  5. 在 12 个案例上反复修改提示,最终从 8 个合格变成 9 个。你可以报告什么,还需要做什么?

参考答案

  1. 分别为 70%、60%、75%。少漏检要重点看召回率,同时留意误报数量和额外复核负担,不能只追求一个数值。
  2. 不能。它没有正类预测,精确率分母为 0;应说明这一情况,而不是按直觉填 100%。若实际存在问题卡片,其召回率为 0。
  3. 不一定。开放生成任务可以有多个合格答案,应按预先规定的内容与任务标准判断,而非一律逐字匹配。
  4. 不足。还需检查基准与场景的关系,以及评分模型是否偏好长度。用自己的材料对照事实与任务要求,才能得到更贴近项目的证据。
  5. 可以报告开发检查集上的 8/12 与 9/12,并列出修复与退步。不能当成独立测试结论;还应使用未参与调整的新材料,并记录波动和评估范围。

从 AI 基础,走向大模型原理

第一部分到这里结束。我们从“模型怎样从数据中学习”出发,经过表示、概率、神经网络、训练、泛化、反馈与生成,最后学会检查它是否真的完成了任务。

回到最初的个人复习助手,你现在应该能把问题说得更清楚:是输入缺信息、训练目标与需求不一致,还是生成过程出错?是模型内容能力不足,还是应用保存失败?哪种证据能支持改进,哪种只是一次好看的演示?

第二部分会把这些基础放进大语言模型的具体机制中。第一篇从最靠近输入的地方开始:《文字怎样进入模型:Token、分词与文本表示》。先弄清模型实际上收到了哪些单元,再逐步理解它怎样利用上下文、生成回答和参与任务。


上一篇:生成式 AI:模型怎样从识别内容走向生成内容 · 第一部分大纲 · 第二部分大纲

资料观察基准:2026 年 10 月 3 日。本文的检查集与评分规则为教学设计,未经实际模型实验验证。


14 进阶学习

理解AI理论之后 怎样判断一个Agent方案是否可靠

模型在训练中学到了什么,为什么换一批数据效果就变了,指标提高是否意味着用户体验变好?读完 AI 理论基础知识库,你已经有了一套理解这些问题的基本概念。

从数据、表示、训练到泛化与评估,这些知识能帮助你读懂技术方案,也能提醒你在看到一次漂亮演示时,多问一句:它在什么条件下成立?进入真实项目后,这个问题会变得更具体。

先把理论变成检查方案的工具

假设你要做一个客服助手,模型能够流畅回答,并不代表它已经完成了客服任务。可以从下面四个角度检查方案。

原文图片

例如,客服知识里缺少最近的退款规则,回答可能依旧流畅,却没有正确依据。此时要先检查资料是否完整、检索是否拿到了相关内容,再判断模型如何使用这些信息。

知识库讲到的泛化与分布变化,也可以用在这里:演示中只有措辞清楚的提问,实际用户却可能带着错别字、多个诉求和含糊描述。测试样本需要覆盖这些输入,才能看清方案的适用范围。

练习时,可以整理一小组真实风格的问题,分别记录正确依据、预期回答和需要人工处理的情况。你会更容易判断,问题来自信息不足、模型理解,还是业务规则没有说清楚。

从判断回答 到判断整个执行过程

当助手开始查询订单、创建工单,评估对象就从一段回答扩展到了整条业务流程。下面几项值得一起检查。

原文图片

比如,用户要求修改收货地址,系统需要先核实身份和订单状态,再确定是否允许修改。模型理解了请求,只是其中一步;是否访问了正确订单、有没有获得授权、操作失败后怎样恢复,都需要单独验证。

可以先选择一个低风险流程,把输入、工具、预期结果和异常路径写出来。每次调整模型或提示词后,用同一组样本比较结果,保留失败记录。这样,理论中的评估意识就有了实际落点。

有了开发实践 再深入系统架构

如果你已经做过大模型应用或基础 Agent,希望进一步解决这些系统问题,可以了解《企业级 Agent 工程架构实战营》。

课程从 LLM 与 Agent 的底层认知出发,进一步讨论架构选型、运行时设计、上下文与工具治理,以及结果、执行轨迹和系统代价三个层面的评测。学习重点是把判断依据落实到系统设计中。

贯穿项目是企业级多租户零售经营分析与决策 DataAgent。学员围绕数据查询、分析、证据验证和受控业务操作,比较候选方案、建立评测基线,并练习故障诊断和发布控制。

这是一门面向已有大模型应用和基础 Agent 开发经验的架构进阶课程。刚读完理论的同学,可以先补一个小型应用实践,再带着遇到的具体问题继续学习。

带着一个方案 继续往下学

挑一个你希望落地的 AI 场景,写下它需要什么信息、怎样验收、哪些操作必须由人确认。这个小练习能帮助你看清下一步需要补的能力。

想了解《企业级 Agent 工程架构实战营》的内容与学习要求,可以通过下方入口联系学习顾问,备注 「AI 理论到架构」,说明自己的开发基础和目标场景。

[此处插入晶姐确认的销售二维码或联系链接]

原文图片