损失、泛化与正则化
训练只能在手头的数据上把损失压低,机器人要的却是在没见过的情况里也做对。损失函数决定你惩罚什么(它其实是对噪声的一个假设),泛化问的是训练集上的好成绩能不能带到新数据上,正则化则是防止灵活的模型把训练数据连同噪声一起背下来的各种办法。本节在浏览器里现场训练小网络:看它过拟合、早停、被 L2、dropout 和数据增广拉回来,再看偏差与方差、L1 与 L2、双下降,以及机器人最大的泛化难题:部署时的数据分布与训练时不同。
1为什么机器人需要它
机器人越来越多的部件是从数据里学出来的:关节摩擦的补偿模型、“这次抓取会不会成功”的预测器、从人类示教学来的整套策略。16.1 节用最大似然拟合了回归和分类模型,并在留出的测试集上打分。训练时我们最小化的是训练集上的平均损失,可我们真正在乎的是机器人明天遇到的情况:新的物体、新的光照、新的速度。两者之差就是泛化问题。
有三件事决定泛化好不好。第一,损失函数:平方误差、L1、Huber 和交叉熵各自隐含着对噪声的不同假设,遇到传感器野值或类别标签时表现完全不同。第二,容量与正则化:一个参数比数据点多得多的网络能把训练误差压到几乎为零,包括把噪声也背下来;验证集、早停、L2、dropout、数据增广是防止这件事的工具。第三,对机器人最要命的是分布偏移:机器人自己的动作会改变它接下来看到的东西,部署时的输入分布和训练时不同,而模型在训练分布之外几乎没有任何保证(22.1 节的模仿学习会把这个问题放大成误差累积)。
2直觉:损失函数是对噪声的一个假设
4.6 节已经推出:如果测量噪声是高斯的,最大似然就是最小化平方误差;如果是拉普拉斯的(尾巴更厚),就是最小化绝对误差,估计值从均值变成中位数。换句话说,选损失就是选噪声模型。对拟合过程更直观的看法是每个数据点对拟合施加的“拉力”:损失 \(\hl{rho}{\rho(r)}\) 对残差 \(r\) 的导数 \(\hl{psi}{\psi(r)=\rho'(r)}\) 叫影响函数。平方损失的拉力与残差成正比,一个离谱的点拉力最大;L1 的拉力恒为 ±1,与残差大小无关;Huber 损失在 \(|r|\le\delta\) 时是平方、之外是线性,拉力被截在 ±δ。
下图是一个力传感器的标定:横轴是加的载荷,纵轴是读数,10 个点基本在一条直线上,外加一个可以拖动的点。把它拖成一个“野值”(比如接触瞬间的冲击读数),看三条拟合直线各被拉走多少。
- 把琥珀色圈往下拖,直到它离青色干净直线至少 1 V(读数第一行),Huber 阈值保持 δ ≤ 0.25:红色平方损失直线被拉走的距离是绿色 Huber 和紫色 L1 的 2.5 倍以上。
在默认位置 \(x=0.7\),把这个点拖到离干净直线 1.5 V 时,平方拟合偏离 0.18 V,Huber(δ = 0.2)只偏离 0.03 V,L1 偏离 0.04 V;再往下拖,平方拟合继续跟着走(2.0 V 时 0.24 V),而 Huber 和 L1 几乎不再动:它们对这个点的拉力已经封顶了。代价是什么?把 δ 拉到 2,Huber 在这个范围内就退化成平方损失;而即使琥珀色圈就在直线上,L1 也和干净拟合差 0.02 V,因为它估计的是条件中位数而不是均值,在噪声真是高斯时浪费了一些数据。Huber 的阈值通常取噪声标准差的 1 到 2 倍左右(经典取法是 1.345σ,在高斯噪声下保留 95% 的效率),这里噪声 σ = 0.07 V,默认 δ = 0.2 V 约为 3σ。
分类:为什么用交叉熵而不是平方误差
分类器输出一个 logit \(z\),经过 sigmoid 得到概率 \(\sigma(z)\)(多类时是 softmax,16.1 节)。最大似然给出交叉熵 \(\hl{ce}{-\log\sigma(z)}\)(真实标签 \(y=1\) 时)。你也可以图省事,对概率用平方误差 \(\hl{sqp}{(\sigma(z)-y)^2}\),两者的最小值都在 \(\sigma(z)=1\)。区别在于模型错得很自信时:比如 \(z=-6\),模型以 99.75% 的把握说“不会成功”而实际成功了。交叉熵对 \(z\) 的梯度是 \(\sigma(z)-y\approx-1\),推力最大;平方误差的梯度多了一个因子 \(\sigma(z)(1-\sigma(z))\approx0.0025\),几乎推不动:sigmoid 在饱和区是平的,平方误差把这种平坦原样传给了梯度,交叉熵的对数恰好把它抵消掉。
- 把初始 logit 设到 −5 或更低(模型自信地错了),ε = 0,按“训练”:交叉熵不到 10 步就越过 0.5,平方误差至少要多 10 倍的步数(−5 时 85 步,−6 时 214 步)。
- 选标签平滑 ε = 0.1 或 0.2 并训练至少 150 步:交叉熵的 logit 停在有限的 \(z^\ast\)(ε = 0.1 时为 2.944),不再无限增大;对比 ε = 0 时 400 步后 \(z\) 仍在缓慢上涨。
第二个任务揭示了交叉熵的另一面:对于可分的数据,它的最小值在 \(z\to\infty\),模型会被一直推向“100% 确定”,权重越来越大。标签平滑(label smoothing)把目标从 1 改成 \(1-\varepsilon+\varepsilon/K\)(\(K\) 类,图里 \(K=2\),即 \(1-\varepsilon/2\)),最优 logit 就成了有限值 \(z^\ast=\log\frac{1-\varepsilon/2}{\varepsilon/2}\)。这是一种正则化:它阻止模型过度自信,对标注噪声也更宽容;代价是预测概率被系统性地压低,需要校准好的概率时要小心。
选损失要回答两个问题:噪声长什么样(高斯 → 平方,有野值 → Huber 或 L1,类别 → 交叉熵),以及梯度在哪里还有力气(平方误差加 sigmoid 在饱和区没有梯度,交叉熵有)。下面三节转向第二件事:损失再合适,模型也可能把训练数据背下来。
3动手:看一个网络过拟合,再把它拉回来
一个直观的比喻:学生拿到去年的考卷和答案。背答案,去年的卷子能考满分,换一套题就不行;理解了方法,两套卷子都考得好。训练集就是去年的卷子,验证集是你自己留出来、训练时从不用于更新参数的另一套题,测试集是最后才打开一次的真正考试。16.1 节已经引入了训练/测试的划分;这里多出的验证集用来做所有“选择”:训练多久、正则化多强、用哪个模型。测试集只能用来报告最终结果,一旦你根据它做了选择,它就不再是公正的估计。
下图在你的浏览器里现场训练一个两层隐藏层、每层 32 个 tanh 单元的网络(1153 个参数),去拟合一个关节的摩擦力矩随速度变化的曲线(库仑摩擦 + 低速的 Stribeck 峰 + 粘性摩擦),只有 12 个带噪声(σ = 0.15 N·m)的测量点。用 Adam(学习率 0.01),每一步用全部训练点(多于 16 个时随机取 16 个)。
- 默认设置(12 个点、不加任何正则化)下按“训练”:验证损失在第 285 步左右最低(约 0.025,接近噪声水平),之后回升,到第 1200 步左右超过最低值的 1.5 倍;训练损失则一路降到 \(10^{-5}\) 以下。
- 仍用 12 个点,只把 L2 系数设为 \(\lambda\ge 3\times10^{-4}\),训练到第 3000 步以后:读数里“最近 1000 步平均 / 最低”低于 1.4(λ = 3×10⁻⁴ 时约 1.16,λ = 10⁻³ 时约 1.08),不加正则化时这个数约是 2.5。
- 去掉所有正则化,把训练点数加到 48 个以上,训练到第 3000 步以后:同一个 1153 参数的网络不再明显过拟合,“最近 1000 步平均 / 最低”低于 1.4。
注意默认运行里发生的事:到第 2000 步,训练损失只有约 \(2\times10^{-5}\),网络几乎精确地穿过了每一个训练点,包括它们的噪声;琥珀色曲线在点与点之间剧烈弯曲。验证损失约 0.066,是最低时的 2.6 倍;用真实函数衡量,当前网络的误差(约 0.03)是早停点(约 0.004)的 7 倍左右。这就是过拟合:训练误差和真实误差之间的差距(泛化差距)在扩大。
几种补救方法的效果(同样 12 个点,训练 5000 步,看第 4000 到 5000 步验证损失的平均值除以其最低值):不加正则化 2.4;L2 系数 \(10^{-4}\) 只是推迟了过拟合(第 3000 步时 1.3,第 5000 步时 2.4),\(3\times10^{-4}\)、\(10^{-3}\) 分别为 1.17、1.08;dropout p = 0.1 或 0.2 约 1.3;输入抖动 0.05 或 0.1(每一步给训练输入加一点高斯噪声,这是 1 维输入上最简单的数据增广)约 1.3;训练点加到 48 个约 1.3,96 个约 1.16。带随机性的方法(dropout、抖动、多于 16 个点时的小批量)会让验证损失一直小幅抖动,所以读数里同时给出“现在”和“最近 1000 步平均”。早停是最便宜的一种:按“早停:恢复最佳权重”,就得到绿色虚线那个网络。
(1) 验证损失的最低值(约 0.025)贴近噪声水平 0.0225:这个模型能做到的最好,就是只剩下不可约的测量噪声。(2) 过拟合不是因为“训练太久”本身,而是参数太多、数据太少、又没有约束;同样训练 5000 步,96 个点就几乎不过拟合。(3) 一个运行的数字依赖于随机种子:按“换一组数据”试几次,最低点可能在 100 到 450 步之间,但“训练一路降、验证先降后升”的形状每次都在。
4另一个视角:偏差、方差与交叉验证
为什么模型越灵活越容易过拟合?设想你可以从同一个分布里抽出很多个不同的训练集,每个都拟合一次。偏差是这些拟合的平均离真实函数有多远:模型太僵硬(比如用直线拟合 S 形曲线),平均下来也是错的。方差是这些拟合彼此差多少:模型太灵活,就会跟着每个训练集特有的噪声走,换一组数据就换一个样子。平方误差恰好能分解成三部分:
左边是期望测试误差,期望是对“抽一个训练集”(以及新样本的噪声)取的;右边第一项是测量噪声(不可约),第二项是偏差的平方,第三项是方差(推导见第 7 节)。下图用多项式回归把它们算出来:多项式的次数就是“容量”旋钮。它是线性最小二乘,有闭式解,所以可以一次对 40 个训练集各拟合一遍。
- λ = 0 时把次数拉到 9 或更高:方差超过偏差²的 5 倍,紫线在两端乱甩,而训练误差还在继续下降。
- 保持次数 ≥ 9,把岭系数 λ 往右拉:找到一个 λ,让期望测试误差低于“不加正则化时所有次数里最好的那个”(λ = 0 时次数 5,0.053)。
λ = 0 时曲线是教科书式的 U 形:次数 0 和 1 偏差很大(直线拟合不了摩擦在零速附近的跳变),次数 5 的期望测试误差最低(0.053),次数 9 时方差已有 0.40,是偏差²(0.025)的十几倍,次数 12 时测试误差超过 20。第二个任务的结论更重要:一个灵活的模型加上合适的正则化,胜过最好的小模型;次数 9 到 12 加上 λ = 0.01,测试误差约 0.042 到 0.045。这正是深度学习的常态:用比需要更大的网络,再用正则化和足够的数据把方差压下去。
交叉验证是现实里估计测试误差的办法,因为你只有一个数据集,不能抽 40 个。\(k\) 折交叉验证把数据分成 \(k\) 份,轮流用 \(k-1\) 份训练、剩下 1 份评估,再取平均(第 7 节)。紫色虚线就是它:它比真正的测试误差噪声大得多,但大致跟着 U 形走;在数据集 #1 上它选了次数 3,测试误差 0.058,离最好的 0.053 不远。按“换一个数据集做 CV”看它怎样随数据抖动。
5正则化:L2 让参数变小,L1 让参数变成零
正则化就是在训练损失后面加一项惩罚 \(\lambda\,\Omega(\boldsymbol\theta)\)。4.6 节说过它就是一个先验:\(\hl{pen}{\Omega=\|\boldsymbol\theta\|_2^2}\)(L2,岭回归,权重衰减)对应高斯先验,\(\Omega=\|\boldsymbol\theta\|_1\)(L1,lasso)对应拉普拉斯先验。两者都让参数变小,但方式完全不同。几何上看,带惩罚的最小化等价于“在一个范数球里找损失最低的点”(λ 越大,球越小):L2 的球是圆的,损失的等高椭圆一般在某个没有坐标为零的地方碰到它;L1 的球是一个菱形,有尖角在坐标轴上,椭圆往往先碰到尖角,于是某些坐标恰好等于零。
- 选“L1”,调 λ 让右图里非零的系数恰好是第 1、3、6 个:lasso 自己挑出了真正有用的特征(λ 在 0.14 到 0.40 之间都可以)。再切到“L2”看:没有一个系数会变成零。
其他正则化手段
深度学习里显式的 L1/L2 只是一部分,更常见的是下面这些,FIG 3 里试过其中三种:
- 权重衰减:每步把权重乘以略小于 1 的数。对普通 SGD 这与 L2 惩罚等价,对 Adam 不等价(第 7 节),所以现在通常用 AdamW 的“解耦”权重衰减。
- 早停:用验证集挑训练得最好的那一刻。对二次损失上的梯度下降,训练 \(t\) 步大致等价于 \(\lambda\approx1/(\eta t)\) 的 L2(第 7 节):训练时间本身就是一个正则化旋钮。
- Dropout:训练时每个隐藏单元以概率 \(p\) 被随机置零,留下的乘以 \(1/(1-p)\);测试时全部保留。网络不能依赖任何单个单元,相当于训练了大量共享权重的子网络的集成。
- 数据增广:对输入做不改变标签的变换,制造“免费”的新样本。对机器人图像是随机裁剪、平移、颜色抖动;对 1 维输入就是 FIG 3 的输入抖动,训练时加小噪声在一定条件下等价于一种平滑正则(Tikhonov 正则化,Bishop 1995)。增广编码了你对不变性的先验知识,常常是最有效的一种。
- 标签平滑:FIG 2,限制分类器的自信程度。
- SGD 的噪声:6.4 节的小批量噪声本身也有正则化作用,这也是极大批量训练常常泛化更差、需要重新调学习率的原因之一。
6再多一点参数:双下降
按照 U 形曲线,参数远多于数据的现代网络应该过拟合得一塌糊涂,可它们常常泛化得很好。一个可以完全看清楚的例子:用 \(p\) 个随机 ReLU 特征 \(\phi_j(x)=\max(0,s_j(x-t_j))\)(随机的拐点 \(t_j\) 和方向 \(s_j\))做线性回归,只学最后一层权重。\(p<n\) 时用最小二乘;\(p>n\) 时有无穷多组权重能精确穿过所有训练点,我们取其中范数最小的那一组 \(\hl{minnorm}{\mathbf w=\Phi^{+}\mathbf y}\)(1.13 节的伪逆)。测试误差随 \(p\) 先降、在 \(\hl{thresh}{p\approx n}\) 处冲上一个尖峰、然后再次下降,这叫双下降。
- λ = 0:先把 \(p\) 拉到 15 到 17 之间,看平均误差冲到上千(左图的拟合在点之间剧烈震荡);再拉到 \(p\ge100\):平均误差回落到绿色虚线以下,比经典区里最好的还低。最后试试 λ = 10⁻⁵:尖峰消失。
数字:经典区(\(p<n\))里平均误差最低约 0.054(\(p=6\));\(p=15\) 时平均误差约 8600,\(p\ge100\) 时回落到 0.017 到 0.019。看紫色小点就会发现,平均值的巨大尖峰几乎全来自 20 次抽样中的一次(它在 \(p=15\) 时误差约 \(10^5\));中位数(典型的一次抽样)也有一个温和得多的鼓包:从 \(p=8\) 时的 0.027 升到 \(p=12\) 到 13 时的 0.08,再降到 \(p\ge100\) 时的 0.013,不到它在经典区最好值的一半。为什么会有尖峰?\(p\approx n\) 时特征矩阵 \(\Phi\) 接近方阵,它的最小奇异值可能很小,为了精确穿过每一个带噪声的点,权重必须非常大(方差随 \(\sum 1/s_i^2\) 增长,第 7 节);\(p\) 再大,能穿过所有点的解有很多,最小范数的那个最“平缓”,方差反而下降。一点点岭正则化(λ = 10⁻⁵)就把尖峰抹平,这是实践中很少看到尖峰的一个原因:几乎总有某种显式或隐式的正则化。深度网络里也观察到了随模型大小、甚至随训练轮数出现的双下降(Nakkiran 等,2020)。本节只点到为止;它说明“参数个数”并不是衡量容量的好指标,有效容量还取决于优化器隐式偏好的那类解。
7再看数学
提示:把鼠标悬停在公式中带底色的符号上,图中对应的元素会被高亮(损失与影响函数曲线、交叉熵与平方误差曲线、最优 logit、训练与验证曲线、偏差/方差/噪声曲线、范数球、最小范数曲线与插值阈值、测试分布)。
风险、经验风险与泛化差距
模型 \(f_{\boldsymbol\theta}\),逐样本损失 \(\ell(\hat y,y)\),数据来自分布 \(p(x,y)\)。我们想要小的风险(期望损失),手里却只有 \(n\) 个样本上的经验风险:
对固定的 \(\boldsymbol\theta\),\(\hat R\) 是 \(R\) 的无偏估计;但 \(\hat{\boldsymbol\theta}\) 是用同一批数据挑出来的,挑选过程偏向那些恰好在这批数据上表现好的参数,所以 \(\hat R(\hat{\boldsymbol\theta})\) 系统性地偏低,泛化差距 \(\Delta\) 为正。验证集上的损失 \(\hl{val}{\hat R_{\mathrm{val}}}\) 用的是没参与挑选的数据,因此是 \(R\) 的公正估计;可一旦你用它来挑选(早停、调 λ),它也会开始偏低,只是偏得少得多,这就是还要留一个测试集的原因。
损失 = 负对数似然
| 损失 \(\rho(r)\),\(r=\hat y-y\) | 影响 \(\psi=\rho'\) | 噪声模型 \(p(r)\propto e^{-\rho(r)}\) | 估计的是 |
|---|---|---|---|
| 平方 \(\tfrac12 r^2\)(MSE) | \(r\) | 高斯 | 条件均值 |
| L1 \(|r|\) | \(\operatorname{sign} r\) | 拉普拉斯 | 条件中位数 |
| Huber \(\rho_\delta\) | \(\operatorname{clip}(r,-\delta,\delta)\) | 中间高斯、尾部拉普拉斯 | 介于两者之间 |
右边的最优条件说明了“拉力”的含义:每个点按 \(\psi(r_i)\) 对参数施力,所有力平衡时就是解。写成 \(\psi(r_i)=w_i r_i\),\(w_i=\psi(r_i)/r_i\),就是带权最小二乘的条件,交替更新权重和解就是 FIG 1 用的 IRLS(6.9 节)。平方损失前面的 \(\tfrac12\) 和 MSE 的 \(\tfrac1n\) 只改变尺度,不改变最小值点。
分类。\(K\) 类,logit \(\mathbf z\),概率 \(\mathbf p=\operatorname{softmax}(\mathbf z)\),目标分布 \(\mathbf y\)(one-hot 或平滑后的)。交叉熵与它的梯度(4.11 节的交叉熵,16.1 节的 softmax):
交叉熵的梯度就是“预测减目标”,在完全错误时大小接近 1;平方误差多出的 \(\sigma(1-\sigma)\) 在饱和区趋于 0,这就是 FIG 2 里 85 步对 6 步的来源。标签平滑:\(\mathbf y_\varepsilon=(1-\varepsilon)\mathbf e_c+\varepsilon\mathbf 1/K\)。梯度 \(\mathbf p-\mathbf y_\varepsilon=0\) 在 \(\mathbf p=\mathbf y_\varepsilon\) 处成立,即正确类与其他类的 logit 之差为
偏差–方差分解的推导
固定一个输入 \(x\)。\(y=f(x)+\epsilon\),噪声 \(\mathbb E\epsilon=0\)、\(\operatorname{Var}\epsilon=\sigma^2\),且与训练集无关;\(\hat f\) 依赖于随机的训练集,记 \(\bar f=\mathbb E[\hat f(x)]\)。把 \(y-\hat f\) 拆成三段 \(\epsilon+(f-\bar f)+(\bar f-\hat f)\) 再平方取期望,三个交叉项都为零(\(\epsilon\) 均值为零且与 \(\hat f\) 独立;\(f-\bar f\) 是常数而 \(\mathbb E[\bar f-\hat f]=0\)),于是剩下
FIG 4 把它在 81 个均匀分布的 \(x\) 上平均,期望用 40 个训练集的平均近似。分解只对平方损失这么干净;对 0-1 损失或交叉熵有类似但不可加的版本。\(k\) 折交叉验证把索引分成 \(k\) 组 \(I_1,\dots,I_k\),\(\hat f^{(-j)}\) 是不用第 \(j\) 组训练出的模型:
L2 与 L1 的解
对线性最小二乘 \(\frac1{2n}\|X\mathbf w-\mathbf y\|^2\),记 \(A=X^\top X/n\)、\(\hat{\mathbf w}\) 为无正则化的解,则损失等于 \(\tfrac12(\mathbf w-\hat{\mathbf w})^\top A(\mathbf w-\hat{\mathbf w})\) 加常数(FIG 5 用的就是这个形式)。加上 \(\tfrac\lambda2\|\mathbf w\|_2^2\),令梯度为零:
L2 把每个特征方向按 \(d_i/(d_i+\lambda)\) 收缩:数据约束强的方向(大 \(d_i\))几乎不动,数据几乎不约束的方向(小 \(d_i\),方差的主要来源)被压向零,但永远不会恰好为零。L1 不可导,用次梯度:在 \(A\) 为对角阵(特征正交)时问题按坐标分开,每个坐标的最优条件 \(d_i(w_i-\hat w_i)+\lambda\,\partial|w_i|\ni0\) 给出软阈值
只要 \(|\hat w_i|\le\lambda/d_i\),解就精确为零:这就是稀疏性的代数来源,对应几何上的菱形尖角。特征相关时没有闭式解,FIG 5 用坐标下降:反复对每个坐标做上面这个软阈值,其他坐标暂时固定。lasso 的已知弱点也在这里:一组高度相关的有用特征,它往往只留一个、随意丢掉其余的。
早停、权重衰减与优化器
对上面的二次损失从 \(\mathbf w=0\) 出发做梯度下降(学习率 \(\eta\)),沿第 \(i\) 个特征方向第 \(t\) 步的分量是 \(\big(1-(1-\eta d_i)^t\big)\,\hat w_i\)。与 L2 的 \(d_i/(d_i+\lambda)\) 比较:两者都让大 \(d_i\) 方向先学到、小 \(d_i\) 方向被抑制;当 \(\eta d_i\ll1\) 时,\(t\) 步的早停大致相当于 \(\lambda\approx1/(\eta t)\)(Goodfellow 等《深度学习》7.8 节)。所以 FIG 3 里验证损失先降后升,是因为网络先学到了数据支持强的平滑部分,后学到的是被噪声主导的方向。
权重衰减 ≠ L2(对 Adam)。L2 惩罚把 \(2\lambda\boldsymbol\theta\) 加进梯度;SGD 的一步 \(\boldsymbol\theta\leftarrow\boldsymbol\theta-\eta(\mathbf g+2\lambda\boldsymbol\theta)=(1-2\eta\lambda)\boldsymbol\theta-\eta\mathbf g\) 正好就是“先衰减再走一步”。Adam 却会把整个梯度除以它的二阶矩估计(6.3、6.4 节),于是 \(2\lambda\boldsymbol\theta\) 这一项也被逐坐标缩放,梯度大的参数几乎不被衰减。AdamW(Loshchilov & Hutter, 2019)把衰减从梯度里拿出来单独做:\(\boldsymbol\theta\leftarrow\boldsymbol\theta-\eta\,(\mathbf u_t+\lambda\boldsymbol\theta)\),其中 \(\mathbf u_t\) 是 Adam 本来要走的那一步(只由数据损失的梯度算出)。FIG 3 用的是写进损失的 L2 惩罚(加在梯度里,再交给 Adam),这在我们这里也足够有效。
Dropout:训练时隐藏单元输出 \(h_j\) 换成 \(m_j h_j/(1-p)\),\(m_j\sim\mathrm{Bernoulli}(1-p)\),于是 \(\mathbb E[m_jh_j/(1-p)]=h_j\),测试时直接用 \(h_j\),期望不变(“inverted dropout”)。
最小范数解与双下降
\(\Phi\in\R^{n\times p}\) 的奇异值分解 \(\Phi=\sum_i s_i\mathbf u_i\mathbf v_i^\top\)。\(p\ge n\) 且满秩时,所有插值解中范数最小的是 \(\mathbf w=\Phi^+\mathbf y=\sum_i \frac{\mathbf u_i^\top\mathbf y}{s_i}\mathbf v_i\)(1.13 节)。观测噪声 \(\boldsymbol\epsilon\) 通过 \(1/s_i\) 被放大,噪声在权重上造成的方差是 \(\sigma^2\sum_i 1/s_i^2\);\(p\) 刚好等于 \(n\) 附近时最小的 \(s_i\) 最接近零,所以出现尖峰。加岭正则把 \(1/s_i\) 换成 \(s_i/(s_i^2+n\lambda)\),上限是 \(1/(2\sqrt{n\lambda})\),尖峰随之消失。
分布偏移
上面所有的保证都假设训练数据和测试数据来自同一个分布。协变量偏移是最常见的破坏方式(下标 tr 表示训练,te 表示测试):\(p(y\mid x)\) 不变(物理规律没变),但输入的分布从 \(p_{\mathrm{tr}}(x)\) 变成了 \(\hl{shift}{p_{\mathrm{te}}(x)}\)(机器人去了没去过的状态)。测试风险可以改写成训练分布上的加权期望:
这就是重要性加权(Shimodaira, 2000),前提是 \(p_{\mathrm{tr}}(x)>0\) 处处覆盖 \(p_{\mathrm{te}}\)。如果测试分布落在训练分布完全没有覆盖的地方,权重是无穷大,任何重新加权都救不了:模型在那里的预测只取决于它的结构偏好(外推),数据不提供任何约束。下一节就是这种情形。
8机器人中的它:分布偏移是头号泛化问题
一台机械臂要学一个关节的重力补偿力矩 \(\tau_g(q)=2\sin q\)(N·m)。采数据时为了安全,只在 \(|q|\le0.8\) rad 的小范围里动,得到 40 个带噪声(0.05 N·m)的点;在这个范围里 \(\sin q\) 几乎是一条直线。训练 5 个初值不同的网络(深度集成,各训练 800 步),然后让机器人去 \(q\approx2\) rad 的位置工作。拖动下方红色的测试分布,看误差和集成的分歧怎样变化。
- 训练完成后,把测试分布移到 \(|\mu|\ge1.5\) rad:均方误差变成训练分布内(μ = 0)的 100 倍以上(μ = 2 时约 4000 倍)。看一眼读数:集成标准差只涨到约 0.05 N·m,而实际误差的均方根约 0.7 N·m。
- 在 \(|\mu|\ge2\) 处按“在测试分布处采 10 个新点并继续训练”,等训练结束(μ 不要移动超过 0.3):那里的均方误差降到采集前的 1/20 以下。
三点观察。(1) 在训练范围里,5 个网络的误差都很小(μ = 0 时均方误差约 \(10^{-4}\)),在范围之外它们各自“合理地”外推,可数据完全不约束这种外推,μ = 2 时均方误差约 0.5,μ = 3 时约 6。(2) 集成的分歧确实随偏移增大(标准差从不到 0.001 增到 μ = 2 时约 0.05),可以当作“我到了没见过的地方”的报警信号(21.3 节),但它严重低估了真实误差:5 个网络犯了相似的错误。(3) 唯一真正有效的办法是到那里去采数据。机器人领域有一整套方法都是这个思路:DAgger 让策略自己跑、在它到达的状态上请专家标注(22.1 节);域随机化在仿真里把训练分布撑得足够宽,让真实世界落在里面(23.2 节)。
鲁棒损失:DQN(Mnih 等,Nature 2015)把 TD 误差截断在 [−1, 1],等价于 Huber 损失;Fast R-CNN(Girshick, 2015)用 smooth L1 回归检测框;ACT(Zhao 等,RSS 2023,22.2 节)用 L1 而不是 L2 作为动作的重建损失。 模仿学习里的 MSE:示教在同一个状态下可能有两种做法(从左绕或从右绕),MSE 学到的是它们的平均,可能直接撞上障碍;这就是 ACT、Diffusion Policy 等生成式策略存在的原因(22.1、22.2 节)。 数据增广:从像素学习的强化学习中,随机平移/裁剪一类的增广带来了很大提升(RAD:Laskin 等,2020;DrQ:Kostrikov 等,2020),视觉运动策略普遍使用随机裁剪和颜色抖动。 验证损失与真实成功率:robomimic(Mandlekar 等,CoRL 2021)的研究发现,按最低验证损失挑选的策略检查点并不可靠,需要在环境里实际评估;原因之一正是闭环执行时的分布偏移。 集成与不确定性:PETS(Chua 等,2018)用概率网络的集成学习动力学模型(24.2 节);深度集成(Lakshminarayanan 等,2017)是估计不确定性的常用基线(21.3 节)。 按轨迹划分数据:同一条示教轨迹里相邻的帧几乎一样,随机按帧划分训练/验证会让验证集“偷看”到训练数据,应按轨迹、场景或物体划分。
9常见误区
每用测试集做一次选择(挑模型、挑 λ、挑训练轮数),它就多一分乐观。调参只用验证集或交叉验证,测试集最后只看一次。机器人数据里泄漏更隐蔽:同一条轨迹的相邻帧、同一个物体的不同角度、同一个场景的不同时刻高度相关,随机按样本划分会让验证误差和训练误差一样漂亮,部署时却完全不是那么回事。按轨迹、物体或场景划分。
验证集仍然来自训练时的分布(比如人类示教的状态)。机器人闭环执行时,自己的小错误会把它带到示教里没有的状态(FIG 7、22.1 节),开环的逐样本损失看不到这一点。验证损失是必要的诊断,但策略要在真实或仿真环境里评估成功率,最好多次、多个随机种子。
MSE 假设高斯噪声、单峰的目标。传感器有野值时一个坏点就能拉偏整个模型(FIG 1);分类时它在饱和区没有梯度(FIG 2);目标有多个合理答案时它给出平均值,可能哪个都不是(避障时从左绕和从右绕的平均就是撞上去)。L1 给出中位数,同样只有一个答案;多峰的目标需要能表示分布的模型(第 19 章的生成模型、22.2 节)。
惩罚 \(\lambda\|\mathbf w\|^2\) 对所有系数一视同仁,但系数的大小取决于特征的单位:同一个关节速度用 rad/s 还是 deg/s 表示,系数相差 57 倍,被惩罚的程度也天差地别。加正则前先把每个特征减均值、除标准差;偏置(截距)一般不惩罚(FIG 4 也是这样做的)。在网络里,偏置和归一化层的参数通常也不做权重衰减。
两个实现层面的坑。(a) 在 Adam 里把 L2 惩罚加进梯度,效果和 SGD 里不同(第 7 节),想要权重衰减就用 AdamW,而且换优化器时 λ 要重新调。(b) dropout、数据增广和 BatchNorm 训练时与测试时行为不同;部署前忘了切到评估模式(PyTorch 的 model.eval()),预测会带随机噪声,机器人动作会抖。
10小练习
11延伸阅读
- T. Hastie, R. Tibshirani & J. Friedman, The Elements of Statistical Learning, 2nd ed., Springer, 2009, Ch. 3 and 7 — 岭回归与 lasso、偏差–方差、交叉验证的标准参考
- I. Goodfellow, Y. Bengio & A. Courville, Deep Learning, MIT Press, 2016, Ch. 5 and 7 — 深度学习里的正则化:权重衰减、早停与 L2 的关系、dropout、数据增广
- C. M. Bishop, Pattern Recognition and Machine Learning, Springer, 2006, Ch. 1 and 3 — 损失与概率模型、偏差–方差分解
- P. J. Huber, Robust Estimation of a Location Parameter, Annals of Mathematical Statistics, 1964 — Huber 损失的原始论文
- S. Geman, E. Bienenstock & R. Doursat, Neural Networks and the Bias/Variance Dilemma, Neural Computation, 1992 — 把偏差–方差带进神经网络的经典
- R. Tibshirani, Regression Shrinkage and Selection via the Lasso, Journal of the Royal Statistical Society B, 1996 — lasso
- N. Srivastava, G. Hinton, A. Krizhevsky, I. Sutskever & R. Salakhutdinov, Dropout: A Simple Way to Prevent Neural Networks from Overfitting, JMLR, 2014
- C. M. Bishop, Training with Noise is Equivalent to Tikhonov Regularization, Neural Computation, 1995 — 输入噪声与平滑正则的联系
- C. Szegedy, V. Vanhoucke, S. Ioffe, J. Shlens & Z. Wojna, Rethinking the Inception Architecture for Computer Vision, CVPR 2016 — 提出标签平滑
- I. Loshchilov & F. Hutter, Decoupled Weight Decay Regularization, ICLR 2019 — AdamW:为什么 Adam 里权重衰减不等于 L2
- C. Zhang, S. Bengio, M. Hardt, B. Recht & O. Vinyals, Understanding Deep Learning Requires Rethinking Generalization, ICLR 2017 — 网络能完美拟合随机标签
- M. Belkin, D. Hsu, S. Ma & S. Mandal, Reconciling Modern Machine-Learning Practice and the Classical Bias–Variance Trade-off, PNAS, 2019; P. Nakkiran et al., Deep Double Descent: Where Bigger Models and More Data Hurt, ICLR 2020 — 双下降
- H. Shimodaira, Improving Predictive Inference under Covariate Shift by Weighting the Log-Likelihood Function, Journal of Statistical Planning and Inference, 2000 — 协变量偏移与重要性加权
- B. Lakshminarayanan, A. Pritzel & C. Blundell, Simple and Scalable Predictive Uncertainty Estimation using Deep Ensembles, NeurIPS 2017 — FIG 7 用的深度集成
- A. Mandlekar et al., What Matters in Learning from Offline Human Demonstrations for Robot Manipulation, CoRL 2021 — robomimic:模仿学习的实际经验,包括检查点选择