OpenKub 图书开发书单中职/技工版 · 十二章候选稿

十二章候选稿 · 汇总于2026-10-08

第3章 机器怎样从数据中学习

样章 v0.1 | 2026年9月20日

桌面换了,杯子还是那个杯子

把一只杯子放在桌上,你很容易认出它。将它转过来,把杯把藏到背面,或者在下面垫一张深色的纸,你大概仍然知道这是同一只杯子。

如果让计算机来认,它会根据什么作出判断?是杯口的形状,是杯身的颜色,还是照片中某个我们没有留意的地方?

你可以试着写一句规则:“有把手的是杯子。”但有的杯子没有把手,有时把手正好被挡住。继续补写规则,会遇到更多不同的情况。

还有一种做法:准备一些杯子的照片,也准备一些橡皮的照片,分别告诉计算机它们属于哪一类,再让程序根据这些例子调整模型。调整完成后,给它一张新的照片,看看它怎样判断。

这一次,我们既要准备例子,也要研究例子怎样变成识别的依据。最后再换一张桌面背景,问同一个问题:杯子还是那个杯子,模型的回答有没有变化?

上一章,我们学习了认真观察、把材料说清楚。本章继续使用这些方法,只是材料变成了照片。你选择拍什么、怎样拍,会影响模型接触到哪些信息。

学完本章,你将能够:说明样本、标签和模型的关系;通过简单计算理解参数怎样影响结果;完成一次两类物品的图像分类训练;用新照片检查模型,并解释一次观察。

3.1 从例子中寻找规律

3.1.1 给程序写规则与给模型提供样本

假如要把一组已经记录好重量的物品分成两组,要求是“不超过100克放在甲组,其余放在乙组”,程序照着这个条件比较就能完成。规则明确,结果也容易检查。

认照片中的杯子要复杂一些。拍摄角度一变,杯口看起来可能从圆形变成椭圆形;距离一变,杯子在画面中的大小也会变化。颜色、阴影和遮挡还会带来更多差别。

要为这些情况逐一写出判断条件,需要先找出适用的规律。机器学习(machine learning)提供了一种办法:通过数据和训练,让模型形成完成某项任务所需的计算关系。本章学习的,就是利用已经标明类别的图片来训练模型。[1]

这两种做法可以放在一起理解:

依据规则判断:人写好判断条件,程序接收图片中提取的信息,按条件给出结果。

依据样本学习:人准备图片和对应类别,训练程序据此调整模型;调整完成后,模型接收新图片,计算它更接近哪一类。

后一种做法仍然需要人设计程序、选择材料和检查效果。变化在于,许多具体的判断依据由训练过程从数据中形成,人不必事先把每一种杯子的样子都写成规则。

这也让数据的选择变得重要。假如提供的照片里,杯子总在画面左边,橡皮总在右边,位置就可能与类别一起影响训练。我们希望模型识别物品,但照片还记录了背景、位置、光线等许多信息。

学习方法也有适合的范围。对“是否超过100克”这样确定的问题,直接比较数值就很清楚。对外观变化较多的图片,学习数据中的规律往往更有帮助。选择方法时,先看问题需要处理什么信息、判断条件是否已经明确。

本章先完成一个小任务:每次给模型看一张图片,图片中只有杯子或橡皮中的一种,让它选择类别。这类任务称为分类。给出物体在图片中的具体位置,是另一个问题,我们将在下一章继续研究。

先想一想:为杯子和橡皮各写出一个容易观察的特点。这个特点在物品转动、离镜头远近变化以后,还一定成立吗?

3.1.2 数据、标签与模型

准备一只杯子、一块普通的橡皮,以及两张颜色不同的纸。纸用来改变桌面背景。使用能够拍摄图片的设备和图像分类训练工具,就可以开始。Teachable Machine的图像项目是一种可选工具,也可以使用具有采集图片、训练和预览功能的同类工具。[2]

先选一张纸铺在桌面上。把杯子放好,拍一张照片。在这个任务中,这张照片就是一个样本。给它标上“杯子”,这个类别名称就是标签。拍摄橡皮时,相应标签就是“橡皮”。

把许多这样的照片和标签放在一起,就形成了这次训练使用的数据集。照片提供输入信息,标签告诉训练程序:我们希望这张图片得到什么分类结果。[1]

在训练工具中建立“杯子”和“橡皮”两个类别。先分别采集约20张图片,作为第一轮尝试的起点。可以直接用摄像头采集,也可以导入已经拍好的照片。

