感知机

2026-11-10

第一部分:从分类任务认识感知机

1. 机器学习中的“分类”究竟是什么?

假设我们想让计算机判断一个水果是苹果还是橘子。

对于每个水果,我们记录两项可以量化的特征:

  • $x_1$:重量,或者经过统一尺度处理的重量指标;
  • $x_2$:颜色,或者经过数值化的颜色指标。

一个水果便可以记为:

\[x=(x_1,x_2)\]

这里的 $x$ 不表示一个神秘的数学对象,它只是一个样本的信息清单。

我们再给样本一个正确答案,称为标签:

\[y=\begin{cases} +1,&\text{苹果}\\ -1,&\text{橘子} \end{cases}\]

注意,$+1$ 和 $-1$ 仅仅是类别编号,不表示苹果比橘子“更好”。将两种标签对调也完全可以,只要整个训练过程保持一致。

假设收集到了 $N$ 个水果,我们就有了一批训练数据:

\[D=\{(x_1,y_1),(x_2,y_2),\ldots,(x_N,y_N)\}\]

这里下标 $i$ 表示第 $i$ 个样本。例如 $x_3$ 可以是一个具有多个特征的向量,而不一定是第三个特征。

机器学习的目标是:从已经知道答案的样本里,总结出一个能够判断新样本类别的规则。

2. 感知机的核心想法:用一个分数决定类别

感知机(Perceptron)是一种最基础的线性二分类模型。它先给样本计算一个分数:

\[s(x)=w^Tx+b\]

再根据分数的正负决定类别:

\[\boxed{f(x)=\operatorname{sign}(w^Tx+b)}\]

其中:

符号 数学含义 通俗解释
$x$ 输入特征向量 一个水果的各项信息
$w$ 权重向量 模型怎样看待不同特征
$b$ 偏置 调整分类标准的位置
$w^Tx+b$ 分类分数 模型给样本打的分
$\operatorname{sign}$ 符号函数 将分数转换成类别

常见的符号函数定义是:

\[\operatorname{sign}(z)=\begin{cases} +1,&z>0\\ -1,&z<0 \end{cases}\]

当 $z=0$ 时,样本正好处在分类边界上。不同程序可以采用不同的预测约定;在标准感知机训练中,通常把这样的样本视为尚未正确分开,需要继续更新。

把公式完全展开

假设样本只有两个特征:

\[x=\begin{pmatrix}x_1\\x_2\end{pmatrix},\qquad w=\begin{pmatrix}w_1\\w_2\end{pmatrix}\]

那么:

\[w^Tx+b=w_1x_1+w_2x_2+b\]

因此,$w^Tx$ 不是需要害怕的复杂符号,只是一个加权求和:每个特征乘上对应权重,再把结果加起来。

举例:

\[w=(2,1),\qquad b=-5\]

模型变为:

\[f(x)=\operatorname{sign}(2x_1+x_2-5)\]

对于样本 $x=(3,2)$:

\[2\times3+1\times2-5=3>0\]

所以模型预测 $+1$。

对于样本 $x=(1,1)$:

\[2\times1+1\times1-5=-2<0\]

所以模型预测 $-1$。

感知机最基本的工作就是:计算分数,判断正负。

3. 为什么说感知机是在“画一条直线”?

所有分类分数恰好为零的点满足:

\[\boxed{w^Tx+b=0}\]

这就是感知机的决策边界。

如果只有两个特征:

\[w_1x_1+w_2x_2+b=0\]

它在平面上就是一条直线。如果 $w_2\ne0$,还可以写为:

\[x_2=-\frac{w_1}{w_2}x_1-\frac{b}{w_2}\]

和初中学过的直线方程 $y=kx+c$ 很像。

那么,$w$ 和 $b$ 各管什么?

  • $w$ 与直线的方向有关。 严格说,向量 $w$ 垂直于决策边界,称为法向量。
  • $b$ 与直线的位置有关。 固定 $w$、改变 $b$,直线会平行移动。

在更高维的情形中:

特征维度 决策边界
2 维 一条直线
3 维 一个平面
$n$ 维 一个超平面

“超平面”这个词听起来很难,其实就是二维直线、三维平面在更高维度的统一叫法。

改变权重和偏置会发生什么?

例如,先有:

\[x_1+x_2-3=0\]

若只把偏置改为 $-5$:

\[x_1+x_2-5=0\]

直线保持平行,只是移动到了新的位置。

若改动权重比值,例如:

\[2x_1+x_2-3=0\]

直线方向就会改变。

因此,训练感知机,本质上是在不断修改直线的方向和位置。

4. 线性可分与线性不可分

如果我们能找到一条直线,使所有正类样本都在一侧、负类样本都在另一侧,那么训练数据就是线性可分的。

对正样本($y_i=+1$),要求:

\[w^Tx_i+b>0\]

对负样本($y_i=-1$),要求:

\[w^Tx_i+b<0\]

这两句可以巧妙地合并为:

\[\boxed{y_i(w^Tx_i+b)>0}\]

为什么?

  • 如果 $y_i=+1$,前面的 $+1$ 不改变符号,要求分类分数为正。
  • 如果 $y_i=-1$,前面的 $-1$ 会把分数翻转,要求原来的分类分数为负。

所以只看 $y_i(w^Tx_i+b)$ 就能判断分类情况:

$y_i(w^Tx_i+b)$ 判断
$>0$ 分类正确,位于正确一侧
$<0$ 分类错误,位于错误一侧
$=0$ 样本在决策边界上,训练时通常也需要更新

如果两类样本交错得很厉害,任何直线都无法把它们完全分开,那就是线性不可分。

线性不可分不意味着计算机完全不能分类,只意味着单独使用一条线性边界无法让这些训练样本全部严格正确分类。更复杂的非线性模型可能会有帮助。

第二部分:无约束优化——理解感知机学习算法的数学基础

这一部分虽然公式较多,但目标只有一个:理解怎样找到使某个函数尽可能小的参数。掌握这件事,就更容易理解感知机为什么可以靠“不断纠错”学会分类。

5. 什么是优化问题?什么又是无约束优化?

假设你站在一片高低不平的山地上,任务是找到最低的地方。

你可以往前、后、左、右走,也可以沿任意斜方向走。没有人规定你必须走哪条路,你唯一的目标就是海拔尽可能低。

这就是无约束优化最直观的比喻。

数学上通常写作:

