算法理论框架
沿着统计模型、传统机器学习和深度学习的演进顺序,科普算法如何表示数据、学习规律,并解决非线性与泛化问题。
核心
算法模型的演进,可以看成人工参与逐渐减少、模型表达能力逐渐增强的过程:统计模型依赖人工特征,传统机器学习开始自动组合规则,深度学习进一步把特征提取也交给模型。 三者并非简单的淘汰关系,而是在数据规模、问题复杂度、可解释性和计算成本之间做不同取舍。
算法到底在做什么
算法首先要把现实问题翻译成数学问题。一个完整的监督学习任务通常包含三部分:
- 输入 $x$: 已知信息,例如用户特征、商品属性或图像像素;
- 模型 $f_\theta$: 从输入到输出的函数,$\theta$ 是需要学习的参数;
- 输出 $y$: 希望预测的结果,例如销量、价格或类别。
训练的目标,是找到一组参数 $\theta$,让预测值 $\hat y=f_\theta(x)$ 尽量接近真实值 $y$:
\[\theta^*=\arg\min_\theta\frac{1}{n}\sum_{i=1}^{n} L\bigl(y_i,f_\theta(x_i)\bigr)\]$L$ 是损失函数(用一个数表示预测错得有多严重)。算法负责求解参数,人负责定义目标、准备数据、选择模型和评价标准。
flowchart LR
A["现实问题"] --> B["数据与特征"]
B --> C["统计/线性模型"]
C --> D["传统机器学习"]
D --> E["深度学习"]
E --> F["评估泛化能力"]
输入还会影响模型选择。表格、文本和图像对应不同的数据结构;类别要先编码成数字;时间序列不能随意打乱;用户—商品关系往往是稀疏矩阵。数据怎样表示,决定模型能看到什么。
第一阶段:统计模型从线性关系出发
统计模型的典型代表是线性回归和逻辑回归。它们结构简单、计算快、结果容易解释,但表达能力有限,因此非常依赖人工选择特征。
线性模型并不只会画直线
线性回归可以写成:
\[\hat y=w_0+w_1x_1+\cdots+w_px_p\]这里的“线性”,主要指预测值由各个特征加权相加。$x_i$ 不一定是原始数据,也可以是年龄平方、身高与体重的乘积等人工构造的特征。因此,线性模型在原始坐标中也可能画出曲线;只是在变换后的特征空间中,它仍然是平的。
这个“平”的边界叫作超平面(把直线和平面推广到任意维度):
\[w^\top x+b=0\]在二维空间中,超平面是一条直线;在三维空间中,它是一个平面;在 $n$ 维空间中,它是 $n-1$ 维的边界。线性分类器就是用这样的边界把数据分到两侧。
逻辑回归先计算线性得分,再用 Sigmoid 把它压到 $0$ 到 $1$ 之间作为概率。调整分类阈值,会形成 precision 与 recall 的权衡:阈值高,预测更保守;阈值低,覆盖更多正例,也更容易误报。
简单模型把压力留给了特征
数值特征可以直接进入模型,类别特征则要先编码:
- 有天然顺序的类别可以使用序数编码;
- 没有顺序的少量类别可以使用 one-hot 编码;
- 类别非常多时,可以学习 embedding(用低维连续向量表示离散对象)。
线性模型本身很轻,所以特征选得好不好往往直接决定效果。这也是早期算法“轻模型、重特征”的主要特征。
第二阶段:传统机器学习开始表达非线性
现实关系很少是一条直线。传统机器学习一方面继续改造线性模型,另一方面发展出决策树与集成学习,用更灵活的结构描述非线性规律。
正则化限制模型不要乱学
特征越来越多后,模型容易把噪声也当成规律。正则化(在训练目标中加入复杂度惩罚)为过大的参数收费:
\[\text{训练目标}=\text{原始损失}+\lambda\times\text{复杂度惩罚}\]Ridge 使用 L2 惩罚,通常让参数整体变小、更加稳定;Lasso 使用 L1 惩罚,更容易把部分参数压到零,因此可以自动筛选特征。$\lambda$ 太小可能过拟合,太大又会让模型过于简单,需要通过验证数据选择。
决策树用规则切分数据
决策树反复判断“某个特征是否超过某个阈值”,把样本切成越来越纯的区域。它能够直接表达非线性关系,而且单棵树容易解释;缺点是对数据变化敏感,树过深时很容易过拟合。
集成学习通过组合多棵树弥补这一缺点:
- 随机森林: 并行训练许多有差异的树,最后平均或投票,主要降低模型波动;
- GBDT: 串行训练许多小树,后一棵专门修正前面模型的错误,逐步降低整体损失。
传统机器学习比线性模型更强,却通常仍然依赖人工特征工程。对于结构化表格数据,GBDT 至今仍是非常有竞争力的选择。
第三阶段:深度学习让模型自己提取特征
神经网络把许多简单计算层叠加起来。每个神经元先做一次线性变换,再经过激活函数:
\[h=\sigma(Wx+b)\]如果没有非线性激活函数,多层线性变换最终仍能合并成一层,网络再深也只是线性模型。ReLU、Sigmoid 等激活函数打破了这种可合并性,让网络能够形成复杂的非线性关系。
隐藏层可以理解为一条自动学习的特征加工链:前面的层从原始输入提取简单模式,后面的层再把它们组合成更抽象的表示。于是人的工作重心从“手工造特征”转向设计网络结构、数据、损失函数和训练策略。
深度学习框架进一步把训练拆成标准循环:
- 前向计算预测值;
- 计算损失;
- 反向传播,自动计算梯度;
- 优化器沿降低损失的方向更新参数。
以 PyTorch 的 nn.Linear(2, 3) 为例,权重形状是 (3, 2):三行对应三个输出单元,两列对应两个输入特征,前向计算为 $y=xW^\top+b$。框架负责自动微分和张量计算,但模型是否有效,仍取决于问题定义和数据质量。
深度学习能够兴起,还依赖大规模数据、GPU 算力、训练算法和网络架构共同成熟。它擅长图像、文本、语音等非结构化数据,代价是训练成本更高、参数更多、解释更困难。
三代模型面对同一个难题:泛化
训练集表现好,不代表模型真正学到了规律。泛化(在没有见过的同类数据上继续有效)才是训练最终要交付的结果。
当模型过于复杂、特征太多或数据太少时,它可能把样本中的偶然噪声也记下来,这就是过拟合。常见控制方法包括:
- 增加有效训练数据;
- 降低模型复杂度或加入正则化;
- 划分训练集、验证集和测试集;
- 用交叉验证减少一次随机划分的偶然性;
- 持续监控上线后的数据分布变化。
评价指标也必须服务于业务。回归任务可以使用 MSE、MAE 或相对误差;分类任务可以使用 accuracy、precision、recall 或 AUC。没有脱离场景的“最佳指标”:漏诊和误诊的代价不同,推荐得少而准与推荐得多但混杂的价值也不同。
数据还会随时间变化。销量、价格和用户兴趣可能很快过期;图像和语言的底层结构相对稳定,却也不是永远不变。模型上线后甚至会反过来改变用户行为。因此,真实系统不仅要训练模型,还要处理时间切分、分布漂移和周期性更新。
如何选择模型
模型不是越新越好,而是要与问题匹配。
| 模型 | 更适合的场景 | 主要优点 | 主要限制 |
|---|---|---|---|
| 线性模型 | 小规模表格、需要解释的分析 | 快、稳定、容易解释 | 复杂关系依赖人工特征 |
| 树与集成学习 | 中等规模表格数据 | 非线性能力强,预处理较少 | 大型集成不容易整体解释 |
| 深度学习 | 图像、文本、语音和大规模数据 | 能自动学习多层表示 | 数据、算力和调试成本高 |
真正需要判断的是:数据有多少、关系有多复杂、是否必须解释、错误成本怎样计算,以及训练和推理预算是多少。
评价
写得好的地方
这套框架把不同算法放进同一条递进主线:线性模型建立基础,传统机器学习引入非线性与集成思想,深度学习再把特征提取纳入训练。用“人负责多少、模型能够学习多少”观察三代方法,适合作为机器学习的入门地图。
它也没有停留在模型名称,而是把输入表示、损失函数、过拟合、验证方法和业务指标串了起来。读者因此能看到,算法效果来自数据、模型和评价标准的共同作用。
可以改进的地方
“统计模型—传统机器学习—深度学习”是一条便于理解的教学顺序,却不是严格互斥的学术分类。现代方法会同时使用统计推断、树模型、神经网络和预训练表示,实际选型不能只按年代判断。
这套入门框架也只简要涉及因果关系、数据泄漏、分布漂移和线上反馈。继续深入时,需要把这些系统问题补上,才能从“理解模型”走向“长期运行可信的算法系统”。