每拍几张,就把物品转动一点,或适当改变它的位置。两类物品都使用刚才选定的背景,都尝试几个角度。尽量让物品完整、清楚地出现在画面中;放好后移开手,再采集图片。

先不用追求很多照片。重要的是看看这些照片提供了哪些不同的信息。同一个姿势连续拍20张,与从几个角度拍20张,覆盖的情况并不一样。这里的数量便于开始实验,不能保证任何物品都能得到理想结果。

采集完成后,浏览两个类别中的图片。有没有把橡皮照片放进杯子一类?有没有某张照片同时出现两种物品,让标签变得含糊?把这类问题改正,再开始训练。标签是训练所依据的答案,填错以后,程序也会受到错误信息的影响。

此时,我们已经有了数据和标签。那么,模型是什么?可以先把它理解为一套把输入信息转换成结果的计算方法,其中有一些可以调整的数值。训练会改变这些数值,使模型在所提供的样本上更接近相应标签。[1]

训练后的模型接收一张照片,能够为“杯子”和“橡皮”分别计算一个分数,再据此选择类别。它怎样调整数值,正是下一节要研究的问题。

现在把采集好的图片作为训练材料。后面检查效果时,我们会另外拍摄新照片,先不把检查用的图片加入训练。这样才能看看模型面对新材料时的表现。

3.2 模型怎样逐步改进

3.2.1 比较结果并调整参数

照片本身不会直接变成一句“这是杯子”。计算机要把图片中的信息表示成数字,再按模型的计算方法得到结果。模型中可以调整、并会影响输出的数值,称为参数。

先用一个可以手算的小例子,看清参数的作用。假设我们只看物体在照片中的高宽比,用“高度÷宽度”得到一个数。例如,高度是宽度的1.2倍,高宽比就是1.2。

下面四组数据用于演算。

图片编号 高宽比 已知标签
甲 0.5 橡皮
乙 0.8 橡皮
丙 1.2 杯子
丁 1.6 杯子

我们暂时采用这样的计算方法:高宽比达到某个分界值,就判为杯子;低于它,就判为橡皮。这里可以调整的参数,就是这个分界值。

先把分界值设为0.7。甲的0.5低于0.7,判为橡皮,正确;乙的0.8高于0.7,判为杯子,与标签不符。丙、丁也被判为杯子,与标签一致。这次共有一张图片分错。

把分界值改成1.0,再算一次。甲、乙都低于1.0,丙、丁都达到1.0,四张图片的判断便与标签一致。

这里发生了三个动作:先计算结果,再与标签比较,随后调整参数。分界值的改变,使同一组输入得到了不同结果。这里由我们演算,也可以让程序比较若干个分界值,选出分错较少的一项。它先利用带标签的数据进行比较,再确定参数,这就构成了一种简单的学习过程。

分界值可以继续增大吗?试着把它改成1.4。你会发现,丙又被分错了。参数的数值越大,并不代表模型越好;需要看它对整组样本产生了什么影响。

这个例子可以用分错的张数来比较结果。实际训练通常会用一个数表示预测结果与标签之间的差别,这个数称为损失(loss)。不同任务可以采用不同的计算方式,训练的目标是尽量减小这种差别。[3]

在神经网络的图像分类训练中,程序通常还会比较各类别的预测分数。即使最后选对了类别,分数与目标之间仍可能有可调整的差别。程序利用损失的变化,计算参数向哪些方向作小幅调整更有帮助,再反复进行计算和更新。[3]

回到桌面的实验。现在选择训练功能,先保留工具的默认设置。训练程序会使用已经提供的图片和标签,调整参与本次训练的参数。完成后,进入预览,把杯子和橡皮分别放到画面中,看看输出是否跟随物品变化。

这时看到的是模型的一次实际运行。接下来还需要专门用新照片检查,暂时不用凭这几次预览给模型下结论。

刚才的高宽比计算,只是帮助我们看清一个参数怎样改变结果。真实的杯子和橡皮有更多外形,单独使用高宽比很难充分区分。图像模型会组合许多信息,下面再看其中一种常用结构。

3.2.2 神经网络怎样组合简单的计算

高宽比把一张图片中的信息压缩成一个数。真实图片还包含颜色变化、边缘、纹理,以及各部分的位置关系。为了利用更多信息,模型需要组织更多计算。

神经网络(neural network)把许多计算单元连接起来。前面的单元得到一些数值,后面的单元继续处理这些结果,最后形成输出。先看一个计算单元,就能理解其中一部分工作。[4]

沿用刚才的高宽比,把它记作x。一个用于演算的单元先做下面这步计算:

计算结果=2 × x - 1

