Files
Notes/机器学习/统计学习要素-ESL-v1/2 第二章 监督学习概要.md
2026-05-16 17:16:51 +08:00

108 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 2 第二章 监督学习概要
draft: false
tags:
- ESL
---
## [逻辑架构图]
本章知识点构成了一个严密的系统架构模型,逻辑链条如下:
1. **I/O 接口定义 (数据与任务)**:明确系统的输入输出协议(回归 vs 分类)。
2. **目标函数与编译指示 (损失与判别)**:定义系统优化的终极目标(让损失函数最小化),决定了参数更新的方向。
3. **两种极端的底层架构 (最小二乘 vs KNN)**全局参数化模型高Bias/计算密集型与局部非参数化模型高Variance/内存密集型)的对立与适用场景。
4. **系统的物理极限 (偏差-方差权衡)**:揭示了由于数据有限性和噪声引起的泛化瓶颈,打碎了“完美拟合”的幻想。
5. **地址空间重映射 (基函数与核方法)**:通过特征空间的非线性映射(类似虚拟内存映射),将原空间的高维复杂逻辑降维打击,化繁为简。
6. **系统级约束与调度 (归纳偏置与正则化)**:通过引入先验规则(平滑度、贝叶斯假设),限制解空间的野蛮生长,确保系统在未知状态下的鲁棒性。
---
## [深度整理正文]
### 一、 系统的 I/O 接口定义:输入与输出映射
监督学习本质上是一个确定输入输出协议的**黑盒映射系统**。
* **变量术语约定(接口定义)**
> “在统计学中,输入变量 (inputs) 通常称作 **预测变量 (predictors)**,这是一个与输入变量等价的说法,更经典的说法是 **自变量 (independent variables)**。在模式识别中,更倾向于采用 **特征 (features)** 的说法,我们也会采用这一说法。输出变量 (outputs) 被称作 **响应变量 (responses)**,或者更经典的说法是 **因变量 (dependent variables)**。”
* **任务类型(数据类型决定指令集)**
* **预测输出 => 回归 (Regression)**{底层对应连续的浮点数空间映射,目标是逼近一个标量或向量函数。}
* **预测分类 => 分类 (Classification)**{底层对应离散的枚举类型或One-Hot编码目标是划定系统状态的决策边界 (Decision Boundary)。}
* **学习的本质描述**
> 给定输入向量 $X$,对输出 $Y$ 做出一个很好的估计,记为 $\hat{Y}$。如果 $Y$ 取值为 $\mathbb{R}$,则 $\hat{Y}$ 取值也是 $\mathbb{R}$;同样地,对于类别型输出,$Y$ 取值为对应 $G$ 取值的集合。
### 二、 系统目标与判别理论:损失函数 (Loss Function)
系统怎么知道自己做得好不好?必须定义“误差衡量标准”。
* 我们希望**最小化的是**`目标和现实的差距`
* **0-1损失函数**:相当于一个绝对的错误损失 => 取决于你在乎什么 {这是一种非凸、不可导的阶跃函数,在计算机底层极难直接通过梯度下降优化,通常需要找代理损失函数 (Surrogate Loss)}。
* **交叉熵 (Cross-Entropy)**:如果是多分类,一般用交叉熵。
* **本质**:用模型分布 $q$ 去描述真实分布 $p$,需要付出的“代价”。
* {**深度扩充:信息论视角的底层逻辑**:交叉熵 $H(p, q) = -\sum p(x) \log q(x)$。在信息论中,它代表如果我们用模型 $q$ 来对真实数据 $p$ 进行霍夫曼编码Huffman Coding系统平均需要消耗多少 bit 的存储空间。让交叉熵最小,就是让你的模型系统对数据的压缩效率达到物理极限(即真实分布的香农熵)。}
### 三、 两种极端的系统架构:全局 vs 局部
为了实现映射,我们有两种截然不同的底层架构。
* **最小二乘法 (Ordinary Least Squares, OLS):全局学习** ^1fba7c
* **最小二乘假设**$f(x)$ 是某个整体线性函数的良好近似。
* {**深度扩充:计算密集型 (Compute-Bound)**:线性模型在底层最终化简为矩阵乘法 $\hat{\beta} = (X^T X)^{-1} X^T Y$。这是一种高度全局化的抽象,参数量固定($O(1)$ 空间复杂度)。它极其契合 CPU/GPU 的 ALU 阵列设计和 L1 Cache 预取,计算极快,但表达能力受限。}
* **k最近邻算法 (K-Nearest Neighbors, KNN):局部学习**
* **最近邻假设**$f(x)$ 是局部常值函数的良好近似。
* **各向同性 (isotropic)**:以某个点为中心,向所有方向扩展方式完全相同的局部区域。
* {**深度扩充:内存/带宽密集型 (Memory-Bound)**KNN 本质上是“延迟计算 (Lazy Evaluation)”,它不压缩数据,而是把整个训练集存在内存里。每次预测都需要遍历计算距离,这会导致严重的 Cache Miss缓存未命中且在特征维度极高时遭遇“维度灾难”——高维空间中所有点都在边界上所谓的“最近”失去了统计意义。}
* **两种架构适用的数据情境 (Data Context)**
* **情境 1**:每一类的训练数据是从二元正态分布 (不相关且均值不同) 中生成的 => **适用线性模型(全局)**
* **情境 2**:每一类的训练数据是来自 10 个低方差的高斯分布的混合,每一个高斯分布都有各自的均值 => **适用KNN模型局部**
### 四、 系统的物理极限:偏差-方差分解 (Bias-Variance Decomposition)
^2346c8
你精确地指出了:“偏差-方差分解这只是线性模型所能够模拟的极限”。
* **泛化误差公式**$E = \text{Bias}^2 + \text{Variance} + \text{Noise}$
* **Bias (偏差)** => 拟合数据的能力;系统本身的逻辑缺陷。
* **Variance (方差)** => 泛化能力;系统对输入波动的敏感度。
* **Noise (噪声)** => 不可控的系统外力;{物理世界采样的固有熵,即贝叶斯最优误差,这是任何算法都无法突破的下界}。
* **所有模型核方法、基函数、KNN、正则化本质都在通过一个参数控制复杂度而模型选择的核心问题就是在 Bias 和 Variance 之间找到最优平衡点。**
### 五、 地址空间重映射:从线性到非线性
面对复杂的非线性现实,我们不需要重构系统,只需要做一层“中间件映射”。
* **突破线性束缚的手段**
* 手动特征变换 => 人自己定义基底。
* 核方法变换 (Kernel Methods)。
* **基函数方法与字典**
* **基函数方法**:把输入 $x$ 映射成一组“特征函数”,然后对这些函数做线性组合。基函数类似线性代数的基底,每个基函数都是一个 $e_i$。
* **基函数**:一组用来“表示函数”的基本构件。常见如多项式,$h_0(x) = 1, h_1(x) = x, h_2(x) = x^2$ 诸如此类。
* **字典方法**:字典是一大堆候选基函数的集合。
* **核心洞察**:基函数方法就是通过一个非线性映射 $\phi(x)$,把输入变换到一个新的特征空间,在该空间中用线性模型进行拟合,从而在原空间中实现对复杂非线性函数的逼近。
* **金句升华****机器学习的本质不是“让模型变复杂”,而是“找到一个合适的表示,使问题在这个表示下变简单(线性)”。**
* {**深度扩充OS层面的类比**:这完美等价于操作系统中的**虚拟内存机制 (Virtual Memory)**。真实的物理内存(非线性原始数据空间)碎片化且难以直接操作,但通过 MMU基函数/核函数)的映射,每个进程(模型)都看到了一片连续、平坦、无限大的虚拟地址空间(高维线性特征空间),从而可以用最简单的线性寻址方式解决极度复杂的问题。}
### 六、 系统的安全机制:归纳偏置与解空间限制
这是你笔记中最精辟的部分:“为了得到有限的有用结果,我们必须限制解的集合。”
* **纯数学拟合 vs 统计学习**
* 我们真正想要的不是:拟合训练数据;而是:**找一个“合理的函数”**。
* 所以我们做的是:在所有能让 RSS (残差平方和) 小的函数里,挑一类“我们认为好的函数”。
* 我们想要找的不是经过这些特定点的所有函数(解空间)(静态拟合),而是**预测没有见过的数据(动态泛化)**。
* **结论****机器学习的本质不是“拟合数据”,而是“在有限数据下做合理的函数选择”。**
* **引入归纳偏置 (Inductive Bias) 的具体手段**
* 优先引入限制,比如要求函数平滑,具有线性,不能剧烈振荡:
* **粗糙度惩罚 (Roughness Penalty)**:数学观点,太复杂和太不平滑的不要。{底层对应 L1/L2 正则化,类似于在数字信号处理中加入低通滤波器,过滤掉代表高频突变(过拟合)的噪声}。
* **Bayes方法**:以先验信仰,看函数本身是否合理。{在权重初始化时赋予概率分布,相当于给系统一个极其坚实的 Fallback (后备) 方案,当数据不足时,系统倾向于保持先验状态}。
* **核方法 / 局部回归**:在“某个点附近”用加权平均或简单模型来估计 $\mathbb{E}[Y|X]$。
---
## [边界知识联动]
为了将这些统计学习的概念焊死在你的程序员基因里,我们可以做以下系统级联动:
1. **偏差-方差 与 TCP拥塞控制**
* 高 Bias 类似于 TCP 窗口设得极小,虽然稳定不丢包(方差小),但传输效率极低,无法适应好网络。
* 高 Variance 类似于不设限的 UDP 满负荷发送,对网络状态(训练数据)极其敏感,稍微一点抖动(噪声)就会导致全盘重传(过拟合)。
2. **基函数映射 (Kernel Trick) 与 缺页中断 (Page Fault)**
* 核技巧允许我们在无限维的空间里计算内积,而不需要真正把数据升维。这就像 OS 处理庞大的虚拟内存:并不需要一开始就分配 $2^{64}$ 字节的物理内存,而是只在计算实际发生(被寻址)时,通过点积快速求值,极大节省了计算和存储资源。
3. **正则化 与 缓存替换策略 (Cache Eviction)**
* 正则化(尤其是 L1 导致稀疏性)就像是 Cache 中的 LRU (Least Recently Used) 策略。为了防止系统被无效变量撑爆,强行惩罚/淘汰掉那些权重微小(不常访问)的特征,强制保持系统的轻量化与核心运算的高效。