← 全部极客知识库

大模型通识 / AI 理论基础

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

原文备份 · 第 5 / 14 篇 · 查看极客时间原知识库 ↗

本篇目录 · 8 节

来源:AI 理论基础

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

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

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

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

返回:第一部分大纲