\[\boxed{\min_{x\in\mathbb R^n}f(x)}\]

逐个解释:

符号 意思
$\min$ 寻找最小值
$x$ 可以自由调整的变量
$f(x)$ 评价一个选择好坏的目标函数
$\mathbb R^n$ 变量可以在整个 $n$ 维实数空间里取值

例如:

\[\min_x f(x)=(x-3)^2+2\]

不管 $x$ 取什么值,平方项 $(x-3)^2$ 都不小于 $0$。

因此,当 $x=3$ 时,函数达到最小值:

\[f(3)=0+2=2\]

这里要区分:

  • 最优解:$x^*=3$,也就是“应该选哪个位置”。
  • 最优值:$f(x^*)=2$,也就是“最低能达到多少”。

无约束优化与有约束优化

假设要设计一款电脑,希望性能损失 $f(x)$ 尽可能小。

无约束优化可以写为:

\[\min_x f(x)\]

如果又规定预算不能超过 8000 元、重量不能超过 2 千克,那么就变成:

\[\begin{aligned} \min_x\quad &f(x)\\ \text{s.t.}\quad &\operatorname{price}(x)\le8000\\ &\operatorname{weight}(x)\le2 \end{aligned}\]

其中 $\text{s.t.}$ 是“在满足以下条件的前提下”的缩写。

区别在于:

  • 无约束优化:参数可以自由搜索,不额外加入限制它们的等式或不等式。
  • 有约束优化:只能在符合要求的区域里搜索。

一个容易误解的地方是:“无约束”并不是“没有目标”或“没有数据”,而是决策变量没有额外的显式约束条件。

6. 为什么先研究凸集?

6.1 凸集的生活化理解

想象一块面团,在它里面随意选两个点 $A$ 和 $B$,然后拿一根直尺把它们连起来。

如果无论怎样选点,整条线段都留在面团里面,这个集合就是凸集。

圆盘、矩形、三角形都是凸集;月牙形、带洞的圆环通常不是凸集。注意,“圆盘”是包括内部的整个区域,而不是只有圆周。

6.2 凸集的数学定义

设集合 $D\subseteq\mathbb R^n$。若任意 $x,y\in D$、任意 $\alpha\in[0,1]$ 都满足:

\[\boxed{\alpha x+(1-\alpha)y\in D}\]

那么 $D$ 是凸集。

这里最重要的是理解:

\[\alpha x+(1-\alpha)y\]

表示 $x$ 和 $y$ 之间的一点。

例如取 $x=2,y=8$:

  • $\alpha=0$ 时,得到 $8$;
  • $\alpha=0.5$ 时,得到 $5$;
  • $\alpha=1$ 时,得到 $2$;
  • $\alpha=0.2$ 时,得到 $0.2\times2+0.8\times8=6.8$。

当 $\alpha$ 从 $0$ 变化到 $1$,得到的就是两端之间整条线段上的点。

所以凸集定义的核心只是一句话:集合内任意两点的连线,仍完整留在集合内。

6.3 凸组合是什么?

如果有 $k$ 个点 $x_1,\ldots,x_k$,考虑:

\[x=\sum_{i=1}^k\alpha_i x_i\]

并要求:

\[\alpha_i\ge0,\qquad \sum_{i=1}^k\alpha_i=1\]

这叫做凸组合,本质就是“权重非负、权重和为 1 的加权平均”。

例如三名同学的分数为 $80,90,100$,权重为 $0.2,0.3,0.5$:

\[0.2\times80+0.3\times90+0.5\times100=93\]

这就是一个凸组合。

二维或更高维也一样:不是平均考试分数,而是对几个点的坐标做加权平均。

一个重要性质是:凸集内任意有限多个点的凸组合仍在这个凸集内。

另外:

  • 任意多个凸集的交集仍然是凸集;
  • 两个凸集的元素逐个相加所形成的集合,也仍然是凸集。

研究凸集,是因为后面要在“形状良好”的区域上研究凸函数和最优解。

7. 凸函数:为什么说它是优化问题中的“好函数”?

7.1 先想象一只碗

先看最典型的函数:

\[f(x)=x^2\]

它的图像像一只开口向上的碗。

在曲线上选两个点,用一条直线连接。你会发现,曲线在这两点之间不会高于那条连线。

这就是凸函数的典型几何特征。这里“凸”这个名称容易让人觉得应该向上鼓起,实际上在优化课里,凸函数通常可以先想成开口向上的碗。

7.2 凸函数的定义

在凸定义域 $D$ 上,如果任取 $x,y\in D$ 和 $\alpha\in[0,1]$,都有:

\[\boxed{f(\alpha x+(1-\alpha)y) \le \alpha f(x)+(1-\alpha)f(y)}\]

那么 $f$ 是凸函数。

别急着背,先比较左右两边:

左边:

\[f(\alpha x+(1-\alpha)y)\]

是“先在两个位置之间取一个点,再计算这个点的函数高度”。

右边:

\[\alpha f(x)+(1-\alpha)f(y)\]

是“先看两端的高度,再按比例计算连线的高度”。

所以凸函数的含义是:中间点的真实函数值,不高于两端连线在对应位置的高度。

7.3 用数字验证一次

取 $f(x)=x^2$,$x=0$,$y=2$,$\alpha=0.5$。

左边:

\[f(0.5\times0+0.5\times2)=f(1)=1\]

右边:

\[0.5f(0)+0.5f(2)=0.5\times0+0.5\times4=2\]

果然:

\[1\le2\]

这与“曲线处于连线下方”的直觉完全一致。

7.4 严格凸函数、凹函数

如果任意不同的 $x,y$、任意 $0<\alpha<1$ 都有严格不等式:

\[f(\alpha x+(1-\alpha)y) <\alpha f(x)+(1-\alpha)f(y)\]

那么称为严格凸函数。

严格凸函数若存在全局最小值点,那么它一定是唯一的。

与凸函数相反,凹函数像“倒扣的碗”。例如:

\[f(x)=-x^2\]

一个简单的记法:

\[f\text{ 是凹函数}\iff -f\text{ 是凸函数}\]

不过,凸函数不必处处光滑。例如 $f(x)=\lvert x\rvert$ 也是凸函数,但在 $x=0$ 处不可导;它也不必长得像标准抛物线。

7.5 凸函数的一阶几何性质

如果凸函数可导,那么对任意 $x,y$:

\[\boxed{f(y)\ge f(x)+\nabla f(x)^T(y-x)}\]

这个式子的右边是函数在 $x$ 处的一阶线性近似。

对一元函数而言,就是在 $x$ 点所画切线的高度。

所以公式可以翻译为:

凸函数图像不会低于任意一条切线;多元时,函数曲面不会低于对应的切平面。

这条性质后来可以帮助我们证明:凸函数的驻点就是全局最小值点。

8. 局部最优与全局最优

在一片有多个山谷的地形中,你可能站在某个小山谷的最低点。附近已经没有更低的位置,但远处还有一个更深的山谷。

于是出现两种概念。

8.1 局部极小值

如果存在一个足够小的邻域,使 $x^*$ 附近的点都满足:

\[f(x^*)\le f(x)\]

那么 $x^*$ 是局部极小值点。

通俗理解:在附近已经找不到更低的地方。

8.2 全局最小值

如果对整个定义域的所有 $x$ 都满足:

\[f(x^*)\le f(x)\]

那么 $x^*$ 是全局最小值点。

通俗理解:在所有可以选择的地方中,它都是最低的。

8.3 为什么凸性很重要?

一般函数可能有多个“山谷”,找到局部最低点不等于找到全局最低点。

但是,对于定义在凸集上的凸函数,局部最小值就是全局最小值。

这件事很有价值:如果问题是凸的,我们便不必担心“找到了一个小山谷,却漏掉远处更深的大山谷”。

这里仍然要注意两点:

  1. 凸函数不代表优化算法一定马上找到答案;步长、计算精度等仍然重要。
  2. 全局最小值未必存在。例如 $f(x)=e^x$ 是凸函数,在整个实数范围内能无限接近 $0$,却永远取不到 $0$。

9. 一阶导数、梯度与 Hessian 矩阵

我们已经知道要找函数的最低点,现在的问题是:怎样判断当前位置是不是最低点?

9.1 一元函数:导数表示坡度

对一元函数:

\[f(x)=(x-3)^2+2\]

求导:

\[f'(x)=2(x-3)\]

导数的直观含义是当前位置的坡度:

  • $f’(x)>0$:朝 $x$ 增大的方向走,函数在局部上升;
  • $f’(x)<0$:朝 $x$ 增大的方向走,函数在局部下降;
  • $f’(x)=0$:当前位置的切线水平,但不保证是最低点。

令导数为零:

\[2(x-3)=0\implies x=3\]

这个点的确是最小值点,但不是因为“导数等于零”这句话本身足够,而是还要结合函数形状或其他条件判断。

9.2 多元函数:梯度就是多个方向的坡度

如果函数有两个变量:

\[f(x,y)=x^2+y^2\]

你可以朝 $x$ 方向走,也可以朝 $y$ 方向走。

它的梯度为:

\[\nabla f(x,y)= \begin{pmatrix} \frac{\partial f}{\partial x}\\ \frac{\partial f}{\partial y} \end{pmatrix} =\begin{pmatrix}2x\\2y\end{pmatrix}\]

梯度是把各个坐标方向上的变化率汇总成一个向量。

例如在 $(2,1)$ 处:

\[\nabla f(2,1)=\begin{pmatrix}4\\2\end{pmatrix}\]

意思是:当前位置附近,朝向量 $(4,2)$ 的方向,函数值上升最快;朝相反方向 $(-4,-2)$,函数在局部下降最快。

更精确地说,“最快”比较的是长度相同的无穷小移动方向,不是保证最终最少迭代次数。

9.3 Hessian 矩阵:研究函数怎样弯曲

对于一元函数,我们可以继续求二阶导数:

\[f''(x)\]

对于多元函数,所有二阶偏导数组成一个矩阵,称为 Hessian 矩阵:

\[\nabla^2 f(x)= \begin{pmatrix} \frac{\partial^2 f}{\partial x_1^2}&\cdots&\frac{\partial^2 f}{\partial x_1\partial x_n}\\ \vdots&\ddots&\vdots\\ \frac{\partial^2 f}{\partial x_n\partial x_1}&\cdots&\frac{\partial^2 f}{\partial x_n^2} \end{pmatrix}\]

通俗地说:

  • 梯度告诉我们“坡往哪个方向倾斜”。
  • Hessian 帮助我们判断“曲面往哪个方向弯、弯得有多厉害”。

例如:

\[f(x,y)=(x-2)^2+(y+1)^2\]

其梯度:

\[\nabla f(x,y)= \begin{pmatrix}2(x-2)\\2(y+1)\end{pmatrix}\]

Hessian 矩阵:

\[\nabla^2f(x,y)= \begin{pmatrix}2&0\\0&2\end{pmatrix}\]

这个矩阵在所有非零方向上的二阶弯曲都为正,因此是正定的。

10. 无约束优化的一阶、二阶最优性条件

10.1 一阶必要条件:极小值点的梯度为零

设函数在某点可微,而此点是无约束问题的局部极小值点,那么必有:

\[\boxed{\nabla f(x^*)=0}\]

对于一元函数,就是:

\[f'(x^*)=0\]

这样的点通常称为驻点。

但一定要记住:

\[\text{局部极小值点}\Longrightarrow\text{梯度为零}\]

反方向一般不成立。

看三个例子:

  1. $f(x)=x^2$:在 $x=0$ 处导数为零,确实是极小值。
  2. $f(x)=-x^2$:在 $x=0$ 处导数也为零,却是极大值。
  3. $f(x)=x^3$:在 $x=0$ 处导数为零,但既不是极小值也不是极大值。

所以“导数为零”只能说明这是一个值得进一步检查的候选点。

10.2 二阶条件:区分谷底、山顶和马鞍

对一元函数,假设 $f’(x^*)=0$:

二阶导数 常见结论
$f’‘(x^*)>0$ 严格局部极小值,像碗底
$f’‘(x^*)<0$ 严格局部极大值,像山顶
$f’‘(x^*)=0$ 不能仅凭二阶导数判断

例如 $f(x)=x^4$ 与 $g(x)=-x^4$ 在 $x=0$ 的一阶、二阶导数都为零,但前者是极小值,后者是极大值。

多元函数中,要研究 Hessian 的正定性。

在 $\nabla f(x^*)=0$ 且函数二阶连续可导的前提下:

Hessian 的情况 结论
正定 严格局部极小值点
负定 严格局部极大值点
不定 鞍点,不是局部极值点
半正定但不正定 单靠二阶信息不能断定是否为极小值

正定可通俗理解为:从该点向任何非零方向考察,曲面在二阶近似下都向上弯。

不定则意味着:有的方向向上弯,有的方向向下弯。最典型的例子是:

\[f(x,y)=x^2-y^2\]

它在原点的梯度为零,但沿 $x$ 方向像谷底、沿 $y$ 方向像山顶,所以原点是鞍点。

另外,若一个二阶可导函数在某点取得局部极小值,其 Hessian 必须半正定;但半正定并不单独保证极小值成立。

10.3 对凸函数,为什么梯度为零就足够?

如果 $f$ 是定义在凸集上的可微凸函数,那么:

\[\boxed{\nabla f(x^*)=0\iff x^*\text{是全局最小值点}}\]

原因来自前面学过的切平面性质:

\[f(y)\ge f(x^*)+\nabla f(x^*)^T(y-x^*)\]

如果 $\nabla f(x^*)=0$,右边第二项消失:

\[f(y)\ge f(x^*)\]

对于定义域中任意 $y$ 都成立。因此 $x^*$ 就是全局最小值点。

这一推导特别值得记住:凸性提供全局保证,梯度为零提供候选位置,两者合在一起才能直接判定全局最优。

如果还知道函数严格凸,那么一旦存在这个最小值点,它就是唯一的。

11. 梯度下降:为什么沿负梯度方向走?

前面研究的是“怎样判断最优点”。但真实问题往往非常复杂,没法一步就解出 $\nabla f(x)=0$。

因此,我们需要一种从初始位置一步一步走向低处的方法。

11.1 下山的比喻

设想你蒙着眼睛站在山坡上:

  1. 感受脚下地形向哪个方向上升得最快。
  2. 朝完全相反的方向迈出一小步。
  3. 到新位置再重新感受坡度。
  4. 不断重复,尝试走向谷底。

这就是梯度下降。

11.2 用方向导数理解“最快”

设当前位置的梯度为:

\[g=\nabla f(x)\]

选择一个移动方向 $d$,沿它走一个很小的正步长 $\alpha$,则:

\[f(x+\alpha d)\approx f(x)+\alpha g^Td\]

式子里的 $g^Td$ 是两个向量的内积:

\[g^Td=\|g\|\,\|d\|\cos\theta\]

其中 $\theta$ 是梯度与移动方向的夹角。

如果只比较长度为 1 的方向,即 $\lVert d\rVert=1$,那么当 $\theta=180^\circ$ 时:

\[\cos180^\circ=-1\]

内积取到最小值:

\[g^Td=-\|g\|\]

这时:

\[d=-\frac{g}{\|g\|}\]

方向恰好与梯度相反。

所以:

\[\boxed{\text{负梯度方向是局部最速下降方向}}\]

注意:这是针对欧氏距离意义下等长、足够小的移动而言。它不意味着每一步走负梯度方向,一定能让整个迭代过程用最少步数完成。

11.3 梯度下降更新公式

通常把梯度方向的长度也放到学习率里,于是得到:

\[\boxed{x_{k+1}=x_k-\alpha_k\nabla f(x_k)}\]

它可以读成:

新位置 = 旧位置 − 步长 × 当前梯度。

这里:

  • $x_k$:第 $k$ 次迭代的当前位置;
  • $\nabla f(x_k)$:当前位置的梯度;
  • $-\nabla f(x_k)$:想走的下降方向;
  • $\alpha_k>0$:步长或学习率,控制每次迈多远;
  • $x_{k+1}$:下一次的位置。

12. 完整手算一次梯度下降

求:

\[\min_x f(x)=(x-3)^2+2\]

我们明明知道答案是 $x^*=3$,却故意假装不知道,用梯度下降来寻找。

第一步:求导数。

\[f'(x)=2(x-3)\]

第二步:选初始位置。

\[x_0=0\]

第三步:选学习率。

\[\alpha=0.2\]

第四步:反复更新。

第一次:

\[x_1=0-0.2\times2(0-3)=1.2\]

第二次:

\[x_2=1.2-0.2\times2(1.2-3)=1.92\]

第三次:

\[x_3=1.92-0.2\times2(1.92-3)=2.352\]

计算每次的函数值:

迭代次数 当前位置 $x_k$ 函数值 $f(x_k)$
0 $0$ $11$
1 $1.2$ $5.24$
2 $1.92$ $3.1664$
3 $2.352$ $2.419904$
4 $2.6112$ 约 $2.1512$
不断迭代 逐渐接近 $3$ 逐渐接近 $2$

可以看到:变量越来越接近 $3$,函数值也越来越接近理论最小值 $2$。

对于这个例子,更新还可以整理为:

\[x_{k+1}=0.6x_k+1.2\]

由 $x_0=0$ 可进一步得到:

\[x_k=3-3(0.6)^k\]

因为 $0.6^k\to0$,所以 $x_k\to3$。

这解释了梯度下降为什么可以在适当条件下逐渐靠近最优点。

13. 步长为什么重要?梯度下降会遇到哪些问题?

学习率过小: 每次只移动一丁点,虽然方向正确,但可能要走很多步。

学习率过大: 可能一下跨过谷底,在两侧反复跳动,甚至越跳越远。

学习率适中: 通常更容易稳定地逼近目标。

还是刚才的二次函数,更新后到最优点的误差满足:

\[x_{k+1}-3=(1-2\alpha)(x_k-3)\]

要让误差在这个例子中越来越小,需要:

\[|1-2\alpha|<1\]

也就是:

\[0<\alpha<1\]

这里的范围只针对当前二次函数,不是所有梯度下降问题都通用的学习率范围。

常见停止条件包括:

  • 梯度已经非常小;
  • 相邻两次的函数值变化很小;
  • 相邻两次参数变化很小;
  • 达到允许的最大迭代次数。

但如果函数不是凸函数,算法可能停在局部最小值或鞍点附近,不能保证得到全局最优解。

其他常见的无约束优化方法

方法 核心思想 主要特点
梯度下降法 沿负梯度逐步更新 简单、容易实现
牛顿法 同时利用一阶和二阶信息 条件合适时局部收敛很快,但计算 Hessian 及求解线性方程可能昂贵
拟牛顿法(如 BFGS) 用迭代信息近似二阶信息 在许多中小型光滑优化问题中表现良好
共轭梯度法 利用相互配合的搜索方向 常用于特定的大规模线性系统和优化问题
随机梯度下降(SGD) 每次用一个样本或一个小批次估计梯度 广泛用于机器学习

这些算法的共同点,是都在设法解决同一个问题:怎样更有效地降低目标函数。

14. 从无约束优化过渡到机器学习:线性回归

在真正研究感知机之前,先看一个更容易理解的机器学习例子。

假设我们要根据房屋面积预测房价。这里的输出是连续数值,不是类别。

采用线性模型:

\[\hat y_i=wx_i+b\]

其中 $\hat y_i$ 是预测值,$y_i$ 是真实房价。

希望预测越准越好,可以定义均方误差:

\[\boxed{L(w,b)=\frac1N\sum_{i=1}^N\left(y_i-(wx_i+b)\right)^2}\]

这个式子并不复杂:

  1. 计算每套房的“真实值 − 预测值”;
  2. 把误差平方,避免正负误差相互抵消;
  3. 把所有平方误差取平均;
  4. 寻找让平均误差最小的 $w,b$。

因此我们要解决:

\[\min_{w,b}L(w,b)\]

现在优化变量不再是抽象的 $x$,而是模型参数 $w,b$。

求偏导数:

\[\frac{\partial L}{\partial w}=-\frac2N\sum_{i=1}^N x_i\bigl(y_i-(wx_i+b)\bigr)\] \[\frac{\partial L}{\partial b}=-\frac2N\sum_{i=1}^N\bigl(y_i-(wx_i+b)\bigr)\]

再用梯度下降更新:

\[w\leftarrow w-\eta\frac{\partial L}{\partial w}\] \[b\leftarrow b-\eta\frac{\partial L}{\partial b}\]

整个思路可以概括成:

建立模型 → 定义损失 → 计算梯度 → 更新参数 → 让损失逐渐降低。

感知机接下来使用的也是这条思路,不过它解决的是二分类问题,使用的损失函数和参数更新公式会不同。

第三部分:感知机学习策略、原始算法、收敛性与对偶形式

15. 从“分对分错”到“分错多少”:分类间隔与距离

前面知道,感知机把:

\[s_i=w^Tx_i+b\]

当作第 $i$ 个样本的分类分数。

再乘上真实标签:

\[\boxed{m_i=y_i(w^Tx_i+b)}\]

这个量常称为函数间隔(functional margin);也可以先直观理解为“带正负号的正确程度”。

  • $m_i>0$:分对了,且不在边界上;
  • $m_i<0$:分错了;
  • $m_i=0$:恰好落在边界上。

例如,对于 $w=(2,1),b=-5$:

正样本 $x=(3,2),y=+1$:

\[m=(+1)(2\times3+1\times2-5)=3>0\]

分类正确。

负样本 $x=(3,2),y=-1$:

\[m=(-1)(2\times3+1\times2-5)=-3<0\]

分类错误。

为什么还要讨论几何距离?

假设两个样本都被分错了:

  • 样本 A 刚刚越过分类线;
  • 样本 B 远远落在错误的一侧。

直觉上,样本 B 的错误更加严重。

一个点到分类超平面 $w^Tx+b=0$ 的垂直距离为:

\[\boxed{d_i=\frac{|w^Tx_i+b|}{\|w\|}}\]

这里 $\lVert w\rVert$ 是权重向量的长度:

\[\|w\|=\sqrt{w_1^2+\cdots+w_n^2}\]

在 $w\ne0$ 时,几何间隔可以写成:

\[\boxed{\gamma_i=\frac{y_i(w^Tx_i+b)}{\|w\|}}\]

它为正,表示位于正确一侧;它为负,表示位于错误一侧。它的绝对值是到分类超平面的垂直距离。

特别地,对于误分类样本:

\[d_i=-\frac{y_i(w^Tx_i+b)}{\|w\|}\]

这个负号只是把误分类时的负值变成正的距离。

函数间隔与几何间隔的区别:

  • $y_i(w^Tx_i+b)$ 没有除以 $\lVert w\rVert$,随着 $w,b$ 同比例放大,其数值也会放大。
  • $y_i(w^Tx_i+b)/\lVert w\rVert$ 排除了这种整体缩放的影响,真正表示与超平面的有符号几何距离。

16. 感知机损失函数从哪里来?

如果只统计分错几个样本,虽然直观,但这个计数难以直接用于通常的梯度更新。

因此,我们希望设计一个函数,让:

  • 分对的样本不产生惩罚;
  • 分错的样本产生正的惩罚;
  • 分错得越严重,惩罚越大。

最常见的感知机损失定义为:

\[\boxed{L(w,b)=-\sum_{i\in M}y_i(w^Tx_i+b)}\]

其中 $M$ 是当前分类错误或落在边界上的样本集合:

\[M=\{i:y_i(w^Tx_i+b)\le0\}\]

对分错的样本,$y_i(w^Tx_i+b)<0$,前面加一个负号,就得到正损失。

例如有三个误分类样本,它们的函数间隔分别是:

\[-1,\quad -2,\quad -4\]

对应总损失:

\[L=1+2+4=7\]

我们希望损失尽可能小,因此:

\[\boxed{\min_{w,b}L(w,b)}\]

这样,训练感知机就成为一个以 $w,b$ 为决策变量的无约束优化问题。

16.1 为什么损失函数里没有 $\lVert w\rVert$?

前面讲的是几何距离:

\[-\frac{y_i(w^Tx_i+b)}{\|w\|}\]

但感知机使用的标准损失却是:

\[-y_i(w^Tx_i+b)\]

原因是它采用了更方便计算和更新的函数间隔惩罚,而不是严格的几何距离总和。不能把两者直接说成同一个量。

这么做使得在当前误分类样本确定时,损失对 $w,b$ 的表达式非常简单。

16.2 损失函数还可以怎样写?

每个样本的惩罚可以写成:

\[\ell_i(w,b)=\max\bigl(0,-y_i(w^Tx_i+b)\bigr)\]

因此总损失也可以写成:

\[\boxed{L(w,b)=\sum_{i=1}^N\max\bigl(0,-y_i(w^Tx_i+b)\bigr)}\]

这种写法有两个重要性质:

  1. 它对参数 $(w,b)$ 是凸函数,因为每一项是两个仿射函数 $0$ 与 $-y_i(w^Tx_i+b)$ 的最大值。
  2. 它在函数间隔恰好为 $0$ 的位置可能不可导,因此严格地说,感知机更新与次梯度(subgradient)方法有关。

先不需要深入学习次梯度,只需知道:不可导不意味着不能设计优化算法。

还有一个容易忽略的细节:当 $w=0,b=0$ 时,所有样本都恰好落在边界上,此时上面的损失也是零。因此单看“损失值为零”并不能证明样本已经被严格分开。标准感知机训练明确要求 $y_i(w^Tx_i+b)>0$,对等于零的样本也继续更新。

17. 为什么感知机更新公式是一个加号?

感知机最重要的两个更新公式是:

\[\boxed{w\leftarrow w+\eta y_ix_i}\] \[\boxed{b\leftarrow b+\eta y_i}\]

其中 $\eta>0$ 是学习率。

乍看之下,梯度下降不是“减去梯度”吗?为什么这里是加号?

17.1 从单个误分类样本的损失推导

对当前误分类样本 $(x_i,y_i)$,损失为:

\[\ell_i(w,b)=-y_i(w^Tx_i+b)\]

对 $w$ 求梯度:

\[\nabla_w\ell_i=-y_ix_i\]

对 $b$ 求导:

\[\frac{\partial\ell_i}{\partial b}=-y_i\]

将其代入梯度下降公式:

\[w_{\text{new}}=w_{\text{old}}-\eta\nabla_w\ell_i\]

得到:

\[\begin{aligned} w_{\text{new}} &=w_{\text{old}}-\eta(-y_ix_i)\\ &=w_{\text{old}}+\eta y_ix_i \end{aligned}\]

同理:

\[b_{\text{new}}=b_{\text{old}}+\eta y_i\]

原来,更新公式中的加号,正是“减去负梯度”的结果。

17.2 这两个公式在直观上做了什么?

情况一:误分类的是一个正样本,$y_i=+1$。

那么:

\[w\leftarrow w+\eta x_i,\qquad b\leftarrow b+\eta\]

这会让该样本的分类分数变大,鼓励它回到正类一侧。

情况二:误分类的是一个负样本,$y_i=-1$。

那么:

\[w\leftarrow w-\eta x_i,\qquad b\leftarrow b-\eta\]

这会让该样本的分类分数变小,鼓励它回到负类一侧。

用一句话概括:正样本分错,就把它的分数往上拉;负样本分错,就把它的分数往下推。

17.3 更新后,当前样本到底改善了多少?

这个结论很能说明算法为什么合理。

更新前,当前样本的函数间隔为:

\[m_i=y_i(w^Tx_i+b)\]

更新后:

\[\begin{aligned} m_i^{\text{new}} &=y_i\bigl((w+\eta y_ix_i)^Tx_i+b+\eta y_i\bigr)\\ &=y_i(w^Tx_i+b)+\eta y_i^2(\|x_i\|^2+1) \end{aligned}\]

由于 $y_i\in{+1,-1}$,所以 $y_i^2=1$:

\[\boxed{m_i^{\text{new}}=m_i+\eta(\|x_i\|^2+1)}\]

只要 $\eta>0$,右边增加的量就是正的。

这说明:每次更新都能改善当前被选中的误分类样本的函数间隔。

不过,这不代表其他样本的情况也一定同时改善。调好一个点后,可能让另一个点分错,因此需要反复训练。

18. 原始形式的感知机学习算法

现在可以把完整学习过程写出来了。

输入: 训练数据 $D={(x_i,y_i)}_{i=1}^N$,学习率 $\eta>0$。

初始化: 例如设 $w=0,b=0$。

循环执行:

  1. 从训练样本中找一个满足 $y_i(w^Tx_i+b)\le0$ 的样本。
  2. 它被分错或落在分类边界上,需要更新。
  3. 更新 $w\leftarrow w+\eta y_ix_i$。
  4. 更新 $b\leftarrow b+\eta y_i$。
  5. 继续检查训练数据。

终止: 如果所有样本都满足 $y_i(w^Tx_i+b)>0$,就找到了能严格正确分类训练集的超平面。

可以写成伪代码:

输入:训练样本 (x_i, y_i),学习率 η > 0
初始化:w = 0,b = 0

重复:
    找到一个满足 y_i (w^T x_i + b) <= 0 的样本
    如果不存在这样的样本:
        结束训练
    否则:
        w = w + η y_i x_i
        b = b + η y_i

输出:w、b,以及分类规则 sign(w^T x + b)

这里“随机梯度下降”的说法,指的是可以随机或依次选取一个训练样本进行更新;更严格地说,在分类边界等不可导点处,标准感知机可理解为一种单样本次梯度更新。

19. 完整例题:手算出感知机分类直线

下面用一个小到可以在纸上完整算完的例子。

设训练样本为:

样本 坐标 真实类别
$x_1$ $(3,3)$ $+1$
$x_2$ $(4,3)$ $+1$
$x_3$ $(1,1)$ $-1$

目标:寻找 $w=(w_1,w_2)$ 和 $b$,使这三个点全部被正确分类。

取:

\[w_0=(0,0),\qquad b_0=0,\qquad\eta=1\]

19.1 第一次更新:选正样本 $(3,3)$

当前分类分数:

\[w^Tx_1+b=0\]

其函数间隔:

\[y_1(w^Tx_1+b)=0\]

位于边界上,需要更新:

\[w\leftarrow(0,0)+1\times(+1)\times(3,3)=(3,3)\] \[b\leftarrow0+1\times(+1)=1\]

现在的分类边界是:

\[3x_1+3x_2+1=0\]

19.2 第二次更新:选负样本 $(1,1)$

当前分数:

\[3\times1+3\times1+1=7\]

模型把它预测为 $+1$,但真实标签为 $-1$,显然分错了。

更新:

\[w\leftarrow(3,3)+1\times(-1)\times(1,1)=(2,2)\] \[b\leftarrow1+1\times(-1)=0\]

新的分类边界为:

\[2x_1+2x_2=0\]

19.3 第三、第四次更新:负样本仍然分错

对于当前参数 $(w,b)=((2,2),0)$,负样本 $(1,1)$ 的分数:

\[2\times1+2\times1+0=4>0\]

它还是被错误地预测为正类,于是继续更新:

\[w=(1,1),\qquad b=-1\]

再次检查:

\[1\times1+1\times1-1=1>0\]

仍然分错,再更新:

\[w=(0,0),\qquad b=-2\]

这时负样本已经被正确分到负类一侧,但正样本又可能出错。

19.4 继续更新直至全部正确

按照下面这组合法的误分类样本选择顺序,参数一共更新七次:

更新次数 触发更新的样本 更新后的 $w$ 更新后的 $b$
0 初始化 $(0,0)$ $0$
1 $x_1=(3,3),y_1=+1$ $(3,3)$ $1$
2 $x_3=(1,1),y_3=-1$ $(2,2)$ $0$
3 $x_3=(1,1),y_3=-1$ $(1,1)$ $-1$
4 $x_3=(1,1),y_3=-1$ $(0,0)$ $-2$
5 $x_1=(3,3),y_1=+1$ $(3,3)$ $-1$
6 $x_3=(1,1),y_3=-1$ $(2,2)$ $-2$
7 $x_3=(1,1),y_3=-1$ $(1,1)$ $-3$

最终得到:

\[\boxed{w=(1,1),\qquad b=-3}\]

对应分类规则:

\[\boxed{f(x)=\operatorname{sign}(x_1+x_2-3)}\]

也就是分类直线:

\[\boxed{x_1+x_2-3=0}\]

19.5 最重要的一步:验证答案

检查正样本 $x_1=(3,3)$:

\[3+3-3=3>0\]

预测 $+1$,正确。

检查正样本 $x_2=(4,3)$:

\[4+3-3=4>0\]

预测 $+1$,正确。

检查负样本 $x_3=(1,1)$:

\[1+1-3=-1<0\]

预测 $-1$,正确。

因此,所有训练样本都被正确分类,算法可以停止。

这里得到的是一条可行分类直线,不一定是唯一的,也不代表它必然拥有最大的分类间隔。

19.6 顺便算一下几何距离

最终 $w=(1,1)$,所以:

\[\|w\|=\sqrt{1^2+1^2}=\sqrt2\]

三个样本到边界的几何距离分别为:

\[d_1=\frac{|3+3-3|}{\sqrt2}=\frac3{\sqrt2}\] \[d_2=\frac{|4+3-3|}{\sqrt2}=\frac4{\sqrt2}\] \[d_3=\frac{|1+1-3|}{\sqrt2}=\frac1{\sqrt2}\]

三个样本都在正确一侧,其中 $x_3$ 离边界最近。

20. 感知机为什么能够收敛?

感知机并不总能训练成功,要区分两种情形。

20.1 线性可分:有限次误分类更新后会停止

对于有限且严格线性可分的训练集,使用固定的正学习率、每次选取误分类或边界样本更新的标准感知机,存在经典的收敛保证:

经过有限次误分类更新,就能找到一组把训练样本严格分开的参数。

直觉上,因为确实存在正确的分界线,算法每次根据一个错误样本纠正参数,整体上能够不断朝某个可行分界方向取得进展。

20.2 线性不可分:标准算法可能反复纠错

如果无论画哪条直线,都有样本分错,那么标准感知机不可能满足“所有样本严格正确”这个停止条件。

它可能出现这样的循环:

  1. 调整参数,修正样本 A。
  2. 结果样本 B 又分错。
  3. 再调整参数,修正样本 B。
  4. 样本 A 又分错。

因此线性不可分时,标准感知机没有有限步成功停止的保证。实际使用时往往会设置最大训练轮数,或者改用其他模型及损失函数。

20.3 收敛定理中的 $R$ 和 $\gamma$

为了统一处理 $w$ 和 $b$,可以把参数和样本扩充一维:

\[\tilde w=\begin{pmatrix}w\\b\end{pmatrix},\qquad \tilde x_i=\begin{pmatrix}x_i\\1\end{pmatrix}\]

于是:

\[\tilde w^T\tilde x_i=w^Tx_i+b\]

现在假设:

  1. 每个增广样本的长度都有上界 $\lVert \tilde x_i\rVert\le R$。
  2. 存在一个长度为 $1$ 的理想参数向量 $\tilde w^*$,让所有样本都满足:

    \[y_i(\tilde w^{*T}\tilde x_i)\ge\gamma>0\]

那么从零向量出发,感知机的误分类更新次数 $k$ 满足:

\[\boxed{k\le\left(\frac R\gamma\right)^2}\]

这个界可以直观理解为:

  • 数据的整体尺度 $R$ 越大,理论上界可能越大;
  • 线性分隔的间隔 $\gamma$ 越大,理论上界越小。

也就是说,样本分得越清楚,通常越容易学习到一条正确的分类线。这个公式给的是最坏情况的更新次数上界,不是对每个数据集实际更新次数的精确预测。

20.4 选读:为什么会有这个收敛上界?

如果你目前只想掌握算法,可以先跳过下面推导;但它能帮助理解收敛定理的依据。

采用增广表示,更新为:

\[\tilde w_{t+1}=\tilde w_t+\eta y_i\tilde x_i\]

初始 $\tilde w_0=0$。

首先看当前参数在理想方向 $\tilde w^*$ 上的投影:

\[\begin{aligned} \tilde w_{t+1}^T\tilde w^* &=\tilde w_t^T\tilde w^*+\eta y_i\tilde x_i^T\tilde w^*\\ &\ge \tilde w_t^T\tilde w^*+\eta\gamma \end{aligned}\]

每更新一次,这个投影至少增加 $\eta\gamma$。更新 $k$ 次后:

\[\tilde w_k^T\tilde w^*\ge k\eta\gamma\]

再看参数长度的平方:

\[\begin{aligned} \|\tilde w_{t+1}\|^2 &=\|\tilde w_t+\eta y_i\tilde x_i\|^2\\ &=\|\tilde w_t\|^2+2\eta y_i\tilde w_t^T\tilde x_i +\eta^2\|\tilde x_i\|^2 \end{aligned}\]

因为更新发生在误分类或边界样本上,有:

\[y_i\tilde w_t^T\tilde x_i\le0\]

并且 $\lVert \tilde x_i\rVert\le R$,所以:

\[\|\tilde w_{t+1}\|^2\le\|\tilde w_t\|^2+\eta^2R^2\]

连续更新 $k$ 次:

\[\|\tilde w_k\|\le\eta R\sqrt{k}\]

最后使用柯西—施瓦茨不等式,并利用 $\lVert \tilde w^*\rVert=1$:

\[k\eta\gamma \le\tilde w_k^T\tilde w^* \le\|\tilde w_k\| \le\eta R\sqrt{k}\]

整理得到:

\[k\le\left(\frac R\gamma\right)^2\]

这说明,感知机并不是“凭感觉说能收敛”,而是具有明确的数学保证。

21. 什么是感知机的对偶形式?

原始形式直接更新:

\[w\leftarrow w+\eta y_ix_i\]

现在换个角度观察:每次权重变化,都是把某一个训练样本乘上一个系数,再加到 $w$ 上。

如果初始 $w=0$,训练很多次之后,权重自然可以写成:

\[\boxed{w=\sum_{i=1}^N\alpha_i y_ix_i}\]

这里 $\alpha_i\ge0$ 是第 $i$ 个样本累计的更新系数。

例如固定学习率 $\eta=1$,第一个样本更新过 2 次、第三个样本更新过 5 次,第二个样本从未触发更新,那么:

\[\alpha_1=2,\quad\alpha_2=0,\quad\alpha_3=5\]

于是:

\[w=2y_1x_1+5y_3x_3\]

对偶形式的核心思想就是:不直接存储权重如何一步步变化,而是记录每个训练样本为权重贡献了多少。

21.1 对偶形式更新什么?

对某个误分类样本 $i$,执行:

\[\boxed{\alpha_i\leftarrow\alpha_i+\eta}\] \[\boxed{b\leftarrow b+\eta y_i}\]

其他样本的 $\alpha_j$ 不变。

因为:

\[w=\sum_j\alpha_jy_jx_j\]

若只增加 $\alpha_i$,那么权重的实际变化就是:

\[\Delta w=\eta y_ix_i\]

与原始形式完全一致。

21.2 对偶形式怎样预测?

原始形式的分类分数是:

\[w^Tx+b\]

把 $w=\sum_i\alpha_i y_ix_i$ 代入:

\[\begin{aligned} w^Tx+b &=\left(\sum_{i=1}^N\alpha_i y_ix_i\right)^Tx+b\\ &=\sum_{i=1}^N\alpha_i y_i(x_i^Tx)+b \end{aligned}\]

因此:

\[\boxed{f(x)=\operatorname{sign}\left(\sum_{i=1}^N\alpha_i y_i(x_i^Tx)+b\right)}\]

你会发现:对偶形式里,样本之间的内积 $x_i^Tx$ 开始扮演重要角色。

22. Gram 矩阵:把样本之间的内积提前算好

训练时,经常要计算:

\[x_i^Tx_j\]

如果每次都重复计算,会做很多相似工作。

于是我们可以把所有样本两两之间的内积整理成一张表。这张表叫 Gram 矩阵:

\[\boxed{G_{ij}=x_i^Tx_j}\]

用前面的三个样本:

\[x_1=(3,3),\quad x_2=(4,3),\quad x_3=(1,1)\]

分别计算:

\[x_1^Tx_1=3\times3+3\times3=18\] \[x_1^Tx_2=3\times4+3\times3=21\] \[x_1^Tx_3=3\times1+3\times1=6\] \[x_2^Tx_2=4\times4+3\times3=25\] \[x_2^Tx_3=4\times1+3\times1=7\] \[x_3^Tx_3=1\times1+1\times1=2\]

得到:

\[\boxed{G=\begin{pmatrix} 18&21&6\\ 21&25&7\\ 6&7&2 \end{pmatrix}}\]

Gram 矩阵有两个非常直观的特点:

  1. 它是对称的,因为 $x_i^Tx_j=x_j^Tx_i$。
  2. 对角线上的值就是样本向量的长度平方,例如 $G_{11}=\lVert x_1\rVert^2=18$。

在对偶算法中,判断样本 $x_i$ 是否分错,需要:

\[y_i\left(\sum_{j=1}^N\alpha_jy_jG_{ji}+b\right)\le0\]

因此提前准备好 $G$,就能在训练时反复查表使用内积。

不过,Gram 矩阵需要存储 $N\times N$ 个数,样本很多时可能占用大量内存,因此“提前算好一定更高效”也不是绝对的。

22.1 用对偶形式重现前面的答案

前面七次更新的样本顺序中:

  • $x_1$ 被用于更新 2 次;
  • $x_2$ 没有被用于更新;
  • $x_3$ 被用于更新 5 次。

因为学习率为 $1$,所以:

\[\alpha_1=2,\quad\alpha_2=0,\quad\alpha_3=5\]

代入:

\[\begin{aligned} w &=\alpha_1y_1x_1+\alpha_2y_2x_2+\alpha_3y_3x_3\\ &=2(+1)(3,3)+0(+1)(4,3)+5(-1)(1,1)\\ &=(6,6)-(5,5)\\ &=(1,1) \end{aligned}\]

偏置也可以由更新贡献得到:

\[b=2(+1)+5(-1)=-3\]

于是与原始形式完全一致:

\[\boxed{w=(1,1),\qquad b=-3}\]

如果采用相同的样本处理顺序、学习率和初始化方式,两种写法产生的分类模型是一致的。

22.2 对偶形式为什么有价值?

它给我们提供了一个新的理解角度:

最终分类器可以看成由训练样本以不同权重组合出来的。

同时,对偶形式只涉及样本之间的内积。这与更进一步的核方法有关:某些核函数能在不显式构造高维特征的前提下,计算高维特征空间中的内积,从而让线性算法在变换后的特征空间里形成更复杂的分类边界。

核感知机是进阶内容。第一次学习时,理解“对偶形式记录样本贡献,Gram 矩阵保存样本内积”就足够了。

23. 原始形式与对偶形式完整对照

对比项目 原始形式 对偶形式
直接维护的主要量 权重 $w$、偏置 $b$ 样本系数 $\alpha_i$、偏置 $b$
选择更新对象 当前误分类样本 当前误分类样本
权重更新 $w\leftarrow w+\eta y_ix_i$ 通过 $\alpha_i\leftarrow\alpha_i+\eta$ 间接改变 $w$
偏置更新 $b\leftarrow b+\eta y_i$ $b\leftarrow b+\eta y_i$
分类分数 $w^Tx+b$ $\sum_i\alpha_iy_i(x_i^Tx)+b$
重要计算 特征向量和权重的内积 样本间的内积、Gram 矩阵
核心直觉 直接修正分类标准 记录各训练样本的累计贡献

两者不是两种互不相关的模型,而是同一种感知机学习思想的两种表示方式。