Files
Notes/机器学习/统计学习要素-ESL-v1/9 第九章 增广模型,树,以及相关方法.md
2026-05-16 17:16:51 +08:00

13 KiB
Raw Permalink Blame History

title, draft, tags
title draft tags
9 第九章 增广模型,树,以及相关方法 false
ESL

[逻辑架构图]

本章探讨的是“带强结构假设的监督学习方法”,从系统架构的角度来看,这等同于用硬件拓扑(模型结构先验)来优化内存随机访问(维数灾难)。其内在逻辑可划分为四个层级:

  1. 架构哲学System Philosophy:引入结构假设,对抗维数灾难(用特定的寻址模式代替全局随机寻址)。

  2. 基础算子层Base Primitives

    • GAM独立并行处理SIMD无交互

    • Trees递归离散分支Hard Branching

    • MARS连续分段查找表Piecewise Linear LUT

    • PRIM掩码过滤与高频缓存挖掘Bitmask Subgrouping

  3. 动态调度机制Dynamic DispatchingHME (混合专家)EM算法本质是利用变分下界实现运行时的软路由Soft Routing与责任分配。

  4. 串行流水线增强Sequential PipelineBoosting,通过前向残差反馈(类似指令流水线的错误重放机制)将弱算子串联为强系统。


[深度整理正文]

第零层:核心世界观 —— 结构假设与维数灾难

第 9 章不再走“通用算法”的路线,而是开始讨论一类“带强结构假设的监督学习方法”。它们的核心思想不是盲目地在高维空间里硬拟合一个任意复杂的函数,而是先相信“真实的回归函数大概率有某种简单结构”,再利用这个结构去降维、降复杂度,从而缓解维数灾难。

所谓“监督学习”,手里有输入 X 和输出 $Y$,想学一个映射 $f(X)\approx Y$。回归里关心的是 $f(x)=\mathbb E[Y\mid X=x]$;分类里则是类别概率或决策边界。如果不加假设,直接在高维空间估计任意函数,数据需求会爆炸。一维需要局部样本,十维、二十维空间体积膨胀极快,样本变得极其稀疏,模型极不稳定。第 9 章方法本质是:别让函数“什么都能长”,给它加点骨架、形状约束,在较少数据下学得更稳。

但这需要付出“模型设错型”的代价(模型偏差)。这章的主线是经典权衡:结构越强,越容易拟合、越省数据,但越可能错;结构越弱,更灵活,但越吃数据、越容易不稳

{底层系统视角扩充}{维数灾难在计算机系统中等同于极其稀疏的巨大地址空间Sparse Address Space。如果不加结构假设相当于用一个巨大的一维数组Flat Memory去映射高维数据会导致极低的缓存命中率Cache Hit Rate。而本章介绍的方法,本质上是在构建特定的内存分页表Page Tables或哈希索引Hash Indices通过引入系统层面的强一致性“约束”强行提升数据的“空间局部性Spatial Locality用牺牲一部分灵活性偏差来换取访存性能的绝对稳定方差。}


第一层基础算子与空间切割机制GAM / Trees / MARS / PRIM

这四种方法都在“回归函数的结构”上做文章。

1. GAM广义可加模型独立管道流

假设函数可以写成各个变量单独作用的和:$f(x_1,\dots,x_p)=\alpha+\sum_{j=1}^p f_j(x_j)$。它假设“每个变量各管各的,再加起来就行”。比如房价受面积、位置、楼层分别影响。优点是可解释性强,高维问题拆成很多一维问题;缺点是忽略强交互作用。

{底层系统视角扩充}{GAM 相当于 CPU 中的 SIMD单指令多数据流向量化运算或多个无数据依赖的独立线程。各个 f_j(x_j) 之间不存在内存竞争和同步锁,极度容易并行计算,但在面对需要“跨线程通信”(特征交叉)的任务时表现无力。}

2. 树 (Decision Trees):离散条件分支与递归划分

树不假设函数光滑,而是通过“如果……那么……”规则(如 $x_1 < 3.5$),将特征空间一层层切分成“长方体区域”,在每个区域输出局部常数(均值或多数类)。它把复杂整体变成一堆局部简单模型。

  • 缓解维数灾难:不在整个高维空间精细插值,只在局部区域估计简单量。

  • 生成过程(贪心递归)找一个切分点使损失平方误差、Gini、交叉熵下降最多递归左右子节点。

  • 优缺点:直观、天然处理变量交互。但不稳定、极易过拟合、边界是“硬切”的分段函数阶梯。

    {底层系统视角扩充}{树在汇编层面是一颗庞大的 cmp(比较)与 jle / jg(条件跳转)指令构成的决策图。由于数据分布的不确定性,极深且复杂的决策树在推理时会引发极高的分支预测惩罚Branch Misprediction Penalty,频繁清空 CPU 流水线。它是一种典型的控制流Control-Flow驱动模型而非数据流驱动模型。}