这里的2控制输入变化对结果的影响,称为权重;-1让整个计算结果向下移动,称为偏置。二者都是参数。对这个单元来说,输入变化时,结果会变化;输入不变而参数变化时,结果也可能变化。[4]

当x=0.8时,计算结果是2×0.8-1=0.6。若把权重从2改成3,结果就变成3×0.8-1=1.4。你可以看到,参数怎样参与了计算。

继续使用权重2和偏置-1。许多神经网络单元还会对计算结果作一次变换:负数变成0,正数或0保持原值。这样,x=0.8时输出0.6;x=0.4时,先算出-0.2,最后输出0。这种数值变换由激活函数完成。[4]

把刚才得到的0.6交给下一个单元。假设这个单元先算“3×输入值-0.5”,再把负数变为0,就会得到3×0.6-0.5=1.3。前一个单元的输出,成为后一个单元的输入;后面还可以继续接着计算。

为什么要加上把负数变为0这类变换?假如很多层都只是把输入乘上固定的数,再加上另一个数,它们合在一起仍能化成同一类简单计算。加入这样的变换以后,整个网络就能够表示更复杂的关系。[4]

真实的计算单元通常会接收多个数,将它们分别乘上权重后相加,再加上偏置并进行变换。许多单元使用不同参数处理输入,将结果传给下一层。一个单元的计算并不复杂,多层组合后就有了处理更复杂信息的可能。

在图像网络中,有些前面的计算能够对局部明暗变化或边缘产生不同响应;后面的计算继续组合这些信息。具体利用了哪些信息,还需要通过分析和实验来了解。不能仅凭最终输出“杯子”,就认定某一个单元专门负责识别杯把。[5]

训练时,程序把网络最终的输出与标签比较,再据此调整参与训练的权重和偏置。我们刚才手动改动一个数,网络训练则由程序处理许多参数。小例子帮助我们看清计算,实际模型需要更多数据和计算来形成有用的结果。[3][4]

你也许还会问:刚才只有几十张照片,为什么就能训练一个图像模型?

一种常见做法是先使用已经在大量图片上训练过的网络,利用它提取图像中的信息,再用我们提供的样本训练后面的分类部分。这种借用已有学习成果来完成新任务的方法,称为迁移学习(transfer learning)。[5]

采用这种方式时,杯子和橡皮的照片主要用于学习本次分类所需要的区别;模型处理图像的部分能力来自此前的训练。因此,少量照片就能开始一次练习,并不说明仅凭这些照片就能从头形成全面的图像识别能力。

现在区分两个过程:训练时,程序依据图片和标签调整参数;预览时,程序使用当前参数处理新画面。在本章采用的操作方式中,连续给它看更多画面,并不会自动再次训练模型。

上一章向AI补充一段文字,是给本次回答增加可以参考的材料。本章专门执行训练,则会改变参与训练的参数。这两个过程都使用了信息,改变模型行为的方式有所不同。

动手算一算:沿用“2×x-1,负数变为0”的单元,当x=1.2时,输出是多少?再把偏置由-1改成-2,保持x不变,输出又是多少?说说究竟是哪一项变化影响了结果。

3.3 怎样知道模型学得如何

3.3.1 用不同材料进行训练与测试

四张演算图片都分对了,能说明那个分界值适合所有杯子和橡皮吗?还需要看看其他图片。真正训练出的图像模型也面临同样的问题。

用于调整模型的材料称为训练集。专门留出来、用于检查模型面对新材料时表现的材料称为测试集。测试时,我们知道图片的类别,但先只把图片交给模型,再用已知类别核对它的回答。[6]

就像检查自己是否理解了一种解题方法,做过的原题可以帮助回顾,换一道题才能了解是否会运用。在模型训练中,训练材料上的表现与新材料上的表现也需要分别观察。

现在保持模型不变,使用原来的背景,为杯子和橡皮各拍5张新照片。这些照片不加入训练类别,只送入预览或预测功能。可以重新摆放物品、变换少量角度,让照片与训练时有所不同。

这里的“新”不只是换一个文件名。从训练录像中紧挨着截出的两帧,画面往往很相近。重新摆放、重新拍摄,能让检查更有意义。若只使用同一只杯子和同一块橡皮,得到的结论也先限定在这两件物品及本次拍摄条件内。

逐张查看模型选出的类别,与实际物品对照。可以直接把结果记成“杯子,5张中判对几张;橡皮,5张中判对几张”。选择预测分数较高的一类作为答案;若两类分数并列最高,这次记为未正确分出。

