人工智能导论 第 2 章 · 实验一

← 返回实验目录

第 2 章 人工智能数学基础 · 实验一

走下山坡

这个实验要弄清一件事:给定一堆数据,机器是怎么把一条直线的两个参数一点一点调到最合适的位置的。全程不写代码,通过拖动、点击和观察完成。

建议用时45 分钟
需要装什么什么都不用装
对应课件第 2 章 第 11、17、26 页
交什么最后一节生成的实验报告
01

这张图上的每一个点,都是一条直线

先玩十分钟,别急着往下走

我们手上有 100 个点,想用一条直线 y = w·x + b 去穿过它们。只要定下 w(斜率)和 b(截距)这两个数,直线就定下来了。左边那张图的横纵坐标就是这两个数,所以左图上任意一个位置,都对应右图里的一条具体直线。

参数空间
颜色越浅的地方误差越小。直接在图上按住拖动,看右边的直线跟着动。红色星星是数学上算出来的最优位置。
数据与直线
灰点是 100 条数据。竖线是每个点到直线的距离,也就是这条直线在这个点上错了多少。误差就是把所有竖线的长度平方之后取平均。
试一试:把直线拖成一条水平线(w 接近 0),看看竖线有多长。再拖成一条很斜的线,看竖线怎么变。你会发现只有一个位置能让所有竖线整体最短。
为什么误差长成一个碗的形状

误差的定义是把每个点的偏差先平方再平均,写出来是这样:

误差 = 平均值[ (w·x + b − y)² ]

括号里是「直线给出的预测值」减去「真实值」。平方是为了让偏高和偏低都算错,而且偏得越多罚得越重。

把这个式子展开,里面 w 和 b 的最高次数都是 2 次,而且平方项的系数是正的。二次函数的图像是抛物线,两个变量的二次函数图像就是一个碗。所以这个误差面只有一个最低点,不存在走错方向掉进别的坑里的问题。

课件第 2 章第 17 页那个式子 (1/N)‖y−Xθ‖²,说的就是这里的误差。

那个最优位置是怎么算出来的

因为误差是个碗,碗底那一点的坡度必然是零。把「对 w 的坡度 = 0」和「对 b 的坡度 = 0」两个条件列出来,是一个两个未知数、两个方程的方程组,解出来就是最优的 w 和 b。这就是课件第 2 章第 24 页那个 θ*=(XᵀX)⁻¹Xᵀy 在只有两个参数时的样子。

问题是:真实的模型有几百万个参数,那个方程组根本解不动。所以才需要后面这些一步一步往下走的办法。

手动调参

当前误差—
最小可能误差—
你手调的最好成绩—
离最优还差—
02

站在任意一点,往哪个方向下山最快

点图上任意位置

上一节是靠手感找最低点,很快就会发现手感不太靠得住。有没有办法在任意一点上算出「往哪边走是下坡」?有,而且这个方向可以精确算出来,它叫梯度。

在图上点几下
每点一下,就在那个位置画出一支箭头,箭头指的是下降最快的方向,长度代表坡有多陡。多点几个地方,就能看出整张图的坡是怎么走向的。

刚点的那一点

位置 w—
位置 b—
w 方向的坡度—
b 方向的坡度—
坡有多陡—
这一点的误差—
注意两件事:

一、所有箭头都指向中间那个最低点附近,但不是直直指过去,而是垂直于脚下那条等高线。

二、越靠近最低点,箭头越短。到了最低点,箭头长度就是零,这也是判断「到没到底」的依据。

坡度这两个数是怎么算出来的

一个方向上的坡度,就是「往这个方向挪一点点,误差会变多少」。数学上把它叫做偏导数。这个实验里两个方向的坡度分别是:

w 方向坡度 = 2 × 平均值[ (预测值 − 真实值) × x ]
b 方向坡度 = 2 × 平均值[ (预测值 − 真实值) ]

两个式子长得几乎一样,区别只在于 w 的那个多乘了一个 x。原因很直观:改变 b 是把整条直线平移,对每个点的影响一样大。改变 w 是把直线转一下,x 越大的点被甩得越远,所以要按 x 加权。

把这两个数拼成一对,就是梯度。梯度指向上坡最快的方向,所以下山要往它的反方向走,箭头画的就是反方向。

03

顺着箭头一步一步走

先单步走几下,看清每一步在算什么

有了方向,剩下的事就是反复做同一件事:算出脚下的坡度,往反方向挪一小步,再算一次。这句话写成式子就是课件第 2 章第 26 页那一行,整个第 2 章最该记住的一行。