3. MARS (多元自适应回归样条):连续插值查找表

MARS 的核心是用很多“折线零件”拼出一个复杂函数。它使用“铰链函数对”:(x-t)_+ = \max(0, x-t) 与 $(t-x)+ = \max(0, t-x)$。模型为:$\hat{f}(X) = \beta_0 + \sum{m=1}^{M} \beta_m B_m(X)$。

  • 自适应机制

    • 前向选择(贪心拆解):从字典里穷举所有变量和节点,加入铰链函数对(及交互乘积),使 RSS 下降最多。

    • 后向剪枝(结构优化):用 GCV广义交叉验证准则在 MSE 和基函数数量间找帕累托最优,删掉冗余。

  • 优缺点对比树是“区域常数硬切”MARS是“分段线性平滑连续”。MARS 自动找折点、处理交互、适合连续数值,但模型结构复杂。

    {底层系统视角扩充}{铰链函数 \max(0, x-t) 在底层其实就是现代神经网络中最常用的 ReLU 激活函数的原语。MARS 的前向生成可以视作一种JIT (Just-In-Time) 编译期的代码生成技术;而其后向剪枝过程,则完美等价于编译器优化中的 Dead Code Elimination死代码消除剥离那些对最终计算结果GCV评分贡献甚微的分支逻辑。它是一种连续内存分布的插值查找表LUT。}

4. PRIM (耐心规则归纳法):高纯度内存块挖掘

PRIM 不是追求全局最优,而是找“特别纯”的区域(子群发现、高风险人群)。它在特征空间找一个高维盒子 $a_j \le x_j \le b_j$。

  • 算法逻辑(耐心削苹果):从全空间开始,每次选一个边界稍微往里收缩,使盒子里的目标均值更高或纯度更强,直到满足条件。

  • 优缺点:适合做区域发现、异常子群分析,规则易解释。但找的是轴对齐盒子,不是完整预测器。

    {底层系统视角扩充}{PRIM 相当于在巨大的海量数据堆中进行掩码过滤Bitmask Filtering操作。它不关心全局的内存布局而是通过剥离边界Bitwise AND 操作)来锁定包含高频热点数据的 Cache Line缓存行。这在数据库系统中类似于建立一个专用的、针对极端异常值的 Partial Index部分索引。}


第二层:动态调度引擎 —— EM算法的系统解构与 HME (专家混合)

HME (混合专家) 引入了“分工合作”机制专家模型负责不同子区域门控模型决定在什么输入下相信哪个专家。HME 的训练极度依赖 EM 算法 (Expectation-Maximization)

1. EM 算法的数学推导与坐标上升机制

EM 是为了解决含隐变量 Z 的对数似然 \log p(X\mid \theta)=\log \sum_Z p(X,Z\mid \theta) 直接最大化极其困难的问题(\log 在积分求和外,强耦合)。

  • 构造下界 (Jensen 不等式):引入分布 $q(Z)$,得到变分下界 $\mathcal{L}(q,\theta) = \mathbb E_q[\log p(X,Z\mid\theta)] + H(q)$。

  • 恒等式核心$\log p(X\mid\theta) = \mathcal{L}(q,\theta) + \mathrm{KL}(q(Z) | p(Z\mid X,\theta))$。

  • 交替优化 (Coordinate Ascent)

    • E 步(拉紧下界):固定 $\theta^{(t)}$,优化 $q$。让 $\mathrm{KL}=0$,得到 $q^{(t+1)}(Z)=p(Z\mid X,\theta^{(t)})$。算出“责任度 (Responsibility)”。

    • M 步(横向爬升):固定 $q^{(t+1)}$,最大化期望完整数据对数似然 $\theta^{(t+1)} = \arg\max_\theta \mathbb E_{Z\mid X,\theta^{(t)}}[\log p(X,Z\mid\theta)]$。

  • 高斯混合模型 (GMM) 是软 K-means。E步算软分配 $\gamma_{ik}$M步用加权数据更新 $\pi_k, \mu_k, \Sigma_k$。

    {底层系统视角扩充}{直接最大化似然等同于试图获取一把全局阻塞锁Global Mutex在海量隐变量存在时会导致系统完全死锁。EM 算法本质上是一种无锁并发设计Lock-Free Design与交替状态机。E 步(算后验)相当于执行一次非破坏性的 Read 阶段,为各个数据点打上读时钟版本号(软权重分配)M 步相当于 Write 阶段,根据这些版本号进行局部数据的原子更新(横向爬升)。通过下界定理EM 保证了每次迭代的内存状态(似然)绝对不会回退。}

