机器学习
机器学习算法的组成
一个机器学习算法由以下内容组成
- 假设函数:定义输入和输出的映射关系,根据函数的表现形式决定当前任务的类型,如假设函数为线性函数,则当前任务为线性回归模型。
- 代价函数:代价函数是评估标准,用来衡量当前模型预测的结果和真实数据之间的差距。学习的目标是让这个值尽可能的笑。
- 优化算法:负责不断的调整参数,通过不断计算代价函数的实际值最终找到让代价函数最小的参数。
机器学习的过程就是用优化算法,把假设函数代入到代价函数中,不断迭代优化参数,当参数降到最低时就获得了训练好的线性回归模型。
| 组件 | 微调后的精确表述 |
|---|---|
| 假设函数 h(x) | 义了输入 x 到输出 y 的映射形式,决定了模型的表达能力 |
| 代价函数 J(θ) | 它量化了当前参数下模型的"错误程度",优化目标就是让 J(θ) 尽可能小 |
| 优化算法 | 告诉你怎么更新 θ 才能让 J(θ) 下降(如梯度下降、正规方程) |
三者的关系(流程图)
text
假设函数 h(x) ← 选什么模型
↓
代价函数 J(θ) ← 怎么才算好
↓
优化算法 ← 怎么变更好
↓
最优参数 θ ← 训练完成
后续任何算法(SVM、神经网络、决策树...),都可以进行拆解:
| 算法 | 假设函数 | 代价函数 | 优化算法 |
|---|---|---|---|
| 线性回归 | θᵀx | MSE(均方误差 Mean Squared Error) | 梯度下降 / 正规方程 |
| 逻辑回归 | 1/(1+e^(-θᵀx)) | 交叉熵 | 梯度下降 |
| 神经网络 | 多层复合函数 | 交叉熵 / MSE | 反向传播 |
| SVM | 核函数映射 | 合页损失 | SMO / 拉格朗日对偶 |
完整的机器学习过程
- 收集数据
- 人工标注
- 模型选择及特征设计和数据处理
- 训练及调优和评估模型
- 开发应用和服务,加载模型
- 提供服务
与大模型相关概念笔记
一、机器学习与深度学习的核心差异
-
特征提取
- 机器学习:依赖人工设计特征。
- 深度学习:自动从原始数据中学习特征。 梯度下降
-
模型复杂度与参数数量
- 机器学习:模型简单,参数少。
- 深度学习:模型复杂,参数多。
-
样本数量要求
- 机器学习:中小规模数据即可。
- 深度学习:需海量数据。
二、大模型细分领域微调
-
数据量要求
- 文本类任务:几千到几万条高质量标注数据。
- 图像类任务:几百到几千张领域内图片。
- 关键影响因素:数据质量越高,所需数量可减少。
-
过拟合缓解
- 技术手段:参数高效微调、数据增强、正则化。
- 优势:大模型预训练已积累海量知识,微调更像"校准",少量精准数据可减少噪声干扰。
-
参数调整方式
- 优先选择:参数高效微调
- 原理:冻结大模型大部分参数,仅训练新增的少量适配层或低秩矩阵。
- 优势:节省计算资源,降低过拟合风险,适合数据少、资源有限的场景。
- 全量微调:需调整所有参数,对数据量和算力要求极高,细分领域微调极少使用。
- 优先选择:参数高效微调
Agent(智能体 / 代理)核心概念笔记
一、基本概念
Agent 是人工智能领域中的核心概念,指能够感知环境 、自主决策 并执行任务以实现特定目标的智能实体。
简单理解:它可以代理你去完成一些事情。
二、四大核心能力
1. 环境感知
- 方式 :通过视觉传感器、语音接口等多模态 "感官"。
- 功能:实时获取环境数据。
2. 智能决策
- 方式 :运用深度学习模型 和强化学习算法。
- 功能:进行复杂的分析与决策。
3. 任务执行
- 方式:调用API工具库或操控物理设备。
- 功能:完成实际的、具体的工作任务。
4. 持续进化
- 方式 :具备自主学习 和迁移学习能力。
- 功能:实现性能的持续提升与优化。
Agent(智能体)核心架构解析
主要模块概览
一个功能完善的智能体(Agent)通常由规划、记忆、工具使用三大核心模块构成。
一、规划模块("大脑")
决策与控制中心,负责思考与规划。
- 任务拆解:将复杂目标分解为可执行的具体步骤序列。
- 自我反思 :通过思维链 或ReAct等框架评估行动,形成"规划-行动-观察-反思"循环,动态调整策略。
二、记忆模块("书架")
知识与经验库,保障对话连贯性并利用历史信息。
- 短期记忆:缓存当前对话的上下文,维持话题焦点。
- 长期记忆:通过向量数据库等技术持久化存储关键历史与知识,支持快速检索与应用。
三、工具使用模块("工具箱")
与外部世界交互的接口,扩展能力边界。
- 工具选择 :核心是函数调度能力,能根据描述准确调用外部工具API(如计算、搜索、查询等)来执行具体操作。
模块协同工作流程
- 接收任务:感知用户指令。
- 规划:"大脑"拆解任务,制定计划。
- 记忆检索:"书架"提供相关背景与历史信息。
- 执行:"工具箱"被调用以完成外部操作(如搜索)。
- 反思 :"大脑"评估结果,必要时修正计划,循环直至任务完成。
通过这种模块化协同,Agent能够实现自主规划、工具调用与持续学习,以应对复杂任务。
Agent常见的四种模式
根据吴恩达(Andrew Ng)的总结,智能体(Agent)在完成任务时,主要遵循以下四种核心工作模式:
1. Reflection【反馈/反思模式】
- 核心机制 :模型通过自我反思来评估和改进其任务执行过程与结果。
- 典型方法与框架:ReAct、Self-Refine、Reflection等。
- 作用:形成"行动 → 观察结果 → 反思 → 优化"的循环,提升输出的质量和准确性。
2. Tool Use【工具调用模式】
- 核心机制 :模型调用外部工具、API或函数来扩展其自身能力,解决纯文本模型无法直接处理的任务。
- 典型工具:计算器、搜索引擎、数据库查询、代码解释器、专业软件API等。
- 作用:突破大语言模型的固有局限,实现与真实世界的数据和服务交互。
3. Planning【规划模式】
- 核心机制 :在执行任务前,先进行多步骤的提前计划与组织,将复杂目标拆解为有序的子任务序列。
- 典型方法:思维链(CoT)规划、任务分解树等。
- 作用:提升处理复杂任务的效率和逻辑性,避免盲目行动。
4. Multi-agent Collaboration【多智能体协作模式】
- 核心机制 :多个具备不同角色或专长的智能体之间进行协作与协商,共同完成一项任务。
- 典型协议与框架:A2A (Agent-to-Agent) 协议、CrewAI、AutoGen等。
- 作用:通过分工、讨论和辩论,汇集集体智慧,处理单一智能体难以胜任的复杂、多维度问题。
总结 :这四种模式并非互斥,一个强大的智能体系统通常会融合多种模式。例如,一个智能体可能先进行规划 ,然后调用工具 执行子步骤,过程中不断进行自我反思 调整,并在需要时与其他智能体协作。
机器学习 (ML)、深度学习 (DL)、强化学习 (RL) 核心概念辨析
一、核心定义与关系
- 机器学习 :总称与范式 。研究计算机如何从数据中学习规律,以完成预测或决策任务,而无需显式编程。
- 深度学习 :机器学习的子集与工具 。通过构建深层神经网络来自动学习数据的多层次特征表示,是当前实现复杂任务(如图像、语音、自然语言处理)的主流方法。
- 强化学习 :机器学习的另一范式 。关注智能体 如何通过与环境交互,并根据获得的奖励(或惩罚)来学习一系列最优决策。
二、三者的核心对比
| 维度 | 机器学习 | 深度学习 | 强化学习 |
|---|---|---|---|
| 核心目标 | 从数据中发现模式,用于预测或分类。 | 自动学习数据的复杂特征表示,以解决感知和识别任务。 | 学习一个能最大化长期累积奖励的最优决策策略。 |
| 学习方式 | 监督学习(有标签)、无监督学习(无标签)、半监督学习。 | 多为监督学习,但也可用于无监督和强化学习(作为函数近似器)。 | 试错学习。基于状态、动作、奖励、新状态的交互循环。 |
| 数据需求 | 需要数据,其质量与特征工程对性能影响巨大。 | 需要海量数据 和强大算力,能自动进行特征工程。 | 不依赖静态数据集,依赖与环境交互产生的状态-动作序列。 |
| 模型/算法 | 线性回归、逻辑回归、决策树、SVM、K-Means等。 | 深度神经网络:CNN(视觉)、RNN/LSTM(序列)、Transformer(NLP)。 | Q-Learning, Policy Gradients, DQN, A3C, PPO等。 |
| 人类参与 | 高度依赖人工进行特征工程和算法选择。 | 特征工程自动化,重点转向网络架构设计、调参和数据准备。 | 重点是设计奖励函数、环境和算法,引导智能体学习。 |
| 典型应用 | 信用评分、客户分群、推荐系统(传统)、垃圾邮件过滤。 | 图像识别、语音助手、机器翻译、大语言模型、自动驾驶感知。 | 游戏AI、机器人控制、自动驾驶策略、资源优化、交易策略。 |
三、关键交集:深度强化学习
深度强化学习 是深度学习 与强化学习的结合,代表了当前最前沿的方向之一。
- 原理 :使用深度神经网络 来近似强化学习中的核心函数(如价值函数、策略函数),使智能体能直接从高维原始输入(如图像、文本)中学习决策。
- 意义 :解决了传统强化学习在高维状态空间下的表征和学习难题。
- 标志性成就:AlphaGo、AlphaStar、在复杂视频游戏中超越人类的智能体。
四、总结与类比
| 学习类型 | 核心比喻 |
|---|---|
| 机器学习 | "从历史考卷中学习答题":分析大量已有题目和标准答案,总结出解题套路。 |
| 深度学习 | "拥有多层抽象理解能力的学生":不仅能看懂题目,还能自动拆解出题目背后的知识点、出题意图和深层逻辑。 |
| 强化学习 | "通过不断对弈学习下棋":没有标准答案,通过每一步的得失(奖励/惩罚)来领悟如何赢得整盘棋。 |
关系核心:
- 深度学习是机器学习的"利器",极大地提升了机器处理复杂数据的能力。
- 强化学习是机器学习的"另一条路",专注于解决交互决策问题。
- 深度强化学习是"强强联合",用深度学习的感知能力解决强化学习的复杂环境输入问题,是通向通用智能体的关键技术路径。
机器学习分类
- 监督学习
常见应用:语音识别、搜索广告、商品推荐、机器翻译、个性化新闻。
值为离散型时称为分类问题,为连续型称为回归问题。 - 无监督学习
常见应用:聚类、将为、神经网络预训练。 - 强化学习
常见应用:游戏、机器人、自动驾驶。
基本组件:环境、agent(与环境交互的对象)、动作、反馈(回报、奖赏)。
知识图谱
知识图谱的关键点可以概括为以下四个方面:
- 图结构表示:核心是用"图"来建模世界。图中的"节点"代表实体(如人物、地点、概念),"边"代表实体间的关系(如"出生于"、"位于")。这种结构能直观、清晰地表达复杂的关联信息。
- 构建与融合:其价值依赖于高质量的数据。关键过程包括从多源、异构的数据(文本、数据库等)中抽取实体和关系,并进行知识融合,消除冲突,形成一个统一、可信的知识库。
- 推理与发现:不仅存储已知事实,还能通过逻辑规则或图算法进行推理,发现实体间隐藏的、未明确陈述的关系,从而扩展知识,实现更深入的洞察。
- 智能应用基石:作为底层知识库,是提升人工智能系统理解能力和可解释性的关键。它广泛应用于增强搜索引擎(提供直接答案和关联探索)、智能问答、个性化推荐、风险分析等需要深度语义理解的场景。
简单来说,知识图谱是将信息组织成一张机器能理解的"关系网",并通过构建、推理来驱动各类智能应用
向量说明
后续使用【,】表示行向量x1,x2,使用【;】表示列向量x1;x2T。
误差
-
泛化误差
在未来的样本上的误差
-
经验误差
在训练集上的误差(训练误差)
误差并非越小越好,可能导致overfitting 过拟合、过配
underfitting 欠拟合
模型选择的关键问题
- 评估方法:如何获得测试结果
- 性能度量:如何评估性能优劣
- 比较检验:如何判断实质差别
评估方法
测试集应该和训练集互斥
- 留出法(hold-out)
- 交叉验证法(cross validation)
- 自助法(bootstrap)
留出法
注意事项
- 保持数据分布一致性(例如:分层采样)
- 多次重复划分(例如:100次随机划分)
- 测试集不能太大、不能太小(例如:1/5~1/3)
- 需要从数据集中留出部分数据进行训练,确认模型误差较小后再对全量数据进行训练得到结果模型
缺陷
由于使用随机划分,可能导致部分数据始终未经过训练、测试。若此数据对模型较为重要将会导致模型性能交叉
K-折(k倍)交叉验证法(k-fold)
特征
将数据分为k分,每次选其中一份作为测试集,经过轮转训练后便完整的对所有数据集进行了训练。
注意事项
不同的切分方式将对模型的性能造成扰动,可再做若干次随机切分减小扰动,即10x10次验证。
备注
可以在每次切分时只保留一条数据作为测试集,即留一法,(leave-one-out,LOO)。由于测试数据过少,此时可能导致测试偏差较大,
自助法
基于"自助采样"(bootstrap sampling),亦称"有放回采样"、"可重复采样"
特征
每次随机采样出需要个数的样本(M个样本,取样M次)。
根据极限得到约有36.8%的样本不出现。
math
\lim_{m \to \infty} \left( 1 - \frac{1}{m} \right)^m = \frac{1}{e} \approx 0.368
"包外估计"(out-of-bag estimation)
缺陷
- 训练集与远样本集同规模
- 数据分布有所改变(如果数据分布影响较小、数据量较少时可以使用)
调参与最终模型
- 算法的参数:一般由人工设定,亦称"超参数"
- 模型的参数:一般由学习确定
调参过程类似:先产生若干模型,然后基于某种评估方法进行选择
参数调整的好坏对模型的性能有关键影响
- 训练集
- 测试集
- 验证集(validation set):用来和测试集分开,专门用来调参,从训练集中留出一部分。避免从测试集中选取数据用于测试集直接使用。
算法参数选定后,要用训练集+验证集重新训练最终模型
性能度量
性能度量(performance measure)是衡量模型泛化能力的评价标准,反映了任务需求。
使用不同的性能度量会导致不同的评判结果
什么样的模型是"好"的,不仅取决于算法和数据,还取决于任务需求。
均方误差(二次误差、平方误差),回归任务常常使用
math
E(f;D) = \frac{1}{m} \sum{i=1}^{m} (f(\boldsymbol{x}i) - y_i)^2
错误率
math
E(f;D) = \frac{1}{m} \sum{i=1}^{m} \mathbb{I}(f(\boldsymbol{x}i)
精度
math
\begin{aligned}
\operatorname{acc}(f;D) &= \frac{1}{m} \sum{i=1}^{m} \mathbb{I}(f(\boldsymbol{x}i) = y_i) \
&= 1 - E(f;D).
\end{aligned}
查准率 VS. 查全率
分类结果混淆矩阵
| 预测结果 | ||
| 真实情况 | 正例 | 反例 |
| 正例 | TP (真正例) | FN (假反例) |
| 反例 | FP (假正例) | TN (真反例) |
查准率 (Precision)
用于衡量预测为正例的样本中有多少是真实的。
math
P = \frac{TP}{TP + FP}
查全率 (Recall)
用于衡量所有真实的样本中有多少被成功预测出来了。
math
R = \frac{TP}{TP + FN}
F1度量及其调和平均数
优于算数平均,使得较小的值不会被忽视。
F1 度量的基本定义及变形
math
\begin{equation}
\begin{aligned}
F1 &= \frac{2 \times P \times R}{P + R} \\
&= \frac{2 \times TP}{\text{样例总数} + TP - TN}
\end{aligned}
\end{equation}
F1 度量的调和平均数形式
math
\begin{equation}
\frac{1}{F1} = \frac{1}{2} \left( \frac{1}{P} + \frac{1}{R} \right)
\end{equation}
若对查准率、查全率有不同的偏好
Fβ2度量的主公式及其调和平均数形式
math
F_\beta = \frac{(1 + \beta^2) \times P \times R}{(\beta^2 \times P) + R}
math
\frac{1}{F_\beta} = \frac{1}{1 + \beta^2} \cdot \left( \frac{1}{P} + \frac{\beta^2}{R} \right)
比较校验
在得到某种度量下的评估结果后,无法直接比较以评判优劣。
- 测试性能不等于泛化性能
- 测试性能随测试集的变化而变化
- 很多机器学习算法本身有一定的随机性
机器学习寻找的是概率近似正确
常用方法
统计假设经验(hypothesis test)为学习器性能比较提供了重要依据。
两学习器比较
- 交叉验证t检验(基于成对t检验)
- k折交叉验证;5x2交叉验证
- McNemar检验(基于列联表,卡方检验)考虑反对角线中的差异
| A2 | ||
|---|---|---|
| A1 | 双方都认为是正确的数据 | A1正确 A2错误 |
| A1错误 A2正确 | 双方都认为是错误的数据 |
线性模型
核心任务
线性模型主要解决两大基础机器学习任务:
- 分类 (Classification):预测离散的类别标签。目标是找到一个边界(如直线),将不同类别的数据点分开。
- 回归 (Regression):预测连续的数值。目标是找到一条趋势线,使得数据点尽可能贴近这条线。线性回归非常擅长处理数值类型的属性。
数学模型
线性模型试图学习一个通过属性的线性组合来进行预测的函数。
- 一般形式 :
- x_i:输入特征的属性值。
- w_i:对应特征的权重(系数),表示特征的重要性。
- b:偏置项(截距),用于调整决策边界的起点。
math
f(x) = w_1x_1 + w_2x_2 + \dots + w_dx_d + b
- 向量形式 (更简洁的表达):
- w:权重向量。
- x:输入特征向量。
- wTx:向量的点积运算。
math
f(x) = \mathbf{w}^\mathrm{T}\mathbf{x} + b
基于图片内容,为您整理线性回归的核心公式笔记如下:
线性回归
math
f(x_i) = wx_i + b \quad \text{使得} \quad f(x_i) \simeq y_i
- 模型表达式 :
- x_i:输入样本的特征值。
- w:模型的权重参数。
- b:模型的偏置项。
- 学习目标 :f(xi)≃y
- yi:样本的真实标签(目标值)。
- ≃:表示通过训练,使模型的预测值无限逼近真实值。
离散属性的处理:若有序,则连续化;否则,转化为k维向量。
令均方误差最小化,有
math
\begin{align*}
(w^*, b^*) &= \arg \min_{(w,b)} \sum_{i=1}^{m} (f(x_i) - y_i)^2 \\
&= \arg \min_{(w,b)} \sum_{i=1}^{m} (y_i - wx_i - b)^2
\end{align*}
对下式进行最小二乘参数估计
math
E_{(w,b)} = \sum_{i=1}^{m} (y_i - wx_i - b)^2
分别对w、b求偏导
math
\begin{aligned}
\frac{\partial E_{(w,b)}}{\partial w} &= 2 \left( w \sum_{i=1}^{m} x_i^2 - \sum_{i=1}^{m} (y_i - b)x_i \right) \\
\frac{\partial E_{(w,b)}}{\partial b} &= 2 \left( mb - \sum_{i=1}^{m} (y_i - wx_i) \right)
\end{aligned}
令导数为0,得到闭式(closed-form)解
math
w = \frac{\sum{i=1}^{m} y_i (x_i - \bar{x})}{\sum{i=1}^{m} x_i^2 - \frac{1}{m} \left( \sum{i=1}^{m} x_i \right)^2} \quad b = \frac{1}{m} \sum{i=1}^{m} (y_i - w x_i)
这套公式被称为线性回归的闭式解 (Closed-form Solution) 或 正规方程 (Normal Equation) 的一维形式。
优点:直接套用公式就能算出最优解,不需要像梯度下降那样迭代。
缺点:当特征维度很高(比如有上万个特征)时,计算量巨大(因为涉及到矩阵求逆),此时梯度下降法更有效。
对于大规模数据集,X可能本身就无法完整装入内存:
解析解需要一次性加载所有数据到内存。
梯度下降可以使用小批量(mini-batch)处理,一次只加载部分数据
求偏导就是计算变化率
目的为求极值点(极值点为0时,即变化停止的点)
多元(Multi-variate)线性回归
math
\begin{aligned}
& f(\boldsymbol{x}_i) = \boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_i + b \quad \text{使得} \quad f(\boldsymbol{x}_i) \sim y_i \\
& \boldsymbol{x}_i = (x_{i1}; x_{i2}; \ldots; x_{id}) \qquad\qquad y_i \in \mathbb{R}
\end{aligned}
- f(xᵢ):线性模型的预测函数,表示对输入样本 xᵢ 的预测值。
- wᵀ:权重向量 w 的转置。
- xᵢ:第 i 个样本的特征向量。
- b:偏置项(截距)。
- wᵀxᵢ + b:输入样本 xᵢ 经过线性变换后的结果。
- ~:表示"逼近"或"拟合"。
- yᵢ:第 i 个样本的真实标签(目标值)。
- xᵢ = (xᵢ₁; xᵢ₂; ...; xᵢd):表示 xᵢ 是一个 d 维的特征向量。
- yᵢ ∈ R:表示真实标签 yᵢ 是一个实数。
把w和b吸收入向量形式ŵ=(w;b)数据集表示为
math
\begin{aligned}
\mathbf{X} &=
\begin{pmatrix}
x_{11} & x_{12} & \cdots & x_{1d} & 1 \\
x_{21} & x_{22} & \cdots & x_{2d} & 1 \\
\vdots & \vdots & \ddots & \vdots & \vdots \\
x_{m1} & x_{m2} & \cdots & x_{md} & 1
\end{pmatrix}
=
\begin{pmatrix}
\mathbf{x}_1^{\mathrm{T}} & 1 \\
\mathbf{x}_2^{\mathrm{T}} & 1 \\
\vdots & \vdots \\
\mathbf{x}_m^{\mathrm{T}} & 1
\end{pmatrix} \\[2em]
\mathbf{y} &= (y_1; y_2; \ldots; y_m)
\end{aligned}
说明
- 背景操作:这一步是将模型的权重向量 w 和偏置项 b 合并为一个新的向量 ŵ。为了方便矩阵运算,通常在原始数据集的每一行特征末尾手动添加一个常数 1。
- 左侧矩阵 f(X) :
- 这是添加了全 1 列后的新设计矩阵。
- 矩阵的维度是 m x (d+1),其中 m 是样本总数,d 是原始特征数。
- 最后一列全为 1,专门用于与合并后的偏置项进行相乘。
- 右侧矩阵 :
- 这是左侧矩阵的紧凑写法。
math
x_i^T
代表第 i 个样本的 d 维特征向量转置(即行向量形式)。
- 向量 y :
- 这是一个 m x 1 的列向量,包含了所有 m 个样本的真实标签(目标值)。
同样采用最小二乘法求解,有:
math
\boldsymbol{w}^* = \arg \min_{\boldsymbol{w}} (\boldsymbol{y} - \mathbf{X}\boldsymbol{w})^{\text{T}} (\boldsymbol{y} - \mathbf{X}\boldsymbol{w})
令
math
E_{\hat{\boldsymbol{w}}} = (\boldsymbol{y} - \mathbf{X}\hat{\boldsymbol{w}})^{\text{T}} (\boldsymbol{y} - \mathbf{X}\hat{\boldsymbol{w}})
,对w求导:
math
\frac{\partial E_{\hat{\boldsymbol{w}}}}{\partial \boldsymbol{w}} = 2\mathbf{X}^{\text{T}} (\mathbf{X}\hat{\boldsymbol{w}} - \boldsymbol{y}) \quad
令其为零可得 w
涉及矩阵求逆。
- 若
math
X^TX
满秩或正定,则
math
\hat{w}^* = (X^T X)^{-1} X^T y
- 若
math
X^TX
不满秩,则可解出多个ŵ
此时需求助于归纳偏好,或引入正则化(regularization)
线性模型的变化
对于(x,y),y∈R, 希望线性模型的预测值逼近真是标记,则得到线性回归模型
math
y=w^Tx+b
如何令预测值逼近y的衍生物?
如另y'逼近对数
math
lny=w^Tx+b
则得到对数线性回归(log-linear regression)
实际上是在用
math
e^{w^{T} x + b}
逼近y
广义线性模型
一般形式
math
y=g^{-1}(w^Tx+b)
其中
math
g^-1
为单调可微的联系函数(link function)
令
math
g(.)=ln(.)
则得到对数线性回归
math
lny=w^Tx+b
联系函数:将线性回归产生的结果和真正想要的结果联系起来。
基于此思想,可以考虑如何使用回归的模型来解决分类的问题。
二分类问题
线性回归模型产生的实值输出
math
\begin{cases}
z=w^Tx+b ,\\[2pt]
y∈{0,1}
\end{cases}
找z和y的联系函数。
理想的单位阶跃函数(unit-step function)
math
y=\begin{cases}
0, & z<0,\\[2pt]
0.5, & z=0,\\[2pt]
1, & z>0.
\end{cases}
性质不好,需找"替代函数"(surrogate function)
常用单调可微、任意阶可导
math
y=\frac{1}{1+e^{-z}}
对数几率函数(logistic function) 简称"对率函数"
对率回归
以对率函数为联系函数
math
y=\frac{1}{1+e^{-z}}
变为
math
y=\frac{1}{1+e^{-w^Tx+b}}
即
math
ln\frac{y}{1-y}=w^Tx+b
y/(1-y)为几率(odds),反映了x作为正例的相对可能性。
增加对数后则形成对数几率(log odds,亦称logit)。
对数几率回归 (logistic regression)简称对率回归。
- 无需实现假设数据分布
- 可得到"类别"的近似概率预测
- 可直接应用现有数值优化算法求解最优解
此方法为分类学习算法
对率回归求解思路
1. 类后验概率与对数几率
在逻辑回归中,将输出 y 看作类后验概率估计
math
p(y=1|x)
。结合上一轮推导的对数几率公式,可进行如下替换:
- 原公式:
math
ln \frac{y}{1-y} = w^T x + b
- 概率形式
math
ln \frac{p(y=1|x)}{p(y=0|x)} = w^T x + b
(注:分母 1-y 对应负类概率 p(y=0|x))
2. 参数估计方法
基于上述概率模型,逻辑回归使用极大似然法来估计模型参数 (w, b)。
3. 数据集表示
给定包含 m 个样本的数据集:
math
\{(x_i, y_i)\}_{i=1}^m
4. 最大化对数似然函数
为了找到最优参数,需要最大化以下对数似然函数:
math
\ell(w, b) = \sum_{i=1}^m \ln p(y_i | x_i; w, b)
明白了,我会严格按照您的要求,将所有公式使用 math ... 包裹。以下是重新整理的笔记:
逻辑回归极大似然估计推导与优化
1. 参数与特征的增广合并
为了数学表达和后续计算的简便,将权重向量 w 与偏置项 b 合并,同时将特征向量 x 进行增广:
- 令参数向量
math
{\beta} = (w; b)
- 令增广特征向量
math
\hat{\boldsymbol{x}} = (x; 1)
- 此时,线性组合
math
w^T x + b
可简写为
math
{\beta}^T \hat{\boldsymbol{x}}
2. 正负类概率的重新定义
基于合并后的参数和特征,定义正类和负类的后验概率:
- 正类概率:
math
p_1(\hat{x}_i; \boldsymbol{\beta}) = p(y=1 \mid \hat{x}; \boldsymbol{\beta}) = \frac{e^{w^T x + b}}{1 + e^{w^T x + b}}
- 负类概率:
math
p_0(\hat{x}_i; \boldsymbol{\beta}) = p(y=0 \mid \hat{x}; \boldsymbol{\beta}) = 1 - p_1(\hat{x}_i; \boldsymbol{\beta}) = \frac{1}{1 + e^{w^T x + b}}
3. 似然项的统一重写
为了将正负类的似然项统一为一个表达式,引入真实标签 y_i(取值为0或1):
- 重写后的似然项:
math
p(y_i \mid x_i; w, b) = y_i p_1(\hat{x}_i; \boldsymbol{\beta}) + (1 - y_i) p_0(\hat{x}_i; \boldsymbol{\beta})
(注:当 y_i=1 时取 p_1,当 y_i=0 时取 p_0)
4. 最大化似然函数
结合上一轮笔记,最大化对数似然函数的目标为:
math
\ell(w, b) = \sum_{i=1}^m \ln p(y_i \mid x_i; w, b)
5. 等价转化为最小化问题
将上述概率表达式代入对数似然函数,经过数学推导,最大化该似然函数等价于最小化以下目标函数:
math
\ell(\boldsymbol{\beta}) = \sum_{i=1}^m \left( -y_i \boldsymbol{\beta}^T \hat{x}_i + \ln(1 + e^{\boldsymbol{\beta}^T \hat{x}_i}) \right)
(注:这实际上就是逻辑回归的交叉熵损失函数)
6. 优化求解方法
- 该目标函数是一个高阶可导连续凸函数。
- 因此,可以使用经典的数值优化方法进行求解,如梯度下降法 或牛顿法。
梯度下降
梯度下降算法(Gradient Descent Algorithm)笔记
核心更新公式
repeat until convergence
math
θ_j := θ_j - α * \frac{∂}{∂θ_j} J(θ_0, θ_1)
公式符号与直观含义
- θ_j :模型参数(如截距 θ_0 和斜率 θ_1)。
:=表示赋值更新。 - α(Learning rate) :学习率。控制每次参数更新的步子迈多大。
- (∂/∂θ_j) J(θ_0, θ_1)(Derivative) :偏导数项。表示代价函数 J 在参数 θ_j 方向上的变化率(梯度)。
- J(θ_0, θ_1):代价函数(Cost Function),用于衡量模型预测值与真实值的误差。
关键执行规则
- 同步更新(Simultaneously update) :必须同时更新 j=0 和 j=1 的参数。
- 正确做法:先计算好所有参数的更新量,然后同时赋值。
- 错误做法:先更新 θ_0,再用更新后的 θ_0 去计算 θ_1(这会破坏算法逻辑)。
算法直观理解
- 循环条件 :
repeat until convergence,即不断重复更新步骤,直到参数收敛(变化极小,说明找到了误差最小的谷底)。 - 找谷底比喻 :找最低点就像下山。
- 偏导数(梯度):告诉你当下该往哪个方向走(最陡峭的下山方向)。
- 学习率(α):决定你每一步迈多大。
- 学习率设置注意事项 :
- 如果 α 太小:下山速度极慢,计算耗时。
- 如果 α 太大:可能步子跨过头,永远到不了谷底(甚至越走越高)。
自动收敛
即使在学习率 α 固定的情况下,梯度下降也可能收敛至局部最小值。
θ₁ := θ₁ − α ∂/∂θ₁ J(θ₁)
越接近局部最小值时导数越小,从而和α的乘积也越小,在图像上的表现就是步长缩小。
因此,在线性回归这种凸函数场景下,即使学习率 α 自始至终保持不变,梯度下降也能安全、自动地收敛到局部最小值(谷底)。
梯队下降容易遇到局部最优解的情况,但是在线性回归的代价函数是凸函数(弓状函数,只会有一个最小值,即只有一个全局最优,不会存在局部最优)
批量梯度下降 batch gradient descent
每次更新参数时,使用全部训练样本计算梯度。
随机梯度下降 Stochastic Gradient Descent
每次只用一个随机样本计算梯度,更新频繁,波动大,但能跳出局部极值,适合大规模数据。
小批量梯度下降 Mini-batch Gradient Descent
每次使用一小批样本(如32、128),兼顾速度和稳定性,是深度学习中常用的版本。
最小平方代价
math
J(\theta_0, \theta_1) = \frac{1}{2m} \sum_{i=1}^m \big( h_\theta(x^{(i)}) - y^{(i)} \big)^2
矩阵计算
通过使用SIMD(单指令多数据流)进行并行计算来优化性能。
我继续帮你把剩下的部分改完。你改的思路是对的------把公式放进 math```` 代码块就能正常渲染,所以我把笔记里**残留的所有 `$...$` 行内公式全部清理掉** ,简短的数学关系改用「纯文本 + Unicode 符号」(如 m×n、Aᵀ、≠),需要展示的公式则统一提取到 math```` 块里。同时顺手修掉了几处断行和多余标点(比如"- ,假设函数")。
以下是完整修改后的版本,可以直接复制:
吴恩达机器学习 - 线性代数基础复习笔记
一、矩阵加法
- 规则:相同维度的矩阵可以相加(对应位置元素相加)。
- 示例:
math
\begin{bmatrix} 1 & 0 \\ 2 & 5 \\ 3 & 1 \end{bmatrix}_{3 \times 2} + \begin{bmatrix} 4 & 0.5 \\ 2 & 5 \\ 0 & 1 \end{bmatrix}_{3 \times 2} = \begin{bmatrix} 5 & 0.5 \\ 4 & 10 \\ 3 & 2 \end{bmatrix}_{3 \times 2}
二、标量乘矩阵
- 规则:标量与矩阵每个元素分别相乘。
- 性质:支持交换律(cA = Ac)。
- 示例:
math
3 \times \begin{bmatrix} 1 & 0 \\ 2 & 5 \\ 3 & 1 \end{bmatrix} = \begin{bmatrix} 3 & 0 \\ 6 & 15 \\ 9 & 3 \end{bmatrix}
三、矩阵与向量乘法
- 规则:矩阵 m×n 乘以向量 n×1,结果为 m×1 的向量(行元素与列元素对应相乘再相加)。
- 示例:
math
\begin{bmatrix} 1 & 3 \\ 4 & 0 \\ 2 & 1 \end{bmatrix}_{3 \times 2} \begin{bmatrix} 1 \\ 5 \end{bmatrix}_{2 \times 1} = \begin{bmatrix} 1\times1 + 3\times5 \\ 4\times1 + 0\times5 \\ 2\times1 + 1\times5 \end{bmatrix} = \begin{bmatrix} 16 \\ 4 \\ 7 \end{bmatrix}_{3 \times 1}
四、矩阵在线性回归中的应用(预测)
- 场景:房屋面积(House Sizes)数据:
math
[2104, 1416, 1534, 852]^T
假设函数:
math
h_\theta(x) = -40 + 0.25x
- 矩阵化计算:
math
\begin{bmatrix} 1 & 2104 \\ 1 & 1416 \\ 1 & 1534 \\ 1 & 852 \end{bmatrix}_{4 \times 2} \times \begin{bmatrix} -40 \\ 0.25 \end{bmatrix}_{2 \times 1} = \begin{bmatrix} -40 + 2104 \times 0.25 \\ -40 + 1416 \times 0.25 \\ -40 + 1534 \times 0.25 \\ -40 + 852 \times 0.25 \end{bmatrix}_{4 \times 1}
-
多假设同时计算:若有 3 个竞争假设:
假设 1:
math
h_\theta(x) = -40 + 0.25x
假设 2:
math
h_\theta(x) = 200 + 0.1x
假设 3:
math
h_\theta(x) = -150 + 0.4x
参数矩阵为:
math
\begin{bmatrix} -40 & 200 & -150 \\ 0.25 & 0.1 & 0.4 \end{bmatrix}
则预测结果为(矩阵 X 乘参数矩阵):
math
\begin{bmatrix} 1 & 2104 \\ 1 & 1416 \\ 1 & 1534 \\ 1 & 852 \end{bmatrix} \begin{bmatrix} -40 & 200 & -150 \\ 0.25 & 0.1 & 0.4 \end{bmatrix} = \begin{bmatrix} 486 & 410 & 692 \\ 314 & 342 & 416 \\ 344 & 353 & 464 \\ 173 & 285 & 191 \end{bmatrix}
- 计算加速:可通过专用线性代数函数库驱动 SIMD 加速计算。
五、矩阵与矩阵乘法
- 规则:左矩阵列数 = 右矩阵行数。结果维度为(左矩阵行数 × 右矩阵列数)。
- 性质 :不支持交换律 (AB ≠ BA),但支持结合律。
- 示例:
math
\begin{bmatrix} 1 & 3 & 2 \\ 4 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 3 \\ 0 & 1 \\ 5 & 2 \end{bmatrix} = \begin{bmatrix} 11 & 10 \\ 9 & 14 \end{bmatrix}
- 本质 :矩阵乘矩阵等价于用左矩阵依次乘右矩阵的每一列向量。
- 乘第一列:
math
\begin{bmatrix} 1 & 3 & 2 \\ 4 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 \\ 0 \\ 5 \end{bmatrix} = \begin{bmatrix} 11 \\ 9 \end{bmatrix}
- 乘第二列:
math
\begin{bmatrix} 1 & 3 & 2 \\ 4 & 0 & 1 \end{bmatrix} \begin{bmatrix} 3 \\ 1 \\ 2 \end{bmatrix} = \begin{bmatrix} 10 \\ 14 \end{bmatrix}
六、单位矩阵(I)
- 性质:主对角线为 1,其余为 0 的方阵。满足:
math
A \cdot I = I \cdot A = A
- 维度说明:若 A 为 m×n,则左乘的单位阵为 m×m,右乘的单位阵为 n×n。
七、逆矩阵
- 前提 :只有方阵(且非奇异 / 满秩)才有逆矩阵。
- 定义:
math
A A^{-1} = A^{-1} A = I
- 示例:
math
\begin{bmatrix} 3 & 4 \\ 2 & 16 \end{bmatrix} \begin{bmatrix} 0.4 & -0.1 \\ -0.05 & 0.075 \end{bmatrix} = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} = I_{2 \times 2}
(注:左矩阵左上角手写略模糊,结合逆矩阵计算结果反推为 3)
八、转置矩阵
- 规则:沿主对角线翻转,元素满足:
math
B_{ij} = A_{ji}
- 维度变化:若 A 为 m×n,则 A 的转置(记作 Aᵀ 或 A^T)为 n×m。
- 示例:
math
A = \begin{bmatrix} 1 & 2 & 0 \\ 3 & 5 & 9 \end{bmatrix}_{m \times n} \implies A^T = \begin{bmatrix} 1 & 3 \\ 2 & 5 \\ 0 & 9 \end{bmatrix}_{n \times m}
补充说明:
- 矩阵乘法不满足交换律,但在计算逆矩阵时 A·A⁻¹ = A⁻¹·A = I 是特例。
- 若矩阵行列式为 0(如特征共线性),则逆矩阵不存在,此时线性回归需借助伪逆或岭回归求解。
我来处理这份笔记,把其中需要用 ```````math```` 代码块包裹的数学公式都规范好(沿用你之前定下的风格:行内简短符号保留纯文本/Unicode,需要独立展示的矩阵、公式全部进 math 块),其余内容保持不动。
以下是处理好的版本:
从单特征到多特征:符号约定与假设函数
1. 核心思想:从单特征到多特征
之前的模型只用 1 个特征(如房屋面积)预测价格;现实中需要多个特征(面积、卧室数、楼层、房龄等)。
- 记 n 为特征数量。
- 第 i 个样本的特征向量记为 x⁽ⁱ⁾ ,其第 j 个特征记为 xⱼ⁽ⁱ⁾。
2. 假设函数(Hypothesis)
引入"多特征"后,假设函数变为各特征的线性组合,并约定 x₀ = 1(对应偏置项 θ₀):
math
h_\theta(x) = \theta_0 + \theta_1 x_1 + \theta_2 x_2 + \dots + \theta_n x_n
用向量内积简写为(非常关键,后续 NumPy 直接用它):
math
h_\theta(x) = \theta^T x
其中参数向量 θ 和特征向量 x 都是 n+1 维。
一句话记忆:预测 = 参数向量转置 × 特征向量,从此模型能吃进多个维度数据。
多元梯度下降(Gradient Descent for Multiple Variables)
1. 核心思想:从单变量到多变量的梯度下降
单变量时,我们同时更新 θ₀ 和 θ₁。多变量时,参数扩展到 n+1 个(θ₀, θ₁, ..., θₙ),更新规则形式上完全一致,只是每个 θⱼ 对应的特征不同。
2. 梯度下降更新规则
单变量(n=1):
math
\theta_0 := \theta_0 - \alpha \frac{1}{m} \sum_{i=1}^{m} \left( h_\theta(x^{(i)}) - y^{(i)} \right) \cdot 1
math
\theta_1 := \theta_1 - \alpha \frac{1}{m} \sum_{i=1}^{m} \left( h_\theta(x^{(i)}) - y^{(i)} \right) \cdot x^{(i)}
多变量(n≥1):
math
\theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m} \left( h_\theta(x^{(i)}) - y^{(i)} \right) x_j^{(i)}
对所有 j = 0, 1, ..., n 同时更新。
3. 为什么 θⱼ 更新时要乘 xⱼ⁽ⁱ⁾?
这是由链式求导法则决定的:
- 代价函数对 θⱼ 求偏导时,外层平方求导产生误差项 (h_θ - y)。
- 内层对 θⱼ 求导时,假设函数中只有 θⱼ xⱼ⁽ⁱ⁾ 这一项包含 θⱼ,对其求导得到系数 xⱼ⁽ⁱ⁾。
- 所以偏导结果 = 误差 × 对应特征值。
特例:θ₀ 对应 x₀ = 1,所以 θ₀ 的更新式不显式乘特征(等价于乘 1)。
4. 关键规则:同步更新(Simultaneous Update)
每次迭代中,所有 θ₀, θ₁, ..., θₙ 必须同时更新:
- ✅ 正确做法:先用旧参数算出所有新值,再一次性赋值。
- ❌ 错误做法:先更新 θ₀,然后用新 θ₀ 去算 θ₁------这不再是标准梯度下降。
5. 向量化形式(为后续 NumPy 铺垫)
整个更新规则可以用矩阵运算写成一行:
math
\theta := \theta - \alpha \frac{1}{m} X^T (X\theta - y)
其中:
- X 是 m × (n+1) 的特征矩阵(第一列为 1)
- θ 是 (n+1) × 1 的参数向量
- y 是 m × 1 的目标向量
对应 Python 代码(学完 NumPy 后可直接运行):
python
theta = theta - (alpha / m) * (X.T @ (X @ theta - y))
一句话记忆:多变量梯度下降 = 单变量规则的直接推广,每个 θⱼ 更新时乘以对应的特征 xⱼ,所有参数同步更新。
以下是按规范(行内符号用纯文本/Unicode,独立公式进 ```````math```` 块)整理的笔记:
特征缩放(Feature Scaling)
1. 为什么需要特征缩放?
当不同特征的取值范围差异过大时,梯度下降会收敛缓慢。
示例:
- 房屋面积:300 ~ 2000 平方英尺
- 卧室数量:1 ~ 5 间
面积数值远大于卧室数,导致代价函数的等高线图呈狭长椭圆形。梯度下降在这种地形中来回震荡(zigzag),需要更多迭代才能到达最小值。
2. 特征缩放的作用
将所有特征缩放到相近的取值范围(如 -1 ~ 1 或 0 ~ 1),使等高线图更接近圆形,梯度下降直接指向圆心方向,收敛速度大幅提升。
3. 常用方法:均值归一化(Mean Normalization)
math
x_j := \frac{x_j - \mu_j}{\sigma_j}
其中:
- μⱼ 是第 j 个特征的均值
- σⱼ 是第 j 个特征的标准差
处理后效果:
- 均值变为 0
- 标准差变为 1
4. 为什么标准差会变成 1?
这是由方差的性质决定的。设原始特征为 X,标准差为 σ_X:
math
Z = \frac{X - \mu_X}{\sigma_X}
标准差会变成 1,原因就一句话:
新数据 Z = (X - μ) / σ 的单位就是"标准差"本身。
具体看定义:
math
\text{原始方差 } \sigma^2 = \frac{1}{m}\sum(X_i - \mu)^2
经过变换后:
math
\text{新方差} = \frac{1}{m}\sum\left(\frac{X_i-\mu}{\sigma}\right)^2
= \frac{1}{\sigma^2} \cdot \frac{1}{m}\sum(X_i-\mu)^2
= \frac{1}{\sigma^2} \cdot \sigma^2
= 1
本质 :用"原始数据的平均波动幅度(σ)"去量每个数据的波动幅度,那平均下来自然就是 1 倍的平均波动幅度。
就像用"米"去量一根正好 1 米长的棍子,结果必然是 1。
标准差 = 方差的平方根,所以 std(Z) = 1。
5. 另一种方法:Min-Max 缩放
math
x_j := \frac{x_j - \min(x_j)}{\max(x_j) - \min(x_j)}
处理后特征范围在 0 ~ 1 之间,但不保证标准差为 1。
6. 什么时候需要特征缩放?
| 情况 | 是否需要缩放 |
|---|---|
| 特征量级差异巨大(如 0~1 和 1000~2000) | 必须缩放,否则可能发散 |
| 特征量级差异较小(如 0~10 和 0~20) | 通常不需要,梯度下降仍能正常工作 |
| 所有特征已在相近范围(如 -3 ~ 3) | 不需要 |
经验法则:如果一个特征的取值范围大致在 -3 ~ 3 之外,或者与其他特征不在同一量级,就应该考虑特征缩放。
一句话记忆:特征缩放让梯度下降走直线而非 zigzag,均值归一化后数据均值为 0、标准差为 1。
多元梯度下降法 II -- 学习率(Learning Rate)
1. 调试梯度下降:绘制代价函数随迭代次数的变化曲线
判断梯度下降是否正常工作的标准方法是:绘制 J(θ) 随迭代次数变化的曲线。
- 横轴:迭代次数
- 纵轴:代价函数 J(θ)
正常情况 :曲线应该随着每次迭代而下降,并在一定次数后趋于平坦(收敛)。
异常情况:
- 曲线上升 → 梯度下降发散,通常是因为学习率 α 太大
- 曲线反复震荡(上下波动)→ 同样表明 α 太大
- 曲线下降极其缓慢 → α 可能太小
2. 自动收敛检测
除了肉眼观察曲线,也可以设置一个阈值来判断收敛:
math
\text{如果 } J(\theta) \text{ 在一次迭代中的下降量 } < \varepsilon \text{(如 } 10^{-3} \text{),则认为已收敛}
但实际中,选择合适的 ε 很困难,推荐直接观察曲线。
3. 学习率 α 的选择
3.1 α 太小
- 梯度下降运行缓慢
- 需要大量迭代才能收敛
3.2 α 太大
- J(θ) 可能在每次迭代中不下降甚至上升
- 可能导致无法收敛甚至发散
现象:如果 J(θ) 在某次迭代后上升,通常意味着 α 过大,应尝试更小的 α。
4. 如何选择合适的 α
实践中通常采用尝试法,按 3 倍间隔依次测试:
math
\alpha = 0.001, \; 0.003, \; 0.01, \; 0.03, \; 0.1, \; 0.3, \; 1, \; \dots
步骤:
- 从较小的 α(如 0.001)开始
- 绘制 J(θ) 曲线,观察是否正常下降
- 如果正常,尝试下一个更大的 α
- 找到使 J(θ) 快速下降且稳定的最大 α 值
经验:
- 如果 α 太小,J(θ) 下降缓慢
- 如果 α 太大,J(θ) 可能出现震荡或上升
- 理想的 α 应在两者之间,使 J(θ) 平滑快速地下降到最小值
5. 特征缩放与学习率的关系
- 特征缩放后,梯度下降的等高线图更接近圆形
- 这使得梯度下降对 α 的选择更加宽容(更大的 α 也能稳定工作)
- 未做特征缩放时,α 的选择范围更窄,更容易发散
一句话记忆:画 J(θ) 曲线看趋势,按 3 倍间隔试 α,特征缩放能让 α 更好选。
以下是按规范(行内符号去 $ 改用纯文本/Unicode,独立公式进 ```````math```` 块)修正后的笔记:
特征和多项式回归 (Features and Polynomial Regression)
1. 特征工程 (Feature Engineering)
在线性回归中,有时原始特征并不能很好地拟合数据。我们可以通过组合现有特征来创建新特征。
- 例子(房价预测):假设有临街宽度(frontage)和纵向深度(depth),可以直接创建一个新特征:面积 x = frontage × depth,模型变为 h_θ(x) = θ₀ + θ₁ × frontage × depth。
- 核心思想:特征工程是指利用原始特征构造新特征,使模型更好地匹配数据分布。
2. 多项式回归 (Polynomial Regression)
当数据呈现明显的曲线趋势时,标准线性模型(直线)无法很好拟合,需要引入多项式特征。
常见形式(以房屋面积 x 为例)
假设 h_θ(x) = θ₀ + θ₁x + θ₂x²(二次函数/抛物线):
-
二次模型:h_θ(x) = θ₀ + θ₁x + θ₂x²
- 缺点:抛物线最终会下降,但房价不会随面积无限增大而降低(不符合实际)。
-
三次模型:h_θ(x) = θ₀ + θ₁x + θ₂x² + θ₃x³
- 能够持续上升,更符合实际趋势。
-
平方根模型:h_θ(x) = θ₀ + θ₁x + θ₂√x
- 曲线上升但逐渐平缓,也常用于特征变换。
3. 与多元线性回归的统一
多项式回归本质上可以转化为多元线性回归:
- 令 x₁ = x,x₂ = x²,x₃ = x³(或 √x)
- 模型转化为:h_θ(x) = θ₀ + θ₁x₁ + θ₂x₂ + θ₃x₃
- 这样就能继续使用之前的梯度下降算法,但输入特征变成了原始特征的多项式组合。
4. 特征缩放的极端重要性 ⚠️
引入多项式后,特征缩放变得必不可少:
- 例:房屋面积 x ∈ 1, 1000,则 x² ∈ 1, 10⁶,x³ ∈ 1, 10⁹。
- 尺度差异巨大会导致梯度下降收敛极慢,甚至发散。
- 必须对 x、x²、x³ 分别进行归一化(如除以最大值或均值标准化),使其处于相近区间(如 -1, 1)。
一句话记忆 :特征工程造新变量,多项式回归用 x²/x³ 弯曲线,转化多元线性后务必特征缩放。
正规方程与代价函数最小化 (Normal Equation)
1. 核心结论
公式 θ = (XᵀX)⁻¹Xᵀy 即为正规方程(Normal Equation) 。
它能通过纯代数方法一步到位求出让代价函数 J(θ) 达到全局最小的参数 θ,无需像梯度下降那样进行迭代。
2. 为什么它能最小化代价函数?(推导逻辑)
代价函数 J(θ) 是关于 θ 的"碗状"凸二次函数,存在全局最小值,令其导数为 0 即可找到碗底。
- 矩阵表示 :预测误差为
(Xθ - y),代价函数可写为J(θ) = 1/2 * (Xθ - y)ᵀ(Xθ - y)。 - 展开化简 :展开后得
J(θ) = 1/2 * (θᵀXᵀXθ - 2yᵀXθ + yᵀy)。 - 求导令零 :对 θ 求梯度并令其为 0,得到
∇J(θ) = XᵀXθ - Xᵀy = 0。 - 得出方程 :移项得到正规方程核心形式 XᵀXθ = Xᵀy。
- 解析求解 :假设 XᵀX 可逆,左乘逆矩阵即得 θ = (XᵀX)⁻¹Xᵀy。
3. 几何直觉
Xθ 是特征空间中的预测向量,y 是真实值。最小化误差等价于让预测向量最接近 y,此时误差向量 (y - Xθ) 必须垂直于特征空间 (与 X 各列正交),数学表达即 Xᵀ(y - Xθ) = 0,同样导出该公式。
4. 与梯度下降的对比
| 对比项 | 梯度下降 | 正规方程 |
|---|---|---|
| 方法 | 迭代逼近(逐步下山) | 直接解析求解(一步到位) |
| 学习率 α | 需要手动选择调参 | 不需要 |
| 特征缩放 | 必须(否则收敛慢/发散) | 不需要 |
| 计算复杂度 | O(kn²),k 为迭代次数 | O(n³),因需算 (XᵀX)⁻¹ |
| 适用规模 | 适合大规模(n > 10000) | 适合小规模(n < 10000) |
一句话记忆:凸函数求导令零得 XᵀXθ = Xᵀy,求逆解出 θ 一步最小化代价,小数据免缩放,大数据用梯度。
正规方程在矩阵不可逆情况下的解决方法
1. 核心问题:XᵀX 不可逆(奇异/退化)
在上一节正规方程 θ = (XᵀX)⁻¹Xᵀy 中,前提是 XᵀX 可逆 (满秩)。
但在实际中,XᵀX 可能不可逆,导致无法直接求逆。此时正规方程"失效"。
2. 矩阵不可逆的常见原因
- 特征冗余(多重共线性) :特征之间存在严格的线性关系。
- 例:房价预测中,同时包含"面积(平方英尺)"和"面积(平方米)",两者成比例;或 x₁ = 大小,x₂ = 2×大小。
- 特征数量过多(m ≤ n) :样本数 m 小于等于特征数 n(包括截距项),数据维度不足,矩阵不满秩。
- 例:只有 10 个样本,却有 12 个特征,模型无法唯一确定参数。
3. 解决方法
(1) 删除冗余特征 / 合并特征
- 检查并移除线性相关的特征(如保留一个面积单位,删除另一个)。
- 特征工程时避免构造完全成比例的特征。
(2) 正则化(最常用、最稳健)
- 引入 岭回归(Ridge Regression) :在 XᵀX 对角线上加一个常数 λ,使矩阵必然可逆。
- 修正后的方程:θ = (XᵀX + λI)⁻¹Xᵀy (I 为单位矩阵,λ > 0)
- 即使 XᵀX 奇异,(XᵀX + λI) 也一定可逆,同时防止过拟合。
- 注:这是实际工程中最推荐的方案,后续课程会深入讲解。
(3) 使用伪逆(数值计算层面)
- 在代码实现中(如 NumPy),可用 Moore-Penrose 伪逆 代替普通逆矩阵:
- θ = pinv(XᵀX) Xᵀy ≈ (XᵀX)⁻¹Xᵀy
- 伪逆总能计算,给出"最小范数"的最优解,但解释性稍弱。
(4) 降维(如 PCA)
- 当特征过多(n 很大)时,可用主成分分析(PCA)减少特征维度,消除共线性。
4. 与梯度下降的关系
- 矩阵不可逆时,梯度下降依然可以运行(不需要求逆),但可能因特征共线性导致收敛路径震荡。
- 正则化同时改善了正规方程的可逆性与梯度下降的稳定性。
一句话记忆:XᵀX 不可逆因冗余或特征多,删特征/正则化(加 λI)/伪逆可解,岭回归最常用。
分类 (Classification)
1. 什么是分类问题?
分类问题的目标是预测离散的输出值(类别标签),而不是连续值。
- 二分类 :输出只有两个类别,通常记为 0 和 1。
- 0:负类(Negative Class),如"没有肿瘤"、"不是垃圾邮件"
- 1:正类(Positive Class),如"有肿瘤"、"是垃圾邮件"
- 多分类:输出有多个类别(如手写数字识别 0~9),将在后续课程讲解。
2. 为什么不能用线性回归做分类?
如果用线性回归拟合分类数据,会存在两个严重问题:
问题一:输出值超出 0, 1 范围
- 线性回归的输出是连续值,可能远大于 1 或远小于 0
- 但分类问题的期望输出只能是 0 或 1(或介于 0~1 之间的概率)
- 即使设定阈值(如 ≥0.5 判为 1,<0.5 判为 0),线性回归仍可能因极端值导致误判
问题二:添加新样本会破坏已有的决策边界
- 线性回归对异常值敏感
- 新增一个远离现有数据的样本,会显著改变回归直线的斜率,导致原有的分类阈值失效
结论:线性回归不适合分类任务,需要专门的分类算法。
3. 分类问题的表示方式
假设函数输出的不再是具体的数值,而是属于正类的概率:
math
0 \leq h_\theta(x) \leq 1
- 如果 h_θ(x) ≥ 0.5,预测 y = 1(正类)
- 如果 h_θ(x) < 0.5,预测 y = 0(负类)
4. 分类问题的常见应用
| 应用场景 | 正类 (y=1) | 负类 (y=0) |
|---|---|---|
| 垃圾邮件分类 | 是垃圾邮件 | 不是垃圾邮件 |
| 肿瘤诊断 | 恶性肿瘤 | 良性肿瘤 |
| 信用卡欺诈检测 | 欺诈交易 | 正常交易 |
| 在线交易判定 | 欺诈 (Fraudulent) | 合法 (Valid) |
一句话记忆:分类预测离散标签(0/1),线性回归输出无界且对异常敏感,需用专门算法(即将学习的逻辑回归)。
假设陈述 (Hypothesis Representation)
1. 逻辑回归的假设函数
我们希望分类器的输出在 0 和 1 之间,因此将线性回归的假设函数 θᵀx 放入 Sigmoid 函数中:
math
h_\theta(x) = g(\theta^T x)
其中 Sigmoid 函数(也称逻辑函数)定义为:
math
g(z) = \frac{1}{1 + e^{-z}}
完整的假设函数为:
math
h_\theta(x) = \frac{1}{1 + e^{-\theta^T x}}
2. Sigmoid 函数的特性回顾
| z 的值 | e^(-z) | g(z) |
|---|---|---|
| -∞ | +∞ | 趋近 0 |
| -10 | 22026 | ≈ 0.000045 |
| -5 | 148.4 | ≈ 0.0067 |
| -2 | 7.39 | ≈ 0.12 |
| 0 | 1 | 0.5 |
| 2 | 0.135 | ≈ 0.88 |
| 5 | 0.0067 | ≈ 0.993 |
| 10 | 0.000045 | ≈ 0.99995 |
| +∞ | 0 | 趋近 1 |
- 输出范围:(0, 1),永远不触及边界
- z = 0 时,g(z) = 0.5,这是决策分界线
3. 假设函数的输出含义
math
h_\theta(x) = P(y = 1 | x; \theta)
读作:给定特征 x 和参数 θ 的条件下,y = 1 的概率。
并且满足概率公理:
math
P(y = 1 | x; \theta) + P(y = 0 | x; \theta) = 1
所以:
math
P(y = 0 | x; \theta) = 1 - h_\theta(x)
4. 如何做出预测
基于概率输出,通过阈值 0.5 做出分类决策:
- 如果 h_θ(x) ≥ 0.5,预测 y = 1
- 如果 h_θ(x) < 0.5,预测 y = 0
由于 Sigmoid 函数的单调性,这等价于:
- 如果 θᵀx ≥ 0,预测 y = 1
- 如果 θᵀx < 0,预测 y = 0
5. 与线性回归假设函数的对比
| 对比项 | 线性回归 | 逻辑回归 |
|---|---|---|
| 假设函数形式 | h(x) = θᵀx | h(x) = 1 / (1 + e^(-θᵀx)) |
| 输出范围 | (-∞, +∞) | (0, 1) |
| 输出含义 | 连续数值预测 | 属于正类的概率 |
| 决策方式 | 直接输出数值 | 以 0.5 为阈值分类 |
一句话记忆:逻辑回归的假设函数 = 对 θᵀx 套上 Sigmoid 函数,输出 0~1 之间的概率,以 0.5 为阈值做分类。
决策边界 (Decision Boundary)
1. 什么是决策边界?
决策边界是将特征空间划分为不同类别的分界线(或超平面)。它由假设函数的预测规则自然定义出来,而非由数据集直接给出。
2. 决策边界的由来
逻辑回归的预测规则:
- 如果 h_θ(x) ≥ 0.5,预测 y = 1
- 如果 h_θ(x) < 0.5,预测 y = 0
由于 Sigmoid 函数在 z = 0 时恰好输出 0.5,且 g(z) 单调递增,上述规则等价于:
- 如果 θᵀx ≥ 0,预测 y = 1
- 如果 θᵀx < 0,预测 y = 0
θᵀx = 0 这条线(或超平面)就是决策边界。
3. 线性决策边界示例
假设一个二分类模型有两个特征 x₁、x₂,参数为:
math
\theta = [-3, 1, 1]^T
即 h_θ(x) = g(-3 + x₁ + x₂)
决策边界由 θᵀx = 0 决定:
math
-3 + x₁ + x₂ = 0
化简得:x₁ + x₂ = 3
这条直线将平面分成两部分:
- 上方区域(x₁ + x₂ ≥ 3):预测 y = 1
- 下方区域(x₁ + x₂ < 3):预测 y = 0
4. 非线性决策边界示例
如果数据无法用一条直线分开,可以通过添加多项式特征实现非线性决策边界。
假设:
math
h_\theta(x) = g(\theta_0 + \theta_1 x_1 + \theta_2 x_2 + \theta_3 x_1^2 + \theta_4 x_2^2)
参数为:
math
\theta = [-1, 0, 0, 1, 1]^T
决策边界由 θᵀx = 0 决定:
math
-1 + x_1^2 + x_2^2 = 0
化简得:x₁² + x₂² = 1
这是一个半径为 1 的圆:
- 圆内(x₁² + x₂² < 1):预测 y = 0
- 圆外(x₁² + x₂² ≥ 1):预测 y = 1
5. 关键理解
| 要点 | 说明 |
|---|---|
| 决策边界是模型的属性 | 由参数 θ 决定,而非由训练数据直接画出 |
| 决策边界可以是任意形状 | 通过添加多项式特征(x₁²、x₁x₂、√x₁ 等),可以得到非线性边界 |
| 高阶多项式 = 更复杂的边界 | 特征越复杂,决策边界越灵活,但也更容易过拟合 |
| 线性 ≠ 简单 | 线性决策边界指 θᵀx = 0 是线性方程,但特征本身可以是多项式的 |
一句话记忆:决策边界由 θᵀx = 0 定义,是模型自身的分界线;添加多项式特征可得到非线性边界,但越复杂越容易过拟合。
代价函数 (Cost Function)
1. 为什么不能用线性回归的代价函数?
逻辑回归如果沿用线性回归的均方误差(MSE):
math
J(\theta) = \frac{1}{2m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})^2
将 h_θ(x) = 1/(1+e^(-θᵀx)) 代入后,J(θ) 会变成非凸函数(Non-convex),图像有许多局部最低点。梯度下降很容易卡在某个局部最小值,找不到全局最优解。
结论:逻辑回归需要一个不同的、凸的代价函数。
2. 逻辑回归的代价函数(交叉熵损失)
分段定义
当 y = 1 时:
math
\text{Cost}(h_\theta(x), y) = -\log(h_\theta(x))
当 y = 0 时:
math
\text{Cost}(h_\theta(x), y) = -\log(1 - h_\theta(x))
设计原理
| 真实值 y | 预测值 h(x) | 代价 | 含义 |
|---|---|---|---|
| 1 | 0.99(很准) | -log(0.99) ≈ 0.01 | 惩罚极小 |
| 1 | 0.50(模糊) | -log(0.50) ≈ 0.69 | 中等惩罚 |
| 1 | 0.01(很偏) | -log(0.01) ≈ 4.61 | 严厉惩罚 |
| 0 | 0.01(很准) | -log(0.99) ≈ 0.01 | 惩罚极小 |
| 0 | 0.50(模糊) | -log(0.50) ≈ 0.69 | 中等惩罚 |
| 0 | 0.99(很偏) | -log(0.01) ≈ 4.61 | 严厉惩罚 |
核心思想:预测越离谱,代价越大;预测越准,代价越小。
3. 统一的代价函数公式
将分段写法合并为一个公式:
math
J(\theta) = -\frac{1}{m} \sum_{i=1}^m \left[ y^{(i)} \log(h_\theta(x^{(i)})) + (1 - y^{(i)}) \log(1 - h_\theta(x^{(i)})) \right]
- 当 y=1 时,后半项 (1-y)log(1-h) 为 0,只剩 -ylog(h)
- 当 y=0 时,前半项 ylog(h) 为 0,只剩 -(1-y)log(1-h)
等价于分段写法。
4. 为什么叫交叉熵?
交叉熵来自信息论,衡量两个概率分布之间的差异:
- 真实分布:y(要么 0,要么 1)
- 预测分布:h_θ(x)(0~1 之间的概率)
两个分布越接近,交叉熵越小;差异越大,交叉熵越大。最小化交叉熵 = 让预测分布尽量接近真实分布。
5. 与线性回归代价函数的对比
| 对比项 | 线性回归(MSE) | 逻辑回归(交叉熵) |
|---|---|---|
| 公式 | 1/2m Σ(h - y)² | -1/m Σy log(h) + (1-y)log(1-h) |
| 函数形状 | 凸函数(碗形) | 凸函数(碗形) |
| 能否用梯度下降 | ✅ 能找到全局最优 | ✅ 能找到全局最优 |
| 输出含义 | 数值误差 | 概率分布差异 |
一句话记忆:逻辑回归用交叉熵替代 MSE,因为 MSE 代入 Sigmoid 后会变成非凸函数;交叉熵的 -log 形式确保预测越离谱惩罚越大,且整体是凸函数。
简化代价函数与梯度下降 (Simplified Cost Function and Gradient Descent)
1. 简化后的代价函数
上一节的分段代价函数可以合并为一个简洁的公式:
math
J(\theta) = -\frac{1}{m} \sum_{i=1}^m \left[ y^{(i)} \log(h_\theta(x^{(i)})) + (1 - y^{(i)}) \log(1 - h_\theta(x^{(i)})) \right]
- 当 y=1 时:后半项 (1-y)log(1-h) = 0,只剩 -ylog(h)
- 当 y=0 时:前半项 ylog(h) = 0,只剩 -(1-y)log(1-h)
这个公式是从极大似然估计推导而来的,目标是找到一组参数 θ,使得观测到当前训练数据的概率最大。
2. 逻辑回归的梯度下降
梯度下降的通用形式
math
\theta_j := \theta_j - \alpha \frac{\partial}{\partial \theta_j} J(\theta)
对逻辑回归求导后的结果
对 J(θ) 求偏导并化简后,得到与线性回归形式上完全相同的更新规则:
math
\theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) \cdot x_j^{(i)}
重要提醒:虽然形式相同,但 h(x) 不同!
| 对比项 | 线性回归 | 逻辑回归 |
|---|---|---|
| 假设函数 h(x) | θᵀx | 1/(1+e^(-θᵀx)) |
| 梯度下降更新规则 | θⱼ := θⱼ - α/m Σ(h-y)·xⱼ | θⱼ := θⱼ - α/m Σ(h-y)·xⱼ |
更新规则的公式一样,但因为 h(x) 完全不同,所以实际计算出的梯度方向和大小也不同。
3. 梯度下降的具体步骤
text
重复直到收敛 {
对所有 j 同步更新:
temp_j = θ_j - α * (1/m) * Σ (h(xⁱ) - yⁱ) * xⱼⁱ
所有 temp_j 同时赋值给 θ_j
}
注意事项
- 同步更新:所有 θⱼ 必须同时计算新值,再一起赋值
- 特征缩放仍然重要:逻辑回归的特征尺度差异过大时,梯度下降也会收敛缓慢
4. 与线性回归梯度下降的对比总结
| 对比项 | 线性回归 | 逻辑回归 |
|---|---|---|
| 假设函数 h(x) | θᵀx | 1/(1+e^(-θᵀx)) |
| 代价函数 | MSE = 1/2m Σ(h-y)² | 交叉熵 = -1/m Σy log(h)+(1-y)log(1-h) |
| 梯度下降更新公式 | θⱼ := θⱼ - α/m Σ(h-y)xⱼ | θⱼ := θⱼ - α/m Σ(h-y)xⱼ |
| 是否需要特征缩放 | ✅ 是 | ✅ 是 |
| 是否能找到全局最优 | ✅ 凸函数 | ✅ 凸函数 |
一句话记忆:逻辑回归的代价函数简化为交叉熵统一公式,梯度下降更新规则形式上与线性回归一致,但因 h(x) 不同导致实际计算不同;特征缩放依然重要。
高级优化 (Advanced Optimization)
1. 为什么要用高级优化?
基础梯度下降虽然能工作,但有两个痛点:
- 需要手动选择学习率 α,调参麻烦
- 收敛速度相对较慢
高级优化算法可以自动选择步长,不需要手动调 α,且收敛更快。
2. 三种高级优化算法
| 算法 | 特点 |
|---|---|
| 共轭梯度法 (Conjugate Gradient) | 利用共轭方向避免之字形震荡,内存友好 |
| BFGS | 拟牛顿法,近似海森矩阵,收敛极快但内存消耗大(O(n²)) |
| L-BFGS | BFGS 的改进版,只存最近几步信息,内存消耗小,是传统机器学习的标配 |
共同优势:自动线搜索找步长,无需手动调 α,收敛快于基础梯度下降。
3. 优化器的使用范式
核心思想:你负责提供代价函数值和梯度,优化器负责找最优 θ。
你需要提供一个函数,返回两个值:
- 代价函数值 J(θ)
- 梯度 ∂J/∂θⱼ
教学示例
为演示用法,人为构造一个极简测试函数(非真实逻辑回归):
math
J(\theta) = (\theta_1 - 5)^2 + (\theta_2 - 5)^2
梯度:
math
\frac{\partial J}{\partial \theta_1} = 2(\theta_1 - 5)
math
\frac{\partial J}{\partial \theta_2} = 2(\theta_2 - 5)
最优解:θ₁ = 5,θ₂ = 5
真实场景(逻辑回归)
将逻辑回归的交叉熵代价函数及其梯度代入,优化器自动迭代求解。
4. Octave/MATLAB 实现
octave
% 配置优化选项
options = optimset('GradObj', 'on', 'MaxIter', 100);
% 调用无约束最小化求解器
[optTheta, functionVal, exitFlag] = fminunc(@costFunction, initialTheta, options);
| 组件 | 说明 |
|---|---|
| optimset | 配置选项(非算法),设置是否提供梯度、最大迭代次数等 |
| fminunc | 无约束最小化求解器,默认使用 BFGS/L-BFGS 类拟牛顿法 |
| @costFunction | 自定义函数,返回 J(θ) 和梯度 |
| initialTheta | 初始参数 |
| optTheta | 优化后的最优参数 |
一句话记忆:高级优化器自动调步长不求人,你只需提供 J(θ) 和梯度,fminunc 帮你找最优 θ。
多元分类:一对多 (Multiclass Classification: One-vs-All)
1. 什么是多元分类?
之前学的逻辑回归处理的是二分类 问题(y = 0 或 1)。但在实际中,常常遇到多于两个类别的分类问题。
常见例子
| 应用场景 | 类别 |
|---|---|
| 邮件分类 | 工作邮件、朋友邮件、家人邮件、兴趣邮件 |
| 天气预测 | 晴天、多云、雨天、雪天 |
| 手写数字识别 | 0、1、2、3、4、5、6、7、8、9 |
| 疾病诊断 | 健康、感冒、流感、新冠肺炎 |
2. 一对多的核心思想
将一个多分类问题 拆分为多个独立的二分类问题。
具体做法
假设有 K 个类别(y = 1, 2, ..., K),训练 K 个独立的逻辑回归分类器:
| 分类器 | 任务 | 正类 | 负类 |
|---|---|---|---|
| h_θ^(1)(x) | 判断是否为类别 1 | y = 1 | y = 2, 3, ..., K |
| h_θ^(2)(x) | 判断是否为类别 2 | y = 2 | y = 1, 3, ..., K |
| ... | ... | ... | ... |
| h_θ^(K)(x) | 判断是否为类别 K | y = K | y = 1, 2, ..., K-1 |
每个分类器输出的是属于该类别的概率:
math
h_\theta^{(k)}(x) = P(y = k | x; \theta)
3. 如何进行预测
当输入一个新的样本 x 时:
- 将所有 K 个分类器都跑一遍
- 每个分类器输出一个概率值
- 选择概率最大的那个类别作为最终预测
math
\text{预测类别} = \arg\max_k h_\theta^{(k)}(x)
示例(手写数字识别)
假设有 3 个类别(1、2、3),输入一个数字图片:
| 分类器 | 输出概率 |
|---|---|
| h_θ^(1)(x):是 1 的概率 | 0.05 |
| h_θ^(2)(x):是 2 的概率 | 0.90 |
| h_θ^(3)(x):是 3 的概率 | 0.05 |
预测结果:类别 2(概率最高)
一句话记忆:一对多 = 训练 K 个二分类器,每个判断"是不是第 k 类",预测时选概率最大的那个。
过拟合问题 (The Problem of Overfitting)
1. 什么是过拟合?
过拟合是指模型在训练集上表现非常好 (误差极低甚至为零),但在新数据(测试集/验证集)上表现很差 的现象。模型学到了训练数据中的噪声和偶然模式,而不是真实的潜在规律。
三种拟合状态的直观对比
| 状态 | 训练误差 | 测试误差 | 模型复杂度 | 图示表现 |
|---|---|---|---|---|
| 欠拟合 (Underfitting) | 高 | 高 | 过低 | 直线无法拟合曲线数据 |
| 刚好拟合 (Just Right) | 适中 | 适中 | 适当 | 曲线贴合数据趋势但不扭曲 |
| 过拟合 (Overfitting) | 极低(接近 0) | 很高 | 过高 | 曲线穿过每一个数据点,剧烈抖动 |
2. 过拟合的常见原因
| 原因 | 说明 | 示例 |
|---|---|---|
| 特征太多 | 特征数量 n 远大于样本数量 m | 100 个样本但有 1000 个特征 |
| 模型过于复杂 | 使用高阶多项式或深层网络 | 用 x⁵、x⁶ 等高次项拟合少量数据 |
| 训练数据太少 | 样本量不足以支撑模型复杂度 | 10 个样本却用 5 次多项式 |
| 训练时间过长 | 在梯度下降中迭代次数过多 | 训练集误差已经很低还继续迭代 |
3. 过拟合在不同算法中的表现
线性回归中的过拟合
假设房价预测,特征为房屋面积 x:
math
h_\theta(x) = \theta_0 + \theta_1 x + \theta_2 x^2 + \theta_3 x^3 + \theta_4 x^4
- 高阶项让曲线剧烈弯曲,强行穿过每个训练点
- 但在新数据上预测极差
逻辑回归中的过拟合
math
h_\theta(x) = g(\theta_0 + \theta_1 x_1 + \theta_2 x_2 + \theta_3 x_1^2 x_2 + \theta_4 x_1^2 x_2^2 + ...)
- 决策边界变得极其复杂、扭曲
- 完美分割训练集但在测试集上失效
4. 解决过拟合的方法
| 方法 | 做法 | 适用场景 |
|---|---|---|
| 1. 减少特征数量 | 手动选择重要特征 / 用模型自动筛选 | 特征中有大量冗余或无关特征时 |
| 2. 正则化 (Regularization) | 保留所有特征,但减小参数 θⱼ 的值 | 每个特征都有一定作用时(最常用) |
| 3. 增加训练数据 | 收集更多样本 | 数据量不足时 |
| 4. 降低模型复杂度 | 减少多项式次数 / 简化网络结构 | 模型过于复杂时 |
两种主要方法的对比
| 方法 | 优点 | 缺点 |
|---|---|---|
| 减少特征 | 模型更简单,可解释性更强 | 可能会丢失有用信息 |
| 正则化 | 保留所有特征,自动削弱不重要特征的影响 | 需要选择合适的正则化参数 λ |
一句话记忆:过拟合 = 训练误差极低但测试误差极高,模型记住了噪声而非规律;解决思路:减少特征或正则化。
代价函数 (Cost Function)
1. 正则化的直观想法
过拟合的原因是高阶项的系数(参数)过大,导致曲线剧烈扭曲。如果能让这些高阶项的系数变小,曲线就会变得更平滑,从而缓解过拟合。
以房价预测为例
假设使用四次多项式拟合房价:
math
h_\theta(x) = \theta_0 + \theta_1 x + \theta_2 x^2 + \theta_3 x^3 + \theta_4 x^4
- 二次多项式(θ₃ = θ₄ = 0):拟合良好,曲线平滑
- 四次多项式(θ₃、θ₄ 不为 0):过拟合,曲线剧烈扭曲
思路:保留所有特征,但对 θ₃ 和 θ₄ 施加惩罚,迫使它们接近于 0。
2. 带惩罚项的代价函数
修改后的代价函数
在原代价函数(均方误差)的基础上,对特定参数加上惩罚项:
math
J(\theta) = \frac{1}{2m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})^2 + 1000\theta_3^2 + 1000\theta_4^2
为什么乘以 1000?
- 1000 是一个极大的惩罚系数
- 如果 θ₃ 或 θ₄ 稍微变大,惩罚项就会急剧增大,导致总代价飙升
- 为了最小化总代价,优化算法被迫将 θ₃ 和 θ₄ 压缩到接近于 0
效果
当 θ₃ ≈ 0 且 θ₄ ≈ 0 时:
math
h_\theta(x) \approx \theta_0 + \theta_1 x + \theta_2 x^2
四次多项式退化为二次多项式,曲线变得平滑,解决了过拟合问题。
3. 通用的正则化代价函数
在实际中,我们不知道哪些参数需要惩罚,所以对所有参数统一施加惩罚:
math
J(\theta) = \frac{1}{2m} \left[ \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})^2 + \lambda \sum_{j=1}^n \theta_j^2 \right]
其中:
- λ(正则化参数) :控制正则化的强度
- λ 越大,参数惩罚越重,模型越简单(容易欠拟合)
- λ 越小,参数惩罚越轻,模型越复杂(容易过拟合)
- λ = 0:退化为原始代价函数(无正则化)
- ∑θⱼ² :对参数 θ₁ 到 θₙ 施加惩罚(注意:θ₀ 不参与正则化)
为什么不惩罚 θ₀?
θ₀ 是偏置项(截距),只影响预测值的整体偏移,不影响曲线的弯曲程度。惩罚 θ₀ 会导致模型整体偏移,反而降低拟合能力。
4. 正则化的直观效果
| 正则化强度 λ | 参数 θⱼ 的大小 | 模型复杂度 | 拟合状态 |
|---|---|---|---|
| λ = 0 | 不受限制 | 高 | 容易过拟合 |
| λ 适中 | 被适度压缩 | 适中 | 刚好拟合 |
| λ 过大 | 被过度压缩,趋近于 0 | 过低 | 欠拟合(接近水平线) |
一句话记忆:正则化 = 在代价函数中加入 λ∑θⱼ²,惩罚过大的参数,让模型更平滑;λ 越大模型越简单,λ 越小模型越复杂。
线性回归的正则化 (Regularized Linear Regression)
1. 正则化线性回归的代价函数
在原始均方误差的基础上,加入正则化项(惩罚所有参数 θ₁ 到 θₙ,θ₀ 不参与):
math
J(\theta) = \frac{1}{2m} \left[ \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)})^2 + \lambda \sum_{j=1}^n \theta_j^2 \right]
其中:
- 前半部分:原始均方误差
- 后半部分:正则化项 λ∑θⱼ²
- λ:正则化参数,控制惩罚强度
2. 梯度下降法的正则化版本
梯度下降更新规则
对 J(θ) 求偏导后,得到更新规则:
math
\theta_0 := \theta_0 - \alpha \frac{1}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_0^{(i)}
math
\theta_j := \theta_j - \alpha \left[ \frac{1}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} + \frac{\lambda}{m} \theta_j \right] \quad (j = 1, 2, ..., n)
改写形式
将 θⱼ 的更新规则改写为更直观的形式:
math
\theta_j := \theta_j (1 - \alpha \frac{\lambda}{m}) - \alpha \frac{1}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)}
| 组成部分 | 含义 |
|---|---|
| θⱼ(1 - αλ/m) | 每次迭代先将 θⱼ 缩小一点(收缩项) |
| - α/m Σ(h-y)xⱼ | 与标准梯度下降相同的更新项 |
关键理解:正则化后的梯度下降每次迭代都会先把 θⱼ 乘以一个略小于 1 的数(1 - αλ/m),相当于对参数进行"缩减",然后再向梯度方向更新。这就是正则化让参数变小的机制。
与标准梯度下降的对比
| 对比项 | 标准梯度下降 | 正则化梯度下降 |
|---|---|---|
| θ₀ 更新 | 不变 | 不变 |
| θⱼ 更新 | 仅减去梯度项 | 先收缩再减梯度项 |
| 参数大小 | 不受限制 | 被持续压缩 |
3. 正规方程法的正则化版本
正则化后的正规方程
math
\theta = (X^T X + \lambda \cdot L)^{-1} X^T y
其中 L 是一个 (n+1)×(n+1) 的对角矩阵:
math
L = \begin{bmatrix}
0 & 0 & \cdots & 0 \\
0 & 1 & \cdots & 0 \\
\vdots & \vdots & \ddots & \vdots \\
0 & 0 & \cdots & 1
\end{bmatrix}
- L 的第一个元素为 0(对应 θ₀ 不参与正则化)
- 其余对角线元素为 1(对应 θ₁ 到 θₙ 参与正则化)
正则化解决矩阵不可逆问题
在 4-7 中讲过,当 m ≤ n 或特征存在多重共线性时,XᵀX 可能不可逆。加入 λL 后:
math
X^T X + \lambda L
一定可逆(因为 λ > 0 时,该矩阵是正定的)。
| 情况 | 标准正规方程 | 正则化正规方程 |
|---|---|---|
| XᵀX 可逆 | ✅ 可解 | ✅ 可解 |
| XᵀX 不可逆 | ❌ 无法求解 | ✅ 一定可解 |
一句话记忆:正则化线性回归 = 代价函数加 λ∑θⱼ²,梯度下降每次迭代先收缩 θⱼ再更新,正规方程加 λL 保证矩阵可逆。
逻辑回归的正则化 (Regularized Logistic Regression)
1. 逻辑回归的过拟合问题
逻辑回归同样会面临过拟合问题,尤其是当特征较多或使用高阶多项式特征时。
过拟合的表现
| 状态 | 决策边界 | 训练集表现 | 测试集表现 |
|---|---|---|---|
| 欠拟合 | 直线,过于简单 | 误差高 | 误差高 |
| 刚好拟合 | 平滑曲线 | 误差适中 | 误差适中 |
| 过拟合 | 扭曲复杂,完美分割每个点 | 误差极低 | 误差高 |
2. 正则化逻辑回归的代价函数
在逻辑回归的交叉熵代价函数基础上,加入正则化项:
math
J(\theta) = -\frac{1}{m} \sum_{i=1}^m \left[ y^{(i)} \log(h_\theta(x^{(i)})) + (1 - y^{(i)}) \log(1 - h_\theta(x^{(i)})) \right] + \frac{\lambda}{2m} \sum_{j=1}^n \theta_j^2
其中:
- 前半部分:逻辑回归的交叉熵代价函数
- 后半部分:正则化项 λ/(2m) ∑θⱼ²
- θ₀ 不参与正则化(与线性回归一致)
- λ:正则化参数,控制惩罚强度
3. 梯度下降更新规则
对正则化后的 J(θ) 求偏导,得到更新规则:
math
\theta_0 := \theta_0 - \alpha \frac{1}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_0^{(i)}
math
\theta_j := \theta_j - \alpha \left[ \frac{1}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)} + \frac{\lambda}{m} \theta_j \right] \quad (j = 1, 2, ..., n)
改写形式
math
\theta_j := \theta_j (1 - \alpha \frac{\lambda}{m}) - \alpha \frac{1}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)}
注意 :这个更新公式与线性回归正则化后的形式完全相同,区别仅在于 h_θ(x) 的定义不同:
- 线性回归:h_θ(x) = θᵀx
- 逻辑回归:h_θ(x) = 1/(1 + e^{-θᵀx})
4. 高级优化算法中的正则化
在使用 fminunc 等高级优化器时,只需在自定义的 costFunction 中将正则化项加入 J(θ) 和梯度即可:
octave
function [J, grad] = costFunctionReg(theta, X, y, lambda)
% 计算假设函数
h = sigmoid(X * theta);
% 计算正则化代价函数
J = -(1/m) * sum(y .* log(h) + (1-y) .* log(1-h)) ...
+ (lambda/(2*m)) * sum(theta(2:end).^2);
% 计算梯度(θ₀ 不参与正则化)
grad = (1/m) * X' * (h - y);
grad(2:end) = grad(2:end) + (lambda/m) * theta(2:end);
end
5. 正则化参数 λ 的选择
| λ 取值 | 效果 | 说明 |
|---|---|---|
| λ = 0 | 无正则化 | 容易过拟合 |
| λ 过小 | 正则化不足 | 仍可能过拟合 |
| λ 适中 | 正则化恰当 | 泛化能力最强 |
| λ 过大 | 正则化过度 | 所有参数趋近于 0,模型欠拟合(决策边界接近直线) |
6. 与线性回归正则化的对比
| 对比项 | 线性回归 | 逻辑回归 |
|---|---|---|
| 假设函数 h_θ(x) | θᵀx | 1/(1+e^{-θᵀx}) |
| 代价函数 | 均方误差 | 交叉熵 |
| 正则化项 | λ/(2m)∑θⱼ² | λ/(2m)∑θⱼ² |
| θ₀ 是否参与 | ❌ 不参与 | ❌ 不参与 |
| 梯度下降更新公式 | 形式相同 | 形式相同(h_θ 不同) |
一句话记忆:逻辑回归正则化 = 交叉熵代价函数 + λ∑θⱼ²,梯度下降更新公式形式与线性回归相同(h_θ 不同),θ₀ 不参与正则化。
非线性假设 (Non-linear Hypotheses)
1. 为什么需要非线性假设?
之前学习的线性回归和逻辑回归都假设决策边界是线性的(直线或平面)。但在实际问题中,很多数据无法用线性模型有效分离或拟合。
线性模型的局限性
| 场景 | 线性模型效果 | 原因 |
|---|---|---|
| 简单二分类 | ✅ 效果好 | 两类数据线性可分 |
| 复杂图像识别 | ❌ 效果差 | 像素间关系高度非线性 |
| 自然语言处理 | ❌ 效果差 | 词汇组合关系复杂 |
| 音频信号处理 | ❌ 效果差 | 时序依赖性强 |
2. 用特征组合处理非线性
基本思路
在线性模型中引入高阶多项式特征,使模型具备非线性表达能力。
对于原始特征 x₁、x₂,可以构造:
math
h_\theta(x) = g(\theta_0 + \theta_1 x_1 + \theta_2 x_2 + \theta_3 x_1 x_2 + \theta_4 x_1^2 + \theta_5 x_2^2 + ...)
特征组合的爆炸问题
随着特征数量和多项式次数的增加,特征数量呈指数级增长:
| 原始特征数 | 使用二次项(含交互)后的特征数 | 使用三次项后的特征数 |
|---|---|---|
| 2 | 5 | 9 |
| 10 | 65 | 约 220 |
| 50 | 约 1325 | 约 23425 |
| 100 | 约 5150 | 约 171700 |
| 1000 | 约 501500 | 约 1.67亿 |
计算公式:对于 n 个原始特征,包含所有二次项(含交互项)的特征数为 O(n²),三次项为 O(n³)。
3. 具体案例:房价预测
使用原始特征
math
h_\theta(x) = \theta_0 + \theta_1 \times \text{面积} + \theta_2 \times \text{卧室数}
- 只能拟合线性关系
- 无法捕捉面积与卧室数的交互效应
使用二次特征
math
h_\theta(x) = \theta_0 + \theta_1 \times \text{面积} + \theta_2 \times \text{卧室数} + \theta_3 \times \text{面积}^2 + \theta_4 \times \text{卧室数}^2 + \theta_5 \times \text{面积} \times \text{卧室数}
- 可以拟合非线性关系
- 但特征从 2 个增加到 5 个
使用三次特征
- 特征进一步增加到 9 个
- 模型更灵活,但也更容易过拟合
4. 具体案例:图像识别
图像数据的特征维度
以汽车识别为例,一张灰度图像的输入是每个像素的亮度值:
| 图像尺寸 | 像素数(特征数) | 二次项特征数(约) |
|---|---|---|
| 50×50 | 2500 | 约 300 万 |
| 100×100 | 10000 | 约 5000 万 |
| 200×200 | 40000 | 约 8 亿 |
彩色图像还需要考虑 RGB 三个通道,特征数再乘以 3。
为什么线性模型在这里失效?
- 汽车可能出现在图像的任何位置
- 汽车可能有不同角度、光照条件
- 判断"是否是汽车"依赖于像素之间的空间关系和组合模式
- 线性模型只能看到单个像素的亮度值,无法捕捉这种复杂关系
5. 非线性假设的必要性
当特征数量 n 很大时
| n 的大小 | 是否适合构造高阶多项式特征 | 推荐方法 |
|---|---|---|
| n 很小(≤10) | ✅ 可以,特征组合可控 | 多项式回归 / 逻辑回归 |
| n 中等(10~100) | ⚠️ 特征组合开始膨胀 | 需配合正则化或特征选择 |
| n 很大(≥1000) | ❌ 特征组合爆炸,不可行 | 神经网络 |
结论
当特征数量非常大时(如图像处理中的数千数万个像素),传统的多项式特征方法会因为特征数量爆炸而计算上不可行 ,需要引入新的方法------神经网络来处理这种高维非线性问题。
6. 引出神经网络
| 传统方法的困境 | 神经网络的解决方案 |
|---|---|
| 手动构造高阶特征,维度爆炸 | 自动学习特征表示 |
| 无法处理原始像素级输入 | 逐层提取低级到高级特征 |
| 计算复杂度随特征数指数增长 | 计算复杂度与网络结构相关,可控 |
一句话记忆:特征数量大时,手动构造高阶多项式会导致特征爆炸(O(n²)、O(n³)),传统线性模型失效,需要神经网络自动学习非线性特征表示。
激活函数 (Activation Function)
定义
激活函数是神经网络中每个神经元 (或逻辑回归的输出层)上的一类函数,它对输入的加权和进行非线性变换,决定神经元的输出值。
数学形式
一个神经元的工作流程:
text
输入 x → 加权求和 z = wᵀx + b → 激活函数 a = g(z) → 输出 a
其中 g(z) 就是激活函数。
核心作用
| 作用 | 说明 |
|---|---|
| 引入非线性 | 如果没有激活函数,多层神经网络叠加后仍然是线性变换,等价于单层网络 |
| 控制输出范围 | 将输出限制在特定区间(如 01、-11)或保持非负 |
| 决定神经元是否激活 | 某些激活函数(如 ReLU)会让部分神经元输出 0,实现稀疏激活 |
常见的激活函数
| 名称 | 公式 | 输出范围 | 特点 |
|---|---|---|---|
| Sigmoid | 1/(1+e⁻ᶻ) | (0, 1) | 平滑,适合输出概率,但两端梯度饱和 |
| Tanh | (eᶻ-e⁻ᶻ)/(eᶻ+e⁻ᶻ) | (-1, 1) | 零中心化,比 Sigmoid 好用,但仍存在梯度饱和 |
| ReLU | max(0, z) | [0, ∞) | 计算简单,缓解梯度消失,是目前隐藏层最常用的 |
| Leaky ReLU | max(0.01z, z) | (-∞, ∞) | 改进 ReLU,避免神经元死亡 |
| Softmax | eᶻʲ/∑eᶻᵏ | (0,1), 和为 1 | 多分类输出层专用,输出各类别概率 |
激活函数 vs 线性回归/逻辑回归
| 模型 | 激活函数(隐含在假设函数中) |
|---|---|
| 线性回归 | 无(或者说恒等映射 g(z)=z,输出就是加权和本身) |
| 逻辑回归(二分类) | Sigmoid,将加权和映射到 (0,1) 概率 |
| 逻辑回归(多分类) | Softmax,将加权和映射到多个类别的概率分布 |
| 神经网络 | 隐藏层用 ReLU(常用),输出层根据任务选 Sigmoid/Softmax/线性 |
一句话总结
激活函数是神经元的"开关"或"变换器",对输入的加权和做非线性映射,让神经网络有能力学习复杂的非线性模式。
权重 (Weights)
1. 定义
权重是神经网络中连接两个神经元之间的参数,表示前一个神经元的输出对后一个神经元的影响程度(重要性)。
2. 与之前参数的关系
| 概念 | 线性回归 / 逻辑回归 | 神经网络 |
|---|---|---|
| 参数名称 | θ₀, θ₁, ..., θₙ | W(权重矩阵), b(偏置向量) |
| 作用 | 决定每个特征对输出的影响 | 决定每个神经元连接对下一层的影响 |
| 优化方式 | 梯度下降 | 梯度下降(反向传播) |
权重就是之前学的 θ,只是到了神经网络里改了个名字,并且变成了矩阵形式。
3. 权重的含义
单层网络(逻辑回归视角)
text
输入 x₁ → 权重 w₁ ┐
输入 x₂ → 权重 w₂ ┤→ 加权求和 z = w₁x₁ + w₂x₂ + b → 激活函数 → 输出
输入 x₃ → 权重 w₃ ┘
| 权重取值 | 含义 |
|---|---|
| 绝对值很大 | 该连接很重要,对输出影响大 |
| 绝对值很小 | 该连接不重要,对输出影响小 |
| 正数 | 正向影响(输入增大,输出增大) |
| 负数 | 负向影响(输入增大,输出减小) |
| 接近 0 | 该连接几乎不起作用 |
多层网络(神经网络视角)
text
输入层 隐藏层 输出层
x₁ ──w₁₁──→ 神经元₁ ──w₁₁'──→ 输出
x₂ ──w₁₂──→ 神经元₁
x₁ ──w₂₁──→ 神经元₂
x₂ ──w₂₂──→ 神经元₂
每一层都有自己的权重矩阵,前一层的输出经过权重连接到下一层的每个神经元。
4. 权重与正则化的关系
之前学的正则化(λ∑θⱼ²)在神经网络中称为 权重衰减 (Weight Decay),本质完全相同:在代价函数中惩罚权重的平方和,让权重不要太大,防止过拟合。
5. 权重与特征重要性的关系
| 模型 | 权重是否直接反映特征重要性 |
|---|---|
| 线性回归 | ✅ 是,θⱼ 直接表示特征 xⱼ 的重要性 |
| 神经网络 | ❌ 否,多层非线性变换后,权重不再直接对应原始特征的重要性 |
6. 一句话记忆
权重是神经元之间连接的"强度系数",决定前一个信号对后一个神经元的影响有多大。它就是之前学的 θ,到了神经网络里改名为 W,并扩展为矩阵形式。
神经网络的可解释性问题
1. 为什么神经网络难以解释?
1.1 参数不直接对应原始特征
| 模型 | 参数含义 | 可解释性 |
|---|---|---|
| 线性回归 | θⱼ 直接表示特征 xⱼ 对输出的影响 | 高 |
| 逻辑回归 | θⱼ 表示特征对对数几率的影响 | 较高 |
| 神经网络 | 权重经过多层非线性变换,不再对应原始特征 | 低 |
1.2 特征被层层重组
text
原始像素 → 边缘检测 → 纹理组合 → 局部形状 → 物体部件 → 最终判断
每一层都在做非线性变换,原始输入的信息被反复混合、扭曲、抽象,最终决策路径极其复杂,无法追踪"到底是哪个输入导致了判断结果"。
1.3 参数之间高度耦合
神经网络的决策不是单个参数决定的,而是成千上万个参数协同作用的结果。改变其中一个权重,会影响后续所有层的输出,无法单独归因。
2. 可解释性与性能的权衡
| 模型 | 可解释性 | 性能(复杂任务) | 典型应用场景 |
|---|---|---|---|
| 线性回归 | ★★★★★ | ★★ | 金融风控、医学统计 |
| 逻辑回归 | ★★★★ | ★★★ | 信用评分、广告点击率 |
| 决策树 | ★★★★ | ★★★ | 医疗诊断、信贷审批 |
| SVM | ★★★ | ★★★ | 文本分类、生物信息 |
| 神经网络(浅层) | ★★ | ★★★★ | 中等复杂度的模式识别 |
| 深度学习(深层) | ★ | ★★★★★ | 图像识别、NLP、语音 |
3. 提高可解释性的方法
| 方法 | 做法 | 适用场景 |
|---|---|---|
| LIME | 在预测点附近训练一个简单的可解释模型(如线性回归)来近似解释 | 单次预测的解释 |
| SHAP | 基于博弈论,计算每个特征对预测结果的贡献值 | 特征重要性分析 |
| 注意力热力图 | 在图像任务中,可视化模型重点关注图像的哪些区域 | 图像分类、目标检测 |
| Grad-CAM | 利用梯度生成热力图,显示模型决策依据 | 卷积神经网络的可视化 |
| 简化模型替代 | 如果业务要求强可解释性,放弃神经网络改用逻辑回归或决策树 | 合规性要求高的场景 |
4. 何时可以接受"黑箱"?
| 场景 | 是否可以接受黑箱 | 原因 |
|---|---|---|
| 图片分类(猫 vs 狗) | ✅ 可以 | 错了也没严重后果 |
| 电影推荐系统 | ✅ 可以 | 推荐错了无所谓 |
| 自动驾驶 | ⚠️ 需要部分可解释 | 需要知道为什么刹车 |
| 医疗诊断 | ❌ 需要强可解释性 | 必须解释为什么判断是癌症 |
| 银行贷款审批 | ❌ 法规要求 | 必须解释拒绝理由 |
| 刑事司法 | ❌ 绝对不能黑箱 | 涉及人身自由 |
5. 一句话记忆
神经网络性能越好,往往越难解释。这是因为权重经过多层非线性变换后不再对应原始特征,决策路径高度耦合。实际应用中需要在"性能"和"可解释性"之间做取舍,必要时用 LIME、SHAP 等工具辅助解释,或者直接选择可解释性更强的模型。
吴恩达机器学习笔记:神经网络模型表示 (8-3, 8-4)
一、神经元的数学模型
一个神经元的工作流程:
输入 x1, x2, x3 → 加权求和 z = θᵀx → 激活函数 g(z) → 输出
关键组件
偏置单元 (Bias Unit)
- 在每个非输出层额外添加一个偏置单元,值恒为 1
- 用 x0 或 a0^(j) 表示
- 对应参数 θ0,控制整体偏移
激活函数
- 常用 Sigmoid 函数(逻辑函数)
- 输出范围 (0, 1)
- 公式:
math
g(z) = \frac{1}{1 + e^{-z}}
二、符号约定
| 符号 | 含义 |
|---|---|
| a_i^(j) | 第 j 层第 i 个神经元的激活值(输出值) |
| Θ^(j) | 从第 j 层到第 j+1 层的权重矩阵 |
| Θ_(i,k)^(j) | 从第 j 层第 k 个单元到第 j+1 层第 i 个单元的权重 |
| L | 网络的总层数 |
| s_l | 第 l 层的神经元数量(不含偏置单元) |
| K | 输出层神经元数量(多分类时等于类别数) |
三、前向传播的计算过程
网络结构示例
Layer 1 Layer 2 Layer 3
(输入层) (隐藏层) (输出层)
x0=1 ---+
|
x1 --Θ11--> a1^(2) --Θ11'--> h(x)
|
x2 --Θ12--> a2^(2)
|
x3 --Θ13--> a3^(2)
从输入层到隐藏层
math
a_1^{(2)} = g(\Theta_{10}^{(1)}x_0 + \Theta_{11}^{(1)}x_1 + \Theta_{12}^{(1)}x_2 + \Theta_{13}^{(1)}x_3)
math
a_2^{(2)} = g(\Theta_{20}^{(1)}x_0 + \Theta_{21}^{(1)}x_1 + \Theta_{22}^{(1)}x_2 + \Theta_{23}^{(1)}x_3)
math
a_3^{(2)} = g(\Theta_{30}^{(1)}x_0 + \Theta_{31}^{(1)}x_1 + \Theta_{32}^{(1)}x_2 + \Theta_{33}^{(1)}x_3)
从隐藏层到输出层
math
h_\Theta(x) = a_1^{(3)} = g(\Theta_{10}^{(2)}a_0^{(2)} + \Theta_{11}^{(2)}a_1^{(2)} + \Theta_{12}^{(2)}a_2^{(2)} + \Theta_{13}^{(2)}a_3^{(2)})
四、权重矩阵的维度
维度公式
若第 j 层有 s_j 个神经元(不含偏置),第 j+1 层有 s_(j+1) 个神经元(不含偏置):
math
\Theta^{(j)} \in \mathbb{R}^{s_{j+1} \times (s_j + 1)}
| 含义 | 说明 |
|---|---|
| 行数 | 目标层(第 j+1 层)的神经元数 s_(j+1) |
| 列数 | 当前层(第 j 层)的神经元数 + 1(偏置)即 s_j + 1 |
示例
| 权重矩阵 | 维度 | 计算过程 |
|---|---|---|
| Θ^(1) | 3 x 4 | 第 2 层有 3 个神经元,第 1 层有 3 个特征 + 1 个偏置 |
| Θ^(2) | 1 x 4 | 第 3 层有 1 个输出,第 2 层有 3 个神经元 + 1 个偏置 |
记忆口诀:行数看目标层,列数看当前层(加偏置)。
五、前向传播的向量化实现
定义向量
math
x = [x_0, x_1, x_2, x_3]^T
math
z^{(2)} = [z_1^{(2)}, z_2^{(2)}, z_3^{(2)}]^T
math
a^{(2)} = [a_0^{(2)}, a_1^{(2)}, a_2^{(2)}, a_3^{(2)}]^T
向量化计算步骤
第一步:计算隐藏层的加权和
math
z^{(2)} = \Theta^{(1)} \cdot x = \Theta^{(1)} \cdot a^{(1)}
第二步:应用激活函数
math
a^{(2)} = g(z^{(2)})
第三步:添加偏置单元
math
a^{(2)} = [1, a_1^{(2)}, a_2^{(2)}, a_3^{(2)}]^T
第四步:计算输出层
math
z^{(3)} = \Theta^{(2)} \cdot a^{(2)}
math
h_\Theta(x) = a^{(3)} = g(z^{(3)})
逐层计算规律(通用形式)
math
z^{(j+1)} = \Theta^{(j)} a^{(j)}
math
a^{(j+1)} = g(z^{(j+1)})
六、神经网络与逻辑回归的联系
| 对比项 | 逻辑回归 | 神经网络 |
|---|---|---|
| 输入 | 原始特征 x | 原始特征 x 或上层特征 a |
| 加权求和 | z = θᵀx | z = Θ · a |
| 激活函数 | Sigmoid | Sigmoid(或其他) |
| 输出 | 概率值 | 概率值或特征表示 |
本质理解 :神经网络是多层嵌套的逻辑回归,每一层的输出作为下一层的输入,通过多层组合实现更复杂的非线性拟合能力。
核心要点总结
- 前向传播流程:逐层计算 z = Θ · a → a = g(z),每层计算后添加偏置单元
- 权重矩阵维度:Θ^(j) 的维度为 s_(j+1) × (s_j + 1)
- 本质类比:神经网络是多层嵌套的逻辑回归
神经网络模型表示
一、神经网络示例:逻辑运算 (8-5)
1. 逻辑 AND 运算
网络结构:单层感知机(无隐藏层)
x0 = 1
\
x1 --Σ--→ g(z) → h(x)
/
x2
参数设置:
math
\Theta^{(1)} = [-30, 20, 20]
即 θ0 = -30, θ1 = 20, θ2 = 20
计算过程:
math
h_\Theta(x) = g(-30 + 20x_1 + 20x_2)
真值表验证:
| x1 | x2 | z = -30 + 20x1 + 20x2 | h(x) ≈ |
|---|---|---|---|
| 0 | 0 | -30 | 0 |
| 0 | 1 | -10 | 0 |
| 1 | 0 | -10 | 0 |
| 1 | 1 | 10 | 1 |
结论:当且仅当 x1 = x2 = 1 时输出接近 1,实现了 AND 运算。
2. 逻辑 OR 运算
参数设置:
math
\Theta^{(1)} = [-10, 20, 20]
即 θ0 = -10, θ1 = 20, θ2 = 20
真值表验证:
| x1 | x2 | z = -10 + 20x1 + 20x2 | h(x) ≈ |
|---|---|---|---|
| 0 | 0 | -10 | 0 |
| 0 | 1 | 10 | 1 |
| 1 | 0 | 10 | 1 |
| 1 | 1 | 30 | 1 |
结论:只要有一个输入为 1 输出就接近 1,实现了 OR 运算。
3. 逻辑 NOT 运算
参数设置:
math
\Theta^{(1)} = [10, -20]
即 θ0 = 10, θ1 = -20
真值表验证:
| x1 | z = 10 - 20x1 | h(x) ≈ |
|---|---|---|
| 0 | 10 | 1 |
| 1 | -10 | 0 |
结论:输出为输入的取反,实现了 NOT 运算。
4. 逻辑 XNOR 运算(同或运算)
XNOR 可以用 AND、OR、NOT 组合实现:(x1 AND x2) OR (NOT x1 AND NOT x2)
三层网络结构:
Layer 1 Layer 2 Layer 3
(输入层) (隐藏层) (输出层)
x0=1 ----+
|
x1 ------+--- a1^(2) = x1 AND x2 ----------+
| |
x2 ------+--- a2^(2) = NOT x1 AND NOT x2 ---+--- h(x) = a1 OR a2
|
x0=1 ---------------------------------------+
各层权重矩阵:
第一层到第二层(隐藏层):
math
\Theta^{(1)} = \begin{bmatrix} -30 & 20 & 20 \\ 10 & -20 & -20 \end{bmatrix}
- 第一行:a1^(2) 实现 AND(θ = -30, 20, 20)
- 第二行:a2^(2) 实现 NOT x1 AND NOT x2(θ = 10, -20, -20)
第二层到第三层(输出层):
math
\Theta^{(2)} = \begin{bmatrix} -10 & 20 & 20 \end{bmatrix}
- 实现 OR 运算(θ = -10, 20, 20)
真值表验证:
| x1 | x2 | a1 = x1 AND x2 | a2 = ¬x1 AND ¬x2 | h(x) = a1 OR a2 |
|---|---|---|---|---|
| 0 | 0 | 0 | 1 | 1 |
| 0 | 1 | 0 | 0 | 0 |
| 1 | 0 | 0 | 0 | 0 |
| 1 | 1 | 1 | 0 | 1 |
当 x1 = x2 时输出 1,实现了 XNOR 运算。
核心要点总结
- 单个神经元可模拟基本逻辑门:AND(θ = -30, 20, 20)、OR(θ = -10, 20, 20)、NOT(θ = 10, -20)
- 多层网络实现复杂逻辑:XNOR 通过 AND、OR、NOT 的组合实现
- 隐藏层学习中间特征:a1^(2) 学习 AND,a2^(2) 学习 NOT AND,输出层组合得到 XNOR
神经网络的多分类
一、多分类问题的神经网络表示
1. 问题设定
当我们需要将数据分为 K 个类别(K ≥ 3)时,使用神经网络进行多类分类。
示例场景:
- 手写数字识别:10 个类别(0-9)
- 图像识别:行人、汽车、摩托车、卡车(4 个类别)
- 文本分类:体育、娱乐、科技、政治(4 个类别)
2. 网络输出层设计
输出层有 K 个神经元,每个神经元对应一个类别。
输入层 隐藏层 输出层
┌── 类别 1
├── 类别 2
x1 ──→ ... ──→ ... ──→ ... ──→ ├── 类别 3
x2 ├── ...
... └── 类别 K
xn
3. 输出向量表示
神经网络的输出是一个 K 维向量:
math
h_\Theta(x) \in \mathbb{R}^K
每个分量表示输入属于对应类别的概率:
math
h_\Theta(x) = \begin{bmatrix} p(y=1|x) \\ p(y=2|x) \\ \vdots \\ p(y=K|x) \end{bmatrix}
4. 标签的独热编码
训练数据的标签 y 不再是单个数值,而是转换为 独热编码(One-hot Encoding) 向量。
转换规则:若样本属于第 i 类,则 y 是一个 K 维向量,第 i 个分量为 1,其余为 0。
示例:4 类分类问题
| 实际类别 | 原始标签 | 独热编码向量 |
|---|---|---|
| 类别 1 | y = 1 | 1, 0, 0, 0ᵀ |
| 类别 2 | y = 2 | 0, 1, 0, 0ᵀ |
| 类别 3 | y = 3 | 0, 0, 1, 0ᵀ |
| 类别 4 | y = 4 | 0, 0, 0, 1ᵀ |
5. 预测规则
给定一个新的输入 x,网络输出一个 K 维向量。选择输出值最大的神经元对应的类别作为预测结果:
math
\text{prediction} = \arg\max_{i} \, h_\Theta(x)_i
二、完整示例:4 类分类
1. 网络结构
假设输入特征维度为 n,隐藏层有若干神经元,输出层有 4 个神经元。
Layer 1 Layer 2 Layer 3
(输入层) (隐藏层) (输出层 4 个神经元)
x0=1 h1(x): 是否属于类别 1
x1 ... h2(x): 是否属于类别 2
x2 h3(x): 是否属于类别 3
x3 h4(x): 是否属于类别 4
...
xn
2. 训练数据准备
| 样本 | 输入特征 | 真实类别 | 标签向量 y |
|---|---|---|---|
| 样本 1 | x^(1) | 行人 | 1, 0, 0, 0ᵀ |
| 样本 2 | x^(2) | 汽车 | 0, 1, 0, 0ᵀ |
| 样本 3 | x^(3) | 摩托车 | 0, 0, 1, 0ᵀ |
| 样本 4 | x^(4) | 卡车 | 0, 0, 0, 1ᵀ |
3. 预测过程
输入一张新图片 x,网络计算输出:
math
h_\Theta(x) = \begin{bmatrix} 0.02 \\ 0.85 \\ 0.08 \\ 0.05 \end{bmatrix}
预测结果:类别 2(汽车),因为第二个分量 0.85 最大。
三、与二分类的对比
| 对比项 | 二分类 | 多类分类 |
|---|---|---|
| 输出层神经元数 | 1 个 | K 个(K ≥ 3) |
| 输出形式 | 单个标量 | K 维向量 |
| 标签形式 | y ∈ | y ∈ {0, 1}ᴷ(独热编码) |
| 预测规则 | h(x) > 0.5 判为正类 | arg max h(x)_i |
| 代价函数 | 单个输出的交叉熵 | K 个输出的交叉熵之和 |
四、核心要点
- 输出层神经元数 = 类别数 K
- 标签使用独热编码:每个样本的标签是一个 K 维 0-1 向量
- 预测使用 arg max:选择输出值最大的类别
- 本质:多类分类可以看作 K 个独立的二分类问题,但共享隐藏层的特征提取能力
神经网络的学习 - 代价函数
一、多类分类背景
在神经网络多分类问题中,输出层有 K 个神经元,对应 K 个类别。
- 网络输出 h_Θ(x) ∈ Rᴷ,其中 (h_Θ(x))ᵢ 表示第 i 个输出。
- 训练标签采用独热编码(One-hot Encoding),例如 4 类分类中,真实类别为第 2 类时,标签向量 y = 0, 1, 0, 0ᵀ。
二、逻辑回归代价函数
单输出二分类的代价函数形式:
J(θ) = -1/m Σᵢ₌₁ᵐ y⁽ⁱ⁾log h_θ(x⁽ⁱ⁾) + (1-y⁽ⁱ⁾)log(1-h_θ(x⁽ⁱ⁾)) + λ/(2m) Σⱼ₌₁ⁿ θⱼ²
三、神经网络代价函数
推广到 K 输出神经网络:
J(Θ) = -1/m Σᵢ₌₁ᵐ Σₖ₌₁ᴷ yₖ⁽ⁱ⁾log(h_Θ(x⁽ⁱ⁾)ₖ) + (1-yₖ⁽ⁱ⁾)log(1-h_Θ(x⁽ⁱ⁾)ₖ) + λ/(2m) Σₗ₌₁ᴸ⁻¹ Σᵢ₌₁ˢˡ⁺¹ Σⱼ₌₁ˢˡ⁺¹ (Θⱼᵢ⁽ˡ⁾)²
四、代价函数的两大部分
1. 交叉熵损失(第一部分)
- Σᵢ₌₁ᵐ:对所有 m 个训练样本求和
- Σₖ₌₁ᴷ:对输出层的 K 个输出单元求和
- yₖ⁽ⁱ⁾:第 i 个样本在第 k 个输出上的真实标签(0 或 1)
- h_Θ(x⁽ⁱ⁾)ₖ:第 i 个样本在第 k 个输出上的预测值
直观理解:将每个输出单元视为独立的二分类逻辑回归,计算所有输出单元的交叉熵损失之和。
2. 正则化项(第二部分)
三层求和的含义:
| 求和符号 | 含义 | 对应维度 |
|---|---|---|
| Σₗ₌₁ᴸ⁻¹ | 遍历所有层(权重矩阵) | 层 |
| Σᵢ₌₁ˢˡ⁺¹ | 遍历目标层(第 l+1 层)的神经元 | 行 |
| Σⱼ₌₁ˢˡ⁺¹ | 遍历当前层(第 l 层)的神经元(含偏置) | 列 |
注意:正则化项通常不包含偏置单元对应的参数 Θᵢ₀⁽ˡ⁾,但实践中包含与否影响很小。
五、与逻辑回归代价函数的对比
| 对比项 | 逻辑回归 | 神经网络 |
|---|---|---|
| 输出数量 | 1 个标量 | K 个输出 |
| 样本求和 | Σᵢ₌₁ᵐ | Σᵢ₌₁ᵐ |
| 输出求和 | 无(单输出) | Σₖ₌₁ᴷ |
| 正则化求和 | Σⱼ₌₁ⁿ(单层) | ΣₗΣᵢΣⱼ(多层矩阵) |
| 偏置处理 | 通常包含 θ₀ | 通常不包含 Θᵢ₀⁽ˡ⁾ |
六、核心要点
- 代价函数 = 交叉熵损失 + 正则化项
- 交叉熵损失:对每个样本的每个输出单元计算对数损失并求和
- 正则化项:对所有权重矩阵的所有元素(除偏置外)的平方求和
- 多类分类:输出层有 K 个神经元,标签使用独热编码
- 目的:找到一组参数 Θ,使代价函数 J(Θ) 最小化
神经网络 - 反向传播算法
回顾:前向传播
符号说明
| 符号 | 含义 |
|---|---|
| L | 网络总层数 |
| s_l | 第 l 层的神经元数(不含偏置) |
| K | 输出层神经元数(类别数) |
| m | 训练样本数 |
| a^(l) | 第 l 层的激活值向量(含偏置 a_0^(l) = 1) |
| z^(l) | 第 l 层的加权求和结果向量 |
| Θ^(l) | 从第 l 层到第 l+1 层的权重矩阵 |
| g(z) | Sigmoid 激活函数 |
前向传播计算流程
对于一个训练样本 x:
第 1 层(输入层):
math
a^{(1)} = x
第 2 层(隐藏层):
math
z^{(2)} = \Theta^{(1)} a^{(1)}
math
a^{(2)} = g(z^{(2)})
math
\text{添加偏置: } a^{(2)} = [1, a_1^{(2)}, a_2^{(2)}, a_3^{(2)}]^T
第 3 层(输出层):
math
z^{(3)} = \Theta^{(2)} a^{(2)}
math
h_\Theta(x) = a^{(3)} = g(z^{(3)})
二、反向传播算法的动机
目标
最小化代价函数 J(Θ),需要计算所有参数的偏导数:
math
\frac{\partial}{\partial \Theta_{ij}^{(l)}} J(\Theta)
挑战
神经网络参数众多,无法直接求导。反向传播通过从输出层逆向传播误差,高效计算所有偏导数。
三、误差项 δ 的定义
核心概念
δ_j^(l):第 l 层第 j 个神经元的误差,表示该神经元对最终代价的影响程度。
math
\delta_j^{(l)} = \frac{\partial}{\partial z_j^{(l)}} J(\Theta)
向量化表示
math
\delta^{(l)} = \begin{bmatrix} \delta_1^{(l)} \\ \delta_2^{(l)} \\ \vdots \\ \delta_{s_l}^{(l)} \end{bmatrix}
注意:δ^(l) 是 s_l 维向量,不包含偏置单元对应的误差。
四、输出层的误差计算
公式
对于输出层(第 L 层),误差等于预测值与真实值的差:
math
\delta^{(L)} = a^{(L)} - y
展开形式
对于 K 类分类问题,输出层有 K 个神经元:
math
\delta^{(L)} = \begin{bmatrix} a_1^{(L)} - y_1 \\ a_2^{(L)} - y_2 \\ \vdots \\ a_K^{(L)} - y_K \end{bmatrix}
推导过程
代价函数对 z^(L) 求偏导:
math
J(\Theta) = -\frac{1}{m} \sum_{i=1}^{m} \sum_{k=1}^{K} [y_k \log(a_k^{(L)}) + (1-y_k) \log(1-a_k^{(L)})]
对单个样本、单个输出单元:
math
\frac{\partial}{\partial z_k^{(L)}} J = \frac{\partial}{\partial a_k^{(L)}} J \cdot \frac{\partial a_k^{(L)}}{\partial z_k^{(L)}}
math
= \left(-\frac{y_k}{a_k^{(L)}} + \frac{1-y_k}{1-a_k^{(L)}}\right) \cdot a_k^{(L)}(1-a_k^{(L)})
math
= a_k^{(L)} - y_k
向量化即为:
math
\delta^{(L)} = a^{(L)} - y
五、隐藏层的误差反向传播
公式
从第 l+1 层向第 l 层反向传播误差:
math
\delta^{(l)} = (\Theta^{(l)})^T \delta^{(l+1)} \cdot g'(z^{(l)})
其中:
math
g'(z^{(l)}) = a^{(l)} \cdot (1 - a^{(l)})
完整形式
math
\delta^{(l)} = (\Theta^{(l)})^T \delta^{(l+1)} \cdot a^{(l)} \cdot (1 - a^{(l)})
逐元素展开形式
math
\delta_j^{(l)} = \left( \sum_{k=1}^{s_{l+1}} \Theta_{kj}^{(l)} \delta_k^{(l+1)} \right) \cdot a_j^{(l)} \cdot (1 - a_j^{(l)})
| 符号 | 含义 |
|---|---|
| δ_j^(l) | 第 l 层第 j 个神经元的误差 |
| Θ_kj^(l) | 从第 l 层第 j 个单元到第 l+1 层第 k 个单元的权重 |
| δ_k^(l+1) | 第 l+1 层第 k 个神经元的误差 |
| a_j^(l) | 第 l 层第 j 个神经元的激活值 |
| s_(l+1) | 第 l+1 层的神经元数 |
推导过程
利用链式法则:
math
\delta_j^{(l)} = \frac{\partial J}{\partial z_j^{(l)}} = \sum_{k=1}^{s_{l+1}} \frac{\partial J}{\partial z_k^{(l+1)}} \cdot \frac{\partial z_k^{(l+1)}}{\partial z_j^{(l)}}
其中:
math
z_k^{(l+1)} = \sum_{j=1}^{s_l} \Theta_{kj}^{(l)} a_j^{(l)} = \sum_{j=1}^{s_l} \Theta_{kj}^{(l)} g(z_j^{(l)})
math
\frac{\partial z_k^{(l+1)}}{\partial z_j^{(l)}} = \Theta_{kj}^{(l)} g'(z_j^{(l)})
代入得:
math
\delta_j^{(l)} = \sum_{k=1}^{s_{l+1}} \delta_k^{(l+1)} \cdot \Theta_{kj}^{(l)} \cdot g'(z_j^{(l)})
math
= \left( \sum_{k=1}^{s_{l+1}} \Theta_{kj}^{(l)} \delta_k^{(l+1)} \right) \cdot g'(z_j^{(l)})
维度验证
假设网络结构:s_2 = 3, s_3 = 1
math
\Theta^{(2)} \in \mathbb{R}^{1 \times 4}, \quad \delta^{(3)} \in \mathbb{R}^{1}
math
\delta^{(2)} = (\Theta^{(2)})^T \delta^{(3)} \cdot g'(z^{(2)})
math
(\Theta^{(2)})^T \in \mathbb{R}^{4 \times 1}, \quad \delta^{(3)} \in \mathbb{R}^{1} \implies (\Theta^{(2)})^T \delta^{(3)} \in \mathbb{R}^{4}
去掉偏置对应的第一个元素,得到 δ^(2) ∈ ℝ³,与 s_2 = 3 一致。
六、偏导数的计算
公式
math
\frac{\partial}{\partial \Theta_{ij}^{(l)}} J(\Theta) = a_j^{(l)} \delta_i^{(l+1)}
| 符号 | 含义 |
|---|---|
| Θ_ij^(l) | 从第 l 层第 j 个单元到第 l+1 层第 i 个单元的权重 |
| a_j^(l) | 第 l 层第 j 个单元的激活值 |
| δ_i^(l+1) | 第 l+1 层第 i 个单元的误差 |
向量化形式
math
\frac{\partial}{\partial \Theta^{(l)}} J(\Theta) = \delta^{(l+1)} (a^{(l)})^T
维度验证
math
\delta^{(l+1)} \in \mathbb{R}^{s_{l+1}}, \quad a^{(l)} \in \mathbb{R}^{s_l + 1}
math
\delta^{(l+1)} (a^{(l)})^T \in \mathbb{R}^{s_{l+1} \times (s_l + 1)}
与 Θ^(l) 的维度 s_(l+1) × (s_l + 1) 一致。
七、完整算法流程
符号说明
| 符号 | 含义 |
|---|---|
| Δ^(l) | 第 l 层误差累加矩阵(初始化为全零矩阵) |
| D^(l) | 第 l 层最终偏导数矩阵 |
算法步骤
步骤 1:初始化误差累加矩阵
math
\Delta^{(l)} = 0, \quad \text{for } l = 1, 2, ..., L-1
步骤 2:遍历每个训练样本,i = 1 到 m
步骤 2a:前向传播
math
a^{(1)} = x^{(i)}
math
\text{计算 } z^{(2)}, a^{(2)}, z^{(3)}, a^{(3)}, ..., z^{(L)}, a^{(L)}
步骤 2b:计算输出层误差
math
\delta^{(L)} = a^{(L)} - y^{(i)}
步骤 2c:反向传播误差
math
\text{for } l = L-1 \text{ down to } 2:
math
\delta^{(l)} = (\Theta^{(l)})^T \delta^{(l+1)} \cdot g'(z^{(l)})
步骤 2d:累加偏导数
math
\Delta^{(l)} := \Delta^{(l)} + \delta^{(l+1)} (a^{(l)})^T
步骤 3:计算最终偏导数(含正则化)
对于偏置参数(j = 0):
math
D_{ij}^{(l)} = \frac{1}{m} \Delta_{ij}^{(l)}
对于权重参数(j ≥ 1):
math
D_{ij}^{(l)} = \frac{1}{m} \Delta_{ij}^{(l)} + \frac{\lambda}{m} \Theta_{ij}^{(l)}
梯度下降更新
math
\Theta^{(l)} := \Theta^{(l)} - \alpha D^{(l)}
八、三层网络完整示例
网络结构
- L = 3(输入层、隐藏层、输出层)
- s_1 = 3(3 个输入特征)
- s_2 = 3(隐藏层 3 个神经元)
- s_3 = K = 1(二分类)
前向传播
math
a^{(1)} = \begin{bmatrix} x_0 \\ x_1 \\ x_2 \\ x_3 \end{bmatrix} = \begin{bmatrix} 1 \\ x_1 \\ x_2 \\ x_3 \end{bmatrix}
math
z^{(2)} = \Theta^{(1)} a^{(1)}, \quad \Theta^{(1)} \in \mathbb{R}^{3 \times 4}
math
a^{(2)} = g(z^{(2)}) = \begin{bmatrix} g(z_1^{(2)}) \\ g(z_2^{(2)}) \\ g(z_3^{(2)}) \end{bmatrix}
math
a^{(2)} = \begin{bmatrix} 1 \\ a_1^{(2)} \\ a_2^{(2)} \\ a_3^{(2)} \end{bmatrix}
math
z^{(3)} = \Theta^{(2)} a^{(2)}, \quad \Theta^{(2)} \in \mathbb{R}^{1 \times 4}
math
h_\Theta(x) = a^{(3)} = g(z^{(3)})
反向传播
math
\delta^{(3)} = a^{(3)} - y
math
\delta^{(2)} = (\Theta^{(2)})^T \delta^{(3)} \cdot g'(z^{(2)})
math
g'(z^{(2)}) = a^{(2)} \cdot (1 - a^{(2)}) = \begin{bmatrix} a_1^{(2)}(1-a_1^{(2)}) \\ a_2^{(2)}(1-a_2^{(2)}) \\ a_3^{(2)}(1-a_3^{(2)}) \end{bmatrix}
math
\frac{\partial}{\partial \Theta^{(2)}} J = \delta^{(3)} (a^{(2)})^T
math
\frac{\partial}{\partial \Theta^{(1)}} J = \delta^{(2)} (a^{(1)})^T
九、核心要点总结
- 输出层误差:δ^(L) = a^(L) - y(预测值减真实值)
- 隐藏层误差:δ^(l) = (Θ^(l))ᵀ δ^(l+1) · g'(z^(l))
- 偏导数:∂J/∂Θ_ij^(l) = a_j^(l) δ_i^(l+1)
- 输入层没有误差:δ^(1) 不存在,因为输入层只是数据入口
- 正则化处理:偏置参数(j = 0)不参与正则化惩罚
随机初始化 (Random Initialization)
1. 核心动机:为什么不能全零初始化?
在神经网络中,如果将所有权重 Θ 和偏置 b 初始化为 0(或相同的常数),会导致对称权重问题 (Symmetry Breaking):
- 正向传播:每一层的所有神经元接收到的加权输入完全相同。
- 反向传播:由于输入相同,梯度更新量也完全相同。
- 后果:同一层的所有神经元会保持相同的权重,网络退化为"单层"效果,无法学习复杂特征。
2. 解决方案:随机初始化
打破对称性,需为权重赋予小的随机值:
- 权重 Θ:随机初始化(如 N(0, 0.01²) 或均匀分布)。
- 偏置 b:通常可初始化为 0(因权重已随机,偏置不影响对称性),或小常数。
3. 结合历史:正向与反向视角的统一
回顾前几轮的正向/反向传播,随机初始化是训练的起点:
- 正向:a^(l) = g(Θ^(l-1) a^(l-1) + b^(l-1)),初始 Θ 决定初始激活分布。
- 反向 :δ^(l) = (Θ(l))T δ^(l+1) · g'(z^(l)),初始 Θ 也影响误差回传。
- 参数更新:Θ^(l) := Θ^(l) - α ∂J/∂Θ^(l),随机起点确保各参数走向不同局部最优。
4. 常见初始化方法(拓展)
| 方法 | 核心思想 | 适用场景 |
|---|---|---|
| 简单随机 | 小范围均匀/正态分布 | 浅层网络 |
| Xavier (Glorot) | 方差 ∝ 2/(n_in+n_out),保持输入输出方差一致 | Sigmoid/Tanh |
| He 初始化 | 方差 ∝ 2/n_in,考虑 ReLU 的半饱和特性 | ReLU 系列 |
| 正交初始化 | 权重矩阵正交,保持梯度范数稳定 | RNN/CNN |
5. 关键笔记结论
- 必须随机:打破对称,让不同神经元学习不同特征。
- 要小不要大:权重过大导致 z 落入激活函数饱和区(如 Sigmoid 两端),梯度消失;过小导致信号衰减。
- 偏置可零:偏置不决定对称性,常初始化为 0。
- 与反向传播联动:随机初始化的 Θ 是正向传信号、反向传误差的"桥梁",同一轮迭代中正向/反向共用该 Θ,训练后逐轮更新。
6. 一句话记忆
"全零不行要随机,小权重点亮网络;偏置可零不关键,对称打破是核心。"
神经网络总结
1. 核心脉络:神经网络完整训练流程
- 初始化:权重 Θ 随机初始化(打破对称),偏置可置0。
- 正向传播:逐层计算 z^(l) 与 a^(l),得最终预测 a^(L)。
- 计算代价:J(Θ)(预测值与真实值差异)。
- 反向传播:从输出层起算 δ^(L),逐层回传得各层 δ^(l)(不含偏置)。
- 求梯度并更新:结合 δ 与 a 算偏导,梯度下降更新 Θ, b。
2. 每层神经元数量推荐
| 层级 | 数量原则 | 说明 |
|---|---|---|
| 输入层 | 等于特征维度 | 直接由数据集决定 |
| 隐藏层 | 经验规则:逐渐递减(如256→128→64)或保持相近 | 太少欠拟合,太多易过拟合,需调参 |
| 输出层 | 等于类别数(分类)或1(回归) | 由任务类型决定 |
3. 初始化权重推荐
| 激活函数 | 推荐初始化 | 说明 |
|---|---|---|
| Sigmoid/Tanh | Xavier 初始化:方差 = 2/(n_in+n_out) | 避免梯度消失/爆炸 |
| ReLU 系列 | He 初始化:方差 = 2/n_in | 适应 ReLU 半饱和特性 |
| 浅层网络 | 简单小随机:N(0, 0.01²) | 简单场景够用 |
4. 一句话结论
"随机起步,正向预测,反向纠错,循环更新;隐藏层渐减,激活定初始。"
评估假设 (Evaluating Hypotheses)
一、 为什么需要评估假设?(训练与测试的分离)
在神经网络中,我们通过反向传播最小化代价 J(Θ) 来训练模型。但代价低不代表模型好用。
- 模型可能在训练集上误差极小(过拟合),但面对新数据却表现糟糕。
- 核心目标:评估模型的"泛化能力"(在新样本上的预测能力)。
二、 标准评估流程:训练集与测试集
必须将数据集拆分,打破"既当运动员又当裁判":
- 训练集 (Training Set):用于运行正向/反向传播,学习参数 Θ(通常占 70%)。
- 测试集 (Test Set):用于最终评估,全程不参与训练(通常占 30%)。
注:更严谨时会分为训练集、交叉验证集(调超参)、测试集(最终打分)。
三、 评估指标(不同任务)
模型在测试集上的表现,才是真正的"假设评估"结果:
- 回归问题 (如房价预测):
计算测试集均方误差 (MSE)。数值越小,泛化越好。 - 分类问题 (如神经网络分类):
- 错误率 (Misclassification Rate):测试集中预测错的样本比例。
- 准确率 (Accuracy):预测对的样本比例(= 1 - 错误率)。
四、 逻辑串联(结合你的历史疑问)
- 正向传播:在训练集上算出预测 ŷ。
- 算代价 J:评估当前训练集上的总误差,并启动反向传播更新权重。
- 训练完成:参数 Θ 固定。
- 评估假设 :将测试集做一次纯正向传播 (不更新权重),计算测试集的误差/准确率。
- 若训练误差低、测试误差高 → 过拟合(模型死记硬背了训练集)。
- 若两者都低 → 模型优秀。
五、 核心要点总结
- "评估假设"就是看模型在**未知数据(测试集)**上的表现。
- 训练集用来算 J 和调权重;测试集用来最终打分。
- 只有测试集的误差,才能真实反映假设函数的好坏。
模型选择和训练、验证、测试集
一、核心问题:为什么要分三份?
只用训练集+测试集时,如果用测试集来比较不同模型(如多项式次数、隐藏层数),选出的最佳模型在测试集上的表现会虚高,因为测试集的信息已经被"偷看"了。
二、三集分工
| 数据集 | 用途 | 是否参与决策 |
|---|---|---|
| 训练集 | 学习参数 Θ | ✅ 是 |
| 验证集 | 选择模型/调超参 | ✅ 是 |
| 测试集 | 最终评估泛化能力 | ❌ 否(只看一次) |
三、模型选择流程
- 对每种候选模型(如不同隐藏层数的网络),在训练集上训练,得到参数 Θ
- 在验证集上计算误差,选出误差最小的模型
- 用选出的模型在测试集上做最终评估,报告泛化误差
四、典型比例
- 小数据集:60% 训练 + 20% 验证 + 20% 测试
- 大数据集:98% 训练 + 1% 验证 + 1% 测试
五、一句话总结
"训练集学参数,验证集选模型,测试集终评分------验证集隔离了调参对测试集的污染。"
诊断偏差与方差
一、核心概念回顾
- 偏差 :模型预测的期望值与真实值的差异,反映模型欠拟合程度(系统性不准)。
- 方差 :模型在不同训练集上预测的波动程度,反映模型过拟合程度(对数据敏感不稳)。
- 不可约噪声:数据本身固有的随机误差,任何模型都无法消除。
二、均方误差(MSE)与分解推导
1. 定义与展开
MSE = E(y - ŷ)²
将 ŷ 视为固定值,利用期望线性性质展开:
MSE = Ey² - 2ŷEy + ŷ²
2. 配凑技巧(加减项)
加减 Ey² 进行配方:
MSE = (ŷ² - 2ŷEy + Ey²) + (Ey² - Ey²)
得到中间分解:
MSE = (ŷ - Ey)² + E(y - E\[y)²]
(前者对应偏差平方,后者对应数据固有方差/噪声)
3. 完整偏差-方差分解
考虑模型在不同训练集上的波动(将预测值视为随机变量 f̂),总期望泛化误差为:
MSE = E\[f̂(x) - f(x)]² + E(f̂(x) - E\[f̂(x))²] + σ²
核心结论:总误差 = 偏差² + 方差 + 噪声,三者此消彼长。
三、诊断:如何通过误差判断问题
通过对比训练误差 与验证(测试)误差进行诊断:
| 诊断情况 | 训练误差 | 验证误差 | 问题类型 | 直观含义 |
|---|---|---|---|---|
| 偏差大 | 高 | 高(≈训练误差) | 欠拟合 | 模型太简单,两边都没学好 |
| 方差大 | 低 | 高(远高于训练) | 过拟合 | 模型太复杂,死记硬背训练集 |
| 理想状态 | 低 | 低 | 拟合良好 | 准且稳 |
| 偏差大+方差大 | 高 | 高(且波动) | 双重问题 | 模型结构与数据均需调整 |
四、解决策略(权衡对策)
| 存在问题 | 表现 | 解决方向 |
|---|---|---|
| 偏差大(欠拟合) | 学不到位 | 增加模型复杂度(加深/加宽网络)、减少正则化、延长训练、增加特征 |
| 方差大(过拟合) | 学得太碎 | 增加训练数据、降低模型复杂度、增大正则化(L1/L2/Dropout)、早停(Early Stopping) |
五、核心总结
- 靶心类比:偏差大是"子弹都偏离靶心(不准)",方差大是"子弹散落各处(不稳定)"。
- 权衡本质:降低偏差常需复杂模型(易增方差),降低方差需简化/正则化(易增偏差),需寻找平衡点。
- 诊断关键:训练与验证误差的差距是判断偏差/方差问题的核心依据。
正则化和偏差、方差
一、核心问题:λ 对偏差和方差的影响
正则化参数 λ 控制权重惩罚力度,直接影响偏差-方差权衡:
| λ 取值 | 效果 | 问题 |
|---|---|---|
| λ 太大 | 权重被压到接近 0,模型趋近于常数 | 高偏差(欠拟合) |
| λ 太小 | 几乎没有约束,权重随意变大 | 高方差(过拟合) |
| λ 适中 | 平衡拟合度与复杂度 | 理想状态 |
二、如何选择合适的 λ
遍历候选 λ 值(如 0, 0.01, 0.02, ..., 10),对每个 λ:
- 用训练集学习参数 Θ
- 用验证集计算不带正则化的误差(评估真实表现)
- 选验证误差最小的 λ
- 用该 λ 在测试集上做最终评估
三、误差曲线规律
| λ 区间 | 训练误差 | 验证误差 | 诊断 |
|---|---|---|---|
| λ 过小 | 低(接近 0) | 高(远高于训练) | 高方差(过拟合) |
| λ 过大 | 高 | 高(≈训练误差) | 高偏差(欠拟合) |
| λ 适中 | 略高 | 最低 | 最佳平衡点 |
四、与之前知识的串联
- 偏差大(欠拟合) → 减小 λ(放松权重约束,让模型更灵活)
- 方差大(过拟合) → 增大 λ(加强权重惩罚,让模型更简单)
- 评估时去掉正则化项(10-4 结论),只看模型在验证集上的预测误差
五、一句话总结
"λ 太小过拟合,λ 太大欠拟合;遍历 λ 找验证误差最低点,就是最佳正则化强度。"
学习曲线
一、什么是学习曲线
学习曲线是以训练集大小 m 为横轴,误差为纵轴绘制的曲线,用于诊断模型是否存在高偏差或高方差问题。
二、典型形状与诊断
1. 高偏差(欠拟合)------ 曲线提前收敛
| 特征 | 说明 |
|---|---|
| 训练误差 | 随 m 增大而上升,很快趋于平稳 |
| 验证误差 | 随 m 增大而下降,很快趋于平稳 |
| 两者差距 | 很小,且都停留在较高水平 |
| 结论 | 增加数据无帮助,偏差是瓶颈 |
2. 高方差(过拟合)------ 曲线有较大差距
| 特征 | 说明 |
|---|---|
| 训练误差 | 始终较低,随 m 增大缓慢上升 |
| 验证误差 | 始终较高,随 m 增大缓慢下降 |
| 两者差距 | 很大,且有缩小趋势 |
| 结论 | 增加数据可能有帮助,方差是瓶颈 |
三、如何利用学习曲线做决策
| 曲线形态 | 诊断 | 对策 |
|---|---|---|
| 两线早早汇合且都很高 | 高偏差(欠拟合) | 增加模型复杂度,不是加数据 |
| 两线之间有较大差距 | 高方差(过拟合) | 增加训练数据有帮助 |
| 两线都低且接近 | 理想状态 | 维持现状 |
四、一句话总结
"学习曲线看两线:高偏差两线早汇合且都高,加数据没用;高方差两线差距大,加数据有用。"
误差分析
一、核心思想
不要凭空猜测模型哪里有问题,而是去看实际被分错的样本,从中发现规律。
二、误差分析步骤
- 在验证集上运行模型,找出所有被分错的样本
- 手动检查这些错误样本,观察它们的共同特征
- 根据发现的模式,决定下一步改进方向
三、常见错误模式举例(以垃圾邮件分类为例)
| 发现的问题 | 可能的改进方向 |
|---|---|
| 大量误报包含特定关键词 | 增加该关键词的处理规则 |
| 误报集中在拼写错误的邮件 | 加入拼写校正预处理 |
| 误报集中在超长邮件 | 增加邮件长度特征 |
| 误报集中在特定来源 | 增加发件人信誉特征 |
四、误差分析的量化方法
创建一个错误分类表格,对每个错误样本标注其所属的错误类型:
| 样本 | 真实标签 | 预测标签 | 错误类型1 | 错误类型2 |
|---|---|---|---|---|
| 邮件1 | 垃圾 | 正常 | 漏掉关键词 | 拼写错误 |
| 邮件2 | 正常 | 垃圾 | 误判关键词 | --- |
| 邮件3 | 垃圾 | 正常 | 超长邮件 | 拼写错误 |
统计每种错误类型的占比,优先解决最常见的问题。
五、误差分析的原则
| 原则 | 说明 |
|---|---|
| 数据驱动 | 不要靠直觉猜,要看实际错误样本 |
| 量化优先 | 统计各类错误的数量和占比 |
| 80/20法则 | 优先解决最常见的错误类型 |
| 快速迭代 | 做一个改进 → 重新评估 → 再看错误分布 |
六、一句话总结
"别猜哪里错了,去看错在哪------量化错误类型,优先解决最常见的问题。"
不对称性分类的误差评估
一、为什么不能用准确率?
当类别严重不平衡时(如罕见病检测:99.5% 健康 vs 0.5% 患病),一个永远预测"健康"的模型准确率高达 99.5%,但完全没有实用价值。
二、混淆矩阵(Confusion Matrix)
| 真实\预测 | 正例(Positive) | 负例(Negative) |
|---|---|---|
| 正例 | TP(真正例) | FN(假负例,漏报) |
| 负例 | FP(假正例,误报) | TN(真负例) |
三、核心评估指标
| 指标 | 公式 | 含义 |
|---|---|---|
| Precision(精确率) | TP / (TP + FP) | 预测为正例的样本中,有多少是真的正例 |
| Recall(召回率) | TP / (TP + FN) | 真实正例中,有多少被正确找出来了 |
| F₁ Score | 2·P·R / (P + R) | 精确率和召回率的调和平均,综合评价指标 |
四、不同场景的侧重点
| 场景 | 更关注 | 原因 |
|---|---|---|
| 癌症筛查 | 高 Recall | 宁可误报也不能漏诊 |
| 垃圾邮件过滤 | 高 Precision | 宁可漏掉垃圾邮件,也不要误删正常邮件 |
| 通用场景 | F₁ Score | 兼顾精确率和召回率 |
五、一句话总结
"类别不平衡时别信准确率,用精确率、召回率和 F₁ 来评估模型真本事。"
精确率和召回率的权衡
一、精确率和召回率的关系
精确率和召回率是一对此消彼长的矛盾指标,无法同时达到最高。
二、为什么需要权衡?
以逻辑回归的输出概率为例,我们需要设定一个阈值来决定预测结果:
- 预测概率 ≥ 阈值 → 预测为正例
- 预测概率 < 阈值 → 预测为负例
| 阈值调整 | 精确率 | 召回率 | 解释 |
|---|---|---|---|
| 提高阈值(如从 0.5 提到 0.9) | ↑ 升高 | ↓ 降低 | 只在非常确信时才判为正例,减少误报但容易漏掉 |
| 降低阈值(如从 0.5 降到 0.3) | ↓ 降低 | ↑ 升高 | 放宽判断标准,减少漏报但容易误报 |
三、如何选择阈值?
| 场景 | 目标 | 阈值策略 |
|---|---|---|
| 癌症筛查 | 尽可能不漏诊(高召回率) | 降低阈值(如 0.3) |
| 垃圾邮件过滤 | 尽可能不误删正常邮件(高精确率) | 提高阈值(如 0.9) |
| 通用场景 | 兼顾两者(高 F₁ Score) | 选择使 F₁ 最大的阈值 |
四、F₁ Score 的作用
F₁ Score 是精确率和召回率的调和平均,自动帮你找到两者的最佳平衡点:
F₁ = 2 · P · R / (P + R)
- 只有当精确率和召回率都高时,F₁ 才高
- 如果一个极低、另一个极高,F₁ 会被拉低
五、一句话总结
"调阈值就是在精确率和召回率之间做交易------想少漏就降阈值,想少错就升阈值,F₁ 帮你找最佳平衡点。"
数据对机器学习的影响
一、核心观点
在合适的条件下,更多的数据几乎总是能带来更好的模型表现。
二、什么条件下"更多数据"有效?
| 条件 | 说明 |
|---|---|
| 特征包含足够信息 | 输入特征 x 包含了预测 y 所需的全部信息 |
| 模型容量足够大 | 模型能够学习复杂的映射关系(如大型神经网络) |
满足这两个条件时,更多数据可以帮助模型逼近最优性能。
三、为什么更多数据有效?
从偏差-方差角度看
- 高方差(过拟合):更多数据 → 降低方差 → 验证误差下降
- 高偏差(欠拟合):更多数据 → 对偏差影响不大 → 需要先增加模型复杂度
四、大规模数据的实践规律
| 数据量 | 典型表现 |
|---|---|
| 少量数据 | 简单模型可能更好,防止过拟合 |
| 中等数据 | 复杂模型开始展现优势 |
| 海量数据 | 复杂模型(如深度学习)表现远超简单模型 |
五、需要注意的陷阱
| 陷阱 | 说明 |
|---|---|
| 数据质量比数量更重要 | 脏数据再多也没用 |
| 盲目加数据不解决问题 | 高偏差时先加模型复杂度,再加数据 |
| 边际收益递减 | 数据量越大,每增加一份数据带来的提升越小 |
六、一句话总结
"特征信息够、模型容量足,数据越多越强------但别在欠拟合时盲目加数据,先升级模型再说。"
SVM 优化目标
一、从逻辑回归到 SVM 的转变
逻辑回归的代价函数
J(θ) = -(1/m) Σᵢ₌₁ᵐ yⁱ log(h(xⁱ)) + (1-yⁱ) log(1-h(xⁱ)) + (λ/2m) Σⱼ₌₁ⁿ θⱼ²
其中 h(x) = 1/(1+e^(-θᵀx))
SVM 的改造思路
将逻辑回归的代价函数中的对数项替换为分段线性函数,得到 SVM 的代价函数。
二、SVM 的代价函数
单个样本的代价
令 z = θᵀx
-
正类(y=1):cost₁(z) = max(0, 1-z)
- 当 z ≥ 1 时,代价为 0(分类正确且有余量)
- 当 z < 1 时,代价线性增长
-
负类(y=0):cost₀(z) = max(0, 1+z)
- 当 z ≤ -1 时,代价为 0(分类正确且有余量)
- 当 z > -1 时,代价线性增长
完整代价函数
min C Σᵢ₌₁ᵐ yⁱ cost₁(θᵀxⁱ) + (1-yⁱ) cost₀(θᵀxⁱ) + (1/2) Σⱼ₌₁ⁿ θⱼ²
其中 C 相当于逻辑回归中 1/λ 的角色:
- C 大 → 低偏差、高方差(更关注分类正确)
- C 小 → 高偏差、低方差(更关注间隔最大化)
三、SVM 的假设函数
h(x) =
- 1 if θᵀx ≥ 0
- 0 otherwise
SVM 直接输出类别标签(0 或 1),而非概率值。
四、与逻辑回归的对比
| 对比项 | 逻辑回归 | SVM |
|---|---|---|
| 输出 | 概率值 (0,1) | 类别标签 |
| 代价函数 | 对数损失 | 铰链损失 |
| 决策边界 | 概率=0.5 | 最大间隔超平面 |
| 参数控制 | λ(正则化系数) | C(惩罚系数) |
五、一句话总结
"SVM 用铰链损失替代对数损失,目标是让正类样本满足 θᵀx ≥ 1、负类满足 θᵀx ≤ -1,实现最大间隔分类。"
直观上对大间隔的理解
一、什么是"大间隔"?
SVM 不仅要把两类样本分开,还要让决策边界离最近的样本点尽可能远。这个"最近的距离"就是间隔(Margin)。
二、为什么大间隔更好?
小间隔 vs 大间隔
小间隔(容易出错) 大间隔(鲁棒)
│ │
╳ ╳│○ ○ ╳ ╳ │ ○ ○
╳ ╳│○ ○ ╳ ╳ │ ○ ○
╳ ╳│○ ○ ╳ ╳ │ ○ ○
│ │
| 对比 | 小间隔 | 大间隔 |
|---|---|---|
| 决策边界位置 | 紧贴某类样本 | 远离所有样本 |
| 对新样本的容忍度 | 低(稍扰动就判错) | 高(有缓冲空间) |
| 泛化能力 | 差(容易过拟合) | 好(更鲁棒) |
三、C 参数对间隔的影响
| C 取值 | 效果 | 间隔 | 问题 |
|---|---|---|---|
| C 很大 | 严格分类每一个训练样本 | 间隔小 | 高方差(过拟合) |
| C 很小 | 允许少量分类错误 | 间隔大 | 高偏差(欠拟合) |
| C 适中 | 平衡分类正确与间隔大小 | 间隔适中 | 理想状态 |
四、SVM 的"大间隔分类器"特性
SVM 天然倾向于找到一个最大间隔的决策边界,这是由其优化目标决定的:
min C Σᵢ₌₁ᵐ yⁱ cost₁(θᵀxⁱ) + (1-yⁱ) cost₀(θᵀxⁱ) + (1/2) Σⱼ₌₁ⁿ θⱼ²
- 第一项(代价项):推动模型正确分类
- 第二项(正则化项):推动模型保持权重小 → 间隔大
五、异常值的影响
原始数据 有一个异常值(C 大时)
╳ ╳│○ ○ ╳ ╳ │○ ○
╳ ╳│○ ○ ╳ ╳ ╳ │○ ○
╳ ╳│○ ○ ╳ ╳ │○ ○
- C 很大时:决策边界会被异常值"拉偏",间隔变小
- C 适当时:模型会忽略少数异常值,保持大间隔
六、一句话总结
"SVM 追求的不是单纯分开,而是分开后还留足安全距离------C 控制你愿意为正确分类牺牲多少间隔。"
SVM - 大间隔分类器的数学原理
一、向量内积回顾
内积的定义
两个 n 维向量 u 和 v 的内积:
uᵀv = ‖u‖ · ‖v‖ · cos(θ)
其中:
- ‖u‖:向量 u 的长度(范数),‖u‖ = √(u₁² + u₂² + ... + uₙ²)
- ‖v‖:向量 v 的长度
- θ:u 和 v 之间的夹角
内积的几何意义
uᵀv = ‖u‖ · p
其中 p 是 v 在 u 方向上的投影长度:
- p = ‖v‖ · cos(θ)
- 当夹角小于 90° 时,p 为正
- 当夹角大于 90° 时,p 为负
二、SVM 决策边界的向量表示
简化条件
为便于推导,设 θ₀ = 0(决策边界过原点),n = 2(二维特征)。
决策规则
- 正类:θᵀx ≥ 0
- 负类:θᵀx < 0
用内积表示
θᵀx = ‖θ‖ · p
其中 p 是 x 在 θ 方向上的投影长度。
三、SVM 的优化目标(简化版)
min (1/2) Σⱼ₌₁ⁿ θⱼ² = (1/2) ‖θ‖²
约束条件:
- 正类(y=1):θᵀx ≥ 1 → ‖θ‖ · p ≥ 1
- 负类(y=0):θᵀx ≤ -1 → ‖θ‖ · p ≤ -1
四、为什么会产生大间隔?
小间隔的情况
- 样本在 θ 方向上的投影 p 较小
- 为了满足 ‖θ‖ · p ≥ 1,需要 ‖θ‖ 很大
- 但优化目标是要最小化 ‖θ‖²,所以这种方案被惩罚
大间隔的情况
- 样本在 θ 方向上的投影 p 较大
- 只需要较小的 ‖θ‖ 就能满足 ‖θ‖ · p ≥ 1
- 符合优化目标,被选中
五、决策边界的几何解释
- θ 的方向垂直于决策边界
- 样本在 θ 方向上的投影越大,说明离决策边界越远
- SVM 通过最小化 ‖θ‖,迫使样本在 θ 方向上有尽可能大的投影 → 大间隔
六、θ₀ ≠ 0 的情况
当决策边界不过原点时,上述原理仍然成立,只是决策边界的位置会平移,间隔的计算方式相应调整,但核心思想不变。
七、一句话总结
"SVM 最小化 ‖θ‖ 迫使样本在 θ 方向上投影尽量大 → 样本离决策边界尽量远 → 自然形成大间隔。"
核函数概念
一、为什么需要核函数?
当数据在原始特征空间中线性不可分时,需要将其映射到更高维的空间使其变得线性可分。核函数提供了一种高效完成这个映射的方法。
二、核函数的直观理解
原始空间(线性不可分)
x₂
↑
│ ○ ○
│ ○ ○ ○
│ ○ ○
│ ╳ ╳ ╳
│ ╳ ╳ ╳ ╳
└──────────→ x₁
映射到新空间(线性可分)
通过核函数计算相似度,将每个样本映射到新特征空间。
三、地标点与相似度特征
地标点的选择
选择地标点 l¹, l², ..., lᵏ,每个地标对应一个新特征。
相似度特征的定义(以高斯核为例)
对于样本 x,定义新特征 fᵢ:
fᵢ = similarity(x, lⁱ) = exp(-‖x - lⁱ‖² / 2σ²)
其中:
- ‖x - lⁱ‖:样本 x 到地标 lⁱ 的欧氏距离
- σ:高斯核的带宽参数,控制相似度衰减速度
新特征向量的含义
f = f₁, f₂, ..., fₖ
- fᵢ ∈ (0, 1]
- fᵢ 越接近 1 → x 与 lⁱ 越相似(距离越近)
- fᵢ 越接近 0 → x 与 lⁱ 越不相似(距离越远)
四、高斯核的参数 σ
| σ 取值 | 相似度衰减 | 效果 |
|---|---|---|
| σ 很大 | 慢(平滑) | 高偏差(欠拟合),决策边界平滑 |
| σ 很小 | 快(陡峭) | 高方差(过拟合),决策边界复杂 |
| σ 适中 | 适中 | 理想状态 |
五、地标点的选择方法
| 方法 | 新特征维度 | 说明 |
|---|---|---|
| 所有训练样本做地标 | m 维 | 最常用,表达能力最强 |
| 随机子集 | k 维 | 降低计算成本 |
| 聚类中心 | k 维 | 用 K-means 选取代表性点 |
最常用的做法是将所有训练样本 xⁱ 作为地标点 lⁱ,此时每个样本得到一个 m 维的相似度向量。
六、训练与预测的计算
训练阶段
- 每个样本 xⁱ 与所有地标(即所有训练样本)计算相似度
- 得到 m × m 的相似度矩阵(核矩阵)
- 在此新特征空间上训练线性 SVM
预测阶段
- 新样本只需与支持向量(非所有样本)计算相似度
- 支持向量个数 k ≪ m,预测效率高
七、核函数的本质
核函数不是真的去计算高维空间的坐标,而是直接在原始空间中计算两个点在高维空间中的内积------省去了显式映射的计算开销。
八、一句话总结
"核函数通过地标点和相似度计算,把线性不可分的数据映射到高维空间变得线性可分------高斯核的 σ 控制着决策边界的平滑程度。"
核函数使用
一、SVM 中使用核函数的完整流程
1. 选择地标点
将所有训练样本 x¹, x², ..., xᵐ 作为地标点 l¹, l², ..., lᵐ。
2. 计算新特征向量
对于每个样本 xⁱ,计算其与所有地标的相似度,得到 m 维特征向量 fⁱ:
fⁱ = similarity(xⁱ, l¹), similarity(xⁱ, l²), ..., similarity(xⁱ, lᵐ)
3. 在新特征空间上训练 SVM
用 fⁱ 替代原始特征 xⁱ,训练线性 SVM:
min C Σᵢ₌₁ᵐ yⁱ cost₁(θᵀfⁱ) + (1-yⁱ) cost₀(θᵀfⁱ) + (1/2) Σⱼ₌₁ᵐ θⱼ²
4. 预测
对新样本 x_new,先计算其与所有地标的相似度向量 f_new,然后:
h(x_new) = 1 if θᵀf_new ≥ 0
0 otherwise
二、SVM 参数的选择
C 参数(正则化)
| C 取值 | 效果 | 偏差-方差 |
|---|---|---|
| C 很大 | 严格分类每个训练样本,间隔小 | 高方差(过拟合) |
| C 很小 | 允许分类错误,间隔大 | 高偏差(欠拟合) |
σ² 参数(高斯核带宽)
| σ² 取值 | 相似度衰减 | 效果 |
|---|---|---|
| σ² 很大 | 慢(平滑) | 高偏差(欠拟合),决策边界平滑 |
| σ² 很小 | 快(陡峭) | 高方差(过拟合),决策边界复杂 |
三、核函数的其他类型
| 核函数 | 公式 | 适用场景 |
|---|---|---|
| 线性核 | xᵀz | 线性可分数据,或特征维度很高时 |
| 高斯核(RBF) | exp(-‖x-z‖² / 2σ²) | 最常用,适用于大多数非线性问题 |
| 多项式核 | (xᵀz + c)ᵈ | 文本分类等特定场景 |
| Sigmoid 核 | tanh(κxᵀz + c) | 神经网络风格的核函数 |
四、核函数的 Mercer 定理
不是任意函数都能用作核函数。Mercer 定理给出了合法核函数的条件:
- 核矩阵必须是对称半正定的
- 满足该条件的核函数才能保证 SVM 优化问题是凸的,能找到全局最优解
五、使用核函数时的注意事项
| 注意事项 | 说明 |
|---|---|
| 特征缩放 | 使用高斯核前必须对特征进行归一化/标准化,否则距离计算会被量纲大的特征主导 |
| 计算成本 | 高斯核训练 O(m²),m 很大时(如 > 50000)应考虑线性核或近似方法 |
| 参数调优 | C 和 σ² 需要通过交叉验证联合调优 |
六、一句话总结
"核 SVM 先用核函数把原始特征映射到高维相似度空间,再训练线性 SVM------C 控正则化、σ 控平滑度,特征缩放不能忘。"
使用 SVM
一、基本符号定义
- n:特征维度(输入特征的个数)
- m:训练样本数量
二、选择合适的核函数
线性核
K(x, z) = xᵀz
| 适用场景 | 说明 |
|---|---|
| n 很大(如 n ≥ m) | 数据可能线性可分,无需复杂核 |
| m 很小 | 避免高维映射带来的过拟合 |
| 文本分类等高维稀疏数据 | 线性核往往表现优异 |
高斯核(RBF)
K(x, z) = exp(-‖x - z‖² / 2σ²)
| 适用场景 | 说明 |
|---|---|
| n 较小,m 适中 | 非线性关系需要捕捉 |
| 对数据分布没有先验知识 | 高斯核是默认首选 |
| 需要灵活的非线性决策边界 | 通过调整 σ 控制复杂度 |
其他核函数
| 核函数 | 使用建议 |
|---|---|
| 多项式核 | 参数多(c, d),调参困难,不如高斯核常用 |
| Sigmoid 核 | 在某些参数下不满足 Mercer 条件,慎用 |
三、多分类问题
SVM 原生只支持二分类,处理多分类有两种策略:
| 策略 | 做法 | 复杂度 |
|---|---|---|
| 一对多(One-vs-All) | 训练 K 个 SVM,每个区分一类 vs 其余 | O(K) |
| 一对一(One-vs-One) | 训练 K(K-1)/2 个 SVM,每对类别之间区分 | O(K²) |
实践中,多数 SVM 库(如 libsvm)内置了多分类支持,自动处理。
四、SVM 与其他算法的选择
| 场景 | 推荐算法 | 原因 |
|---|---|---|
| n 很大(相对 m) | 逻辑回归 或 线性核 SVM | 线性模型足够,计算快 |
| n 很小,m 适中 | 高斯核 SVM | 能拟合复杂非线性边界 |
| n 很小,m 很大 | 逻辑回归 或 线性核 SVM | 高斯核计算太慢(O(m²)) |
| 深度学习场景 | 神经网络 | 图像、音频等非结构化数据 |
五、使用 SVM 的实践步骤
- 特征缩放:使用高斯核前,对所有特征进行归一化/标准化
- 选择核函数:根据 n 和 m 的相对大小选择
- 调参:用交叉验证选择 C 和 σ²(或其他核参数)
- 训练:调用成熟的 SVM 库(libsvm、scikit-learn 等)
- 评估:用测试集评估最终模型
六、SVM 的优缺点
| 优点 | 缺点 |
|---|---|
| 理论基础扎实,泛化能力强 | 大数据集训练慢(O(m²) ~ O(m³)) |
| 通过核函数处理非线性问题 | 核函数和参数选择依赖经验 |
| 解是全局最优(凸优化) | 不支持概率输出(需额外 Platt 缩放) |
| 对高维数据有效 | 对缺失数据敏感 |
七、一句话总结
"n 大用线性核,n 小 m 适中用高斯核,n 小 m 很大用逻辑回归------特征缩放不能忘,交叉验证选 C 和 σ。"
无监督学习
一、什么是有监督学习(回顾)
有监督学习中,训练集包含输入 x 和标签 y:
- 分类:y 是离散类别
- 回归:y 是连续值
目标:学习从 x 到 y 的映射。
二、什么是无监督学习
无监督学习的训练集只有输入 x,没有标签 y:
- 数据没有标注
- 不知道每个样本属于哪一类
- 需要算法自己从数据中发现结构
三、无监督学习的典型应用
| 应用 | 说明 | 例子 |
|---|---|---|
| 聚类(Clustering) | 将相似样本自动归为一组 | 新闻文章自动分类、客户分群 |
| 降维(Dimensionality Reduction) | 压缩数据维度,保留主要信息 | 数据可视化、特征压缩 |
| 异常检测(Anomaly Detection) | 找出与众不同的样本 | 欺诈检测、故障监控 |
| 密度估计(Density Estimation) | 估计数据的概率分布 | 概率建模、生成新样本 |
四、有监督 vs 无监督
| 对比项 | 有监督学习 | 无监督学习 |
|---|---|---|
| 训练数据 | x + y(有标签) | x(无标签) |
| 目标 | 预测 y | 发现数据内在结构 |
| 评价 | 有明确指标(准确率、误差) | 较难量化评估 |
| 典型算法 | 线性回归、逻辑回归、SVM、神经网络 | K-means、PCA、DBSCAN、GMM |
五、无监督学习的挑战
| 挑战 | 说明 |
|---|---|
| 没有正确答案 | 无法像有监督那样用标签验证结果好坏 |
| 结果主观性强 | 不同聚类算法可能得出不同结果,难以判断谁对 |
| 评估困难 | 需要领域知识或下游任务来间接验证 |
六、一句话总结
"无监督学习就像让机器自己去发现数据的规律------只有 x 没有 y,全靠算法自己找结构。"
K-Means 算法
一、算法概述
K-Means 是最常用的聚类算法之一,目标是将无标签数据自动划分为 K 个簇。
二、算法步骤
输入
- 训练集
- 聚类数量 K(需要预先指定)
步骤
-
初始化:随机选择 K 个样本作为初始簇中心 μ₁, μ₂, ..., μₖ
-
重复以下两步直到收敛:
第一步:簇分配(Cluster Assignment)
对每个样本 xⁱ,计算其到各簇中心的距离,分配到最近的簇:
cⁱ = argminₖ ‖xⁱ - μₖ‖²
第二步:移动簇中心(Move Centroid)
对每个簇 k,重新计算簇中心为该簇所有样本的均值:
μₖ = (1 / |Cₖ|) Σᵢ∈Cₖ xⁱ
三、优化目标(失真函数)
K-Means 实际上在最小化以下代价函数:
J(c¹, ..., cᵐ, μ₁, ..., μₖ) = (1/m) Σᵢ₌₁ᵐ ‖xⁱ - μ_{cⁱ}‖²
其中:
- cⁱ:样本 xⁱ 被分配的簇编号
- μ_{cⁱ}:样本 xⁱ 所属簇的中心
- ‖xⁱ - μ_{cⁱ}‖²:样本到其簇中心的距离平方
四、K 的选择
| 方法 | 做法 | 说明 |
|---|---|---|
| 肘部法(Elbow Method) | 绘制 K 与 J 的关系曲线,找拐点 | 直观但有时拐点不明显 |
| 业务需求 | 根据实际应用场景确定 K | 如市场细分已知要分几类 |
| 下游任务评估 | 用聚类结果做后续任务,选效果最好的 K | 如聚类后做推荐,评估推荐效果 |
五、初始化问题
随机初始化的风险
K-Means 对初始簇中心敏感,可能收敛到局部最优。
多次初始化策略
- 随机初始化 50-100 次
- 每次运行 K-Means 得到一组聚类结果
- 选择代价 J 最小的那次结果
六、K-Means 的优缺点
| 优点 | 缺点 |
|---|---|
| 算法简单,计算快 | 需要预先指定 K |
| 易于理解和实现 | 对初始值敏感 |
| 适合大数据集 | 只能发现球形簇 |
| 可解释性好 | 对异常值敏感 |
八、一句话总结
"K-Means 两步走:分配样本到最近簇中心,再更新簇中心为簇内均值------重复直到收敛,多次初始化防局部最优。"
K-Means优化目标
一、K-Means 的代价函数(失真函数)
K-Means 实际上是在最小化一个明确的代价函数:
J(c¹, c², ..., cᵐ, μ₁, μ₂, ..., μₖ) = (1/m) Σᵢ₌₁ᵐ ‖xⁱ - μ_{cⁱ}‖²
其中:
- cⁱ ∈ {1, 2, ..., K}:样本 xⁱ 被分配的簇编号
- μₖ ∈ ℝⁿ:第 k 个簇的中心点
- μ_{cⁱ}:样本 xⁱ 所属簇的中心
- ‖xⁱ - μ_{cⁱ}‖²:样本到其簇中心的欧氏距离平方
二、代价函数的作用
| 作用 | 说明 |
|---|---|
| 验证收敛 | 每次迭代后 J 应该下降,若不降则可能出 bug |
| 比较不同初始化 | 多次初始化后选 J 最小的那次 |
| 选择 K | 肘部法中绘制 J 随 K 的变化曲线 |
三、算法两步与代价函数的关系
K-Means 的两步交替执行,每一步都在降低 J:
第一步:簇分配(固定 μ,优化 c)
对每个样本 xⁱ,选择离它最近的簇中心:
cⁱ = argminₖ ‖xⁱ - μₖ‖²
这一步保证 J 不会增加(每个样本都被分配到最近的簇中心)。
第二步:移动簇中心(固定 c,优化 μ)
对每个簇 k,重新计算中心:
μₖ = (1 / |Cₖ|) Σᵢ∈Cₖ xⁱ
这一步同样保证 J 不会增加(均值点使簇内距离平方和最小)。
四、J 随迭代的变化
- J 单调递减(或不变)
- 收敛时 J 不再显著变化
- 如果 J 在某次迭代后上升,说明算法实现有 bug
五、如何利用 J 调试算法
| 现象 | 可能原因 | 解决 |
|---|---|---|
| J 不下降 | 实现有 bug | 检查簇分配和中心更新逻辑 |
| J 下降太慢 | 初始化不好 | 重新初始化或增加迭代次数 |
| J 震荡 | 存在空簇或数值问题 | 检查空簇处理逻辑 |
六、一句话总结
"K-Means 的每一步都在降低同一个代价函数 J------簇分配降 J,移动中心也降 J,单调递减直到收敛。"
K-Means 随机初始化
一、为什么需要随机初始化?
K-Means 对初始簇中心的位置非常敏感,不同的初始位置可能导致完全不同的聚类结果。随机初始化的目的是让算法有机会找到全局最优解。
二、随机初始化的标准方法
步骤
- 从训练集中随机选择 K 个不同的样本作为初始簇中心 μ₁, μ₂, ..., μₖ
- 运行 K-Means 得到聚类结果
- 记录最终的代价 J
注意
- 必须选 K 个不同的样本
- 如果 K 较大(如 K > 100),随机采样时确保不重复
三、多次初始化的必要性
单次初始化的风险
随机初始化可能落入局部最优:
多次初始化的流程
- 循环 50-100 次:
- 随机初始化簇中心
- 运行 K-Means 至收敛
- 记录最终代价 J
- 选择代价 J 最小的那次聚类结果
四、不同 K 值下的初始化策略
| K 值 | 初始化次数 | 原因 |
|---|---|---|
| K 较小(如 2-10) | 50-100 次 | 局部最优问题突出,需多次尝试 |
| K 较大(如 > 100) | 1-10 次 | 局部最优风险降低,计算成本高 |
五、判断是否陷入局部最优
| 信号 | 说明 |
|---|---|
| 不同初始化得到明显不同的聚类结果 | 很可能存在多个局部最优 |
| 多次初始化后 J 相差很大 | 需要更多次初始化尝试 |
| 聚类结果不符合直觉 | 可能是局部最优,需重新初始化 |
六、一句话总结
"随机初始化选 K 个不同样本做起点,跑 50-100 次选 J 最小的------用次数换质量,避开局部最优陷阱。"
K-Means 选取聚类数量
一、K 值选择的难点
K-Means 需要预先指定聚类数量 K,但在无监督学习中,没有绝对的"正确答案"。同一个数据集,不同的 K 值可能都有合理的解释。
二、肘部法(Elbow Method)
做法
- 对不同的 K 值(如 K = 1, 2, 3, ..., 10)分别运行 K-Means
- 记录每个 K 对应的代价 J
- 绘制 K-J 曲线
理想情况(有明显拐点)
J
↑
│
│*
│ *
│ *
│ *
│ *
│ *____
│ | \_____
│ | \_____
└─────────────────────→ K
↑
肘部(elbow)
在拐点处选择 K,因为超过这个点后增加 K 带来的收益急剧下降。
实际情况(无明显拐点)
J
↑
│*
│ *
│ *
│ *
│ *
│ *
│ *
│ *
└─────────────────────→ K
曲线平滑下降,没有明显的肘部。此时肘部法失效,需要用其他方法。
三、基于业务需求选择 K
| 场景 | 如何确定 K | 例子 |
|---|---|---|
| 市场细分 | 根据营销预算和运营能力 | 分 3 类还是 5 类客户更容易制定策略 |
| 图像压缩 | 根据需要的色彩数 | 256 色还是 16 色 |
| 推荐系统 | 根据产品品类数 | 服装分 10 类还是 20 类 |
| 异常检测 | 根据业务对粒度的要求 | 正常/异常 2 类,或细分为多种异常类型 |
四、基于下游任务评估选择 K
做法
- 对不同 K 值运行 K-Means
- 将聚类结果用于下游任务(如推荐、分类)
- 评估下游任务的表现
- 选择使下游任务表现最好的 K
优点
- 直接服务于最终目标
- 避免了无监督评估的主观性
五、K 值选择的总结
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 肘部法 | 有明显拐点时 | 直观、简单 | 很多时候拐点不明显 |
| 业务需求 | 有明确的业务约束 | 结果可落地 | 可能不是最优统计解 |
| 下游任务 | 聚类结果用于后续任务 | 直接优化最终目标 | 需要额外的评估流程 |
六、一句话总结
"K 没有标准答案------肘部法找拐点、业务需求定粒度、下游任务验效果,三种方法选最适合的。"
目标 I:数据压缩
一、什么是降维(Dimensionality Reduction)
降维是将高维数据映射到低维空间,同时尽可能保留原始数据的重要信息。
二、为什么需要数据压缩?
1. 节省存储空间和计算资源
- 高维数据占用大量内存和硬盘
- 降维后数据量大幅减少,后续算法运行更快
2. 加速后续算法
- KNN、K-Means 等算法在高维空间计算距离耗时巨大
- 降维后距离计算更快
3. 可视化
- 人类只能理解 2D 或 3D 的可视化
- 将高维数据降到 2D 或 3D,可以直观观察数据分布
三、降维的直观理解
从 2D 到 1D
原始 2D 数据(x₁, x₂) 投影到 1D 直线
x₂ ↑ 沿直线展开
│ ○ ○ ○──○──○──○──○
│ ○ ○ ○ ○ ○──○──○──○──○
│ ○ ○ ○ ○ ○
│ ○ ○ ○ ○
│ ○ ○
└──────────→ x₁
- 原始数据用两个坐标 (x₁, x₂) 表示
- 降维后用一个坐标 z 表示(沿直线的位置)
- 信息损失 = 点到直线的垂直距离
从 3D 到 2D
原始 3D 数据(x₁, x₂, x₃) 投影到 2D 平面
↗ ↑
/ ○ ○ │ ○ ○
/ ○ ○ ○ │○ ○ ○
/ ○ ○ ○ ○ │ ○ ○ ○
└──────→ └──────→
- 原始数据用三个坐标表示
- 降维后用两个坐标表示(在平面上的位置)
四、降维与特征选择的区别
| 对比项 | 特征选择 | 降维 |
|---|---|---|
| 做法 | 直接丢弃某些特征 | 将原有特征组合成新特征 |
| 结果 | 保留原有特征子集 | 生成全新的特征 |
| 可解释性 | 好(保留了原始特征名) | 差(新特征是原始特征的组合) |
| 信息保留 | 丢失被删除特征的全部信息 | 尽可能保留原始信息的整体结构 |
五、数据压缩的实际应用
| 应用 | 说明 |
|---|---|
| 图像压缩 | 将高分辨率图像降到低维表示,减少存储空间 |
| 语音数据压缩 | 提取语音信号的主要成分,去除冗余 |
| 基因数据压缩 | 上万维的基因表达数据降到几百维 |
| 传感器数据压缩 | 多个传感器的冗余数据合并为少量关键指标 |
六、一句话总结
"降维把高维数据投影到低维空间,保留主要信息的同时节省存储、加速计算------但新特征失去了原有的物理含义。"
目标 II:可视化
一、为什么需要可视化?
- 人类最多只能感知三维空间
- 高维数据(如几十、上千维)无法直接观察
- 降维到 2D 或 3D 后,可以通过肉眼发现数据中的模式和规律
二、可视化能帮我们发现什么?
| 发现 | 说明 | 例子 |
|---|---|---|
| 聚类结构 | 数据是否自然形成若干簇 | 客户分群是否清晰 |
| 异常点 | 是否有远离主群的孤立样本 | 欺诈交易、测量错误 |
| 数据分布 | 数据是否均匀分布或有偏斜 | 类别不平衡情况 |
| 特征关系 | 哪些特征相关性高 | 冗余特征识别 |
三、降维可视化的流程
步骤
- 收集高维数据集(如 m 个样本,n 维特征)
- 用 PCA 等降维算法将数据降到 2D 或 3D
- 在二维/三维坐标系中绘制每个样本
- 观察图形,发现模式和规律
示例:国家经济发展数据
原始数据:各国每年 GDP、人均收入、教育投入、医疗支出、...(几十维)
降维到 2D 后:
z₂ ↑
│ 发展中国家
│ ○ ○
│ ○ ○ ○
│ ○
│ 发达国家
│ ○ ○
│ ○ ○ ○
│ 新兴市场
│ ○ ○
│ ○ ○
└──────────────────────→ z₁
肉眼可见三个簇,对应不同发展阶段的国家。
四、可视化的实际应用
| 应用场景 | 原始维度 | 降维目标 | 可以发现什么 |
|---|---|---|---|
| 基因表达数据分析 | 数千维 | 2D | 不同癌症亚型的聚类 |
| 文本主题分析 | 词汇维度 | 2D | 文档的主题分布 |
| 用户画像分析 | 上百个用户特征 | 2D | 用户群体的自然划分 |
| 图像数据集探索 | 像素维度 | 2D | 图像类别的分布和重叠 |
五、可视化的局限性
| 局限 | 说明 |
|---|---|
| 信息损失 | 降到 2D 必然丢失部分信息,可能掩盖重要结构 |
| 投影误导 | 降维后的距离不完全反映原始空间的距离 |
| 参数敏感 | 不同降维算法或参数可能呈现完全不同的视图 |
六、一句话总结
"降维到 2D 或 3D 让高维数据现原形------聚类、异常、分布一目了然,但要警惕信息损失带来的视觉误导。"
主成分分析问题规划 1
一、PCA 的核心目标
主成分分析(Principal Component Analysis,PCA)的目标是找到一个低维子空间 ,将数据投影到这个子空间上,使得投影后的方差最大(或者说投影误差最小)。
二、PCA 的直观理解
从 2D 到 1D
原始数据用两个坐标 (x₁, x₂) 表示,PCA 找到一个主方向(方差最大的方向),将所有样本投影到这条直线上,每个样本用其在主方向上的投影位置 z 表示。
从 3D 到 2D
原始数据用三个坐标表示,PCA 找到两个主方向构成一个平面,将所有样本投影到这个平面上,每个样本用两个新坐标表示。
三、PCA 与线性回归的区别
这是一个容易混淆的点,需要特别注意:
| 对比项 | PCA | 线性回归 |
|---|---|---|
| 目标 | 最小化投影距离(垂直距离) | 最小化预测误差(竖直距离) |
| 方向 | 所有特征同等对待 | 区分自变量和因变量 |
| 误差方向 | 垂直于主成分方向 | 垂直于 x 轴(竖直方向) |
四、PCA 的数学表述
问题定义
给定 m 个 n 维样本 {x¹, x², ..., xᵐ},要将它们降到 k 维(k < n)。
目标
找到一个 k 维子空间,使得数据投影到该子空间后的投影误差平方和最小 (等价于投影后的方差最大)。
从 n 维降到 k 维
- 找到 k 个方向(主成分),它们是相互正交的单位向量
- 第一个主成分:数据方差最大的方向
- 第二个主成分:与第一个正交且剩余方差最大的方向
- 以此类推
五、数据预处理的必要性
在使用 PCA 之前,必须对数据进行预处理:
步骤
-
均值归一化(Mean Normalization)
- 对每个特征 j,计算均值 μⱼ
- 替换 xⱼ = xⱼ - μⱼ
- 使每个特征的均值为 0
-
特征缩放(Feature Scaling)
- 对每个特征 j,计算标准差 σⱼ
- 替换 xⱼ = xⱼ / σⱼ
- 使所有特征在同一尺度上
为什么要做特征缩放?
- PCA 对特征的尺度敏感
- 如果某个特征的值域远大于其他特征,它会主导主成分方向
- 例如:房屋面积(50-500 m²)和房龄(1-50 年),面积会主导 PCA 结果
六、一句话总结
"PCA 找方差最大的方向做投影,投影误差最小------注意和线性回归区分,而且一定要先做特征缩放。"
主成分分析问题规划 2
一、PCA 的数学推导流程
输入
- m 个 n 维样本
- 目标降维维度 k(k < n)
步骤
1. 数据预处理
对每个特征 j:
- 计算均值 μⱼ = (1/m) Σᵢ₌₁ᵐ xⱼⁱ
- 均值归一化:xⱼⁱ = xⱼⁱ - μⱼ
- 若特征尺度不同,还需除以标准差 sⱼ:xⱼⁱ = xⱼⁱ / sⱼ
2. 计算协方差矩阵
Σ = (1/m) Σᵢ₌₁ᵐ (xⁱ)(xⁱ)ᵀ
其中 Σ 是一个 n×n 的对称矩阵。
3. 计算协方差矩阵的特征向量
对 Σ 进行特征值分解(或对 X 做 SVD 分解),得到:
- 特征向量 u¹, u², ..., uⁿ(每个都是 n 维单位向量)
- 对应的特征值 λ₁ ≥ λ₂ ≥ ... ≥ λₙ
特征向量就是主成分方向,按特征值从大到小排列。
4. 选择前 k 个特征向量
取 u¹, u², ..., uᵏ 构成投影矩阵 U_reduce(n×k 矩阵)。
5. 投影到 k 维空间
对每个样本 xⁱ,计算降维后的表示:
zⁱ = (U_reduce)ᵀ · xⁱ
其中 zⁱ 是一个 k 维向量。
二、降维前后的维度变化
| 阶段 | 维度 | 说明 |
|---|---|---|
| 原始数据 xⁱ | n 维 | 列向量,形状 n×1 |
| 投影矩阵 U_reduce | n×k 矩阵 | 前 k 个特征向量按列排列 |
| 降维后数据 zⁱ | k 维 | 列向量,形状 k×1 |
投影运算详解
zⁱ = (U_reduce)ᵀ · xⁱ
维度变化:(k×n) · (n×1) = (k×1)
展开形式:
zⁱ = u¹·xⁱ, u²·xⁱ, ..., uᵏ·xⁱᵀ
即 zⁱ 的第 j 个分量是 xⁱ 在第 j 个主成分方向上的投影长度。
三、PCA 的应用流程总结
原始数据(n 维)
↓
数据预处理(均值归一化 ± 特征缩放)
↓
计算协方差矩阵 Σ
↓
特征值分解 / SVD
↓
选择前 k 个特征向量
↓
投影到 k 维空间
↓
降维后数据(k 维)
四、注意事项
| 要点 | 说明 |
|---|---|
| 特征缩放必须做 | 否则大尺度特征会主导主成分方向 |
| 均值归一化必须做 | 否则第一主成分会被均值方向带偏 |
| k 的选择 | 通过保留方差比例确定(下一节详述) |
| PCA 只在训练集上计算 | 然后用同样的 U_reduce 投影验证集和测试集 |
五、一句话总结
"PCA 四步走:预处理 → 协方差矩阵 → SVD 找特征向量 → 取前 k 个投影------降维后的 z 就是 x 在主成分方向上的投影长度。"
主成分数量选择
一、核心目标
在 PCA 降维时,选择合适的降维维度 k(主成分个数):用最少的维度,保留原始数据绝大部分的核心信息。
二、评估指标:投影误差与方差保留率
1. 核心公式(误差占比)
衡量降维损失的比例:
(1/m) · Σᵢ₌₁ᵐ ‖x⁽ⁱ⁾ - x⁽ⁱ⁾_approx‖² / (1/m) · Σᵢ₌₁ᵐ ‖x⁽ⁱ⁾‖² ≤ 0.01 (即 1%)
- 分子:平均平方投影误差(x⁽ⁱ⁾ 为原始数据,x⁽ⁱ⁾_approx 为降维后重新还原的近似数据,代表降维损失的信息)。
- 分母:数据的总方差(代表原始数据整体的波动大小,前提已做均值归一化)。
- 物理含义 :投影误差占总方差的比例 ≤ 1%,即保留了 99% 的方差(信息)。
2. 常见阈值标准
| 误差阈值 | 保留方差比例 | 适用场景 |
|---|---|---|
| ≤ 0.01 | 99% | 精度要求极高(常见默认标准) |
| ≤ 0.05 | 95% | 常规机器学习特征压缩 |
| ≤ 0.1 | 90% | 可视化或极度压缩维度 |
三、选择最小 k 值的流程
- 从 k=1 开始尝试。
- 执行 PCA 降维投影得到 z⁽ⁱ⁾,再还原得到 x⁽ⁱ⁾_approx。
- 计算上述误差比例。
- 若满足阈值(如 ≤ 1%),则当前 k 合格;否则 k 加 1 继续尝试。
- 取满足条件的最小 k 值作为最终降维维度。
四、高效计算方法(基于 SVD 奇异值)
实际工程中不直接反复计算投影误差,而是利用 SVD 分解得到的对角矩阵 S(奇异值)直接判定:
1 - Σᵢ₌₁ᵏ Sᵢᵢ / Σᵢ₌₁ⁿ Sᵢᵢ ≤ 0.01 ⇔ Σᵢ₌₁ᵏ Sᵢᵢ / Σᵢ₌₁ⁿ Sᵢᵢ ≥ 0.99
- 分子:前 k 个主成分对应的奇异值平方和(保留的方差)。
- 分母:所有 n 个奇异值平方和(总方差)。
- 优势:一次 SVD 分解即可算出任意 k 的保留比例,无需反复投影还原。
五、与 14-4 的关联总结
- 14-4 规划:选定 k 后,取前 k 个特征向量投影得到降维数据 z。
- 14-5 选参:本节的公式就是检验"前 k 个向量够不够用"的标尺。误差超阈值则 k 不够,需增加;满足阈值则 k 刚好。
六、注意事项
| 要点 | 说明 |
|---|---|
| 仅在训练集选 k | 用训练集算出的 U_reduce 和阈值标准,直接套用到验证集/测试集 |
| 先预处理再评估 | 必须已完成均值归一化与特征缩放,否则总方差分母失去统计意义 |
| 避免人为硬设 k | 优先按方差保留率动态决定 k,而非直接拍脑袋定维度 |
七、一句话总结
"选 k 看误差占比:投影误差/总方差 ≤ 1%(保留 99% 信息),用 SVD 奇异值求和快速判定,取满足条件的最小 k。"
PCA 压缩重现
一、核心目标
- 压缩(降维):将高维数据 x⁽ⁱ⁾ ∈ ℝⁿ 映射为低维特征 z⁽ⁱ⁾ ∈ ℝᵏ(丢弃冗余与噪声,减少计算量)。
- 重现(还原):用低维特征 z⁽ⁱ⁾ 近似还原出原始空间的数据 x̂⁽ⁱ⁾ ∈ ℝⁿ,用于评估投影误差或特定场景的重构。
二、核心矩阵与符号约定
基于前节 SVD / PCA 结果(对中心化数据 X 分解):
- n:原始特征维度
- k:降维后的目标维度(k < n)
- U_reduce:n×k 矩阵,取 V 的前 k 列(即前 k 个主成分方向/特征向量)
- x⁽ⁱ⁾:原始样本(已减均值 μ),x̂⁽ⁱ⁾:还原后的近似样本
三、压缩:高维 → 低维
公式(投影)
z⁽ⁱ⁾ = (U_reduce)ᵀ · x⁽ⁱ⁾
维度变化:z⁽ⁱ⁾ = (k×n) · (n×1) = (k×1)
物理含义
把数据投影到保留大部分方差的前 k 个主方向上,丢掉方差极小的噪声维度。
四、重现:低维 → 高维近似
公式(还原)
x̂⁽ⁱ⁾ = U_reduce · z⁽ⁱ⁾
维度变化:x̂⁽ⁱ⁾ = (n×k) · (k×1) = (n×1)
加回均值(还原到原始坐标系)
x⁽ⁱ⁾_approx = x̂⁽ⁱ⁾ + μ
其中 μ 为训练集均值向量。
物理含义
在低维空间沿主方向"拉伸"回原空间,丢失的维度补 0(即投影误差的来源)。
五、误差评估(衔接 14-5)
投影误差
‖x⁽ⁱ⁾ - x⁽ⁱ⁾_approx‖²
总方差
‖x⁽ⁱ⁾‖²(中心化后)
误差占比
(1/m) · Σᵢ₌₁ᵐ ‖x⁽ⁱ⁾ - x⁽ⁱ⁾_approx‖² / (1/m) · Σᵢ₌₁ᵐ ‖x⁽ⁱ⁾‖² = 1 - Σᵢ₌₁ᵏ Sᵢᵢ² / Σᵢ₌₁ⁿ Sᵢᵢ² ≤ 0.01
即保留 99% 方差。
六、完整计算流程总结
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1. 预处理 | 训练集减均值 μ,特征缩放(若量纲不一) | 确保各特征公平竞争 |
| 2. 求基 | SVD 得 V,按 14-5 准则取前 k 列得 U_reduce | 主成分方向 |
| 3. 压缩 | z⁽ⁱ⁾ = (U_reduce)ᵀ · (x⁽ⁱ⁾ - μ) | 训练/预测通用 |
| 4. 重现 | x⁽ⁱ⁾_approx = U_reduce · z⁽ⁱ⁾ + μ | 仅评估/可视化用 |
七、压缩 vs 重现 对比表
| 环节 | 方向 | 公式 | 维度变化 | 信息损失 |
|---|---|---|---|---|
| 压缩 | 原空间 → 主成分空间 | z = (U_reduce)ᵀ · (x - μ) | n → k | 丢弃小方差方向 |
| 重现 | 主成分空间 → 原空间 | x_approx = U_reduce · z + μ | k → n | 无法恢复已丢弃信息 |
八、注意事项
| 要点 | 说明 |
|---|---|
| 仅训练集定参 | μ 和 U_reduce 只在训练集计算,验证/测试集直接套用(防数据泄露) |
| 还原非真原数据 | x̂ 是投影近似,缺失了被降维丢弃的噪声/细节,不能用于重新训练 |
| 应用场景 | 压缩用于加速模型/去噪;重现用于可视化(降 2/3 维画图)或误差监控 |
九、一句话总结
"压缩即乘 (U_reduce)ᵀ 投影到 k 维,重现即乘 U_reduce 加均值还原------丢失的维度不可恢复,误差由奇异值平方和比例提前锁定。"
应用 PCA 的建议
一、PCA 的正确使用场景
1. 加速监督学习
当特征维度 n 很大时,先用 PCA 降维,再用降维后的数据训练模型:
原始数据(n 维,m 个样本)
↓ PCA 降维
降维后数据(k 维,m 个样本)
↓ 训练监督学习模型
最终模型
好处:
- 减少训练时间
- 降低内存占用
- 可能减轻过拟合(丢弃噪声维度)
2. 数据可视化
将高维数据降到 2D 或 3D,用散点图观察数据分布、聚类结构或异常点。
3. 数据压缩
减少存储空间,加快后续处理速度。
二、PCA 的错误使用场景
1. 用 PCA 防止过拟合
❌ 错误做法:认为 PCA 丢弃了一些维度就能自动防止过拟合。
✅ 正确做法:先用原始数据训练模型,加正则化(L1/L2),只有在计算资源不足时才考虑 PCA。
原因:
- PCA 丢弃维度时不考虑标签 y,可能丢掉对预测有用的信息
- 正则化是专门为防止过拟合设计的,效果更可控
2. 盲目默认使用 PCA
❌ 错误做法:不管什么数据集,上来就先做 PCA。
✅ 正确做法:先用原始数据训练模型,如果效果不好或计算太慢,再考虑 PCA。
原因:
- PCA 会损失信息,可能降低模型性能
- 如果原始特征已经很好,降维反而有害
三、PCA 的使用建议流程
收集数据
↓
先用原始数据训练模型(不加 PCA)
↓
评估效果
├── 效果好,速度快 → 不需要 PCA
├── 效果好,速度慢 → 考虑用 PCA 加速
└── 效果差
├── 欠拟合 → 增加特征或用更复杂的模型
└── 过拟合 → 加正则化或收集更多数据
四、PCA 在不同场景下的建议
| 场景 | 建议 | 原因 |
|---|---|---|
| 特征维度 n 很大(如 > 1000) | 考虑用 PCA 降维 | 计算开销大,可能存在冗余特征 |
| 样本量 m 很小 | 谨慎使用 PCA | 降维后可能丢失关键信息 |
| 特征间高度相关 | PCA 效果好 | 冗余信息多,降维损失小 |
| 特征间独立性强 | PCA 效果有限 | 每个特征携带独特信息,降维损失大 |
| 需要模型可解释性 | 不使用 PCA | 降维后的特征失去物理含义 |
五、PCA 的实施要点
1. 只在训练集上拟合 PCA
- 计算均值 μ 和投影矩阵 U_reduce 时只用训练集
- 然后将同样的变换应用到验证集和测试集
2. 特征缩放必须先做
- PCA 对特征尺度敏感
- 必须做均值归一化,必要时做特征缩放
3. k 的选择
- 用 14-5 的方法(保留方差比例)选择 k
- 不要凭感觉设定 k
六、PCA 的局限性
| 局限 | 说明 |
|---|---|
| 线性变换 | PCA 只能捕捉线性关系,无法处理非线性结构 |
| 可解释性差 | 降维后的特征 z 是原始特征的线性组合,没有物理含义 |
| 信息损失 | 即使保留 99% 方差,仍可能丢掉关键的判别信息 |
| 对异常值敏感 | 异常值会扭曲主成分方向 |
七、一句话总结
"先用原始数据试,不行再加 PCA------加速训练、可视化、压缩存储是好用途,但别拿它当正则化用,也别盲目默认降维一定提升效果。"
异常检测问题动机
一、什么是异常检测(Anomaly Detection)
异常检测是无监督学习 的一种,用于识别数据中与大多数样本显著不同的异常样本。
核心思路
- 对正常数据建立一个概率模型 p(x)
- 设置一个阈值 ε
- 如果 p(x) < ε,则标记为异常
二、异常检测的典型应用
| 应用场景 | 说明 | 例子 |
|---|---|---|
| 欺诈检测 | 识别异常的金融交易行为 | 信用卡被盗刷、账户异常登录 |
| 工业质检 | 检测生产线上的缺陷产品 | 零件尺寸异常、表面划痕 |
| 服务器监控 | 发现服务器运行异常 | CPU 飙升、内存泄漏、流量突增 |
| 设备维护 | 预测设备故障 | 振动异常、温度过高 |
三、异常检测的直观理解
二维特征示例
假设有两个特征:x₁ = 交易金额,x₂ = 交易频率
大多数正常交易集中在某个区域,少数远离该区域的点可能是异常。
四、异常检测 vs 监督学习
| 对比项 | 异常检测 | 监督学习 |
|---|---|---|
| 标签情况 | 无标签,或只有少量正常样本标签 | 有大量正负样本标签 |
| 数据分布 | 正常样本极多,异常样本极少 | 正负样本数量相对均衡 |
| 异常类型 | 未来可能出现从未见过的异常类型 | 训练集中已包含各类样本 |
| 典型应用 | 欺诈检测、故障检测 | 垃圾邮件分类、疾病诊断 |
何时用异常检测?
- 异常样本极少(如 0.1% 甚至更低)
- 异常的类型未知,未来可能出现新型异常
- 只需要识别"是否异常",不需要知道具体是哪类异常
何时用监督学习?
- 正负样本数量都比较充足
- 未来的异常类型与训练集中的类似
- 需要区分具体的异常类别
五、异常检测的挑战
| 挑战 | 说明 |
|---|---|
| 阈值选择 | ε 设得太高会漏报,设得太低会误报 |
| 特征选择 | 需要选择能有效区分正常和异常的特征 |
| 数据质量 | 训练数据中混入异常样本会影响模型 |
| 概念漂移 | 正常的定义随时间变化(如节假日交易模式不同) |
六、一句话总结
"异常检测给正常数据建概率模型,p(x) < ε 就是异常------适合异常极少、类型未知的场景,和无监督学习一脉相承。"
高斯分布
一、高斯分布的定义
高斯分布(正态分布)是异常检测中最基础的概率模型,用于描述单个特征在正常情况下的取值分布。
二、单变量高斯分布
概率密度函数
对于一个特征 x,假设它服从均值为 μ、方差为 σ² 的高斯分布:
p(x) = (1 / √(2πσ²)) · e^(-(x - μ)² / (2σ²))
参数含义
| 参数 | 含义 | 说明 |
|---|---|---|
| μ | 均值 | 数据的中心位置 |
| σ² | 方差 | 数据的离散程度 |
| σ | 标准差 | 方差的平方根,与原始数据同量纲 |
参数估计(从数据中学习)
给定 m 个样本 {x¹, x², ..., xᵐ}:
μ = (1/m) · Σᵢ₌₁ᵐ xⁱ
σ² = (1/m) · Σᵢ₌₁ᵐ (xⁱ - μ)²
注意:这里的分母用 m 而非 m-1(在机器学习中常用 m,在统计学中常用 m-1,差别不大)。
三、高斯分布的形态
μ 的影响(位置参数)
p(x)
↑
│ μ 不同
│ ╱╲ ╱╲
│ ╱ ╲ ╱ ╲
│ ╱ ╲ ╱ ╲
│╱ ╲ ╱ ╲
└──────────────────→ x
μ₁ μ₂
μ 决定曲线的中心位置,μ 越大曲线越靠右。
σ 的影响(尺度参数)
p(x)
↑
│ σ 不同
│ ╱╲
│ ╱ ╲ ╱╲
│╱ ╲ ╱ ╲
│ ╲╱ ╲
└──────────────────→ x
σ 小(瘦高) σ 大(矮胖)
σ 越小曲线越瘦高(数据集中),σ 越大曲线越矮胖(数据分散)。
四、高斯分布的性质
| 性质 | 说明 |
|---|---|
| 对称性 | 关于均值 μ 左右对称 |
| 68-95-99.7 法则 | 约 68% 数据在 μ±σ 内,95% 在 μ±2σ 内,99.7% 在 μ±3σ 内 |
| 峰值在 μ 处 | p(μ) 是最大值,离 μ 越远概率越低 |
| 尾部趋近于 0 | 远离均值时概率密度迅速下降 |
五、用高斯分布做异常检测
对单个特征 xⱼ
- 从训练数据估计 μⱼ 和 σⱼ²
- 对新样本 xⱼ_new,计算 p(xⱼ_new)
- 若 p(xⱼ_new) < ε,则该特征值异常
示例
特征:服务器响应时间(毫秒)
正常范围:μ = 100, σ = 20
p(120) = 正常(在 μ±σ 内)
p(200) = 很低(远离均值,可能异常)
p(50) = 较低(也可能异常,取决于阈值)
六、数据分布非高斯的处理
问题
如果数据分布明显不是高斯分布(如偏态、双峰),直接用高斯分布建模效果不好。
解决方法:数据变换
通过数学变换使数据更接近高斯分布:
| 变换方法 | 公式 | 适用场景 |
|---|---|---|
| 对数变换 | log(x) | 右偏数据(长尾在右边) |
| 平方根变换 | √x | 计数数据 |
| 倒数变换 | 1/x | 比率数据 |
| Box-Cox 变换 | (x^λ - 1)/λ | 通用变换,需调 λ |
示例
原始数据(右偏) 对数变换后(接近高斯)
○ ○
○○ ○○○
○○○○ ○○○○○
○○○○○○ ○○○○○○
└──→ x └──→ log(x)
七、一句话总结
"高斯分布用 μ 定中心、σ² 定宽度,p(x) 远离 μ 就是异常------数据不服从高斯就用对数变换把它掰正。"
异常检测算法
一、异常检测算法的完整流程
输入
- 训练集:m 个 n 维样本
- 每个样本 xⁱ ∈ ℝⁿ,有 n 个特征
输出
- 对新样本 x_new,判断是否异常
二、算法步骤
第一步:选择特征
选择能够反映正常/异常差异的特征 x₁, x₂, ..., xₙ。
第二步:拟合参数
对每个特征 j,估计其高斯分布的参数 μⱼ 和 σⱼ²:
μⱼ = (1/m) · Σᵢ₌₁ᵐ xⱼⁱ
σⱼ² = (1/m) · Σᵢ₌₁ᵐ (xⱼⁱ - μⱼ)²
其中 xⱼⁱ 表示第 i 个样本的第 j 个特征。
第三步:计算新样本的概率
对新样本 x_new,计算它在所有特征上的联合概率:
p(x_new) = Πⱼ₌₁ⁿ p(xⱼ_new ; μⱼ, σⱼ²) = Πⱼ₌₁ⁿ (1 / √(2πσⱼ²)) · e^(-(xⱼ_new - μⱼ)² / (2σⱼ²))
即各个特征概率密度的乘积(假设特征之间相互独立)。
第四步:判断异常
若 p(x_new) < ε,则标记为异常;否则为正常。
三、概率计算示例
假设
- 两个特征:x₁(CPU 负载),x₂(内存使用率)
- 训练集估计得:μ₁=50, σ₁²=100, μ₂=60, σ₂²=64
新样本 x_new = (80, 70)
计算每个特征的概率:
p(x₁=80) = (1 / √(2π·100)) · e^(-(80-50)² / (2·100))
= (1 / √(628.3)) · e^(-900 / 200)
= 0.0399 · e^(-4.5)
= 0.0399 · 0.0111
= 0.00044
p(x₂=70) = (1 / √(2π·64)) · e^(-(70-60)² / (2·64))
= (1 / √(402.1)) · e^(-100 / 128)
= 0.0499 · e^(-0.781)
= 0.0499 · 0.458
= 0.0228
联合概率:
p(x_new) = 0.00044 · 0.0228 = 0.00001
若 ε = 0.001,则 p(x_new) < ε → 标记为异常。
四、密度估计与决策边界
概率密度等高线
ε 等高线内部(p(x) ≥ ε)判定为正常,外部(p(x) < ε)判定为异常。
五、算法特点
| 特点 | 说明 |
|---|---|
| 无监督 | 训练时不需要异常标签 |
| 计算简单 | 只需估计均值和方差 |
| 可扩展 | 适用于高维数据 |
| 可解释 | 可以查看哪个特征导致概率低 |
六、一句话总结
"异常检测三步走:对每个特征估 μ 和 σ²,连乘得联合概率 p(x),低于阈值 ε 就是异常。"
开发和评估异常检测系统
一、用带标签数据评估无监督模型
异常检测本质上是无监督学习,但我们可以利用少量带标签的数据来评估和调优模型。
数据划分
| 数据集 | 用途 | 标签要求 |
|---|---|---|
| 训练集 | 拟合高斯分布的 μ 和 σ² | 全部为正常样本(y=0) |
| 验证集 | 选择阈值 ε 和调优特征 | 包含正常和异常样本(带标签) |
| 测试集 | 评估最终模型性能 | 包含正常和异常样本(带标签) |
数据比例建议
- 训练集:全部为正常样本(通常数量较多)
- 验证集:包含正常样本 + 少量异常样本(如 60% 正常、40% 异常)
- 测试集:包含正常样本 + 少量异常样本(如 60% 正常、40% 异常)
二、评估指标
由于异常检测中正负样本极不平衡(正常样本远多于异常样本),不能用简单的准确率来评估。
混淆矩阵
| 实际\预测 | 预测正常(y=0) | 预测异常(y=1) |
|---|---|---|
| 实际正常(y=0) | TN(真阴性) | FP(假阳性,误报) |
| 实际异常(y=1) | FN(假阴性,漏报) | TP(真阳性) |
常用评估指标
| 指标 | 公式 | 含义 |
|---|---|---|
| 精确率(Precision) | TP / (TP + FP) | 预测为异常的样本中有多少是真的异常 |
| 召回率(Recall) | TP / (TP + FN) | 真正的异常中有多少被成功检出 |
| F₁ 分数 | 2·P·R / (P + R) | 精确率和召回率的调和平均 |
为什么不用准确率?
假设 99% 的样本是正常的,如果模型把所有样本都判为正常,准确率高达 99%,但这个模型毫无用处。F₁ 分数能更好地反映模型对少数类(异常)的检测能力。
三、选择阈值 ε
方法
- 在验证集上计算每个样本的 p(x)
- 尝试一系列 ε 值(如从最小值到最大值之间均匀取 100 个值)
- 对每个 ε,计算验证集上的 F₁ 分数
- 选择使 F₁ 分数最大的 ε
伪代码思路
最佳 ε = None
最佳 F₁ = 0
for ε in 候选列表:
预测结果 = p(x) < ε
计算 F₁ 分数
if F₁ > 最佳 F₁:
更新最佳 F₁ 和最佳 ε
四、特征选择与调优
方法一:观察异常样本的概率
在验证集上,查看被漏检的异常样本(FN)的 p(x) 值。如果它们的 p(x) 仍然较高,说明现有特征不足以区分这些异常。
方法二:通过误差分析选择新特征
分析被误判的样本,思考:
- 这个样本为什么被误判?
- 有什么新特征可以帮助区分它?
常见的新特征思路
| 问题 | 可能的解决方案 |
|---|---|
| CPU 负载高但网络流量低 | 构造特征:CPU / 网络流量 |
| 某特征值异常大 | 取对数变换:log(x) |
| 两个特征组合才有意义 | 构造特征:x₁ · x₂ 或 x₁ / x₂ |
五、完整的开发流程
收集正常数据作为训练集
↓
拟合高斯参数 μ 和 σ²
↓
收集少量带标签数据(正常+异常)
↓
划分验证集和测试集
↓
在验证集上选择 ε 和调优特征
↓
在测试集上评估最终模型
↓
若效果不理想,返回调整特征
六、注意事项
| 要点 | 说明 |
|---|---|
| 训练集只用正常样本 | 异常样本不参与拟合 μ 和 σ² |
| 验证集和测试集包含异常 | 用于评估检测能力和选择阈值 |
| 验证集和测试集要分开 | 避免在测试集上调参导致过拟合 |
| 关注 F₁ 而非准确率 | 不平衡数据下 F₁ 更可靠 |
七、一句话总结
"用正常数据训练,用带标签数据调 ε 和选特征------F₁ 分数评估,验证集选参,测试集终评。"
异常检测 VS 监督学习
一、核心区别
| 对比项 | 异常检测 | 监督学习 |
|---|---|---|
| 数据分布 | 正常样本极多,异常样本极少 | 正负样本数量相对均衡 |
| 异常类型 | 未来可能出现从未见过的新型异常 | 训练集中已包含各类样本 |
| 标签需求 | 训练集不需要标签(全用正常数据) | 需要大量带标签的正负样本 |
| 学习目标 | 学习正常数据的分布 p(x) | 学习区分正负样本的决策边界 |
二、何时用异常检测?
适用场景
- 异常样本极少(如 0.1% 甚至更低)
- 异常的类型未知,未来可能出现新型异常
- 正常数据的模式相对稳定
典型应用
| 应用 | 原因 |
|---|---|
| 欺诈检测 | 欺诈手段不断演变,无法预知所有类型 |
| 工业质检 | 缺陷种类繁多,难以收集所有类型的缺陷样本 |
| 服务器监控 | 异常模式千变万化,无法穷举 |
| 新物种检测 | 需要识别从未见过的物种 |
三、何时用监督学习?
适用场景
- 正负样本数量都比较充足
- 未来的异常类型与训练集中的类似
- 需要区分具体的异常类别
典型应用
| 应用 | 原因 |
|---|---|
| 垃圾邮件分类 | 有大量已标注的垃圾邮件和正常邮件 |
| 疾病诊断 | 有大量确诊患者的病历数据 |
| 手写数字识别 | 各类数字的样本都很充足 |
| 情感分析 | 有大量已标注正面/负面评论 |
四、决策指南
异常样本数量极少? 是 → 异常检测
否 ↓
未来可能出现新型异常? 是 → 异常检测
否 ↓
正负样本数量都充足? 是 → 监督学习
否 ↓
能否轻松收集更多异常样本? 是 → 监督学习
否 → 异常检测
五、两种方法的对比总结
| 维度 | 异常检测 | 监督学习 |
|---|---|---|
| 训练数据 | 大量正常 + 少量异常(可选) | 大量正常 + 大量异常 |
| 对新异常的识别 | ✅ 能识别新型异常 | ❌ 只能识别训练集中出现过的类型 |
| 模型复杂度 | 简单(高斯分布) | 可复杂(神经网络、树模型等) |
| 可解释性 | 好(可追溯哪个特征异常) | 一般(黑盒模型) |
| 调参难度 | 低(主要是 ε 和特征选择) | 高(大量超参数) |
六、一句话总结
"异常极少、类型未知用异常检测;正负充足、类型固定用监督学习------关键看你能不能预知未来会出现什么样的异常。"
异常检测选择要使用的特征
一、特征选择的重要性
异常检测的效果高度依赖于特征的质量。如果选择的特征不能有效区分正常和异常,模型性能会很差。
二、特征应该服从高斯分布
问题
高斯分布假设数据呈钟形曲线分布。如果特征数据明显偏离高斯分布,p(x) 的计算会不准确,导致异常检测效果变差。
如何检查
画出特征的直方图,观察是否大致呈钟形曲线。
修正方法:数据变换
如果特征不服从高斯分布,通过数学变换使其接近高斯分布:
| 变换方法 | 公式 | 适用场景 |
|---|---|---|
| 对数变换 | log(x) | 右偏数据(长尾在右边) |
| 对数变换变体 | log(x + c) | 数据包含 0 或负值时加常数偏移 |
| 平方根变换 | √x | 计数数据 |
| 幂次变换 | x^α(如 α=0.5, 0.25) | 不同程度的偏态数据 |
示例
原始数据右偏严重,取对数后直方图呈现更对称的钟形曲线。
三、通过误差分析选择新特征
基本思路
在验证集上运行模型,找出被漏检的异常样本(假阴性)和被误报的正常样本(假阳性),分析这些样本的特点,构造能够区分它们的新特征。
案例:服务器监控
初始特征
- x₁ = CPU 负载
- x₂ = 网络流量
发现问题
某些异常情况下,CPU 负载很高但网络流量很低(如死循环程序),这种组合模式无法被单独的两个特征捕捉。
构造新特征
- x₃ = CPU 负载 / 网络流量
- x₄ = (CPU 负载)² / 网络流量
新特征能够在 CPU 负载异常高而网络流量正常时产生很大的值,更容易被检测为异常。
另一个案例:计算机集群监控
初始特征
- x₁ = 内存使用量
- x₂ = 磁盘 I/O
构造新特征
- x₃ = 内存使用量 / 磁盘 I/O
- x₄ = (内存使用量)³ / 磁盘 I/O
四、特征选择的通用原则
| 原则 | 说明 |
|---|---|
| 正常数据特征值应集中 | 正常样本在该特征上的取值应比较集中(方差小) |
| 异常数据特征值应偏离 | 异常样本在该特征上的取值应明显偏离正常范围 |
| 组合特征有时更有效 | 单个特征无法捕捉的模式,用比值或乘积构造新特征 |
| 先变换再建模 | 确保每个特征经过变换后接近高斯分布 |
五、特征选择的迭代过程
初始特征集
↓
训练异常检测模型
↓
在验证集上评估
↓
分析误判样本
├── 漏检的异常(FN):这些样本为什么 p(x) 不够低?
└── 误报的正常(FP):这些样本为什么 p(x) 太低?
↓
构造新特征解决上述问题
↓
重新训练并评估
↓
重复直到满意
六、一句话总结
"特征先变高斯再建模,误差分析找漏网之鱼------比值乘积造新特征,迭代直到异常无处遁形。"
多变量高斯分布
一、单变量高斯分布的局限
问题背景
标准异常检测算法假设特征之间相互独立,将各特征的概率密度相乘得到联合概率:
p(x) = Πⱼ₌₁ⁿ p(xⱼ ; μⱼ, σⱼ²)
这个假设在实际中并不总是成立。
典型案例
假设两个特征:
- x₁ = CPU 负载
- x₂ = 内存使用率
正常情况下,CPU 负载和内存使用率存在正相关关系:CPU 高时内存通常也高。
单变量模型的失败场景
x₂ ↑
│ 正常样本分布(斜椭圆)
│ ╭──────╮
│ ╱ ╲
│ ╱ ╲
│╱ ╲
│╲ ╱
│ ╲ ╱
│ ╲ ╱
│ ╰──────╯
│ × 异常点 A(CPU 高,内存低)
│ × 异常点 B(CPU 低,内存高)
└────────────────→ x₁
单变量模型用圆形等高线拟合数据,会把 A 点和 B 点都判为正常(因为它们各自都在单个特征的正常范围内),但实际上这两个点违反了 CPU 和内存之间的正相关关系,应该是异常。
二、多变量高斯分布
概率密度函数
p(x) = (1 / ( (2π)^(n/2) · |Σ|^(1/2) )) · e^( -(1/2) · (x - μ)ᵀ · Σ⁻¹ · (x - μ) )
参数含义
| 参数 | 维度 | 含义 |
|---|---|---|
| μ | n×1 向量 | 每个特征的均值 |
| Σ | n×n 矩阵 | 协方差矩阵,描述特征间的相关性 |
参数估计
μ = (1/m) · Σᵢ₌₁ᵐ xⁱ
Σ = (1/m) · Σᵢ₌₁ᵐ (xⁱ - μ) · (xⁱ - μ)ᵀ
协方差矩阵 Σ 的作用
- 对角线元素 Σⱼⱼ:特征 xⱼ 的方差
- 非对角线元素 Σᵢⱼ:特征 xᵢ 和 xⱼ 的协方差(相关性)
三、多变量 vs 单变量的对比
| 对比项 | 单变量高斯 | 多变量高斯 |
|---|---|---|
| 特征独立性假设 | 假设特征独立 | 自动捕捉特征间相关性 |
| 决策边界形状 | 圆形/球形等高线 | 椭球等高线(可旋转) |
| 计算复杂度 | O(n) | O(n²) |
| 所需样本量 | 少 | 多(需 m > n,否则 Σ 不可逆) |
四、多变量高斯分布的三种特殊情况
情况一:Σ 是对角矩阵且对角线相等
p(x) 的等高线是圆形,等价于单变量高斯分布(各特征方差相同且独立)。
情况二:Σ 是对角矩阵但对角线不等
p(x) 的等高线是轴对齐的椭圆,等价于标准异常检测算法(各特征方差不同但独立)。
情况三:Σ 是非对角矩阵
p(x) 的等高线是旋转的椭圆,这是多变量高斯分布独有的能力。
五、多变量高斯分布的局限性
| 局限 | 说明 |
|---|---|
| 样本量要求 | 必须满足 m > n,否则 Σ 不可逆 |
| 计算成本高 | 需要计算 n×n 矩阵的逆,O(n³) |
| 特征冗余敏感 | 若有完全相关的特征,Σ 会奇异(不可逆) |
实际建议
- 当 m >> n 且特征间有明显相关性时,优先使用多变量高斯分布
- 当 m 较小或 n 较大时,使用标准异常检测算法(单变量高斯乘积)
六、多变量高斯分布与标准算法的关系
标准异常检测算法是多变量高斯分布的一个特例:当 Σ 限制为对角矩阵时,两者等价。
多变量高斯分布允许 Σ 为非对角矩阵,因此能够自动捕捉特征间的相关性,无需手动构造组合特征。
七、一句话总结
"多变量高斯用协方差矩阵 Σ 自动捕捉特征相关性,等高线从圆变成斜椭圆------样本够多就用它,样本太少还是老老实实做特征工程。"
使用多变量高斯分布的异常检测
一、多变量高斯分布的应用流程
与传统异常检测算法的对比
| 步骤 | 传统算法(单变量乘积) | 多变量高斯分布 |
|---|---|---|
| 参数估计 | 分别估计每个特征的 μⱼ 和 σⱼ² | 估计整个 μ 向量和 Σ 矩阵 |
| 概率计算 | 各特征概率密度相乘 | 直接用多变量高斯公式计算 |
| 相关性处理 | 需手动构造组合特征 | 自动捕捉特征间相关性 |
二、算法步骤
第一步:拟合参数
给定训练集 {x¹, x², ..., xᵐ},其中 xⁱ ∈ ℝⁿ:
μ = (1/m) · Σᵢ₌₁ᵐ xⁱ
Σ = (1/m) · Σᵢ₌₁ᵐ (xⁱ - μ) · (xⁱ - μ)ᵀ
第二步:计算新样本的概率
p(x) = (1 / ((2π)^(n/2) · |Σ|^(1/2))) · e^(-(1/2) · (x - μ)ᵀ · Σ⁻¹ · (x - μ))
第三步:判断异常
若 p(x) < ε,则标记为异常;否则为正常。
三、与传统算法的关系
等价条件
当 Σ 为对角矩阵时,多变量高斯分布退化为传统算法:
Σ =
⎡ σ₁² 0 ... 0 ⎤
⎢ 0 σ₂² ... 0 ⎥
⎢ ⋮ ⋮ ⋱ ⋮ ⎥
⎣ 0 0 ... σₙ²⎦
此时:
p(x) = Πⱼ₌₁ⁿ (1 / √(2πσⱼ²)) · e^(-(xⱼ - μⱼ)² / (2σⱼ²))
关键区别
| 方面 | 传统算法 | 多变量高斯 |
|---|---|---|
| Σ 的形式 | 对角矩阵(手动限制) | 任意半正定矩阵(自动学习) |
| 特征相关性 | 假设独立 | 自动建模 |
| 手动构造特征 | 需要(如比值特征) | 不需要(自动捕捉) |
四、多变量高斯分布的优缺点
优点
| 优点 | 说明 |
|---|---|
| 自动捕捉相关性 | 无需手动构造 x₃ = x₁/x₂ 这类组合特征 |
| 计算简便 | 一步到位,不需要逐个特征建模 |
| 决策边界灵活 | 可旋转的椭球等高线,适配各种数据分布 |
缺点
| 缺点 | 说明 |
|---|---|
| 样本量要求高 | 必须满足 m > n,否则 Σ 不可逆 |
| 计算成本高 | 需计算 n×n 矩阵的逆,O(n³) |
| 冗余特征敏感 | 若有完全相关的特征,Σ 奇异 |
五、何时选择多变量高斯分布
推荐使用多变量高斯
- m ≥ 10n(样本量远大于特征数)
- 特征间存在明显的相关性
- 不想手动构造组合特征
推荐使用传统算法
- m 较小(甚至 m < n)
- 特征间相关性弱或已知独立
- 需要更好的可解释性(可追溯哪个特征异常)
六、矩阵 Σ 的可逆性问题
不可逆的原因
- m < n:样本量少于特征数,Σ 秩不足
- 存在冗余特征:某特征是其他特征的线性组合
解决方法
| 问题 | 解决方案 |
|---|---|
| m < n | 改用传统算法,或收集更多数据 |
| 冗余特征 | 删除完全相关的特征(如同时包含摄氏度和华氏度) |
七、一句话总结
"多变量高斯自动学相关性,省去手动造特征的麻烦------但样本要多于特征数,否则 Σ 不可逆就玩不转了。"
推荐系统问题规划
一、什么是推荐系统
推荐系统是机器学习的一个重要应用,用于根据用户的历史行为预测用户对未接触物品的偏好,并向用户推荐他们可能喜欢的物品。
典型应用
| 平台 | 推荐内容 | 推荐依据 |
|---|---|---|
| 电影/视频平台 | 电影、电视剧 | 历史观看记录、评分 |
| 电商平台 | 商品 | 购买历史、浏览记录 |
| 音乐平台 | 歌曲、歌单 | 播放历史、收藏 |
| 新闻平台 | 新闻文章 | 阅读历史、点击行为 |
二、推荐系统的符号约定
基本符号
| 符号 | 含义 | 说明 |
|---|---|---|
| nᵤ | 用户数量 | 系统中注册的用户总数 |
| nₘ | 物品数量 | 系统中可推荐的物品总数 |
| r(i,j) | 用户 j 是否对物品 i 评过分 | 1 表示已评分,0 表示未评分 |
| y(i,j) | 用户 j 对物品 i 的评分 | 仅当 r(i,j)=1 时有定义 |
示例:电影评分矩阵
用户1 用户2 用户3 用户4 用户5
电影A 5 ? 4 ? ?
电影B ? 3 ? ? 2
电影C ? ? ? 4 ?
电影D 4 ? ? ? 5
电影E ? 2 ? ? ?
- 问号表示该用户未对该电影评分
- 目标是预测这些问号处的评分
三、推荐系统的两种主要思路
思路一:基于内容的推荐
- 需要知道物品的特征(如电影的题材、主演、年份)
- 根据用户已评分物品的特征,学习用户的偏好
- 适用于物品特征容易获取的场景
思路二:协同过滤
- 不需要物品的任何特征信息
- 仅依赖用户对物品的评分数据
- 利用"相似用户喜欢相似物品"的规律进行推荐
四、推荐系统的价值
| 价值 | 说明 |
|---|---|
| 提升用户体验 | 帮助用户快速找到感兴趣的内容 |
| 增加平台收入 | 精准推荐提高转化率和用户粘性 |
| 挖掘长尾内容 | 让冷门但有价值的物品被发现 |
| 个性化服务 | 每个用户看到不同的推荐结果 |
五、推荐系统面临的挑战
| 挑战 | 说明 |
|---|---|
| 冷启动问题 | 新用户或新物品没有历史数据 |
| 稀疏性问题 | 评分矩阵非常稀疏(大部分条目为空) |
| 可扩展性 | 用户和物品数量巨大时需要高效算法 |
| 多样性 | 不能只推荐同类内容,需保持多样性 |
六、一句话总结
"推荐系统用历史评分预测未评分项,帮用户发现感兴趣的东西------符号约定 r(i,j) 表示有无评分,y(i,j) 表示具体分值。"
基于内容的推荐算法
一、问题设定
符号约定
| 符号 | 含义 | 说明 |
|---|---|---|
| nᵤ | 用户数量 | 系统中的用户总数 |
| nₘ | 物品数量 | 系统中的物品总数 |
| r(i,j) | 用户 j 是否对物品 i 评过分 | 1 表示已评分,0 表示未评分 |
| y(i,j) | 用户 j 对物品 i 的评分 | 仅当 r(i,j)=1 时有定义 |
| xⁱ | 物品 i 的特征向量 | 包含物品的已知属性 |
| θʲ | 用户 j 的参数向量 | 表示用户的偏好 |
特征向量 xⁱ 的构建
对于每个物品 i,构造一个特征向量 xⁱ ∈ ℝⁿ⁺¹(包含偏置项 x₀=1):
xⁱ =
⎡ x₀ ⎤ ⎡ 1 ⎤
⎢ x₁ ⎥ ⎢ 浪漫程度 ⎥
⎢ x₂ ⎥ = ⎢ 动作程度 ⎥
⎢ ⋮ ⎥ ⎢ ⋮ ⎥
⎣ xₙ ⎦ ⎣ 其他特征 ⎦
二、预测函数
用户 j 对物品 i 的预测评分
h_θʲ(xⁱ) = (θʲ)ᵀ · xⁱ = Σₖ₌₀ⁿ θₖʲ · xₖⁱ
其中:
- θʲ ∈ ℝⁿ⁺¹:用户 j 的参数向量
- xⁱ ∈ ℝⁿ⁺¹:物品 i 的特征向量
- h_θʲ(xⁱ):预测的用户 j 对物品 i 的评分
三、优化目标
单个用户的代价函数
对于用户 j,仅考虑其已评分的物品集合(r(i,j)=1 的那些物品):
min_θʲ (1/2) · Σᵢ:ᵣ₍ᵢ,ⱼ₎₌₁ ( (θʲ)ᵀ · xⁱ - y(i,j) )² + (λ/2) · Σₖ₌₁ⁿ (θₖʲ)²
其中:
- 第一项:预测评分与实际评分的平方误差
- 第二项:正则化项(不惩罚 θ₀)
- λ:正则化参数
所有用户的整体代价函数
对所有用户求和:
min_θ¹,θ²,...,θⁿᵤ (1/2) · Σⱼ₌₁ⁿᵤ Σᵢ:ᵣ₍ᵢ,ⱼ₎₌₁ ( (θʲ)ᵀ · xⁱ - y(i,j) )² + (λ/2) · Σⱼ₌₁ⁿᵤ Σₖ₌₁ⁿ (θₖʲ)²
四、参数学习
梯度下降更新规则
对每个用户 j 和每个参数 θₖʲ:
θₖʲ := θₖʲ - α · ∂J(θ)/∂θₖʲ
偏导数计算
当 k = 0 时(不正则化):
∂J/∂θ₀ʲ = Σᵢ:ᵣ₍ᵢ,ⱼ₎₌₁ ( (θʲ)ᵀ · xⁱ - y(i,j) ) · x₀ⁱ
当 k ≠ 0 时(加正则化):
∂J/∂θₖʲ = Σᵢ:ᵣ₍ᵢ,ⱼ₎₌₁ ( (θʲ)ᵀ · xⁱ - y(i,j) ) · xₖⁱ + λ · θₖʲ
更新公式
θₖʲ := θₖʲ - α · Σᵢ:ᵣ₍ᵢ,ⱼ₎₌₁ ( (θʲ)ᵀ · xⁱ - y(i,j) ) · xₖⁱ + (λ · θₖʲ 当 k≠0 时)
五、完整算法流程
训练阶段
- 为每个物品构造特征向量 xⁱ(人工设计特征)
- 收集用户已给出的评分数据 r(i,j) 和 y(i,j)
- 对每个用户 j,用梯度下降或其他优化算法求解最优 θʲ
- 得到所有用户的偏好参数
预测阶段
- 对用户 j 未评分的物品 i(r(i,j)=0)
- 计算预测评分:(θʲ)ᵀ · xⁱ
- 按预测评分排序,推荐 Top-K 个物品
六、算法特点
| 特点 | 说明 |
|---|---|
| 需要物品特征 | 必须预先知道每个物品的属性 |
| 用户独立训练 | 每个用户的 θ 独立优化,互不影响 |
| 可解释性强 | 知道用户偏好哪些特征(如喜欢浪漫片) |
| 新物品友好 | 新物品只要有特征就能立即推荐 |
| 新用户冷启动 | 新用户没有评分,无法学习 θ |
七、与线性回归的关系
基于内容的推荐算法本质上是对每个用户分别做带正则化的线性回归:
- 特征:物品的特征向量 xⁱ
- 标签:用户对物品的评分 y(i,j)
- 训练样本:该用户已评分的物品
- 预测:对未评分物品的评分
八、局限性
| 局限 | 说明 |
|---|---|
| 特征工程负担重 | 需要人工设计和提取物品特征 |
| 特征不完备 | 无法穷尽影响用户偏好的所有因素 |
| 推荐范围窄 | 只会推荐与历史偏好相似的内容 |
| 无法利用群体智慧 | 不考虑其他用户的评分信息 |
九、一句话总结
"基于内容的推荐就是对每个用户单独做线性回归------用物品特征 x 预测评分 y,学出用户的偏好参数 θ,然后推没看过的。"
协同过滤
一、问题动机
基于内容推荐的局限
基于内容的推荐需要人工设计物品的特征向量 xⁱ,这在实际中往往很困难:
- 不知道应该用哪些特征来描述物品
- 特征工程耗时耗力
- 可能遗漏重要的隐性特征
协同过滤的核心思想
不需要知道物品的特征,仅依靠用户对物品的评分数据,就能自动学习出物品的特征和用户的偏好。
二、问题反转
已知用户参数求物品特征
如果我们已经知道了用户的偏好参数 θ¹, θ², ..., θⁿᵤ,就可以反过来推断物品的特征:
对于物品 i,我们希望它的特征 xⁱ 使得所有已评分用户的预测评分 (θʲ)ᵀ · xⁱ 尽可能接近实际评分 y(i,j)。
优化目标(求物品特征)
min_xⁱ (1/2) · Σⱼ:ᵣ₍ᵢ,ⱼ₎₌₁ ( (θʲ)ᵀ · xⁱ - y(i,j) )² + (λ/2) · Σₖ₌₁ⁿ (xₖⁱ)²
对所有物品求和:
min_x¹,x²,...,xⁿᵐ (1/2) · Σᵢ₌₁ⁿᵐ Σⱼ:ᵣ₍ᵢ,ⱼ₎₌₁ ( (θʲ)ᵀ · xⁱ - y(i,j) )² + (λ/2) · Σᵢ₌₁ⁿᵐ Σₖ₌₁ⁿ (xₖⁱ)²
三、协同过滤的迭代过程
鸡生蛋蛋生鸡的问题
- 如果有物品特征 x,可以学用户参数 θ
- 如果有用户参数 θ,可以学物品特征 x
- 但两者一开始都没有
解决方案:交替迭代
- 随机初始化 θ¹, θ², ..., θⁿᵤ
- 用当前的 θ 求最优的 x
- 用当前的 x 求最优的 θ
- 重复步骤 2-3 直到收敛
这个过程会逐步收敛到一组合理的 x 和 θ。
四、协同过滤的完整优化目标
同时优化 x 和 θ
实际上不需要交替迭代,可以直接将两个优化目标合并为一个,同时对 x 和 θ 求最小化:
J(x¹,...,xⁿᵐ, θ¹,...,θⁿᵤ) = (1/2) · Σᵢ:ᵣ₍ᵢ,ⱼ₎₌₁ ( (θʲ)ᵀ · xⁱ - y(i,j) )² + (λ/2) · Σᵢ₌₁ⁿᵐ Σₖ₌₁ⁿ (xₖⁱ)² + (λ/2) · Σⱼ₌₁ⁿᵤ Σₖ₌₁ⁿ (θₖʲ)²
关键特点
| 特点 | 说明 |
|---|---|
| 同时优化 | 不需要交替迭代,一次性求解所有参数 |
| 无偏置项 | 与基于内容推荐不同,这里 x₀ 和 θ₀ 不再特殊处理 |
| 共享特征 | 所有物品共享相同的特征维度,所有用户共享相同的参数维度 |
五、梯度下降更新规则
对 xₖⁱ 的偏导数
∂J/∂xₖⁱ = Σⱼ:ᵣ₍ᵢ,ⱼ₎₌₁ ( (θʲ)ᵀ · xⁱ - y(i,j) ) · θₖʲ + λ · xₖⁱ
对 θₖʲ 的偏导数
∂J/∂θₖʲ = Σᵢ:ᵣ₍ᵢ,ⱼ₎₌₁ ( (θʲ)ᵀ · xⁱ - y(i,j) ) · xₖⁱ + λ · θₖʲ
更新公式
xₖⁱ := xₖⁱ - α · ∂J/∂xₖⁱ
θₖʲ := θₖʲ - α · ∂J/∂θₖʲ
六、完整算法流程
训练阶段
- 随机初始化 x¹, x², ..., xⁿᵐ 和 θ¹, θ², ..., θⁿᵤ(较小的随机值)
- 用梯度下降(或其他优化算法)最小化 J
- 得到所有物品的特征向量和所有用户的偏好参数
预测阶段
- 对用户 j 未评分的物品 i
- 计算预测评分:(θʲ)ᵀ · xⁱ
- 按预测评分排序,推荐 Top-K 个物品
七、算法特点
| 特点 | 说明 |
|---|---|
| 无需特征工程 | 不需要人工设计物品特征 |
| 自动学习特征 | 算法自行发现最能解释评分数据的特征 |
| 捕捉隐性特征 | 能学到难以描述的隐性特征(如"文艺范"、"烧脑") |
| 利用群体智慧 | 所有用户的评分共同贡献于特征学习 |
八、与基于内容推荐的对比
| 对比项 | 基于内容推荐 | 协同过滤 |
|---|---|---|
| 物品特征来源 | 人工设计 | 自动学习 |
| 用户参数学习 | 独立对每个用户 | 所有用户联合学习 |
| 特征可解释性 | 强(已知特征含义) | 弱(特征含义未知) |
| 冷启动问题 | 新物品可推荐 | 新物品无法推荐 |
| 数据需求 | 需要物品属性 | 只需评分矩阵 |
九、一句话总结
"协同过滤不需要任何物品特征,让算法自己从评分矩阵中同时学出物品的特征 x 和用户的偏好 θ------用群体的智慧填补特征的空白。"
协同过滤算法
一、算法概述
协同过滤算法通过同时优化物品特征和用户偏好,从评分矩阵中自动学习出两者,无需任何人工特征工程。
二、符号约定
| 符号 | 含义 | 维度 |
|---|---|---|
| nᵤ | 用户数量 | 标量 |
| nₘ | 物品数量 | 标量 |
| n | 特征数量 | 标量 |
| r(i,j) | 用户 j 是否对物品 i 评过分 | 0 或 1 |
| y(i,j) | 用户 j 对物品 i 的评分 | 实数 |
| xⁱ | 物品 i 的特征向量 | ℝⁿ |
| θʲ | 用户 j 的参数向量 | ℝⁿ |
三、优化目标
代价函数
J(x¹,...,xⁿᵐ, θ¹,...,θⁿᵤ) = (1/2) · Σᵢ:ᵣ₍ᵢ,ⱼ₎₌₁ ( (θʲ)ᵀ · xⁱ - y(i,j) )² + (λ/2) · Σᵢ₌₁ⁿᵐ Σₖ₌₁ⁿ (xₖⁱ)² + (λ/2) · Σⱼ₌₁ⁿᵤ Σₖ₌₁ⁿ (θₖʲ)²
三项的含义
| 项 | 含义 |
|---|---|
| (1/2) · Σᵢ,ⱼ:ᵣ₍ᵢ,ⱼ₎₌₁ ( (θʲ)ᵀ · xⁱ - y(i,j) )² | 所有已评分项的预测误差平方和 |
| (λ/2) · Σᵢ₌₁ⁿᵐ Σₖ₌₁ⁿ (xₖⁱ)² | 物品特征的正则化 |
| (λ/2) · Σⱼ₌₁ⁿᵤ Σₖ₌₁ⁿ (θₖʲ)² | 用户参数的正则化 |
与基于内容推荐的区别
- 基于内容推荐:只优化 θ,x 固定不变
- 协同过滤:同时优化 x 和 θ,两者都不固定
- 协同过滤中 x₀ 和 θ₀ 没有特殊处理(不加偏置项)
四、梯度下降更新规则
对 xₖⁱ 的偏导数
∂J/∂xₖⁱ = Σⱼ:ᵣ₍ᵢ,ⱼ₎₌₁ ( (θʲ)ᵀ · xⁱ - y(i,j) ) · θₖʲ + λ · xₖⁱ
对 θₖʲ 的偏导数
∂J/∂θₖʲ = Σᵢ:ᵣ₍ᵢ,ⱼ₎₌₁ ( (θʲ)ᵀ · xⁱ - y(i,j) ) · xₖⁱ + λ · θₖʲ
更新公式
xₖⁱ := xₖⁱ - α · ∂J/∂xₖⁱ
θₖʲ := θₖʲ - α · ∂J/∂θₖʲ
五、完整算法流程
第一步:初始化
将 x¹, x², ..., xⁿᵐ 和 θ¹, θ², ..., θⁿᵤ 初始化为较小的随机值(如 ±0.1 之间的随机数)。
第二步:优化
用梯度下降或其他高级优化算法(如 L-BFGS、共轭梯度法)最小化代价函数 J。
第三步:预测
对用户 j 和物品 i,预测评分为:
(θʲ)ᵀ · xⁱ
第四步:推荐
对每个用户 j,在所有未评分的物品中,选取预测评分最高的 K 个物品进行推荐。
六、向量化实现
构建矩阵
- X:nₘ × n 矩阵,第 i 行为 xⁱ
- Θ:nᵤ × n 矩阵,第 j 行为 θʲ
预测评分矩阵
预测评分矩阵 = X · Θᵀ
维度:(nₘ × n) · (n × nᵤ) = nₘ × nᵤ
向量化更新
- 对物品特征:X := X - α · ( (X · Θᵀ - Y) · Θ + λ · X )
- 对用户参数:Θ := Θ - α · ( (X · Θᵀ - Y)ᵀ · X + λ · Θ )
其中 Y 是评分矩阵,未评分位置补 0 并在计算时通过 r(i,j) 屏蔽。
七、算法特点
| 特点 | 说明 |
|---|---|
| 无需特征工程 | 不需要人工设计物品特征 |
| 自动学习隐含特征 | 算法自行发现最能解释评分数据的特征维度 |
| 所有用户联合学习 | 所有用户的评分共同贡献于特征学习 |
| 对称性 | x 和 θ 的角色完全对称,可以互换 |
八、与基于内容推荐的对比
| 对比项 | 基于内容推荐 | 协同过滤 |
|---|---|---|
| 物品特征 x | 已知,固定 | 未知,需学习 |
| 用户参数 θ | 需学习 | 需学习 |
| 优化变量 | 仅 θ | x 和 θ |
| 偏置项 x₀ | 有(恒为 1) | 无 |
| 训练方式 | 每个用户独立 | 所有用户联合 |
九、注意事项
| 要点 | 说明 |
|---|---|
| 初始化 | 随机初始化,不能全零(否则梯度为零无法更新) |
| 特征数量 n | 超参数,需通过验证集调节 |
| 正则化参数 λ | 控制过拟合,也需调参 |
| 均值归一化 | 后续章节会介绍,有助于处理未评分用户 |
十、一句话总结
"协同过滤同时学 x 和 θ,用梯度下降最小化预测误差------不需要任何特征工程,评分矩阵本身就是全部教材。"
矢量化:低秩矩阵分解
一、从协同过滤到矩阵分解
预测评分矩阵
协同过滤的预测评分可以表示为矩阵乘法:
预测评分矩阵 = X · Θᵀ
其中:
- X:nₘ × n 矩阵,第 i 行是物品 i 的特征向量 xⁱ
- Θ:nᵤ × n 矩阵,第 j 行是用户 j 的参数向量 θʲ
维度分析
X · Θᵀ = (nₘ × n) · (n × nᵤ) = nₘ × nᵤ
结果矩阵的 (i,j) 元素即为用户 j 对物品 i 的预测评分 (θʲ)ᵀ · xⁱ。
二、低秩矩阵分解的含义
秩的概念
- 原始评分矩阵 Y 通常是稀疏的(大部分元素未知)
- 预测评分矩阵 X · Θᵀ 是一个稠密矩阵
- 如果特征数量 n 远小于用户数 nᵤ 和物品数 nₘ,则 X · Θᵀ 是一个低秩矩阵
低秩的意义
| 含义 | 说明 |
|---|---|
| 信息压缩 | 用 n 个隐含特征概括用户偏好和物品属性 |
| 去噪 | 丢弃评分数据中的噪声,保留主要模式 |
| 泛化 | 通过学习隐含特征,预测未评分的条目 |
三、矩阵分解的另一种视角
将协同过滤看作矩阵分解
协同过滤的优化目标可以重写为:
min_X,Θ (1/2) · Σᵢ,ⱼ:ᵣ₍ᵢ,ⱼ₎₌₁ ( (X · Θᵀ)ᵢⱼ - Yᵢⱼ )² + (λ/2) · ( ‖X‖_F² + ‖Θ‖_F² )
其中 ‖·‖_F 表示 Frobenius 范数(矩阵所有元素平方和的平方根)。
与 SVD 的关系
- SVD 也是矩阵分解的一种形式:Y ≈ U · S · Vᵀ
- 协同过滤的 X · Θᵀ 相当于 SVD 中的 U · S 和 V 的某种组合
- 区别在于:SVD 需要矩阵完全已知,协同过滤处理的是稀疏矩阵
四、基于矩阵分解的物品查找
寻找相似物品
一旦学到了物品特征矩阵 X,就可以用它来计算物品之间的相似度。
物品 i 和物品 k 的相似度
用特征向量的距离衡量:
d(i,k) = ‖xⁱ - xᵏ‖²
距离越小,物品越相似。
推荐相似物品
当用户喜欢物品 i 时,可以推荐与 i 最相似的几个物品:
用户喜欢物品 i
↓
在物品库中找到 ‖xⁱ - xᵏ‖² 最小的 k 个物品
↓
推荐这些相似物品
五、向量化实现的优势
| 优势 | 说明 |
|---|---|
| 计算效率高 | 矩阵运算比循环快得多(可利用 GPU 加速) |
| 代码简洁 | 一行矩阵乘法代替多层循环 |
| 便于实现 | 可直接调用现成的矩阵运算库 |
六、矩阵分解的几何解释
隐含特征空间
- n 个特征构成一个 n 维空间
- 每个物品 xⁱ 是该空间中的一个点
- 每个用户 θʲ 是该空间中的一个方向(偏好方向)
评分预测的几何意义
(θʲ)ᵀ · xⁱ 表示物品 xⁱ 在用户偏好方向 θʲ 上的投影长度:
- 投影越长 → 用户越喜欢该物品
- 投影越短 → 用户越不喜欢该物品
七、与 PCA 的联系
| 对比项 | PCA | 协同过滤矩阵分解 |
|---|---|---|
| 输入 | 数据矩阵(稠密) | 评分矩阵(稀疏) |
| 分解形式 | U · S · Vᵀ | X · Θᵀ |
| 目标 | 最大化方差保留 | 最小化预测误差 |
| 特征含义 | 主成分方向 | 隐含偏好/属性 |
两者都是低秩近似,但目标和约束不同。
八、算法名称的由来
"低秩矩阵分解"这个名字来源于:
- 低秩:预测评分矩阵 X · Θᵀ 的秩不超过 n,远小于 min(nₘ, nᵤ)
- 矩阵分解:将稀疏的评分矩阵分解为两个低维稠密矩阵的乘积
九、一句话总结
"协同过滤的向量化就是 X · Θᵀ 的低秩矩阵分解------用 n 个隐含特征压缩整个评分矩阵,还能顺便算物品相似度来做推荐。"
推荐算法实施细节:均值规范化
一、问题的提出
场景:新用户或评分极少的用户
假设系统中有一个新用户 Eve,她没有对任何电影评过分:
用户1 用户2 用户3 用户4 Eve
电影A 5 5 0 0 ?
电影B 5 ? ? 0 ?
电影C ? 4 0 ? ?
电影D 0 ? 5 4 ?
电影E 0 0 5 ? ?
协同过滤对新用户 Eve 的预测
对于 Eve,她的参数 θ 通过优化得到:
J(θ) = (1/2) · Σᵢ:ᵣ₍ᵢ,ⱼ₎₌₁ ( (θʲ)ᵀ · xⁱ - y(i,j) )² + (λ/2) · Σₖ (θₖʲ)²
由于 Eve 没有任何评分,第一项求和为空,只剩下正则化项:
J(θ) = (λ/2) · Σₖ (θₖʲ)²
最小化这个代价函数得到 θ = 0, 0, ..., 0ᵀ。
于是 Eve 对所有电影的预测评分均为 0,无法做出任何有意义的推荐。
二、均值规范化的解决方案
第一步:计算每个物品的平均评分
对每个物品 i,计算所有已评分用户的平均分 μᵢ:
μᵢ = ( Σⱼ:ᵣ₍ᵢ,ⱼ₎₌₁ y(i,j) ) / ( 评过分的用户数量 )
第二步:构建规范化评分矩阵
从原始评分中减去对应物品的均值:
Y_norm(i,j) = y(i,j) - μᵢ
- 已评分的条目变为:原始评分减去均值
- 未评分的条目保持为 ?
第三步:对规范化评分做协同过滤
用 Y_norm 替代原始 Y 训练协同过滤,学习 xⁱ 和 θʲ。
第四步:预测评分时加回均值
用户 j 对物品 i 的预测评分为:
pred(i,j) = (θʲ)ᵀ · xⁱ + μᵢ
三、对新用户 Eve 的预测
经过均值规范化后:
- Eve 的参数 θ 仍然为 0, 0, ..., 0ᵀ(因为她没有评分)
- 但预测公式变为:pred(i,Eve) = (θᴱᵛᴱ)ᵀ · xⁱ + μᵢ = 0 + μᵢ = μᵢ
Eve 的预测评分等于每个物品的平均分,即给她推荐大众平均口碑最好的电影,这是一个合理的默认推荐策略。
四、均值规范化的效果
规范化前
用户1 用户2 用户3 用户4 Eve
电影A 5 5 0 0 ? → 预测 0
电影B 5 ? ? 0 ? → 预测 0
电影C ? 4 0 ? ? → 预测 0
规范化后
先计算每个电影的均值:
μ_A = (5+5+0+0)/4 = 2.5
μ_B = (5+0)/2 = 2.5
μ_C = (4+0)/2 = 2.0
...
Eve 的预测评分:
pred(A,Eve) = 0 + 2.5 = 2.5
pred(B,Eve) = 0 + 2.5 = 2.5
pred(C,Eve) = 0 + 2.0 = 2.0
...
Eve 获得了一个合理的默认推荐排序。
五、均值规范化的数学形式
修改后的代价函数
J(x¹,...,xⁿᵐ, θ¹,...,θⁿᵤ) = (1/2) · Σᵢ:ᵣ₍ᵢ,ⱼ₎₌₁ ( (θʲ)ᵀ · xⁱ + μᵢ - y(i,j) )² + (λ/2) · Σᵢ Σₖ (xₖⁱ)² + (λ/2) · Σⱼ Σₖ (θₖʲ)²
预测公式
pred(i,j) = (θʲ)ᵀ · xⁱ + μᵢ
六、均值规范化的变体
按用户均值规范化
也可以对每个用户减去其平均评分,处理物品冷启动问题:
Y_norm(i,j) = y(i,j) - μⱼ
同时按物品和用户均值规范化
减去物品均值后再减用户均值,或者使用更复杂的全局偏置项。
七、注意事项
| 要点 | 说明 |
|---|---|
| 均值来自训练集 | μᵢ 只在训练集上计算,应用到验证/测试集 |
| 新物品处理 | 新物品没有评分,μᵢ 无法计算,仍需其他冷启动策略 |
| 评分尺度差异 | 均值规范化消除了不同物品的评分基准差异 |
| 不影响已有用户 | 对有评分的用户,加回均值只是平移预测值 |
八、一句话总结
"均值规范化让新用户也能获得合理推荐------先减均值消除物品偏差,学完参数再加回来,新用户自动拿到大众平均分作为默认推荐。"
学习大数据集
一、大数据的价值
核心观点
在机器学习中,使用更多的数据往往比使用更复杂的算法更有效。给定足够多的数据,即使是相对简单的算法也能取得很好的表现。
经验规律
模型性能
↑
│ ● 大数据 + 简单算法
│ ●
│ ●
│ ●
│ ●
│ ●
│● 小数据 + 复杂算法
└────────────────────→ 训练数据量
随着数据量增大,模型性能持续提升,且简单算法在大数据下往往能超越小数据下的复杂算法。
二、大数据带来的挑战
计算瓶颈
| 方面 | 问题 |
|---|---|
| 训练时间 | 数据量翻倍,训练时间可能翻倍甚至更多 |
| 内存占用 | 数据集可能无法全部载入内存 |
| 迭代速度 | 每次梯度下降需要遍历全部样本,耗时巨大 |
举例
- 100 万样本的线性回归:几分钟
- 1 亿样本的线性回归:可能需要几天
- 10 亿样本的神经网络:可能需要数周
三、大数据场景下的策略
策略一:随机梯度下降
传统的批量梯度下降每次迭代都要遍历全部样本,在大数据下不可行。随机梯度下降每次只用一个样本更新参数,大大加快了迭代速度。
策略二:Mini-batch 梯度下降
介于批量梯度下降和随机梯度下降之间,每次用一小批样本(如 100-1000 个)更新参数,兼顾效率和稳定性。
策略三:Map-Reduce / 分布式计算
将数据分片到多台机器上并行处理,汇总结果后再更新参数。
四、先从小数据开始
重要建议
在投入大量资源搭建大数据系统之前,先用小规模数据验证可行性:
收集少量数据(如 1000 个样本)
↓
训练模型并评估
↓
绘制学习曲线
↓
判断是否需要更多数据
├── 模型欠拟合(高偏差)→ 增加特征/复杂模型,而非单纯加数据
└── 模型过拟合(高方差)→ 增加数据会有帮助
五、什么时候增加数据有用
| 模型状态 | 表现 | 增加数据的效果 |
|---|---|---|
| 高偏差(欠拟合) | 训练误差高,测试误差高 | 帮助不大,应改进模型 |
| 高方差(过拟合) | 训练误差低,测试误差高 | 很有帮助 |
| 两者皆可 | 训练误差和测试误差都低 | 数据已足够 |
六、大数据场景下的实用技巧
| 技巧 | 说明 |
|---|---|
| 增量学习 | 模型可以随时接收新数据继续训练 |
| 特征简化 | 减少特征维度降低计算量 |
| 硬件加速 | 使用 GPU、分布式集群 |
| 采样策略 | 先用子集调试,确认有效再上全量 |
| 在线学习 | 流式处理数据,边收数据边更新模型 |
七、一句话总结
"大数据虽好,但别盲目堆数据------先画学习曲线看是高偏差还是高方差,前者改模型后者才加数据。"
随机梯度下降
一、批量梯度下降在大数据下的问题
批量梯度下降回顾
θⱼ := θⱼ - α · (1/m) · Σᵢ₌₁ᵐ (h_θ(xⁱ) - yⁱ) · xⱼⁱ
每次迭代需要遍历全部 m 个样本才能更新一次参数。
大数据下的困境
| 问题 | 说明 |
|---|---|
| 计算量大 | m 很大时,每次迭代耗时极长 |
| 收敛缓慢 | 参数更新次数受限于遍历速度 |
| 冗余计算 | 样本之间有大量重复信息,每次全量计算浪费资源 |
二、随机梯度下降的核心思想
算法思路
每次迭代只用一个样本来计算梯度并更新参数,而不是用全部样本。
更新规则
对每个样本 (xⁱ, yⁱ):
θⱼ := θⱼ - α · (h_θ(xⁱ) - yⁱ) · xⱼⁱ
与批量梯度下降的对比
| 对比项 | 批量梯度下降 | 随机梯度下降 |
|---|---|---|
| 每次迭代样本数 | 全部 m 个 | 1 个 |
| 每次迭代计算量 | O(m·n) | O(n) |
| 收敛路径 | 平滑直线下降 | 曲折震荡下降 |
| 能否收敛到全局最优 | 能 | 会在最优值附近徘徊 |
三、随机梯度下降的算法流程
外层循环
for epoch in range(1, max_epochs + 1):
# 内层循环:遍历所有样本
for i in range(1, m + 1):
# 用第 i 个样本更新参数
θⱼ := θⱼ - α · (h_θ(xⁱ) - yⁱ) · xⱼⁱ
其中一次 epoch 表示遍历完一遍全部样本。
数据洗牌
在每个 epoch 开始之前,先将训练数据随机打乱顺序。这样做的好处:
- 避免模型学习到数据中的顺序模式
- 保证每个 epoch 中样本的访问顺序不同
四、收敛特性
随机梯度下降的特性
| 特性 | 说明 |
|---|---|
| 不会精确收敛 | 在最优值附近来回震荡 |
| 初期下降快 | 前几次迭代就能快速接近最优 |
| 后期效率低 | 接近最优后震荡浪费计算 |
| 适用于大数据 | 总计算量远小于批量梯度下降 |
五、学习率 α 的调整
固定学习率的问题
- 学习率太大:震荡幅度大,难以靠近最优
- 学习率太小:收敛速度慢
逐渐衰减的学习率
让学习率随着迭代次数增加而减小,使模型在后期更稳定地靠近最优:
α = constant1 / (iteration_num + constant2)
衰减策略对比
| 策略 | 公式 | 特点 |
|---|---|---|
| 固定学习率 | α = 常数 | 简单但后期震荡 |
| 时间衰减 | α = α₀ / (1 + β·t) | 常用,需调 β |
| 阶梯衰减 | 每隔若干 epoch 减半 | 易于实现 |
六、随机梯度下降 vs 批量梯度下降
| 对比项 | 批量梯度下降 | 随机梯度下降 |
|---|---|---|
| 每次更新计算量 | O(m·n) | O(n) |
| 每次更新信息量 | 全部样本 | 单个样本 |
| 收敛速度(前期) | 慢 | 快 |
| 收敛精度 | 高(精确收敛) | 低(近似收敛) |
| 大数据适用性 | 差 | 好 |
| 实现复杂度 | 简单 | 稍复杂(需洗牌、调学习率) |
七、何时使用随机梯度下降
| 场景 | 建议 |
|---|---|
| m ≤ 10⁴ | 批量梯度下降即可 |
| 10⁴ < m ≤ 10⁶ | Mini-batch 梯度下降 |
| m > 10⁶ | 随机梯度下降或 Mini-batch |
八、一句话总结
"随机梯度下降每次用一个样本更新参数,前期飞跑后期震荡------大数据下比批量梯度下降快得多,但要用衰减学习率来控制最后的抖动。"
Mini-batch 梯度下降
一、批量梯度下降与随机梯度下降的折中
两种极端
| 方法 | 每次迭代样本数 | 优点 | 缺点 |
|---|---|---|---|
| 批量梯度下降 | 全部 m 个 | 方向准确,收敛稳定 | 每次迭代计算量大 |
| 随机梯度下降 | 1 个 | 每次迭代计算量小 | 方向噪声大,不稳定 |
Mini-batch 的思路
每次迭代使用 b 个样本(b 介于 1 和 m 之间),兼顾计算效率和稳定性。
二、Mini-batch 梯度下降的算法
符号约定
- b:mini-batch 的大小(如 10、100、1000)
- 每个 mini-batch 记为 {x⁽¹⁾, y⁽¹⁾}, {x⁽²⁾, y⁽²⁾}, ...,
更新规则
对每个 mini-batch:
θⱼ := θⱼ - α · (1/b) · Σₖ₌₁ᵇ (h_θ(x⁽ᵏ⁾) - y⁽ᵏ⁾) · xⱼ⁽ᵏ⁾
算法流程
将训练数据随机打乱
↓
将数据划分为大小为 b 的 mini-batch
↓
for epoch in range(1, max_epochs + 1):
for each mini-batch:
用该 batch 中的所有样本计算梯度
更新参数 θ
三、三种方法的对比
| 对比项 | 批量梯度下降 | 随机梯度下降 | Mini-batch 梯度下降 |
|---|---|---|---|
| 每次样本数 | m | 1 | b(如 10-1000) |
| 每次计算量 | O(m·n) | O(n) | O(b·n) |
| 收敛稳定性 | 最稳定 | 最不稳定 | 中等 |
| 向量化加速 | 可充分利用 | 无法利用 | 可充分利用 |
| 收敛速度 | 慢 | 快(前期) | 快 |
四、Mini-batch 的优势
1. 向量化加速
Mini-batch 可以利用线性代数库的向量化计算,同时处理 b 个样本,比循环处理 b 个单一样本快得多。
2. 计算效率与稳定性的平衡
| 方面 | 说明 |
|---|---|
| b 较小时 | 接近随机梯度下降,更新快但噪声大 |
| b 较大时 | 接近批量梯度下降,方向准但计算量大 |
| b 适中时 | 既享受向量化加速,又保持更新频率 |
3. 硬件利用率
现代 CPU/GPU 在处理矩阵运算时有并行优势,b 取 32-1024 之间能充分利用硬件。
五、Mini-batch 大小的选择
通用建议
| 数据集规模 | 推荐 batch 大小 |
|---|---|
| 小数据集(m ≤ 10⁴) | 批量梯度下降即可 |
| 中等数据集 | 10 - 100 |
| 大数据集 | 64 - 1024 |
选择原则
- b 取 2 的幂次(如 32、64、128、256)有利于硬件优化
- b 不宜过大,否则接近批量梯度下降,失去速度优势
- b 不宜过小,否则无法充分利用向量化加速
六、三种方法的收敛路径对比
- BGD:方向最准,但走得最慢
- SGD:方向最乱,但走得最快
- Mini-batch:折中方案,实际中最常用
七、实际应用中的选择
| 场景 | 推荐方法 |
|---|---|
| m ≤ 2000 | 批量梯度下降 |
| 2000 < m ≤ 10⁵ | Mini-batch(b=10-100) |
| m > 10⁵ | Mini-batch(b=64-1024) |
| 深度学习 | Mini-batch(b=32-512) |
八、一句话总结
"Mini-batch 用 b 个样本算一次梯度,既有向量化加速又保持更新频率------b 取 64 到 1024 之间,是实际中最常用的梯度下降变体。"
随机梯度下降的收敛
一、如何调试随机梯度下降
问题
批量梯度下降可以在每次迭代后计算 J_train(θ) 来检查收敛,但对随机梯度下降来说,每次更新后计算整个训练集的代价太高。
解决方案
在每次更新参数 θ 之前,先计算当前样本的代价,然后每 1000 次更新取一次平均值。
具体做法
- 每次迭代中,用当前样本计算 cost(θ, x⁽ⁱ⁾, y⁽ⁱ⁾) = (1/2) · (hθ(x⁽ⁱ⁾) − y⁽ⁱ⁾)²
- 每 1000 次迭代,将最近 1000 个样本的 cost 取平均
- 画出「平均 cost --- 迭代次数」曲线
二、收敛曲线的解读
学习率固定时的常见模式
| 曲线形态 | 含义 |
|---|---|
| 平滑下降 | 算法正常运行,正在收敛 |
| 剧烈震荡但总体下降 | 学习率偏大,或平均窗口太小(改为 5000 次试试) |
| 持续上升 | 算法发散,学习率太大 |
| 下降后趋于平坦 | 已经收敛到最优附近 |
平均窗口的影响
| 窗口大小 | 效果 |
|---|---|
| 较小(如 1000) | 曲线噪声大,能更快发现问题 |
| 较大(如 5000) | 曲线更平滑,但反应滞后 |
三、学习率衰减
为什么要衰减
随机梯度下降不会像批量梯度下降那样真正收敛到全局最小值,而是在最优值附近徘徊。原因是固定的学习率 α 导致参数不断振荡。
衰减策略
让学习率随时间逐步减小:
α = const₁ / (iterationNumber + const₂)
其中 const₁ 和 const₂ 是常数。
衰减的效果
- 初期:α 较大,快速接近最优区域
- 后期:α 变小,参数在最优附近做更小幅度的振荡
- 理论上:只要 α 衰减得足够慢,SGD 可以收敛到最小值
实际建议
- 实践中很少使用复杂的衰减公式
- 更常见的做法是固定 α,或者在几个 epoch 后手动调小 α
- 对大多数应用,固定 α 已经足够好用
四、Mini-batch 的收敛诊断
Mini-batch 梯度下降的收敛诊断方法与 SGD 相同:
- 每 1000 次 mini-batch 更新后,计算最近 1000 个 mini-batch 的平均 cost
- 画「平均 cost --- 更新次数」曲线
五、关于学习率的其他讨论
学习率的选择
| 情况 | 表现 |
|---|---|
| α 太大 | 曲线持续上升,发散 |
| α 合适 | 曲线平滑下降 |
| α 太小 | 下降极慢 |
学习率调整策略
- 先在少量数据上调试合适的 α
- 观察收敛曲线形态
- 根据曲线形态决定增大还是减小 α
六、一句话总结
"画最近 1000 个样本的平均 cost 曲线来监控 SGD 收敛------曲线一直往下就是好的,往上走就调小学习率。"
在线学习
一、什么是在线学习
概念
在线学习允许模型随着新数据的到来不断更新参数,而不是一次性使用全部静态数据集进行训练。
适用场景
拥有连续不断的数据流,且数据量极大(甚至无限)的应用。
二、在线学习的算法
与随机梯度下降的关系
在线学习本质上是运行随机梯度下降,只是数据来源不同:
- 常规 SGD:在固定训练集上反复迭代
- 在线学习:从连续的数据流中获取样本,每个样本只用一次
算法流程
while True:
获取新样本 (x, y)
用该样本计算梯度
θ := θ − α · (hθ(x) − y) · x
关键区别
- 没有固定的训练集
- 不进行 epoch 遍历
- 样本用完即弃,不重复使用
三、典型应用场景
1. 物流运输价格预测
| 要素 | 说明 |
|---|---|
| 业务 | 快递公司根据发货地、目的地、时间等因素定价 |
| 特征 x | 起点坐标、终点坐标、发货时间、距离等 |
| 标签 y | 用户是否接受此报价(0/1) |
| 目标 | 学习用户愿意支付的合理价格 |
2. 产品搜索推荐
| 要素 | 说明 |
|---|---|
| 业务 | 电商网站的搜索排序 |
| 特征 x | 用户搜索词、页面浏览特征、点击历史等 |
| 标签 y | 用户是否点击某个商品 |
| 目标 | 学习点击率预测模型,优化搜索结果排序 |
3. 新闻文章推荐
| 要素 | 说明 |
|---|---|
| 业务 | 新闻网站个性化推荐 |
| 特征 x | 用户特征 + 文章特征 |
| 标签 y | 用户是否点击/阅读该文章 |
| 目标 | 学习用户兴趣,推荐最可能被点击的文章 |
4. 广告点击率预测
| 要素 | 说明 |
|---|---|
| 业务 | 在线广告系统 |
| 特征 x | 用户特征 + 广告特征 |
| 标签 y | 用户是否点击广告 |
| 目标 | 预测 CTR(Click Through Rate),优化广告投放 |
四、在线学习的优势
| 优势 | 说明 |
|---|---|
| 适应数据漂移 | 用户偏好随时间变化,模型自动跟随 |
| 无需存储全部数据 | 每个样本用完即弃,节省存储空间 |
| 计算成本恒定 | 每次更新只需 O(n) 计算量 |
| 无限数据 | 只要有新数据,模型就持续改进 |
五、在线学习 vs 离线训练
| 对比项 | 离线训练 | 在线学习 |
|---|---|---|
| 数据使用 | 收集全部数据,批量训练 | 边获取边训练 |
| 更新频率 | 定期重新训练 | 实时更新 |
| 存储需求 | 存储全部历史数据 | 几乎不需要存储 |
| 适应变化 | 慢(只在重训时更新) | 快(实时跟随) |
| 典型场景 | Kaggle 竞赛、学术研究 | 广告系统、推荐系统 |
六、实际注意事项
何时切换到在线学习
| 条件 | 判断 |
|---|---|
| 数据量有限 | 离线训练更好,可复用数据 |
| 用户偏好稳定 | 离线训练足够,在线学习收益不大 |
| 海量数据流 + 偏好变化 | 在线学习是最佳选择 |
学习率设置
- 固定学习率:简单有效,适合大多数场景
- 衰减学习率:适合长期运行的在线系统
评估方法
- 跟踪模型在新数据上的表现
- 使用 A/B 测试对比新旧模型
- 监控关键指标(CTR、转化率等)
七、一句话总结
"在线学习让模型跟着数据流一起进化------每个样本只学一次,丢掉,再学下一个,最适合用户偏好不断变化的互联网应用。"
Map-Reduce 与数据并行
一、大规模机器学习的瓶颈
问题的根源
当数据集大到单台机器无法处理时,批量梯度下降的每次迭代都变得极其缓慢。即使使用 Mini-batch 或 SGD,单机计算能力也存在上限。
解决思路
将计算任务拆分到多台机器上并行执行,最后汇总结果。
二、Map-Reduce 的核心思想
基本原理
将训练数据分割成若干子集,分配到不同的机器上并行计算梯度,然后将各机器的计算结果汇总。
以批量梯度下降为例
原始公式
θⱼ := θⱼ − α · (1/m) · Σᵢ₌₁ᵐ (hθ(x⁽ⁱ⁾) − y⁽ⁱ⁾) · xⱼ⁽ⁱ⁾
求和部分 Σᵢ₌₁ᵐ 是整个计算中耗时最多的环节。
拆分计算
将训练集平均分到 k 台机器上,每台机器负责 m/k 个样本:
- 机器 1:计算 tempⱼ⁽¹⁾ = Σᵢ₌₁ᵐ/ᵏ (hθ(x⁽ⁱ⁾) − y⁽ⁱ⁾) · xⱼ⁽ⁱ⁾
- 机器 2:计算 tempⱼ⁽²⁾ = Σᵢ₌ₘ/ₖ₊₁²ᵐ/ᵏ (hθ(x⁽ⁱ⁾) − y⁽ⁱ⁾) · xⱼ⁽ⁱ⁾
- ...
- 机器 k:计算 tempⱼ⁽ᵏ⁾ = Σᵢ₌₍ₖ₋₁₎ₘ/ₖ₊₁ᵐ (hθ(x⁽ⁱ⁾) − y⁽ⁱ⁾) · xⱼ⁽ⁱ⁾
汇总结果
主服务器收集所有机器的计算结果:
θⱼ := θⱼ − α · (1/m) · (tempⱼ⁽¹⁾ + tempⱼ⁽²⁾ + ... + tempⱼ⁽ᵏ⁾)
三、Map-Reduce 的工作流程
训练集分割成 k 份
↓
┌─────────┬─────────┬──────┬─────────┐
│ 机器 1 │ 机器 2 │ ... │ 机器 k │
│ 计算梯度 │ 计算梯度 │ │ 计算梯度 │
└────┬────┴────┬────┴──────┴────┬────┘
│ │ │
└─────────┼────────────────┘
↓
主服务器汇总
更新参数 θ
↓
广播新 θ 到各机器
↓
进入下一轮
四、加速倍数分析
理论加速
| 机器数量 | 理论加速比 |
|---|---|
| 1 台 | 1× |
| 2 台 | 2× |
| 4 台 | 4× |
| k 台 | k× |
实际限制
| 因素 | 说明 |
|---|---|
| 网络开销 | 数据传输需要时间 |
| 同步等待 | 最慢的机器决定本轮速度 |
| 数据倾斜 | 各机器计算量不均 |
| 容错机制 | 备份和恢复消耗资源 |
实际加速比通常略小于 k 倍,但随数据量增大而趋近于 k 倍。
五、哪些学习算法可以并行化
可以并行化的算法
| 算法 | 并行化方式 |
|---|---|
| 线性回归 | 求和部分可拆分 |
| 逻辑回归 | 求和部分可拆分 |
| 神经网络 | 每个 batch 的梯度计算可拆分 |
| SVM | 部分变种可拆分 |
| 决策树 | 分裂点的统计可拆分 |
不可直接并行化的算法
| 算法 | 原因 |
|---|---|
| K-means | 依赖全局距离计算 |
| PCA | 依赖全局协方差矩阵 |
| 某些聚类算法 | 依赖全局数据结构 |
判断标准
只要学习算法的训练过程中包含对训练集的求和运算,且该求和可以拆分为多个独立的子求和,那么该算法就可以应用 Map-Reduce 并行化。
六、Map-Reduce 的两种实现方式
1. 多机分布式系统
| 要素 | 说明 |
|---|---|
| 代表框架 | Hadoop MapReduce、Spark |
| 适用场景 | 超大规模数据集,单机装不下 |
| 优点 | 可扩展至数千台机器 |
| 缺点 | 运维复杂,网络开销大 |
2. 单机多核/多GPU
| 要素 | 说明 |
|---|---|
| 实现方式 | 将数据分割到不同核心或 GPU 上 |
| 适用场景 | 中等规模数据集,单机能装下 |
| 优点 | 无网络开销,实现简单 |
| 缺点 | 受限于单机硬件资源 |
七、数据并行 vs 模型并行
| 对比项 | 数据并行 | 模型并行 |
|---|---|---|
| 拆分对象 | 训练数据 | 模型参数 |
| 适用场景 | 数据太大 | 模型太大(放不进显存) |
| 典型应用 | 大规模线性模型 | 超大神经网络 |
| 通信开销 | 传递梯度 | 传递中间激活值 |
八、实际应用中的选择
| 场景 | 推荐方案 |
|---|---|
| 单机可容纳数据 | 单机多核/多GPU |
| 数据远超单机容量 | 分布式 Map-Reduce |
| 模型超大(如 GPT) | 模型并行 + 数据并行 |
| 实时在线学习 | 单机 SGD,无需并行 |
九、一句话总结
"Map-Reduce 把训练数据拆到多台机器上各自算梯度,再合起来更新参数------只要算法里有求和,就能这样加速,k 台机器最多快 k 倍。"
照片 OCR 问题描述与流水线
一、问题背景
什么是照片 OCR
照片 OCR(Photo Optical Character Recognition)的目标是从一张照片中识别出图像里的文字信息。
与扫描文档 OCR 的区别
| 对比项 | 扫描文档 OCR | 照片 OCR |
|---|---|---|
| 图像质量 | 清晰、规整 | 可能有模糊、光照不均、透视变形 |
| 背景 | 纯色背景 | 复杂背景 |
| 文字布局 | 规整排列 | 任意角度、字体、大小 |
| 难度 | 较低 | 较高 |
二、照片 OCR 流水线
整体流程
照片 OCR 不是一个单一的算法,而是由多个模块组成的流水线(pipeline):
输入照片
↓
① 文字检测(Text Detection)
在图像中找到包含文字的区域
↓
② 字符分割(Character Segmentation)
将文字区域中的字符逐个切分开
↓
③ 字符识别(Character Recognition)
识别每个分割出的字符是什么
↓
输出文本
三、各模块详解
1. 文字检测
| 要素 | 说明 |
|---|---|
| 输入 | 原始照片 |
| 输出 | 包含文字的矩形区域(bounding boxes) |
| 难点 | 文字可能在任意位置、任意角度、不同大小 |
| 方法 | 滑动窗口分类器(后续章节详述) |
2. 字符分割
| 要素 | 说明 |
|---|---|
| 输入 | 文字区域的图像 |
| 输出 | 单个字符的图像片段 |
| 难点 | 手写体字母可能连笔,印刷体可能有粘连 |
| 方法 | 投影分析、连通域分析、滑动窗口 |
3. 字符识别
| 要素 | 说明 |
|---|---|
| 输入 | 单个字符的图像 |
| 输出 | 该字符的类别(如 'A', 'B', 'C' 等) |
| 难点 | 不同字体、大小、变形 |
| 方法 | 分类器(神经网络、SVM、KNN 等) |
四、流水线的意义
模块化设计的优势
| 优势 | 说明 |
|---|---|
| 分工明确 | 每个模块专注解决一个问题 |
| 独立开发 | 各模块可独立改进和替换 |
| 错误定位 | 容易找到性能瓶颈在哪一环 |
| 复用性 | 文字检测模块也可用于车牌识别等其他任务 |
流水线的局限性
| 局限 | 说明 |
|---|---|
| 错误传播 | 上游的错误会传递给下游 |
| 模块耦合 | 各模块的输出格式必须匹配 |
| 整体优化难 | 单独优化每个模块不一定使整体最优 |
五、实际应用场景
| 场景 | 说明 |
|---|---|
| 文档数字化 | 扫描书籍、发票、表单 |
| 自动驾驶 | 识别路牌、交通标志 |
| 拍照翻译 | 拍摄外文菜单并翻译 |
| 车牌识别 | 停车场、收费站 |
| 盲人辅助 | 读取药品说明书、路牌 |
六、一句话总结
"照片 OCR 不是单个算法,而是文字检测 → 字符分割 → 字符识别三级流水线------每级输出是下一级的输入,环环相扣。"
滑动窗口
一、滑动窗口的基本概念
什么是滑动窗口
滑动窗口是一种在图像中遍历所有可能位置和尺度来检测目标的方法。用一个固定大小的窗口在图像上逐像素移动,对每个窗口区域进行分类,判断是否包含目标物体。
二、滑动窗口在文字检测中的应用
行人检测的例子(铺垫)
在行人检测中,滑动窗口的做法是:
- 选择一个固定大小的窗口(如 82×36 像素)
- 在图像上从左到右、从上到下逐像素移动
- 对每个窗口区域运行分类器,判断是否包含行人
- 改变窗口大小,重复上述过程
应用到文字检测
文字检测的流程与行人检测完全相同,只是分类器的目标从「是否有行人」变成了「是否有文字」。
三、滑动窗口的具体流程
第一步:准备训练数据
| 数据类别 | 内容 | 标签 |
|---|---|---|
| 正样本 | 包含文字的图像区域 | y = 1 |
| 负样本 | 不包含文字的图像区域 | y = 0 |
第二步:训练分类器
用标注好的正负样本训练一个二分类器(如 SVM、逻辑回归、神经网络),输入是窗口内的像素,输出是该区域是否包含文字。
第三步:在图像上滑动检测
设定初始窗口大小(如 80×40 像素)
↓
设定步长(stride),如每隔 5 个像素移动一次
↓
for 每种窗口尺寸:
for 图像中的每个窗口位置:
提取窗口内的像素
送入分类器判断是否包含文字
↓
放大窗口尺寸,重复检测
四、滑动窗口的关键参数
1. 窗口大小
| 参数 | 影响 |
|---|---|
| 窗口过小 | 漏检大文字 |
| 窗口过大 | 漏检小文字 |
| 解决方案 | 使用多种尺寸的窗口 |
2. 步长(stride)
| 参数 | 影响 |
|---|---|
| 步长较小 | 检测更精细,但计算量大 |
| 步长较大 | 计算量小,但可能漏检 |
| 常见取值 | 1~10 像素 |
3. 缩放比例
| 参数 | 影响 |
|---|---|
| 比例因子较小(如 1.01) | 检测更精确,但计算量大 |
| 比例因子较大(如 1.5) | 计算量小,但可能漏检 |
| 常见取值 | 1.1 ~ 1.5 |
五、滑动窗口的计算成本
问题
滑动窗口的计算量非常大。如果图像是 1000×1000 像素,窗口大小 100×100,步长为 1,则需要检测约 810,000 个窗口。若使用多种窗口尺寸,计算量还要翻倍。
缓解方法
| 方法 | 说明 |
|---|---|
| 使用大步长 | 减少窗口数量,但可能降低精度 |
| 缩小图像 | 先缩小图像再检测,减少总像素数 |
| 粗筛+精筛 | 先用大步长粗筛候选区域,再用小步长精确定位 |
| 使用更高效的分类器 | 如用级联分类器(Cascade)快速排除非目标区域 |
六、滑动窗口在字符分割中的应用
字符分割的滑动窗口
字符分割同样可以使用滑动窗口:
- 训练一个二分类器,区分「两个字符之间的间隙」和「字符内部」
- 在文字区域的图像上滑动一个 1×宽度 的垂直窗口
- 分类器输出该位置是否为字符分割点
与文字检测的区别
| 对比项 | 文字检测 | 字符分割 |
|---|---|---|
| 窗口形状 | 矩形(宽×高) | 竖条(1×高度) |
| 检测目标 | 文字区域的位置 | 字符之间的边界 |
| 输出 | 包围盒坐标 | 分割位置 |
七、滑动窗口的优缺点
优点
| 优点 | 说明 |
|---|---|
| 简单直观 | 容易理解和实现 |
| 通用性强 | 可用于检测各种目标 |
| 无需候选区域 | 穷举所有可能位置,不漏检 |
缺点
| 缺点 | 说明 |
|---|---|
| 计算量大 | 需要检测大量窗口 |
| 冗余检测 | 同一个目标会被多个窗口覆盖 |
| 难以处理变形 | 固定窗口难以适应旋转、拉伸的文字 |
八、后续改进方向
| 方向 | 说明 |
|---|---|
| 非极大值抑制 | 合并重叠的检测框,去除冗余 |
| 候选区域方法 | 先用算法找出可能包含目标的区域,再在这些区域上运行分类器 |
| 卷积化滑动窗口 | 用卷积神经网络一次性计算所有窗口的分类结果,大幅提速 |
九、一句话总结
"滑动窗口用不同大小的框扫遍整张图片,每到一个位置就问分类器'这里有文字吗?'------简单但昂贵,是后续更高效方法的基础。"
获取大量数据与人工数据合成
一、为什么需要大量数据
核心观点
在机器学习中,使用"低偏差"算法(如大型神经网络)时,更多的训练数据往往能带来更好的性能。但获取大量标注数据成本高昂,因此需要人工合成数据的方法。
二、人工数据合成的两种主要方法
1. 从零开始创造合成数据
| 方法 | 说明 |
|---|---|
| 思路 | 用程序生成逼真的训练样本 |
| 例子 | 用不同字体、大小、颜色、背景生成文字图像 |
2. 扩展现有数据集
| 方法 | 说明 |
|---|---|
| 思路 | 对已有样本施加变换,生成新的样本 |
| 例子 | 对文字图像添加变形、噪声、模糊、旋转 |
三、案例:文字识别的数据合成
合成文字图像的流程
选择字体库中的一种字体
↓
选择字符(字母、数字)
↓
渲染到图像上
↓
添加背景纹理(纸张、墙壁、招牌等)
↓
添加变形(仿射变换、透视变换)
↓
添加噪声(高斯噪声、椒盐噪声)
↓
添加模糊(运动模糊、高斯模糊)
↓
输出合成图像
合成数据的多样性来源
| 变换类型 | 参数示例 |
|---|---|
| 字体 | Arial, Times New Roman, 手写体等数百种 |
| 字号 | 8pt ~ 72pt |
| 颜色 | 文字颜色、背景颜色的各种组合 |
| 背景 | 纯色、渐变、纹理、真实照片背景 |
| 几何变换 | 旋转 ±30°, 拉伸, 透视扭曲 |
| 图像退化 | 模糊、噪声、压缩伪影、光照不均 |
四、扩展现有数据集的常用变换
适用于文字识别的变换
| 变换 | 说明 | 是否保留标签 |
|---|---|---|
| 旋转变换 | 小角度旋转(±15°) | ✅ 保留 |
| 缩放变换 | 轻微放大或缩小 | ✅ 保留 |
| 平移变换 | 在图像内移动 | ✅ 保留 |
| 弹性变形 | 模拟手写体的自然弯曲 | ✅ 保留 |
| 色彩抖动 | 改变亮度、对比度、饱和度 | ✅ 保留 |
| 添加噪声 | 高斯噪声、椒盐噪声 | ✅ 保留 |
| 模糊 | 高斯模糊、运动模糊 | ✅ 保留 |
注意:变换必须保持标签不变
有些变换会改变标签,例如:
- 对数字 "6" 旋转 180° → 变成 "9"
- 对字母 "d" 水平翻转 → 变成 "b"
这类变换不能随意使用。
五、人工数据合成的注意事项
1. 合成数据要与真实数据匹配
| 问题 | 后果 |
|---|---|
| 合成数据太干净 | 模型在真实照片上表现差 |
| 合成数据噪声类型不对 | 模型学到错误的模式 |
| 合成数据分布偏移 | 模型泛化能力差 |
2. 合成数据的"真实感"要求
| 级别 | 说明 |
|---|---|
| 过于完美 | 字体太规整,背景太干净 → 模型无法泛化到真实场景 |
| 过度失真 | 噪声太多,变形太夸张 → 模型学不到有效特征 |
| 恰到好处 | 模拟真实场景中的各种变化 → 模型泛化最好 |
3. 数据量并非越多越好
| 情况 | 说明 |
|---|---|
| 数据量不足 | 模型欠拟合,性能差 |
| 数据量足够 | 增加更多数据,性能提升变缓 |
| 数据量过剩 | 边际效益递减,投入产出比下降 |
六、获取真实数据的替代方法
众包标注
| 平台 | 说明 |
|---|---|
| Amazon Mechanical Turk | 雇佣在线工作者标注数据 |
| 众包平台 | 低成本获取大量标注数据 |
利用现有资源
| 方法 | 说明 |
|---|---|
| 免费公开数据集 | MNIST、ImageNet、COCO 等 |
| 爬取网络数据 | 从搜索引擎、社交媒体获取图像 |
| 日志数据 | 从用户行为日志中提取训练数据 |
七、人工数据合成的局限性
| 局限 | 说明 |
|---|---|
| 难以模拟复杂场景 | 真实世界的光照、遮挡、反射很难完美模拟 |
| 需要领域知识 | 必须知道哪些变换是合理的 |
| 可能引入偏差 | 合成数据的分布可能与真实数据不同 |
| 验证成本高 | 需要真实数据来验证合成数据的有效性 |
八、实践建议
何时应该尝试人工数据合成
| 条件 | 判断 |
|---|---|
| 真实数据获取成本极高 | ✅ 值得尝试 |
| 真实数据量太少 | ✅ 值得尝试 |
| 合成数据容易生成且贴近真实 | ✅ 值得尝试 |
| 已经有大量真实数据 | ❌ 优先使用真实数据 |
工作流程
评估当前数据量是否充足
↓
若不充足,尝试人工数据合成
↓
生成一批合成数据
↓
在真实验证集上测试模型
↓
若效果不佳,调整合成策略
↓
重复直到满足要求
九、一句话总结
"人工数据合成就是用程序制造训练数据------给文字换字体、加背景、添噪声,让模型见过所有可能的真实变化,才能在实际场景中认出文字。"
上限分析:下一步该优化流水线的哪一部分
一、什么是上限分析
问题背景
在复杂的机器学习流水线中,有多个模块可以改进。但资源有限,需要决定把精力投在哪个模块上能获得最大的整体性能提升。
核心思路
上限分析通过人为模拟某个模块达到完美性能,观察整个系统的性能提升幅度,来判断该模块的改进潜力有多大。
二、照片 OCR 流水线的上限分析
流水线回顾
输入照片
↓
① 文字检测(Text Detection)
↓
② 字符分割(Character Segmentation)
↓
③ 字符识别(Character Recognition)
↓
输出文本
当前系统的基准性能
假设当前整个系统的准确率为 72%。
三、上限分析的执行步骤
第一步:评估文字检测的上限
| 操作 | 说明 |
|---|---|
| 模拟方式 | 用手工标注正确的文字区域代替文字检测模块的输出 |
| 效果 | 跳过文字检测的错误,让流水线从完美的文字区域开始 |
| 新准确率 | 假设提高到 89% |
| 提升幅度 | 89% − 72% = 17% |
含义:即使把文字检测做到完美,系统最多只能提升 17%。
第二步:评估字符分割的上限
| 操作 | 说明 |
|---|---|
| 模拟方式 | 在完美文字检测的基础上,再用手工标注正确的字符分割 |
| 效果 | 跳过文字检测和字符分割的错误 |
| 新准确率 | 假设提高到 90% |
| 提升幅度 | 90% − 89% = 1% |
含义:字符分割已经足够好了,改进它的收益很小。
第三步:评估字符识别的上限
| 操作 | 说明 |
|---|---|
| 模拟方式 | 在完美文字检测和字符分割的基础上,再用手工标注正确的字符识别 |
| 效果 | 跳过所有模块的错误 |
| 新准确率 | 100% |
| 提升幅度 | 100% − 90% = 10% |
含义:字符识别还有 10% 的提升空间。
四、上限分析的结果解读
各模块的提升潜力
| 模块 | 当前准确率 | 完美后的准确率 | 提升潜力 |
|---|---|---|---|
| 文字检测 | 72% | 89% | 17% ⭐ 最大 |
| 字符分割 | 89% | 90% | 1% |
| 字符识别 | 90% | 100% | 10% |
结论
- 文字检测 是当前的最大瓶颈,改进它收益最高
- 字符分割 已经很好了,不值得花精力
- 字符识别 也有改进空间,但优先级低于文字检测
五、上限分析与普通组件评估的区别
普通组件评估
单独测量每个组件的准确率:
- 文字检测准确率:85%
- 字符分割准确率:95%
- 字符识别准确率:90%
问题
某个组件自身准确率高,不代表它的错误对整体影响大。反之亦然。
上限分析的优势
| 对比项 | 普通组件评估 | 上限分析 |
|---|---|---|
| 关注点 | 组件自身的性能 | 组件对整体的影响 |
| 衡量方式 | 组件单独的正确率 | 模拟完美后整体提升 |
| 指导意义 | 有限 | 直接告诉优先级 |
六、另一个例子:人脸识别流水线
流水线
输入图像
↓
① 人脸检测(Face Detection)
↓
② 眼睛定位(Eye Localization)
↓
③ 人脸对齐(Face Alignment)
↓
④ 人脸识别(Face Recognition)
↓
输出身份
上限分析
| 模块 | 当前准确率 | 完美后准确率 | 提升潜力 |
|---|---|---|---|
| 人脸检测 | 85% | 91% | 6% |
| 眼睛定位 | 91% | 93% | 2% |
| 人脸对齐 | 93% | 96% | 3% |
| 人脸识别 | 96% | 100% | 4% |
结论
- 人脸检测和人脸识别都有较大的提升空间
- 眼睛定位和人脸对齐的改进收益较小
七、上限分析的局限性
| 局限 | 说明 |
|---|---|
| 手工标注成本高 | 模拟完美模块需要人工标注中间结果 |
| 模块间存在依赖 | 某些模块的错误会影响后续模块的行为模式 |
| 忽略交互效应 | 同时改进多个模块可能产生协同效应 |
| 完美假设不现实 | 实际中不可能达到完美,只是一个上限估计 |
八、实践建议
何时做上限分析
| 场景 | 建议 |
|---|---|
| 流水线复杂,模块众多 | ✅ 强烈推荐 |
| 不确定下一步改什么 | ✅ 强烈推荐 |
| 有明显瓶颈模块 | ✅ 值得一做 |
| 流水线只有两三个模块 | ⚠️ 可选 |
工作流程
建立完整的流水线
↓
测量当前整体性能
↓
从第一个模块开始,依次模拟完美
↓
记录每次的整体性能提升
↓
找出提升最大的模块
↓
集中资源改进该模块
九、一句话总结
"上限分析通过假装某个模块已经完美,看整体能提升多少------帮你把钱和精力花在刀刃上,而不是浪费在已经够好的地方。"