JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

机器究竟是怎样"学习"的

机器既不像你那样学习,也不只是听从程序员写下的规则。本指南拆解现代人工智能最核心的一个想法:通过调整一堆数字、让模型的错误越来越小,从而把模型拟合到样例上。

让计算机做事的两条路

在本阶段前面的内容里,你已经把人工智能当作一个领域来认识,也看到了它与普通软件的区别。现在我们聚焦到一个动作上——它几乎驱动着今天所有的人工智能;而诚实的起点,是把它和更古老的做法对照来看。在计算机历史的大部分时间里,要让机器完成某项任务,你得写下规则:由程序员事先想清楚的、明确的一步步指令。"如果邮件里出现'中奖'这个词,就标为垃圾邮件。"智能完全寄居在写规则的人身上;计算机只是服从。

这种写规则的做法,正是经典符号人工智能的核心,也是专家系统的核心——后者把人类知识手工编成成千上万条"如果-那么"规则。当任务清晰、规则可知时,它运作得极为漂亮。但想想看:在照片里认出一只猫,或者分辨一条信息是友善还是讽刺。你能把每一条规则都写下来吗?胡须吗?可有很多猫躲在沙发后面。事实是:你毫不费力就能认出猫,却无法完整说清自己是怎么做到的——于是你也没法把这些规则交给计算机。

机器学习把箭头反了过来。你不再自己写规则,而是给机器看大量样例——成千上万张已经标好"是猫"或"不是猫"的照片——再让一套程序替你找出规则。程序员不再规定"是什么"让一只猫成其为猫;他们搭建的是一个能从数据中发现那种模式的系统。目标相同,方向相反:是从样例里得出规则,而不是从规则里得出答案。

样例、特征与标签

要从样例中学习,机器需要把样例变成它能咀嚼的形式:数字。以预测房价为例。每一套房子变成一行可度量的输入——面积(平方米)、卧室数量、房龄、到市中心的距离。每一个这样的输入就是一个特征。你想预测的东西——价格——则是标签(也叫目标值)。一套房子,连同它的特征和已知价格,就是一个训练样例。

当每个样例都带着已知标签时——每套房子都已经有价签,每张照片都已经写明是不是猫——机器就能把自己的猜测和正确答案对照,从而自我纠正。这就是监督学习,迄今最常见、研究得最透彻的一类,也是本指南余下部分要追随的那一类。(还有别的类型——从无标签数据里找模式,或从试错的奖励中学习——但那些你会在下一篇里遇到。)

模型是一台带可调旋钮的机器

这一切的中心坐着一个模型。别把它想得多神秘:模型不过是一个内部带着若干可调数字的数学函数。它把特征输进去,输出一个预测。那些可调的数字就是参数。所谓学习,不多也不少,就是为这些参数找到合适的取值。

最朴素而诚实的例子:把价格预测成各特征的加权和。价格 = w1 x 面积 + w2 x 卧室数 + ... + b。每个 w 都是一个参数——一个旋钮,表示那个特征有多重要——而 b 是一个偏移量。拧动旋钮,同一个模型就变成了不同的价格预测器。一个现代的大语言模型不过是同一个想法被荒诞地放大:它不是四个旋钮,而是数千亿个,但每一个仍旧只是一个正在被调的数字。

把两类数字分开会很有帮助。参数是机器在学习过程中自己设定的——就是上面的那些 w 和 b。超参数则是在学习开始之前做出的选择——允许有多少个旋钮、每次调整时迈多大的步子。参数是学出来的;超参数是由操盘的人手动拨定的。把这两者混为一谈,是初学者最常见的困惑之一。

训练:拧旋钮去拟合数据

那么旋钮是怎么被设定的呢?一开始你给它随机值——模型最初的猜测纯属胡来。你喂给它一个训练样例,它做出预测,你再衡量它错得有多离谱:它的预测与真实标签之间的差距。把这种错误程度在整批数据上取平均,就得到一个单一的数字,叫作损失——越低越好。训练,就是去寻找能让损失变小的那组参数取值。这正是人们所说的"把模型拟合到数据上"。

这种搜索本身美妙地机械。对每一个旋钮你都问:要是我把它往上轻推一点,损失是升还是降?然后你就让每个旋钮都朝着能降低损失的方向轻轻挪一下,再重复——成千上万、乃至上百万次。这种耐心的下坡行走就是梯度下降,而几乎所有现代训练靠的都是它的某个版本。没有顿悟,没有理解——只有"哪个微小的调整能让我少错一点",不停地做下去。

  1. 把参数初始化为随机值。
  2. 让样例通过模型,得到预测。
  3. 衡量损失——预测离真实标签有多远。
  4. 把每个参数朝着能降低损失的方向轻推一点。
  5. 重复第 2 到 4 步,直到损失几乎不再改善。
params = random()
repeat many times:
    pred  = model(features, params)
    loss  = how_wrong(pred, labels)
    grad  = which_way_lowers(loss, params)
    params = params - step_size * grad   # nudge downhill
# params now "fit" the training data
训练循环的精神全貌:预测、衡量误差、把参数往下坡轻推、重复。

训练与使用——以及死记硬背的陷阱

旋钮一旦设定,训练便告结束,模型就可以被使用了:递给它一套从没见过的全新房子,它在一次前向计算里就给出一个价格——不再拧任何旋钮。这一分界就是训练与推理。训练是寻找参数的那个缓慢、昂贵、一次性(或偶尔进行)的过程;推理则是把训练好的模型跑在新输入上的那个快速、廉价、反复进行的动作。正在回答你的聊天机器人做的是推理;它那几个月的训练早已完成,旋钮已被冻结。

这里也最需要诚实。我们的目标从来不是在那些已经知道价格的房子上表现好——我们想预测的是房子。一个只是把训练数据死记下来的模型,就像一个背下了答案却没真正学懂学科的学生,在见过的东西上拿满分,碰到任何新东西就垮掉。这种失败叫作过拟合,而与它搏斗是整个领域最核心的较量之一。

所以,当有人说某台机器"学会了",你现在可以精确地翻译它:一个带可调参数的模型被展示了带标签的样例,一场下坡搜索不断调整这些参数,直到它在样例上的预测变得准确——并且理想情况下,这种准确能迁移到新情形上。没有魔法,没有理解,没有内在生命。只有数据、一个函数,以及大量微小的修正。把这幅图景牢牢记住;这条阶梯上后面所有更重的东西,都建在它之上。