新位置 = 旧位置 − 学习率 × 坡度
下山轨迹
在图上点一下可以换一个出发点。试试从四个角分别出发,看轨迹的形状有什么共同点。
误差怎么降的
横轴是走了几步,纵轴是误差。一开始降得很快,后面越来越慢,因为越靠近底部坡度越小,每一步挪的距离也就越短。
这一步在算什么:
点「走一步」之后这里会显示算式
为什么不能直接一步跨到最低点

因为算出来的坡度只是脚下这一点的坡度,它只在很小的范围内可信。就像你站在山坡上,能看清脚边的坡度,但看不见远处的地形。一次跨太远,很可能踩到一个坡度完全不同的地方,反而越走越高。这就是下一节要看的现象。

真实的模型面对的地形远比这个碗复杂,所以「小步试探、反复修正」几乎是唯一可行的办法。

控制

已走步数0
当前误差—
位置 w—
位置 b—
04

步子迈多大才合适

这一节是真正要动手扫参数的

学习率是这个算法里唯一要人来定的数。定小了走不到,定大了会飞出去。这一节要做的事是:自己扫一遍学习率,把结果一个个点在右边那张图上,看它到底长什么形状。先手动试七八个值,试出感觉了再用自动扫描对照。

这一次的轨迹
每点一次「跑 40 步」,就在这里画一次轨迹,同时在右图落一个点。
学习率 → 最终误差
横轴是学习率(对数刻度,每往右一格乘十倍),纵轴是跑完 40 步之后剩下的误差。绿线是理论上能达到的最小误差。
要找的三个东西:

一、一个太小的学习率,40 步之后还离底很远。

二、一个正好的,几步就到底。

三、一个刚好开始发散的临界值。把它精确到小数点后两位,这个数要写进实验报告。

怎么少试几次就把临界值卡出来

一个一个往上加太慢。用二分法:先找一个肯定能到底的值(比如 0.5)和一个肯定发散的值(比如 2.0),取它们的中点 1.25 试一次。

如果 1.25 发散,说明临界值在 0.5 和 1.25 之间,就把上界改成 1.25,再取中点 0.875 试。如果 0.875 能到底,就把下界改成 0.875,再取中点。

每试一次,可能的范围就缩小一半。从 1.5 的宽度缩到 0.01 只需要试七八次。这个办法在任何「单调分界」的问题上都能用,比逐个试省力得多。

为什么太大会飞出去

假设你在碗的左壁上,坡度指向右下。步子小的时候,你落在碗底偏左的位置,下一步再往右一点,慢慢收敛。

步子一大,你会直接越过碗底冲到右壁,而且落点比原来的左壁更高。下一步从右壁往左冲,又比刚才更高。每一次都比上一次更远,误差就这样滚雪球式地放大,几步之后数值大到算不下去。

这个临界值不是随便定的,它由碗的陡峭程度决定。碗越陡(数据的尺度越大),能用的学习率就越小。这也是为什么真实项目里几乎总要先把数据标准化,把碗的形状调圆一点,学习率才好定。

扫描

你的实验记录
学习率最终误差结果
还没有记录
05

每走一步,要先看几条数据

这一节的结论有点反直觉

前面每走一步,都是把全部 100 条数据的坡度算出来求平均,这叫全批量。也可以只随机抽几条来算,抽到的这几条不一定代表全体,方向会有偏差,但算得快得多,这叫小批量。到底哪个划算?

两条轨迹
蓝色是全批量,赭色是小批量。赭色那条明显在抖,因为每一步的方向都只是几条数据的意见。
按更新次数比
横轴是走了几步。按这个尺度看,小批量走的步数多得多。
这里有个陷阱。

按「走了几步」来比是不公平的。全批量走一步要算全部 100 条数据的坡度,小批量走一步只算几条。同样的计算资源,小批量能走多得多的步数。

切换到按计算量比那一档再看一次,两条曲线的相对位置会变。这才是工程上真正关心的比较方式。

把批量拉到 1 看看

批量拉到最左边,就是每看一条数据就走一步。这时候方向几乎是乱的,轨迹会抖成一团毛线。但它照样能大致走到底,因为虽然每一步都不准,几百步的平均方向还是对的。

再把批量拉到 100,赭色的轨迹会和蓝色完全重合,因为这时小批量就是全批量。中间那一段(大概 4 到 30)是实际最常用的区间。

顺手在右图里对比一下:批量 1 的曲线在「按更新次数」这一档看起来很差,在「按计算量」这一档往往反而最靠左。

抖动为什么反而不全是坏事