2. HME 中的 EM 实现:化嵌套为解耦

HME 的目标函数有两层嵌套的 $\log \sum$,直接求导是灾难。

  • E 步(算责任,拉下界):固定管理层(门控)和员工(专家),自下而上计算后验概率。如果专家预测准,加上门控预判,得到责任权重 $h_{ij}$。

  • M 步(各司其职,横向爬升):下界贴好后,死缠的参数解耦了。

    • 专家的爬升:加权最小二乘回归,拟合数据。

    • 门控的爬升:加权逻辑回归,优化路由眼光。

      {底层系统视角扩充}{HME 是一种带有动态分支预测Dynamic Branch Prediction动态链接Dynamic Linking的计算架构。门控网络就是一个软路由器Soft Router。M 步的解耦操作,在底层系统上完美实现了计算任务的打散Scatter与收集Gather,每一个加权回归任务可以被独立丢进不同的 GPU Stream 中并发执行,因为它们在数学上已经被完全隔离。}


第三层:串行纠错流水线 —— Boosting (提升树)

如果随机森林Bagging是“民主投票”降方差并行HME 是“层级管理”EM找局部最优那么 Boosting 就是“错题集进阶法”靠“串行”和“累加”降低偏差Bias

  • 加法模型与前向分布$F_m(x) = F_{m-1}(x) + \alpha_m h_m(x)$。采用前向分步算法,每一步只学一棵树,学完固定。

  • GBDT (Gradient Boosting):在第 m 步,当前树拟合的不再是原 $y$,而是损失函数相对于当前预测值的负梯度(残差)$r_{im} = -\left[ \frac{\partial L(y_i, F(x_i))}{\partial F(x_i)} \right]{F=F{m-1}}$。利用学习率 \eta 稳步更新。

  • AdaBoost:通过增加前一棵树分错样本的权重,迫使新树重点关注困难样本。

    {底层系统视角扩充}{Boosting 模型在计算机体系结构中对应着深层指令流水线Deep Instruction Pipeline。前向分步算法的本质是一种存在严重写后读RAW - Read After Write数据依赖的串行执行模式。第 m 棵树必须等待第 m-1 棵树的计算结果(残差/梯度)写入寄存器后才能开始执行,因此它极难进行树级别的并行化。相比之下Bagging 就像是完全解耦的 RAID 1 镜像阵列,而 Boosting 更像是带有增量前馈纠错机制的误差反向放大器,通过一系列微小的增量补丁(学习率 \eta 控制的细粒度操作),最终把一个高延迟的弱指令序列(弱学习器)编译成了一个高度精准的强力程序(强分类器)。}


[边界知识联动]

为了将此章节心智模型与更广泛的系统知识彻底打通,你可以做如下联想:

  1. 特征切分Trees/MARS vs. 内存分页与段错误Paging & Segfaults:决策树的“硬切割”类似于内存管理的分页机制Paging边界是绝对的跨界即发生上下文切换MARS 的“折线平滑”则类似于计算机图形学中的抗锯齿Anti-Aliasing渲染缓冲

  2. PRIM vs. OOM (Out Of Memory) 诊断PRIM 寻找高风险极值区域的逻辑和系统运维中使用火焰图Flame Graph从海量进程栈中逐级过滤收缩Shrinking最终定位到导致内存泄漏高浓度异常区域的特定函数代码块一模一样。

  3. EM 算法的 E-M 交替 vs. CPU Cache 的 MESI 协议E 步计算责任度相当于通过总线嗅探Snooping当前各 Cache Line 的共享状态并标记权限Shared/InvalidM 步相当于拥有独占修改权Modified的核对其局部参数进行更新写入。

  4. Boosting 的残差拟合 vs. PID 控制器与信号处理在硬件控制系统中GBDT 对负梯度的不断拟合本质上是一个带有积分Integral和比例Proportional反馈的数字 PID 控制回路。前序树的偏差作为误差信号输入,下一棵树生成纠正信号进行补偿。