下面是一组计算示例:杯子的5张照片判对4张,橡皮的5张照片判对5张,一共判对9张。准确率表示判断正确的数量占总数量的比例:[7]

准确率=判断正确的图片数÷测试图片总数×100%

9÷10×100%=90%

这个90%说明模型在这10张图片上的表现。测试数量很少,换一组图片还可能不同。阅读结果时,把“检查了什么”和“判对多少”放在一起,比只记一个百分数更有用。

预览中还可能显示“杯子90%,橡皮10%”。这是模型对当前这一张图片给出的类别分数,与刚才数出“10张中判对9张”不同。前者是预测时算出的数,后者来自与实际标签逐一核对。模型显示很高的分数,也仍然可能判断错误。[8]

如果训练时已经显示了很好的结果,但新照片经常分错,就需要继续检查。模型过分贴合训练材料中的细节,却不能很好处理新材料,这种情况称为过拟合。训练时间更长,并不保证新图片上的结果更好。[9]

不过,只看到一次错误,还不足以断定原因就是过拟合。先回到图片:是否模糊,是否放错标签,拍摄条件是否有较大变化?上一章区分观察与猜测的方法,在这里依然适用。

现在完成第一组检查:记下两类物品各自判对的数量,保留一张你想进一步研究的照片。它可以是判断错误的一张,也可以是在新角度下仍然判断正确的一张。

3.3.2 换一种条件,结果会怎样变化

第一组检查之后,换上另一张颜色明显不同的纸。仍然使用同一只杯子、同一块橡皮和同一个模型,尽量保持光线、拍摄距离和物品摆放方式与刚才接近,再为每类物品各拍5张新照片。

这次主要改变背景,让两组结果比较起来更容易理解。若同时换物品、换房间、换镜头,即使结果不同,也很难判断主要与哪项变化有关。

在训练工具中仍然只使用预览或预测功能,把这一组照片逐张送入模型。不要在两组检查之间重新训练,否则比较的就同时包含模型变化。

可以把实际结果放在一张小表中:

检查条件 杯子判对数 橡皮判对数 合计判对数
原来的背景,新拍照片 ____ / 5 ____ / 5 ____ / 10
更换背景,新拍照片 ____ / 5 ____ / 5 ____ / 10

如果更换背景后结果变差,一个值得继续检查的猜测是:背景变化影响了识别。它还不能单独证明模型主要依靠背景作出判断,因为拍摄时的阴影、曝光或物品位置也可能有变化。可以挑选一件物品,在两种背景之间来回比较几次,观察影响是否反复出现。

如果两组都判断得很好,也有清楚的收获:在这次选择的背景和样本中,模型保持了较好的表现。记录实际结果,再考虑还有哪一种条件值得检查。没有必要刻意把照片弄得无法辨认,去寻找一个必然出错的例子。

如果换背景以后反而更好,也值得观察。新的背景可能让物品轮廓更清楚,也可能只是这一组照片更容易识别。先描述变化,再提出可能的解释。

模型在没有参与训练的新材料上仍能作出有效判断的能力,称为泛化能力。不同的新材料检查不同的方面:换背景,观察对环境变化的适应;换一只不同颜色的杯子,观察是否能处理同一类别的新物品。一次检查提供的是其中一部分信息。[6][9]

本章的基本实验做到这里,就可以回到起初的问题:桌面换了,模型的回答有没有变化?用刚才的记录回答,再说明一项你能够支持的判断和一项还想继续了解的事情。

还可以怎样改进?

如果某类图片经常分错,先查看这一类的训练材料是否清楚、标签是否正确,是否缺少实际使用时会遇到的角度和背景。若两类物品分别只在不同背景上出现,可以让两类都在这些背景上出现,减少背景与类别固定相伴的情况。

补充数据时,想清楚新照片要增加什么信息。原来的照片复制十遍,文件数量增加了,新的情境却没有增加。把缺少的角度、光线或物品形态补进去,更有机会帮助我们检验原来的猜测。

需要继续尝试时,再修改训练材料、重新训练。已经用来分析问题的测试照片,可以继续帮助观察改动前后的差别;要了解改进后的模型处理新材料的能力,还应另外准备没有参与训练和改进选择的新照片。[6]

两组小实验不能回答所有问题,却能改变我们看模型的方式。看到一次正确识别时,会进一步问它经历了哪些训练、还需要检查什么;看到一次错误时,也能从材料和实际条件出发寻找原因。

你可以用三句话收束这次探索:我提供了什么样的训练材料;换成新照片以后实际出现了什么;根据这些结果,我准备保留或改变什么。让观察和理由留在一起,下一次尝试就有了起点。

