--- title: 8 第八章 模型推断和平均 draft: false tags: - ESL --- ## [逻辑架构图] 1. **不确定性的度量底座**:以 **MLE** 为起点,利用 **Fisher 信息** 定义参数空间的“曲率”与方差。 2. **推断的两大范式(仿真与叠加)**: - **Bootstrap(重点扩充)**:通过对经验分布的重采样模拟真实的抽样分布(计算暴力美学)。 - **Bayes 方法**:利用“能量场叠加”生成后验分布,通过先验注入物理约束。 - **深度关联**:揭示 Bootstrap 是贝叶斯后验的非参数化近似。 3. **计算引擎的底层实现**: - **EM 算法**:在“隐变量迷雾”中通过 E-M 迭代寻找似然下界的最高点。 - **MCMC**:通过马尔可夫链在高维能量场中进行“探索采样”。 4. **群体决策与架构集成**: - **Bagging**:通过并行化的 Bootstrap 采样降低方差(冗余设计)。 - **Stacking/模型平均**:多级流水线式的预测融合。 5. **统一视角**:概率模型下的不确定性闭环。 --- ## [深度整理正文] ### 1. 极大似然估计 (MLE) 与 Fisher 信息矩阵 **我原本的内容**:我们要看“山峰”有多尖。评分函数 $\dot{\ell}(\theta)$ 在极值点等于 0。费雪信息矩阵 $I(\theta) = -E [ \frac{\partial^2 \ell(\theta)}{\partial \theta \partial \theta^T} ]$。曲率越陡,$\hat{\theta}$ 越确定。核心公式:$Var(\hat{\theta}) \to I(\theta)^{-1}$。 **{深度扩充}**: > {在底层系统优化中,Fisher 信息矩阵的逆 $I(\theta)^{-1}$ 实际上定义了参数空间的**克拉美-罗下界(Cramér-Rao Bound)**。 > > 每一个参数估计器(Estimator)都有其方差极限,而 MLE 在大样本下是渐近有效的(Asymptotically Efficient),这意味着它能精准踩在这个极限上。 > > 从计算机视觉或信号处理的角度看,这类似于**信噪比(SNR)**:如果似然函数的曲率很低,说明信号被淹没在噪声中,无论你如何增加采样频率(计算量),你对参数的估计依然存在无法消除的抖动(Variance)。} ### 2. 自助法 (Bootstrapping):底层机理的深度解析 **我原本的内容**:自助法是在原始数据集中进行有放回的采样(Sampling with replacement),构建出多个不同的子训练集。 **{深度扩充}**: > {我们要深度理解 **为什么 Bootstrap 有效?** > > 核心在于 **统计学插件原理(Statistical Plug-in Principle)**: > > 当我们无法观测真实的总体分布 $F$ 时,我们用观测到的 $N$ 个样本生成的**经验分布函数 $\hat{F}$ (EDF)** 来替代它。 > > 1. **模拟“上帝视角”**:在真实世界中,我们需要从总体 $F$ 中抽取 $B$ 个独立数据集才能看到参数 $\theta$ 的波动。但在现实中我们只有一个数据集。Bootstrap 通过从 $\hat{F}$ 中“有放回抽样”,模拟了从 $F$ 中抽样的过程。 > > 2. **收敛性保证**:随着 $N \to \infty$,$\hat{F}$ 趋近于 $F$。因此,在 $\hat{F}$ 上观察到的参数方差,就是对 $F$ 上参数方差的无偏估计。 > > 3. **计算冗余与 OOB (Out-of-Bag)**: > > 对于每一个自助样本集,大约有 $(1 - 1/N)^N \approx 1/e \approx 36.8\%$ 的原始数据没有被抽中。 > > {这 36.8% 的数据就是天然的“验证集”。在系统实现中,这允许我们进行**原地验证(In-situ Validation)**,无需像交叉验证(CV)那样手动切分数据块,从而在处理流式数据时具有更高的吞吐量。} > > > **Bootstrap 的系统代价**: > > 它是一个**计算密集型**任务。如果你有 $B=1000$ 个采样,你的总计算开销就是单模型的 1000 倍。 > > 在现代多核架构下,每一个 Bootstrap 任务都是独立的线程,可以完美适配 **SIMD** 或 **GPU 并行**。但其内存开销在于,虽然数据是重复的,但如果模型很大, $B$ 个模型的参数权重会迅速吃掉所有 L3 Cache 甚至驻留内存(RSS)。} ### 3. 贝叶斯方法:先验与能量场的叠加 **我原本的内容**:贝叶斯定理 $P(\theta|Z) = \frac{P(Z|\theta)P(\theta)}{P(Z)}$。取对数后:$E_{posterior} = E_{likelihood} + E_{prior}$。先验反映了看到数据前的经验(如权重应该很小,这是 Lasso/Ridge 的来源)。 **{深度扩充}**: > {在贝叶斯视角下,预测分布 $P(y_{new}|Z) = \int P(y_{new}|\theta) P(\theta|Z) d\theta$。 > > 这是一个典型的**加权平均**过程。对比 MLE 只用一个最高点预测(点估计),贝叶斯预测是在整个参数分布上做卷积。 > > {从编译器优化的角度看,如果你假设先验是高斯分布,后验也是高斯分布(共轭先验),那么这个积分有闭式解。但如果不是,我们就必须退化到数值积分或采样。贝叶斯方法的“保守”本质上是因为它考虑了所有可能的 $\theta$,这种**稳健性(Robustness)**在航空航天控制等不容许单点故障的系统中是不可或缺的。} } ### 4. EM 算法:在隐变量的迷雾中登山 **我原本的内容**:对付隐变量(Latent Variables) $Z^m$。E 步计算隐藏数据的期望,构造 Q 函数。M 步寻找让 Q 达到最大值的 $\theta$。 **{深度扩充}**: > {EM 算法的数学核心是 **詹森不等式(Jensen's Inequality)**。 > > $\ell(\theta) = \log \sum_{Z^m} P(Z, Z^m|\theta) \ge \sum_{Z^m} P(Z^m|Z, \theta^{(j)}) \log \frac{P(Z, Z^m|\theta)}{P(Z^m|Z, \theta^{(j)})}$ > > {右边那一项就是我们在 E 步构造的**似然下界(ELBO)**。EM 算法就像是在做一个 **双缓冲区交换(Double Buffering)**: > > - **E 步**:在当前位置向上修筑一个支撑平面(下界)。 > > - **M 步**:在这个平面上走到最高点。 > > > 这个过程保证了似然值在单调不减的同时,避开了直接对“Log-Sum”项求导的灾难性计算复杂度。在分布式存储系统的去重(De-duplication)算法中,也有类似 EM 的迭代逻辑来估计数据块的分布。} } ### 5. MCMC 采样:高维能量场的探测器 **我原本的内容**:既然算不出积分,就去分布里“旅游”。MH 算法:计算接受率 $\alpha = \min(1, \frac{P(\theta'|D)}{P(\theta|D)})$,能量低(概率高)百分之百跳,能量高以一定概率跳。 **{深度扩充}**: > {MCMC 真正的硬核在于它解决了**维度灾难**。 > > 传统的数值积分(如辛普森法则)随维度 $d$ 呈指数级增长;而 MCMC 的误差下降速度仅受样本量 $B$ 影响,与维度 $d$ 的关系较弱。 > > {在系统层面,MCMC 的瓶颈在于**冷启动问题(Warm-up/Burn-in)**。马尔可夫链初始阶段的样本不符合目标分布,必须丢弃。这类似于缓存预热(Cache Warming):在系统达到稳态(Steady State)之前,所有的预测都是不可信的。 > > **Gibbs 采样**则利用了条件分布,每次只更新一个维度。这在硬件实现上可以类比为**流水线局部刷新**:我不更新整个寄存器组,只更新受影响的那个位。} } ### 6. 袋装法 (Bagging):通过并行冗余降低方差 **我原本的内容**:Bagging 的名称来源于 "Bootstrap" 和 "Aggregating"。分类用投票法,回归用平均法。优势是降低方差,并行计算。最经典的应用是随机森林(Random Forest)。 **{深度扩充}**: > {Bagging 为什么能降低方差? > > 假设我们有 $B$ 个独立的基模型,每个模型的方差是 $\sigma^2$,且它们之间的相关系数为 $\rho$。 > > 则集成模型的总方差为:$\rho\sigma^2 + \frac{1-\rho}{B}\sigma^2$。 > > 1. **当模型完全独立($\rho=0$)时**:方差降为 $\sigma^2/B$。这也就是你笔记中提到的“平均法”的神力。 > > 2. **随机森林的精髓**:它不仅用 Bootstrap 采样数据,还随机选择特征(Feature Subspacing)。这在本质上是为了**强制降低基模型之间的相关性 $\rho$**。 > > > {在程序员视角下,Bagging 是一种**多副本容错架构**。单棵决策树极其不稳定(数据抖动一下,根节点就变了),类似于一个不带 ECC 的内存条。Bagging 通过 $B$ 个副本的冗余,利用大数定律对冲掉了单个节点的随机错误。同时,由于各个模型之间没有数据依赖(No Data Dependency),它可以实现** Embarrassingly Parallel(极易并行化)**,在多核 CPU 上实现接近线性的加速比。} } ### 7. 模型平均 (BMA) 与堆栈 (Stacking) **我原本的内容**:训练 $p(\theta|D)$ 是为了得到一张全景导航图。Stacking 是把输出当作输入。 **{深度扩充}**: > {**Bayesian Model Averaging (BMA)**: > > 权重分配基于模型的边际似然 $P(D|M_k)$。这意味着表现越好的模型话语权越大。 > > **Stacking (堆栈)**: > > 这是一层**元学习(Meta-learning)**。基模型的预测结果变成了一张全新的特征表。 > > {实现 Stacking 时最忌讳的是“数据泄露”。如果用同一个数据集既训练基模型又训练元模型,元模型会学会“信任那个已经过拟合的基模型”。 > > 因此,Stacking 在工程上必须配合 **$K$-Fold CV**:每一个基模型的输出必须是针对它未曾见过的 Hold-out 数据的预测。这在系统设计中被称为 **隔离保护(Isolation)**,防止过拟合的毒素在流水线中向下游蔓延。} } --- ## [边界知识联动] - **内存一致性与并行 Bootstrap**:在进行大规模 Bagging 时,如果使用 Python 等带有 GIL(全局解释器锁)的语言,多线程会退化为单线程。真正的专家会使用多进程(Multiprocessing)并配合 **Shared Memory** 或 **Plasma Store**,避免数据在进程间频繁序列化(Pickle)带来的巨大 CPU 开销。 - **信号处理中的 Fisher 信息**:在雷达探测或 GPS 定位中,Fisher 信息矩阵用于计算 **GDOP (几何精度因子)**。它告诉硬件工程师,卫星的几何分布(参数空间曲率)如何影响最终的定位方差。 - **编译器调优与随机搜索**:正如你笔记末尾提到的,现代编译器(如 LLVM)在寻找最佳指令组合时,往往会使用类似 **Random Search** 或 **模拟退火** 的策略。这是因为参数空间太大且非凸,寻找全局最优解(MLE)不可行,只能通过采样(MCMC 思想)找到一个足够好的局部解。 - **虚拟内存与 COW**:在实现 Bootstrap 时,如果你的原始数据集有 100GB,抽样 100 份并不意味着需要 10TB 内存。利用 Linux 的 **fork()** 和 **Copy-on-Write**,所有子进程初始共享同一块物理内存页,只有当某个采样模型试图修改数据(极少发生)时,才会发生物理复制。