Part V · 第 16 章 从数据中学习 · 16.1

回归与分类

监督学习只有两个基本问题:输出是一个连续的数(回归),还是若干类别之一(分类)。本节说明两者其实是同一个想法,即给数据写一个噪声模型,再做最大似然:高斯噪声给出最小二乘,伯努利与类别噪声给出交叉熵。我们在浏览器里现场训练一个预测抓取成败的逻辑回归、一个分辨地形的 softmax 分类器和一个 k 近邻分类器,最后用测试集、混淆矩阵、精确率与召回率判断它能不能上机器人。

约 45 分钟 前置:1.13 最小二乘与伪逆 · 4.6 最大似然与最大后验 · 4.11 信息论入门 · 6.3 梯度下降家族 6 个交互

    1为什么机器人需要它

    一台机械臂准备抓一个零件。它在动手之前就想知道:这次抓取会不会成功?它能测到的只有几个数,比如夹爪最大张开量比物体宽出多少毫米,夹爪方向和物体主轴偏了多少度。成败与这些数之间的关系没有现成的公式:摩擦、表面、物体重心都会影响结果。但机器人可以把过去几百次尝试记下来,每次记一行“特征 → 成败”,然后从这些数据里学出一个规则。

    这就是监督学习:给定数据 \(\{(\mathbf x_i,y_i)\}_{i=1}^n\),其中 \(\mathbf x_i\) 是输入(特征),\(y_i\) 是我们想预测的目标,找一个函数 \(\hat y=f_{\boldsymbol\theta}(\mathbf x)\) 让它在没见过的输入上也预测得准。目标 \(y\) 是连续数值时叫回归(关节摩擦力矩、电池剩余时间、物体距离);目标是若干类别之一时叫分类(抓取成/败、地面是沥青/碎石/草地、图像里是哪个物体)。Part VI 的模仿学习本质上也是监督学习:输入是观测,目标是专家的动作(22.1 节)。

    本节不需要神经网络。我们用最简单的模型(线性模型、逻辑回归、softmax、k 近邻)把监督学习的骨架讲清楚:模型 + 噪声假设 → 似然 → 损失 → 优化 → 在测试集上评估。后面的每一节(深度网络、扩散策略、强化学习里的价值网络)都只是把这里的“模型”换得更大,骨架不变。

    2直觉:拟合就是在问“这条线让数据有多可能”

    1.13 节把直线拟合当作几何问题:方程比未知数多,取让残差平方和最小的解。4.6 节从概率角度给了同一个答案的理由:如果测量 = 真值 + 高斯噪声,那么最大似然估计就是最小二乘。现在把两者放在一起,用到“拟合一个函数”上。假设数据来自下面的模型,各点的噪声 \(\varepsilon_i\) 相互独立、同分布:

    $$ y_i = a\,x_i + b + \varepsilon_i,\qquad \varepsilon_i\sim\mathcal N(0,\hl{sig}{\sigma^2})\quad\Longrightarrow\quad p(y_i\mid x_i) = \frac{1}{\sigma\sqrt{2\pi}}\exp\!\Big(-\frac{\hl{res}{(y_i-a x_i-b)}^2}{2\sigma^2}\Big). $$

    每一条候选直线都对应一个“生成数据的故事”:在每个 \(x_i\) 处,\(y\) 应该落在以直线为中心、宽度为 \(\sigma\) 的高斯钟形里。数据的似然是所有钟形在各自数据点处的高度之积;它越大,这条直线把数据解释得越好。取负对数,乘积变成求和,就得到负对数似然(NLL):残差平方和除以 \(2\sigma^2\),再加一个只与 \(\sigma\) 有关的常数。所以无论 \(\sigma\) 取多少,让 NLL 最小的直线就是最小二乘直线。下图里你可以亲手拖直线、拖数据点,看两者怎样一起变。

    FIG 1最小二乘 = 高斯噪声下的最大似然
    左:9 个蓝色数据点(可拖动),琥珀色直线是当前模型,红线是残差。每个数据点处画了一个青色的侧放钟形:以直线在该处的值为中心、标准差为 \(\sigma\) 的高斯密度,它在数据点高度处的“胖瘦”就是这个点的似然。“手动”模式下拖直线两端的圆圈调整直线;“最小二乘”模式下直线由正规方程直接解出。右:对当前直线,NLL 随 \(\sigma\) 变化的青色曲线,蓝点是滑块上的 \(\sigma\),琥珀色虚线标出残差的均方根(RMS)。数据由 \(y=0.5x+0.8\) 加 \(\sigma=0.7\) 的噪声生成。
    试一试
    • 在“手动”模式下拖直线的两个端点,把残差平方和压到最小二乘最小值的 1.15 倍以内(读数会显示两者的比)。
    • 切到“最小二乘”,再拖 \(\sigma\) 滑块:直线纹丝不动,只有 NLL 在变。把 \(\sigma\) 调到让 NLL 最小的位置(与 RMS 残差相差 0.02 以内)。

    默认数据下,最小二乘直线是 \(\hat y=0.54x+0.49\),残差平方和 2.04,RMS 残差 0.48;你在初始的水平线 \(y=0\) 处看到的残差平方和是 17.97。第二个任务揭示了一件事:\(\sigma\) 的最大似然估计恰好是 RMS 残差 \(\hat\sigma=\sqrt{\tfrac1n\sum r_i^2}\)(第 5 节推导)。它比生成数据用的 0.7 小,一部分是只有 9 个点的抽样波动,另一部分是系统性的:直线本身是照着这 9 个点拟合的,残差天然偏小,这正是 4.6 节说 \(\hat\sigma^2_{\mathrm{ML}}\) 偏小、常把分母换成 \(n-2\)(这里减去两个参数)的原因。

    “线性”指的是参数,不是输入

    直线太简单了。真实的关节摩擦力矩 \(\tau_f\) 和关节速度 \(v\) 的关系是弯的:静止附近有一个跳变(库仑摩擦,8.4 节),再加上随速度线性增长的粘滞摩擦。好消息是,只要把输入先变成一组特征 \(\boldsymbol\phi(v)=(\phi_1(v),\dots,\phi_d(v))\),再让模型是特征的线性组合 \(\hat y=\boldsymbol\theta^\top\hl{phi}{\boldsymbol\phi}(v)\),那么预测对 \(\boldsymbol\theta\) 仍是线性的,NLL 仍是 \(\boldsymbol\theta\) 的二次函数,解仍然是 1.13 节的正规方程,只是矩阵 \(A\) 的每一行换成了 \(\boldsymbol\phi(v_i)^\top\)。特征可以是多项式 \(1,v,v^2,\dots\),可以是一排高斯“鼓包”(径向基函数,RBF),也可以是物理给出的 \(1,\operatorname{sgn}v,v\)。

    FIG 2特征回归:辨识一个关节的摩擦
    左:16 个青色实心点是训练数据(用来拟合),200 个紫色空心小点是测试数据(拟合时看不见,只用来打分);绿色虚线是真实的摩擦曲线 \(\tau_f=0.05+0.35\tanh(v/0.03)+0.25v\)(N·m),测量噪声 \(\sigma=0.04\) N·m;琥珀色是拟合结果。悬停公式里的 \(\boldsymbol\phi\) 会以细虚线画出当前的每个特征函数。右:同一种特征下,训练(青)与测试(紫)RMSE 随特征个数变化(对数纵轴),竖线是当前设置,水平虚线是物理特征的两个误差,绿色点线是噪声水平。
    • 在“多项式”下找出测试 RMSE 最低的阶数(右图紫色曲线的最低点),再切到“物理特征”:只用 3 个数就比它更准。
    • 把多项式阶数拉到 11 或 12:训练误差降到噪声水平附近,测试误差却是训练误差的 5 倍以上,曲线在数据点之间乱甩。

    默认数据下,多项式在 7 阶时测试 RMSE 最低(0.098 N·m);12 阶时训练 RMSE 0.040,正好是噪声水平,测试 RMSE 却到了 2.5 N·m,比摩擦本身还大。物理特征 \((1,\operatorname{sgn}v,v)\) 学到 \(\hat{\boldsymbol\theta}=(0.062,\,0.364,\,0.249)\),与真值 \((0.05,\,0.35,\,0.25)\) 很接近,测试 RMSE 0.065:剩下的误差主要来自 \(\operatorname{sgn}\) 在零速附近与真实的平滑过渡不一样(模型误差)。这里只是先碰一下“过拟合”:训练误差低不等于模型好,一定要在没参与训练的数据上打分。为什么会这样、怎样系统地选模型复杂度(验证集、交叉验证、正则化),是 16.2 节的内容。

    核心洞见

    回归的损失函数不是随便挑的,它是你对噪声的假设:高斯噪声 → 平方损失(如果噪声有重尾,换成别的分布就得到别的损失,见 16.2 节)。“线性回归”可以拟合曲线,只要模型对参数是线性的;好的特征(尤其是物理给的特征)比更多的特征更值钱。8.3 节的惯性参数辨识就是这样一个线性回归:力矩对惯性参数是线性的。

    3动手:现场训练一个抓取成败预测器

    回到开头的抓取。每次尝试记两个特征:\(x_1\) = 张开余量(夹爪最大张开量减物体宽度,mm),\(x_2\) = 夹爪与物体主轴的夹角偏差(°),标签 \(y=1\) 表示成功、\(y=0\) 表示失败。能不能还用最小二乘去拟合 0 和 1?可以算,但它的输出会跑到 \([0,1]\) 之外,也不是一个概率,而且远处那些“明显成功”的点会把直线拽偏(第 7 节误区 5)。更好的做法还是先写一个噪声模型:结果是一枚有偏的硬币,成功的概率随特征平滑变化,

    $$ p(y=1\mid\mathbf x)=\sigma(z)=\frac{1}{1+e^{-z}},\qquad z=\mathbf w^\top\mathbf x+b, $$ $$ L(\mathbf w,b)=-\frac1n\sum_{i=1}^n\Big[y_i\log\sigma(z_i)+(1-y_i)\log\big(1-\sigma(z_i)\big)\Big]. $$

    这里 \(\sigma(\cdot)\) 是 logistic(sigmoid)函数,不是噪声的标准差。\(z\) 叫 logit,即对数几率 \(\log\frac{p}{1-p}\):4.2 节的“对数几率”专栏已经说明,两类特征是等方差高斯时后验恰好是 \(z\) 线性的 sigmoid。\(L\) 是伯努利分布的平均负对数似然,也就是标签分布与预测分布之间的交叉熵(4.11 节),机器学习库里叫二元交叉熵(BCE)。它没有闭式解,但它是凸的(第 5 节),用 6.3 节的梯度下降一定能走到全局最优,而且梯度出奇地简单:\(\nabla_{\mathbf w}L=\frac1n\sum_i(\sigma(z_i)-y_i)\,\mathbf x_i\),即“预测概率减标签”乘以输入。

    FIG 3逻辑回归:用梯度下降学抓取成功率
    左:横轴是张开余量 \(x_1\)(mm),纵轴是角度偏差 \(x_2\)(°)。120 次训练尝试:绿色圆点是成功,红色叉是失败。底色是模型预测的成功概率:越绿越可能成功,越红越可能失败。琥珀色实线是决策边界 \(p=0.5\)(即 \(z=0\)),两条琥珀色细虚线是 \(p=0.1\) 和 \(p=0.9\);紫色虚线是生成数据用的真实边界(真实 logit \(z=0.30x_1-0.12x_2+0.6\))。“含噪”数据的标签按真实概率抛硬币得到,“可分”数据把标签取为真实边界的哪一侧并去掉了边界附近的点。选“添加”模式后点击画面可以添加你自己的数据点。右:训练集(青)与 300 个测试样本(紫)上的交叉熵随步数变化(对数纵轴),绿色虚线是真实模型在训练集上的交叉熵。训练前先用训练集的均值和标准差把两个特征标准化,读数里的 \(\mathbf w,b\) 已换回原单位。
    • “含噪”数据、不添加点,按“训练”:训练交叉熵降到 0.304 以下(约 170 步,学习率 0.5)。此时它已低于真实模型在同一批数据上的 0.3041;继续训练,学到的 \(\mathbf w,b\) 收敛到 \((0.307,-0.114)\)、0.56,接近真值 \((0.30,-0.12)\)、0.6。
    • 换成“可分”数据,训练至少 3000 步:损失降到 0.005 以下,而(标准化后的)权重长度 \(\|\mathbf w\|\) 越过 9 还在涨,边界两侧的过渡带越来越窄。
    有意思的细节

    (1) 准确率早就不动了,损失还在降:第一步之后训练准确率就是 87.5%(测试 84.7%),再训练几百步也只到 87.5% / 86.3%。变的是概率:交叉熵从 0.69 降到 0.303,模型从处处 \(p=0.5\) 变成自信的概率(一半成功样本的预测超过 0.96)。只看准确率会以为训练早已结束。 (2) 学到的模型在训练集上的交叉熵(0.3027)低于真实模型(0.3041),这和 11.6 节 BA 收敛处代价低于真值处是同一回事:优化器多少拟合了这批数据的噪声。在测试集上两者几乎一样(0.3105 对 0.3106)。 (3) 测试准确率 86.3% 是一个上限附近的值:即使知道真实模型,按 \(p>0.5\) 去判,在这 300 个测试样本上也只有 85.3%。标签本身是抛硬币,剩下的错误是数据里固有的,不是模型的错。

    可分数据为什么停不下来?当一条直线能把两类完全分开时,把 \(\mathbf w\) 和 \(b\) 一起放大 2 倍,边界不动,但每个点的 \(|z|\) 都变大,每个点的概率都更接近它的标签,交叉熵就更小。所以损失没有最小值,只有下确界 0,最大似然解在无穷远处:梯度下降会让 \(\|\mathbf w\|\) 大致按 \(\log t\) 一直增长,模型变得无比自信(3000 步时 9.4,20000 步时 13.6)。实践中的解药是正则化(给 \(\mathbf w\) 一个先验,4.6 节的 MAP)或提前停止,见 16.2 节。

    4另外两个视角:多类别,以及“不训练”的分类器

    多于两类:softmax 回归

    一台轮式机器人想知道自己正在什么地面上走,好调整速度和牵引控制。它有两个便宜的特征:车身竖直方向振动的 RMS(m/s²)和车轮打滑率(%)。类别有三个:沥青、碎石、草地。逻辑回归的推广是给每一类 \(k\) 一个 logit \(z_k=\mathbf w_k^\top\mathbf x+b_k\),再用 softmax 把 \(K\) 个 logit 变成 \(K\) 个加起来为 1 的概率:

    $$ \hl{pk}{p(y=k\mid\mathbf x)}=\frac{e^{z_k}}{\sum_{j=1}^K e^{z_j}},\qquad L=-\frac1n\sum_{i=1}^n\log p(y=y_i\mid\mathbf x_i). $$

    噪声模型是“掷一个 \(K\) 面的有偏骰子”(类别分布),损失仍是负对数似然 = 交叉熵。类别 \(k\) 与 \(j\) 之间的边界是 \(z_k=z_j\),即 \((\mathbf w_k-\mathbf w_j)^\top\mathbf x+(b_k-b_j)=0\):仍是直线,所以 softmax 回归把平面切成若干个凸的多边形区域。想要弯曲的边界,就像 FIG 2 一样先做特征映射:加入 \(x_1^2,x_2^2,x_1x_2\) 之后,边界在原平面里变成二次曲线(椭圆、双曲线),但模型对参数仍是线性的,损失仍是凸的。

    FIG 4softmax 回归:三类地形,线性与二次特征
    “地形”:横轴振动 RMS(m/s²),纵轴打滑率(%),每类 50 个训练点:蓝色圆点沥青、琥珀色方块碎石、绿色三角草地。“圆环”是一个玩具数据:类别只取决于到原点的距离(内圆、中环、外环,同样三种颜色)。底色是预测的类别(概率最大的那一类),底色越浓表示这个最大概率越高;悬停公式里的 \(p(y=k\mid\mathbf x)\) 会让底色更浓。在图上悬停或点按一个位置,右侧条形图显示该处三类的概率(图中用一个小圈标出该位置)。下方的小图是训练(青)与测试(紫)交叉熵(对数纵轴)。
    • “地形”数据训练至少 200 步,然后悬停在碎石与草地之间的交界处,找一个三类概率都低于 0.6 的位置:模型在那里知道自己没把握。
    • 切到“圆环”,用线性特征训练至少 200 步:测试准确率卡在 55% 以下;再切到二次特征重新训练:测试准确率到 95% 以上。

    “地形”数据上线性 softmax 训练 200 步后测试准确率 94.0%。继续训练,训练准确率还会升到 98.7%,测试交叉熵却在约 200 步后从 0.194 慢慢回升(5000 步时 0.227):这又是一次过拟合的预告。“圆环”上线性模型的测试准确率只有 49%,因为没有任何一组直线能围出一个圆;二次特征 200 步就到 97.3%,1000 步到 99.3%。

    不训练的分类器:k 近邻

    前面的模型都是参数化的:训练把数据“压缩”进 \(\mathbf w,b\),之后数据可以扔掉。k 近邻(k-NN)走另一个极端:根本不训练,把所有训练样本都存着;要分类一个新点,就找离它最近的 \(k\) 个训练样本,让它们投票。它是非参数方法:模型的复杂度随数据量增长,任何形状的边界都能表示,所以常被用作“不做任何假设时能做到多好”的基线。它的代价是:预测时要和所有样本比距离;“距离”完全取决于你怎样度量各个特征,单位不同的特征必须先标准化;维数高时“最近的邻居”也离得很远(维数灾难)。

    FIG 5k 近邻:k 控制边界的粗细,距离的单位很重要
    与 FIG 4 相同的训练数据和颜色。底色是 k-NN 在每个位置的投票结果。拖动琥珀色圆圈(查询点):细线连向它的 \(k\) 个近邻,琥珀色虚线圈出包含这些近邻的邻域(标准化开启时,它在原单位下是一个椭圆)。右:训练集(青)与测试集(紫)准确率随 \(k\) 变化(\(k\) 取奇数),竖线是当前的 \(k\)。“训练准确率”是把训练点自己也当作候选邻居算的,所以 \(k=1\) 时总是 100%。
    • “地形”数据、标准化开启:先把 \(k\) 设为 1(训练 100%,测试只有 90%,边界支离破碎),再找一个让测试准确率达到 94% 的 \(k\)。
    • “地形”数据,关掉标准化并把 \(k\) 设为 25 或更大:测试准确率掉到 85% 以下。看邻域的形状:打滑率(单位 %,数值范围大十倍)几乎独占了距离。

    标准化开启时,测试准确率在 \(k=17\) 和 \(k=23\) 到 \(35\) 之间达到 94.0%,与 FIG 4 的线性 softmax 一样;关掉标准化,\(k=25\) 时只有 83.3%,\(k=41\) 时 80.0%。小 \(k\) 的边界跟着每一个噪声点走(方差大),大 \(k\) 的边界被远处的点抹平(偏差大),这又是 16.2 节偏差–方差权衡的一个例子。在“圆环”上,k-NN 不需要任何特征工程,\(k=3\) 就有 96.7%:这正是非参数方法的长处。

    5再看数学

    提示:把鼠标悬停在公式中带底色的符号上,图中对应的元素会被高亮(残差、钟形、特征函数、决策边界、概率等高线、softmax 底色、k-NN 邻域、混淆矩阵的行与列)。

    回归:高斯似然与正规方程

    模型 \(y_i=\boldsymbol\theta^\top\boldsymbol\phi(\mathbf x_i)+\varepsilon_i\),\(\varepsilon_i\sim\mathcal N(0,\sigma^2)\) 独立同分布。把 \(\boldsymbol\phi(\mathbf x_i)^\top\) 排成设计矩阵 \(\Phi\in\R^{n\times d}\) 的第 \(i\) 行,\(\mathbf y=(y_1,\dots,y_n)\)。负对数似然是

    $$ -\log p(\mathbf y\mid\Phi,\boldsymbol\theta,\sigma)=n\log\big(\hl{sig}{\sigma}\sqrt{2\pi}\big)+\frac{1}{2\sigma^2}\sum_{i=1}^n\hl{res}{\big(y_i-\boldsymbol\theta^\top\hl{phi}{\boldsymbol\phi}(\mathbf x_i)\big)}^2 $$ $$ =n\log\big(\sigma\sqrt{2\pi}\big)+\frac{\|\mathbf y-\Phi\boldsymbol\theta\|^2}{2\sigma^2}. $$

    对 \(\boldsymbol\theta\) 求最小时第一项与 \(\boldsymbol\theta\) 无关,第二项正是 1.13 节的 \(\|A\mathbf x-\mathbf b\|^2\)(\(A=\Phi\),\(\mathbf b=\mathbf y\)),所以 \(\hat{\boldsymbol\theta}\) 满足正规方程 \(\Phi^\top\Phi\,\hat{\boldsymbol\theta}=\Phi^\top\mathbf y\),与 \(\sigma\) 无关(FIG 1 的第二个任务)。再对 \(\sigma\) 求导并令其为零:\(-n/\sigma+\|\mathbf r\|^2/\sigma^3=0\),得 \(\hat\sigma^2=\tfrac1n\|\mathbf y-\Phi\hat{\boldsymbol\theta}\|^2\),即残差的均方。数值上不要真的去求 \((\Phi^\top\Phi)^{-1}\):多项式特征的 \(\Phi\) 条件数很大,\(\Phi^\top\Phi\) 把它平方,FIG 2 用的是 QR 分解(1.13 节的伪逆也可以)。每个噪声不同的点可以给权重 \(1/\sigma_i^2\),就是 1.13 节的加权最小二乘。

    逻辑回归:伯努利似然、梯度与凸性

    \(y_i\in\{0,1\}\),\(p_i=\sigma(z_i)\),\(z_i=\mathbf w^\top\mathbf x_i+b\)。伯努利分布 \(p(y\mid\mathbf x)=p^{y}(1-p)^{1-y}\) 的平均负对数似然就是二元交叉熵。用 \(\sigma'(z)=\sigma(z)(1-\sigma(z))\) 求导,几项会神奇地消掉:

    $$ \frac{\partial L}{\partial z_i}=\frac1n\,(p_i-y_i),\qquad \nabla_{\mathbf w}L=\frac1n\sum_{i=1}^n(p_i-y_i)\,\mathbf x_i, $$ $$ \nabla^2_{\mathbf w}L=\frac1n\sum_{i=1}^n p_i(1-p_i)\,\mathbf x_i\mathbf x_i^\top\succeq0. $$

    三点值得记住。梯度的形状:“预测减目标”乘输入,和线性回归的 \(\nabla_{\boldsymbol\theta}=\frac1n\sum(\hat y_i-y_i)\boldsymbol\phi_i\)(差一个常数因子)一模一样;softmax 也一样,\(\partial L/\partial\mathbf z_i=\frac1n(\mathbf p_i-\mathbf e_{y_i})\),\(\mathbf e_{y_i}\) 是独热向量。这不是巧合:三者都是“指数族分布 + 典范连接函数”的广义线性模型。到了 16.3 节,这个 \(\mathbf p-\mathbf e_y\) 就是反向传播从输出层送回去的第一个信号。凸性:Hessian 是一组半正定矩阵的加权和,所以 \(L\) 是凸的,没有坏的局部极小,梯度下降、牛顿法(逻辑回归里叫 IRLS,迭代重加权最小二乘)都收敛到全局最优(数据可分时除外:最优在无穷远)。边界的几何:

    $$ \hl{bnd}{p(y=1\mid\mathbf x)=\tfrac12\iff\mathbf w^\top\mathbf x+b=0},\qquad \hl{lvl}{p=0.9\iff z=\log 9\approx2.197}, $$ $$ d_\perp(\mathbf x)=\frac{|z|}{\|\mathbf w\|}. $$

    决策边界是一个超平面,\(\mathbf w\) 是它的法向量(1.7 节点积的几何)。\(p=0.1\) 和 \(p=0.9\) 两条等高线到边界的距离是 \(2.197/\|\mathbf w\|\):\(\|\mathbf w\|\) 越大,过渡带越窄、模型越自信,FIG 3 的可分数据里你看到的就是它。上式里的 \(d_\perp(\mathbf x)\) 是点 \(\mathbf x\) 到边界的欧氏距离(在标准化后的坐标里)。阈值不一定取 0.5:把判成功的阈值改成 \(t\),边界就平移到 \(z=\log\frac{t}{1-t}\),第 6 节会利用这一点。

    softmax:K 类的推广

    \(\mathbf z=W\mathbf x+\mathbf b\),\(W\in\R^{K\times d}\),\(p_k=e^{z_k}/\sum_je^{z_j}\)。给所有 logit 加同一个常数,概率不变,所以 \(K\) 组参数里只有 \(K-1\) 组是可辨识的;\(K=2\) 时 \(p_1=\sigma(z_1-z_0)\),正是逻辑回归,\(\mathbf w=\mathbf w_1-\mathbf w_0\)。数值上要先减去最大的 logit 再取指数(否则 \(e^{z}\) 会溢出),库里的交叉熵函数都直接吃 logit 而不是概率,就是为了把 log 和 softmax 合在一起稳定地算。

    k 近邻

    \(\hat y(\mathbf x)=\arg\max_k\big|\{i\in\hl{nbr}{\mathcal N_k(\mathbf x)}:y_i=k\}\big|\),\(\mathcal N_k(\mathbf x)\) 是离 \(\mathbf x\) 最近的 \(k\) 个训练样本(这里的距离是标准化后的欧氏距离)。平票时本页取票数并列的类里离得最近的那个样本的类别。Cover 与 Hart(1967)证明,样本数趋于无穷时,1-NN 的错误率不超过最优(贝叶斯)错误率的两倍。预测一次要 \(O(nd)\) 次运算;机器人上数据量大时用 k-d 树或近似最近邻搜索(与 12.1 节点云最近邻搜索用的 k-d 树相同)。

    评估:混淆矩阵与它派生的指标

    把“判为成功”当作正类。在测试集上数四个数:TP(判成功,真成功)、FP(判成功,实际失败)、FN(判失败,实际成功)、TN(判失败,真失败)。于是

    $$ \mathrm{Acc}=\frac{TP+TN}{n},\qquad \hl{prec}{\mathrm{Prec}=\frac{TP}{TP+FP}},\qquad \hl{rec}{\mathrm{Rec}=\frac{TP}{TP+FN}}, $$ $$ \mathrm{FPR}=\frac{FP}{FP+TN},\qquad F_1=\frac{2\,\mathrm{Prec}\cdot\mathrm{Rec}}{\mathrm{Prec}+\mathrm{Rec}}. $$

    这里 Acc 是准确率,Prec 是精确率(precision),Rec 是召回率(recall),FPR 是假阳性率。精确率问的是“我说会成功的里面,有多少真成功了”,召回率(recall,也叫真阳性率 TPR)问的是“真能成功的里面,我抓住了多少”。阈值 \(t\) 从 0 扫到 1,召回率单调下降,精确率大体上升,画出来就是 PR 曲线;以 FPR 为横轴、TPR 为纵轴画就是 ROC 曲线,它下方的面积 AUC 等于“随机取一个成功样本和一个失败样本,前者得分更高”的概率。ROC 不受类别比例影响,PR 曲线和精确率则直接受它影响:失败很少时,ROC 可能很好看,但精确率仍可能不够。

    6机器人中的它:这个抓取预测器能上机吗?

    训练准确率说明不了什么(FIG 2 和 FIG 5 已经看到),所以要留出一份测试集:训练、调参时都不碰它,最后只用一次。可即便在测试集上,“准确率 90%”也可能毫无用处。下图是一个抓取分类器在 400 次测试抓取上给出的分数(预测的成功概率)。机器人只在分数超过阈值 \(t\) 时才执行抓取。执行了却失败(FP)的代价很高:零件掉落、产线停下;放弃了本能成功的抓取(FN)只是浪费一点时间,换一个候选抓取就行。真实的拣选场景里,候选抓取大多是能成功的,失败是少数:把“类别比例”切到“现实(90% 成功)”看看会发生什么。

    FIG 6评估:阈值、混淆矩阵、精确率与召回率
    左:分数直方图,横轴不变,绿色柱(横轴上方)是真实成功的抓取,红色柱(横轴下方,向下画)是真实失败的抓取;琥珀色竖线是阈值,它右边的抓取会被执行。分数由模型 \(s=\sigma(z)\) 生成:成功时 \(z\sim\mathcal N(1.6,1.2^2)\),失败时 \(z\sim\mathcal N(-1.6,1.2^2)\)。右:蓝色曲线是扫过所有阈值得到的 PR 曲线(或 ROC 曲线),琥珀色点是当前阈值;PR 图里的虚线是“全判成功”的精确率(等于成功比例),ROC 图里的虚线是随机猜测。下方是混淆矩阵:行是预测,列是真实;悬停公式里的 precision / recall 会框出用来计算它的那一行 / 那一列。
    • 选“现实(90% 成功)”,把阈值拉到最左(0.01 或更低):准确率是 90%,可它一次失败也没拦住(TN = 0),这个“分类器”等于什么都不做。
    • 仍在“现实”下,找一个阈值让执行的抓取里一次失败都没有(FP = 0),同时召回率不低于 0.85。

    “均衡”数据下阈值 0.5 时准确率 92.5%、精确率 0.934、召回率 0.915。“现实”数据下,让准确率最高的阈值移到了 0.22 附近(95.75%),因为失败很少,多判成功几乎不吃亏;而满足 FP = 0 且召回率 ≥ 0.85 的阈值只有 0.58 到 0.61 这一小段。别把“0 个失败”看得太绝对:测试集里一共只有 40 次失败,0/40 只能说明“失败的候选被执行”的真实比例(FPR)大概率低于 7.5% 左右(统计里的“三分之法则”:0 次发生时,95% 置信上界约为 \(3/n\))。要宣称这个比例低于 1%,需要几百次失败样本。

    真实系统里

    学习抓取成功率:Pinto 与 Gupta(ICRA 2016)用机器人自己收集的 5 万次尝试(标题里的 50K tries、700 robot hours)训练 CNN,从图像块预测 18 个夹爪角度各自的成功与否;Levine 等(IJRR 2018)用多台机械臂在两个月里收集了约 80 万次抓取尝试,训练一个 CNN 预测“给定图像和一个运动指令,抓取会成功”的概率,再用它挑选指令。Dex-Net 2.0(Mahler 等,RSS 2017)的 GQ-CNN 在 670 万个合成点云样本上训练,从深度图预测平行夹爪抓取的鲁棒性。三者的输出层实质上都是本节的逻辑回归(一个 sigmoid 加交叉熵),只是特征 \(\mathbf x\) 换成了网络从图像里提出的特征(17.1 节)。 地形分类:Brooks 与 Iagnemma(IEEE T-RO 2005)用车体结构上测到的振动信号给行星车分类地形,正是 FIG 4 的问题;今天的足式和轮式机器人仍常把本体感知(IMU、电机电流、打滑)当分类特征。 动力学辨识:8.3 节提到的 Atkeson、An 与 Hollerbach(1986)把连杆和负载的惯性参数辨识写成线性最小二乘;后来的辨识工作常把摩擦项(库仑 + 粘滞)作为额外的回归列加进去,FIG 2 就是这一部分的单关节版本。 软件:scikit-learn 的 LogisticRegression 默认带 L2 正则(C=1.0),所以在可分数据上不会像 FIG 3 那样无限增长;KNeighborsClassifier 默认 \(k=5\)。PyTorch 的 nn.CrossEntropyLoss 与 nn.BCEWithLogitsLoss 都输入 logit,内部合并 log 与 softmax/sigmoid 以保证数值稳定。

    7常见误区

    误区 1:在训练数据上打分,或让测试集“泄漏”进训练

    FIG 2 的 12 阶多项式训练误差等于噪声水平,测试误差却大了 60 倍;FIG 5 的 1-NN 训练准确率永远是 100%。训练分数只说明模型能背下数据。还有更隐蔽的泄漏:用全部数据(含测试集)的均值和方差做标准化,按测试分数反复挑模型,或者把同一次抓取的相邻帧分到训练和测试两边(几乎是重复样本)。机器人数据要按场景、按物体或按时间段切分,否则测试集里全是训练集的“近亲”。

    误区 2:不做特征标准化

    FIG 5 关掉标准化,打滑率(0 到 35)把振动(0 到 3.5)完全压住,k-NN 的测试准确率从 94% 掉到 83%。梯度下降也受害:特征尺度相差 10 倍,损失的等高线就被拉长,条件数变大,6.3 节的“之字形”就出现了,所以 FIG 3、FIG 4 训练前都先标准化。标准化的均值和标准差只能从训练集算,存下来,部署时对新数据用同样的数。

    误区 3:类别不均衡时只看准确率

    FIG 6 里,失败占 10% 时“全判成功”就有 90% 的准确率。要看混淆矩阵,按代价选指标(误执行贵就盯精确率或 FP 数,漏检贵就盯召回率),并按代价选阈值,而不是默认 0.5。报告结果时也要报告测试集里每一类有多少个样本:少数类只有几十个时,任何百分比都带着很宽的误差棒。

    误区 4:把输出的“概率”当真

    逻辑回归的输出只有在模型假设成立(对数几率真的对特征线性)且数据足够时才接近真实频率。FIG 3 的可分数据训练 3000 步后,模型给 62% 的训练点 0.999 以上的把握,给每个点至少 0.93,而且还在升高,可这只是 \(\|\mathbf w\|\) 无限增长的副作用。更大的模型(深度网络)往往系统性地过于自信。输出的分数可以排序,但要当概率用(例如“成功率低于 0.8 就请人帮忙”),必须先在留出数据上检验校准,见 21.3 节。而且它描述的只是训练分布里的不确定性,遇到没见过的物体,它可能非常自信地错。

    误区 5:用回归做分类,或把类别编号当成数

    对 0/1 标签做最小二乘,输出会超出 \([0,1]\),而且离边界很远、本来分对了的点仍会产生很大的平方误差,把直线拽过去,边界反而变差;交叉熵对这些点的梯度 \(p-y\) 几乎为零,不受它们影响。把“沥青 = 0、碎石 = 1、草地 = 2”当作数去回归更糟:它暗含“碎石在沥青和草地中间”“草地和沥青差得最远”这种并不存在的顺序。多类别就用 softmax 和独热标签。(反过来,真正有序的目标,例如抓取力档位,有时可以当回归或有序回归处理。)

    8小练习

    1. 模型 \(\hat y=\theta_0+\theta_1v+\theta_2v^2+\theta_3\sin v\) 为什么仍然可以用正规方程一步解出?
    选项 C。“线性回归”的“线性”是对参数而言的。设计矩阵的第 \(i\) 行是 \((1,v_i,v_i^2,\sin v_i)\),预测 \(\Phi\boldsymbol\theta\) 对 \(\boldsymbol\theta\) 线性,平方损失是二次的,正规方程 \(\Phi^\top\Phi\hat{\boldsymbol\theta}=\Phi^\top\mathbf y\) 给出精确解。它对 \(v\) 显然不是线性的(选项 B 错),也不需要任何近似(选项 A 错)。
    2. 逻辑回归的二元交叉熵对 \(\mathbf w\) 的梯度是?(\(p_i=\sigma(\mathbf w^\top\mathbf x_i+b)\))
    选项 B。\(\partial/\partial z\) 作用在 \(-[y\log\sigma(z)+(1-y)\log(1-\sigma(z))]\) 上,sigmoid 的导数 \(\sigma(1-\sigma)\) 恰好与分母约掉,得到 \(\sigma(z)-y\),再乘 \(\partial z/\partial\mathbf w=\mathbf x\)。选项 A 是对 sigmoid 输出用平方损失时的梯度(差一个因子 2):多出来的 \(p(1-p)\) 在模型很自信地错了时接近 0,梯度消失,这正是分类不用平方损失的原因之一。
    3. 训练数据可以被一条直线完全分开。不加正则地用梯度下降训练逻辑回归,会发生什么?
    选项 D。把 \((\mathbf w,b)\) 放大,边界不动,每个点都离自己的标签更近,损失更小,所以最小值在无穷远处(FIG 3 的“可分”数据:3000 步时 \(\|\mathbf w\|\approx9.4\),之后仍在涨)。损失是凸的(选项 C 错),只是没有有限的极小点;\(\log 2\) 是 \(\mathbf w=0\) 处的损失,那里的梯度并不为零(选项 B 错)。L2 正则或提前停止能给出有限的解。
    4. 一个分拣机器人的抓取有 95% 会成功。一个分类器永远回答“会成功”。下列哪个说法正确?
    选项 A。全判成功:TP = 95%、FP = 5%、FN = TN = 0。准确率 0.95,召回率 TP/(TP+FN) = 1,精确率 TP/(TP+FP) = 0.95(选项 B 错,它把所有失败都误判成了成功),而 TN = 0,失败一个也没有拦下。所有样本得分相同,只有一个阈值点,ROC AUC 是 0.5(选项 D 错)。这就是 FIG 6 的第一个任务。
    5. 关于 k 近邻,下列哪一项正确?
    选项 C。k-NN 是非参数方法,“模型”就是训练集本身,预测时与所有样本比距离;距离由特征尺度决定(FIG 5 关掉标准化后准确率从 94% 掉到 83%)。\(k=1\) 时训练准确率就是 100%,\(k\) 增大通常让它下降(选项 A 错);它能表示任意形状的边界,FIG 5 的“圆环”就是例子(选项 D 错)。

    9延伸阅读

    • C. M. Bishop, Pattern Recognition and Machine Learning, Springer, 2006, Ch. 3–4 — 线性回归与线性分类的概率视角:基函数、最大似然、逻辑回归、IRLS
    • T. Hastie, R. Tibshirani & J. Friedman, The Elements of Statistical Learning, 2nd ed., Springer, 2009, Ch. 2–4 — 最小二乘与最近邻的对比、线性分类方法
    • K. P. Murphy, Probabilistic Machine Learning: An Introduction, MIT Press, 2022 — 现代、免费在线的教材,回归、逻辑回归、评估指标都有详细讨论
    • D. R. Cox, The Regression Analysis of Binary Sequences, Journal of the Royal Statistical Society B, 1958 — 逻辑回归的经典来源之一
    • T. M. Cover & P. E. Hart, Nearest Neighbor Pattern Classification, IEEE Transactions on Information Theory, 1967 — 1-NN 的错误率不超过贝叶斯错误率的两倍
    • J. Davis & M. Goadrich, The Relationship Between Precision-Recall and ROC Curves, ICML 2006 — 何时看 PR 曲线、何时看 ROC
    • L. Pinto & A. Gupta, Supersizing Self-supervision: Learning to Grasp from 50K Tries and 700 Robot Hours, ICRA 2016 — 机器人自己收集标签,学习抓取成败
    • S. Levine, P. Pastor, A. Krizhevsky, J. Ibarz & D. Quillen, Learning Hand-Eye Coordination for Robotic Grasping with Deep Learning and Large-Scale Data Collection, IJRR 2018 — 大规模抓取成功率预测
    • J. Mahler et al., Dex-Net 2.0: Deep Learning to Plan Robust Grasps with Synthetic Point Clouds and Analytic Grasp Metrics, RSS 2017 — 用合成数据训练的抓取质量分类器