本章回望

本章从杯子和橡皮的照片出发,研究机器怎样从数据中学习。图片和标签提供训练依据;模型中的参数参与计算;训练程序比较预测结果与标签,逐步调整参数;新照片则帮助我们检查模型面对变化时的表现。

一个分界值,就能够改变简单分类的结果。神经网络把许多带有参数的计算单元组合起来,再通过训练形成更复杂的处理能力。借用已有模型的学习成果,也可以让一个小实验从少量材料开始。

我们同时看到,数据总是在某些条件下采集的。一张照片包含物品,也包含拍摄位置、背景和光线。我们选择了哪些例子,遗漏了哪些情形,会影响模型能够学习和接受检验的范围。

上一章要求我们把观察写具体。本章又向前走了一步:把材料准备好,让一个判断接受实际检查,再用结果修改自己的理解。

下一章,我们将走近这些输入信息,看看图像和声音怎样进入计算机,以及模型怎样利用它们。

练习与继续探索

1. 用一张照片解释三个词。从本章训练材料中选一张照片,说明它作为样本提供了什么,标签写的是什么,训练后的模型要根据新图片输出什么。

2. 改一个数,再检查。对3.2.1中的四组演算数据,把分界值分别设为0.9和1.3,各会分错几张?如果新出现一只高宽比为0.7的矮杯子,原来的高宽比方法可能遇到什么困难?

3. 判断材料是否真的更新。一位同学把训练照片复制出来,改了文件名,作为测试照片。他得到全部正确的结果。这说明了什么,又没有说明什么?怎样重新安排一次检查?

4. 区分预测分数与实际表现。某张图片显示“杯子95%”,另一份记录写着“20张测试图片中判对19张”。这两个95%分别怎样得到?为什么不能相互替代?

5. 为下一次尝试选材料。一个分类器在正面照片上表现较好,在侧面照片上表现较差。现在只能增加10张训练图片,你准备怎样拍?说明希望补充哪些信息,再设计一次能够检查效果的小尝试。可以借助AI整理计划,最终以实际拍摄和测试结果作判断。

本章资料来源

[1] Google for Developers. Supervised Learning. 用于核对样本、标签、模型、训练与预测的基本关系。访问日期:2026-09-20。https://developers.google.com/machine-learning/intro-to-ml/supervised

[2] Google. Teachable Machine 2.0 makes AI easier for everyone. 2019-11-07。用于核对图像采集、训练与预览的基本流程;工具入口:https://teachablemachine.withgoogle.com/ 。访问日期:2026-09-20。https://blog.google/innovation-and-ai/products/teachable-machine/

[3] Google for Developers. Linear regression: Loss;Linear regression: Gradient descent. 用于核对损失、参数调整与训练过程的基本说明。访问日期:2026-09-20。https://developers.google.com/machine-learning/crash-course/linear-regression/loss ;https://developers.google.com/machine-learning/crash-course/linear-regression/gradient-descent

[4] Google for Developers. Neural networks: Nodes and hidden layers;Neural networks: Activation functions. 用于核对权重、偏置、计算单元和激活函数的解释。访问日期:2026-09-20。https://developers.google.com/machine-learning/crash-course/neural-networks/nodes-hidden-layers ;https://developers.google.com/machine-learning/crash-course/neural-networks/activation-functions

[5] TensorFlow. Transfer learning and fine-tuning. 用于核对利用预训练网络提取图像信息、再训练分类部分的方法。访问日期:2026-09-20。https://www.tensorflow.org/tutorials/images/transfer_learning

[6] Google for Developers. Datasets: Dividing the original dataset. 用于核对训练与测试材料的分离、重复材料及反复使用测试结果的问题。访问日期:2026-09-20。https://developers.google.com/machine-learning/crash-course/overfitting/dividing-datasets

[7] Google for Developers. Classification: Accuracy, recall, precision, and related metrics. 用于核对分类准确率的含义。访问日期:2026-09-20。https://developers.google.com/machine-learning/crash-course/classification/accuracy-precision-recall

[8] GUO C, PLEISS G, SUN Y, et al. On Calibration of Modern Neural Networks. Proceedings of Machine Learning Research, 2017, 70: 1321–1330. 用于核对模型预测分数不自动等于实际正确比例的说明。访问日期:2026-09-20。https://proceedings.mlr.press/v70/guo17a.html

[9] Google for Developers. Overfitting. 用于核对过拟合与泛化的基本解释。访问日期:2026-09-20。https://developers.google.com/machine-learning/crash-course/overfitting/overfitting