在这个实验里误差面是个碗,只有一个底,抖动纯属浪费。但真实的模型误差面坑坑洼洼,有很多局部的小坑。走得太平稳的算法一掉进小坑就出不来了,而带抖动的算法有机会被自己的随机性甩出小坑,继续往下找。

所以实际训练几乎不用全批量。常见的批量大小是 32、64、128 这些数,既保留了一点随机性,又能让显卡一次算一批,不浪费算力。

下一个实验里那个香蕉形的函数,就会让你看到「走不出去」是什么样子。

对比设置

全批量 更新次数—
小批量 更新次数—
全批量 最终误差—
小批量 最终误差—
不同批量的表现(按计算量算到底所需的代价)
批量更新次数总计算量
跑几个不同的批量,这里会记下来
06

换一批数据,最低点还在原地吗

这一节最值得想清楚

前面所有的图都建立在同一批 100 条数据上。可这 100 条只是从现实世界里抽出来的一个样本,换一批数据,误差面就会变形,最低点也会挪位置。这一节要看的是:我们辛辛苦苦走到的那个最低点,到底是真的最优,还是只是这批数据的最优。

当前这批数据
每点一次「换一批数据」,就重新抽一批样本。灰点会变,误差面也跟着变形。
历次最优点落在哪
每换一批数据,就在这里落一个点。十字是真值 w=2、b=1,红点是最新一次。坐标范围会自动缩放来框住这团点,所以要看轴上的数字,别只看点的疏密。
把两个滑块拉到两个极端各试十次:

样本量拉到 20、噪声拉到 1.5,连点十次换数据,看那团点散成什么样。

再把样本量拉到 400、噪声拉到 0.1,重新清空后连点十次。两团点的大小差别非常明显。

这就是课件第 2 章第 11 页那两个词。

我们能算的只有经验风险,也就是在手上这批数据上的平均误差。真正想让它小的是期望风险,也就是在全世界所有数据上的平均误差。

右图那团点的中心接近真值,说明方法本身没错。那团点的散开程度,就是「只用一个样本去估计真相」这件事本身带来的不确定性。数据越多、噪声越小,这团点就越紧。

这件事在实际项目里意味着什么

第一,训练误差降到很低不代表模型好,只代表它在这批数据上表现好。所以必须留一部分数据出来,专门用来检验,这就是第 7 章会讲的训练集与测试集划分。

第二,如果换一批数据模型参数就大变,说明数据量相对于模型的复杂度太少了。要么补数据,要么把模型改简单,要么加约束限制参数乱跑。课件第 2 章第五节的正则化就是干这件事的。

数据设置

这批数据的最优 w—
这批数据的最优 b—
已换过几批0
这团点的散布—
散布指历次最优点到真值 (2, 1) 的平均距离。这个数越小,说明用这批数据估出来的参数越可靠。
07

实验报告

填完点最下面的按钮

下面的题目都没有标准答案,写你自己看到的现象和想到的解释。前面各节做过的操作会自动汇总进报告,不用手抄数据。

一第 01 节里你手动调参数,最好的成绩离最优值差多少?手调的时候你是按什么思路找的?
二第 02 节里你点出的那些箭头,方向上有什么规律?为什么箭头不是直直指向最低点?
三第 04 节里,太小、正好、刚好发散这三个学习率各是多少?你扫出来的那条曲线是什么形状?
把临界值精确到小数点后两位
四第 05 节里,按更新次数比和按计算量比,结论有没有变?如果让你给一个真实项目选批量大小,你会怎么选?
五第 06 节里那团点,在样本量少、噪声大的时候散成什么样?这件事说明「在训练数据上误差很小」这句话有什么问题?
总结学习总结
这一节课你原来以为是怎么回事,做完之后发现其实是怎么回事?哪一步让你觉得意外?还有什么没弄明白的地方?建议写两百字以上。
0 字
会打开打印窗口,选「另存为 PDF」即可
人 工 智 能 导 论 上 机 实 验 报 告

走下山坡:梯度下降的行为观察

第 2 章 人工智能数学基础 · 实验一
姓名—
学号—
班级—
完成日期—

一实验数据记录

手调最好误差
—
数学最优误差
—
查看过的坡度点
—
单步下降试验
—
批量对比试验
—
换过的数据批次
—

二学习率扫描结果

学习率40 步后误差判定
未记录

三批量大小对比结果

批量更新次数总计算量
未记录

四思考题

一、手动调参的最好成绩与思路
二、梯度箭头的方向规律
三、三个学习率与扫描曲线的形状
四、两种比较方式下的结论与选型
五、最优点的漂移说明了什么

五学习总结

指导教师签字  
成绩