
《深度学习》(Ian Goodfellow 著)第1章“引言”详细讲解
1. 本章概述与定位
第1章“引言”是全书的开篇,旨在为读者建立对“深度学习”这一领域的宏观认知。它不是一本技术手册的简单开场白,而是一幅精心绘制的“知识地图”。本章通过回顾人工智能的发展历程、定义核心概念、阐明深度学习的独特优势,为后续所有技术章节奠定了思想和理论基础。
2. 由浅入深:从问题到解决方案
2.1 核心问题:人工智能面临的根本挑战是什么?
基础概念:传统人工智能的困境 早期的AI研究者发现,计算机可以轻松处理那些对人类来说需要高度逻辑推理的任务(如下棋),但在处理人类凭直觉就能完成的任务(如识别图片中的猫、听懂一句话)时却举步维艰。
深层原因:知识的“隐含性” 这些直观任务所依赖的知识(例如,什么是“猫”的形状、颜色、纹理)往往是“隐含知识”(tacit knowledge)。人类很难用一套精确的、形式化的数学规则来描述这种知识。比如,你无法用简单的逻辑语句
如果 有耳朵 且 有胡须 且 会喵喵叫,则 是猫来完美定义一个通用“猫”的检测器,因为现实世界的猫形态万千,光线、角度、遮挡都变化无穷。早期解决方案的失败:“知识库”方法 为了解决这个问题,一些项目(如Cyc)试图通过人工的方式,将所有知识用形式化语言(如CycL)编码成庞大的规则库,让计算机进行逻辑推理。但实践证明,这个过程极其繁琐、易错,且无法覆盖现实世界的无限复杂性。关键在于:人类难以用规则描述世界,但世界本身存在可以被计算机发现的模式。
2.2 第一步解决方案:机器学习
- 核心思想:与其由人手动编写规则,不如让计算机从数据中自动学习这些规则或模式。
- 工作流程:计算机从原始数据中提取出设计好的特征(feature),然后通过一个简单的机器学习算法(如逻辑回归)来学习特征与目标输出(如“是猫”或“不是猫”)之间的映射关系。
- 示例:在垃圾邮件分类中,我们不写规则“如果包含‘发票’或‘中奖’,则为垃圾邮件”。而是定义特征(如“是否包含‘发票’”、“邮件长度”等),然后让算法从大量已标注的邮件中学习这些特征与“垃圾”标签之间的关系。
2.3 新的挑战:表示学习
- 核心问题:特征工程成为新的瓶颈。特征的选择和设计仍然需要大量的人工干预和领域知识。
- 核心思想:能否让机器学习算法不仅学习从特征到输出的映射,还能自动学习特征本身?这就是表示学习。
- 重要性:一个好的数据表示,可以极大地简化后续的机器学习任务。例如,在图1.1中,用笛卡尔坐标系无法线性分割的数据,在极坐标系下却可以轻松地用一条竖线分开。学习到好的表示,意味着找到了数据背后更本质、更简洁的“解释”。
2.4 最终的解决方案:深度学习
- 核心思想:通过引入**“深度”**,即多个层次的表示学习,来解决表示学习本身的难题。
- 核心理念:
- 层次化抽象:复杂的概念可以由更简单的概念组合而成。
- 逐层构建:模型从原始输入开始,第一层学习简单的特征(如边缘),第二层学习由这些简单特征组合而成的稍复杂特征(如角、轮廓),第三层学习更复杂的模式(如眼睛、鼻子),最终顶层形成对“人脸”的高度抽象表示。
- 自动发现:所有这些层次的表示,都是由模型自动从数据中学习到的,无需人工干预。
这个过程形成了一个“深度”的层级结构,因此被称为“深度学习”。
本章知识脉络总结
(失败)
人工编码规则] B --> D[机器学习
(第一步成功)
从数据中学习] D --> E[核心流程] E --> F[1. 人工设计特征] E --> G[2. 简单算法学习映射] F --> H{"新瓶颈: 特征工程"} H --> I[表示学习
(第二步进化)
自动学习特征] I --> J[核心流程] J --> K[算法自动学习特征] J --> L[算法学习特征到输出的映射] I --> M{"新挑战: 如何学习复杂、抽象的特征?"} M --> N[深度学习
(终极方案)
多层次表示学习] N --> O[核心理念] O --> P[1. 层次化概念
(由简到繁)] O --> Q[2. 逐层构建
(深度结构)] O --> R[3. 自动发现
(无人工干预)]
3. 覆盖所有重要概念
本章引入了一系列贯穿全书的关键术语,这里逐一进行解释。
3.1 基础概念
人工智能 (AI)
- 定义:使机器能够模仿和执行人类智能任务(如学习、推理、解决问题)的学科。
- 在本章的位置:这是最上层的概念,深度学习和机器学习都是实现人工智能的具体途径。
机器学习 (Machine Learning)
- 定义:一门学科,旨在让计算机无需明确编程就能学习。其核心是从数据中自动发现模式,并利用这些模式进行预测或决策。
- 与AI的关系:是实现AI的一种主要方法,尤其适用于那些难以手动编写规则的任务。本书认为,机器学习是构建能够应对复杂现实世界的AI系统的唯一可行方法。
表示学习 (Representation Learning)
- 定义:机器学习的一个子领域,其目标是自动学习数据的表示(即特征),使得后续的任务(如分类、回归)变得更容易。
- 与机器学习的关系:是对传统机器学习中“特征工程”环节的自动化和深化。
深度学习 (Deep Learning)
- 定义:机器学习的一个子领域,其模型由多个处理层组成,每一层都学习从输入到更抽象表示的转换。模型通过组合这些简单的表示,来学习复杂的概念。
- 与表示学习的关系:深度学习是表示学习的一种特例,其特点是**“深度”**,即通过多个层次来构建表示。它通过逐层组合简单概念,解决了表示学习中如何获取高层次抽象概念的核心难题。
3.2 核心构成要素
特征 (Feature)
- 定义:数据的一个可测量的属性或性质。例如,一张图片的像素值、一个病人的体温、一个句子中某个单词是否出现。
- 例子:在预测是否需要剖腹产的例子中,“有无子宫疤痕”就是一个特征。在图像识别中,如果我们手动设计,“是否有轮子”也可以是一个特征。
因素 (Factor of Variation)
- 定义:影响或解释观测数据的独立来源或潜在原因。它不是指数学上的乘法因子,而是指“影响因素”。例如,在一张语音录音中,影响因素包括:说话人的年龄、性别、口音、所说的话、背景噪音等。
- 深度学习的核心目标:深度学习旨在**“解耦”**这些因素,即从观测数据中分离出这些潜在的、往往是未知的影响因素。
深度 (Depth)
- 定义:衡量模型层次多少的指标。但书中明确指出,深度有两种理解方式,这常常是初学者困惑的源头。
- 计算图深度:指从输入到输出,最长路径上顺序执行的指令数量。这取决于你如何定义“一个指令”。(见图1.3)
- 概念图深度:指概念与概念之间嵌套关系的层数。(见图1.2)
- 示例:图1.3中,一个逻辑回归模型
σ(w^T x)。如果我们将“加法”、“乘法”、“sigmoid”都视为一个指令,它的计算深度是3。但如果我们将“逻辑回归”整体视为一个基本单元,它的概念深度就是1。
- 定义:衡量模型层次多少的指标。但书中明确指出,深度有两种理解方式,这常常是初学者困惑的源头。
3.3 关键技术与模型
自编码器 (Autoencoder)
- 定义:一种用于学习数据表示的经典神经网络。它包含两部分:
- 编码器 (Encoder):将输入数据(如一张图片)转换为一个不同的表示(一个“编码”)。
- 解码器 (Decoder):将这个表示再转换回原始数据格式。
- 学习目标:在尽可能保留信息的前提下,让这个新的表示拥有某些好的性质(如稀疏、低维等)。它是表示学习的典型例子。
- 定义:一种用于学习数据表示的经典神经网络。它包含两部分:
前馈深度网络 / 多层感知机 (Multilayer Perceptron, MLP)
- 定义:一种最基本的深度学习模型。它是一个数学函数,通过组合多个简单的函数,将输入映射到输出。每个函数(层)的输出作为下一个函数(层)的输入,信息流是单向的,没有反馈,因此称为“前馈”。
- 与深度学习的关系:MLP是深度学习模型的最直观、最基础的代表,体现了“层次化组合”的核心思想。
4. 构建知识体系:概念间的内在联系
本章构建的知识体系可以用一个同心圆(或包含关系)和一个层级图来概括。
4.1 层次包含关系(Venn图,对应图1.4)
这四层关系清晰地定义了深度学习的地位:
- 最外层:人工智能 (AI)。是最终目标,包含一切智能技术。
- 次外层:机器学习 (ML)。是实现AI的主要手段,尤其是处理复杂问题的手段。
- 内层:表示学习 (RL)。是机器学习的一种,其特点是专注于自动学习数据的表示,从而避免繁重的手动特征工程。
- 最内层:深度学习 (DL)。是表示学习的一种,其独特之处在于利用**“深度”**(多个层次)来构建复杂的表示,通过组合简单概念来形成抽象概念。
4.2 流程演进关系(流程图,对应图1.5)
这张流程图展示了不同AI方法在解决任务时的流程差异:
- 知识库方法:输入 → 按人工设计的规则处理 → 输出。整个过程透明但僵化。
- 传统机器学习:输入 → 人工设计特征 → 从特征到输出的映射(由数据学习得到) → 输出。瓶颈在于特征设计。
- 表示学习:输入 → 特征(由数据自动学习) → 从特征到输出的映射(由数据学习得到) → 输出。瓶颈在于学习复杂特征。
- 深度学习:输入 → 简单特征 → 稍复杂特征 → 更复杂特征 → … → 输出。通过层次化解耦了复杂性,实现了端到端的学习。
4.3 核心目标:解耦因素
- 所有努力的核心:无论是特征设计、表示学习还是深度学习的层次化抽象,其终极目标都是为了更好地分离、理解并利用那些影响数据的潜在因素。这些因素可能是物理世界的真实属性(如物体的颜色、位置),也可能是帮助我们理解数据的抽象概念(如句子的情感、图像的风格)。
5. 实例辅助
5.1 概念:表示学习的优势
- 问题:假设我们需要一个程序来识别照片中的“车”。
- 原始数据:数百万个像素值。
- 不好的表示:直接在像素空间里寻找规律。像素值受光照、角度、颜色影响极大,导致“车”这个概念在像素空间中是一个非常复杂的、不规则的函数。
- 好的表示:如果能将像素转换为“是否有轮子”、“是否有车窗”、“是否有车门”等几个特征。那么在这些特征组成的空间中,“车”的识别就变成了一个简单的规则(例如:如果“有轮子”且“有车门”,则为车)。
- 表示学习的作用:自编码器或深度学习网络的任务,就是从像素中自动发现并构建出“轮子”、“车门”这些更好的特征。
5.2 概念:深度学习的层次化组合(对应图1.2)
- 输入:一张人脸图片的像素。
- 第1层(隐藏层):学习识别图像中各个位置的边缘(如横边、竖边、斜边)。这是由相邻像素对比得到的。
- 第2层:组合第1层检测到的边缘,识别出眼角、嘴角、鼻翼轮廓等更复杂的局部特征。这些概念由边缘组合而成。
- 第3层:组合第2层检测到的局部特征,识别出眼睛、鼻子、嘴巴等完整的脸部器官。
- 输出层:根据第3层识别出的器官组合,判断这是一张人脸。
- 关键:整个过程无需任何人告诉模型什么是“边缘”、什么是“眼角”。模型通过观察大量的人脸图片,自动地从像素中逐层构建出这些概念,最终学会“人脸”这个极其复杂的概念。
6. 与前后的联系
第1章如同一份宣言和一张地图,为后续所有章节铺路。
与第1部分(应用数学与机器学习基础)的联系: 第1章提出了深度学习要解决的问题(如解耦因素、层次化抽象)。要解决这些问题,就需要数学工具。因此,第2-5章介绍的线性代数、概率论、数值计算和机器学习基础,正是用来形式化、建模和解决这些问题的语言和方法。
与第2部分(深度网络:现代实践)的联系: 第1章介绍了核心模型前馈网络(MLP)和自编码器的雏形概念。第6章将深入讲解前馈网络的具体结构、激活函数和反向传播算法。第9章和第10章介绍的卷积网络(CNN) 和循环网络(RNN),正是第1章提到的用于处理图像(具有空间网格结构)和序列数据(具有时间结构)的深度网络的具体实现。图1.2对CNN的工作原理进行了直观描述。
与第3部分(深度学习研究)的联系: 第1章提到的“因素”和“表示”概念,是第13-15章讨论线性因子模型、自编码器和表示学习的基础。第1章对模型深度的两种理解,为第16章及以后讨论结构化概率模型和深度生成模型提供了铺垫。
7. 总结与重点
7.1 核心要点
- 深度学习的根本动机:为了解决传统AI和机器学习中难以获取隐含知识和手动设计特征的根本性瓶颈。
- 深度学习的核心思想:通过**“深度”(多个处理层),将复杂概念分解**为一系列由简入繁的简单概念。模型自动学习每一层的表示。
- 深度学习的本质:一种层次化的表示学习方法。其目标是自动从数据中发现并解耦影响因素。
- 关键概念层级:AI > 机器学习 > 表示学习 > 深度学习。
- 深度测量的双重性:“深度”既可以从计算图的角度理解(计算步骤数),也可以从概念图的角度理解(抽象层次数)。这解释了为什么不同的人对同一模型的深度可能有不同说法。
7.2 常见难点
- 混淆“深度”的两种含义:这是本章最常见的误解。读者需要区分“为了得到输出,计算机执行了多少步运算”和“人类理解的、概念上嵌套了多少层”。前者依赖于实现,后者更体现模型的表达能力。
- 对“因素(Factor)”的抽象理解:“因素”不是具体的、可观测的,而是潜在的、需要模型去发现的。理解这一点对后续学习生成模型和表示学习至关重要。
- 正确理解深度学习和“大脑”的关系:本章明确强调,深度学习虽受神经科学启发,但并非旨在模拟大脑。它是一门工程和数学学科,旨在解决实际问题,神经科学的类比只是灵感来源之一。
7.3 学习建议
- 构建宏观图景:在学习后续任何具体算法前,心中时刻回顾本章的Venn图和流程图。问自己:“我学的这个新算法,在帮助我解决什么问题?它处在知识体系的哪个位置?”
- 不纠结于细节:本章是引言,目的是“画地图”,而不是“教走路”。对于本章提到的概念(如自编码器、前馈网络、反向传播),如果觉得陌生,不必深究。在后续的专门章节,会有更详尽的解释。现在只需要知道它们“是什么”和“为什么重要”。
- 用例子理解抽象:在遇到“因素”、“表示”等抽象概念时,尝试用本章中的例子(如人脸识别、语音录音)去具象化它们,建立自己的理解模型。
通过以上讲解,希望你对《深度学习》第1章的内容有了一个清晰、系统和深刻的理解,为接下来的学习之旅打下坚实的基础。
《深度学习》(Ian Goodfellow 著)第2章“线性代数”详细讲解
1. 本章概述与定位
线性代数是深度学习的数学语言。从数据表示(向量、矩阵、张量)到模型运算(加权求和、激活函数)、再到优化求解(梯度、特征分解),无一不依赖线性代数的基本概念。本章作为全书的数学预备知识,旨在为读者打下坚实的线性代数基础,确保后续能够顺畅地理解神经网络的运作原理。
本章从最基础的标量、向量、矩阵、张量的定义开始,逐步深入到矩阵运算、范数、特殊矩阵,最后介绍特征分解、奇异值分解等高级主题,并以主成分分析(PCA) 作为综合实例,展示这些概念如何在实际机器学习算法中应用。
2. 由浅入深:逐步构建线性代数知识体系
2.1 基本对象:从标量到张量
线性代数研究不同层级的数学对象,它们构成了整个学科的基石。
| 名称 | 符号 | 定义 | 例子 | 深度学习中的角色 |
|---|---|---|---|---|
| 标量 (Scalar) | 斜体小写字母,如 $a$ | 单个数字 | $a = 5$ | 学习率、损失值、偏置项 |
| 向量 (Vector) | 粗体小写字母,如 $\boldsymbol{x}$ | 有序数组 | $\boldsymbol{x} = \begin{bmatrix}1 \\ 2 \\ 3\end{bmatrix}$ | 输入样本、特征、权重向量 |
| 矩阵 (Matrix) | 粗体大写字母,如 $\boldsymbol{A}$ | 二维数组 | $\boldsymbol{A} = \begin{bmatrix}1 & 2 \\ 3 & 4\end{bmatrix}$ | 权重矩阵、数据集(设计矩阵) |
| 张量 (Tensor) | 特殊字体,如 $\mathsf{A}$ | 多维数组(超过两维) | 彩色图像(高×宽×通道) | 卷积网络中的特征图、视频数据 |
理解要点:
- 向量可以看作一维数组,矩阵是二维数组,张量是更一般的多维数组。
- 在深度学习中,大多数数据都以张量形式存在(例如一批图像就是四维张量:样本数×高×宽×通道)。
2.2 基本运算
2.2.1 转置 (Transpose)
- 定义:矩阵 $\boldsymbol{A}$ 的转置 $\boldsymbol{A}^\top$ 是将行和列互换得到的新矩阵。
$$ (\boldsymbol{A}^\top)_{i,j} = A_{j,i} $$ - 例子:若 $\boldsymbol{A} = \begin{bmatrix}1 & 2 \\ 3 & 4\end{bmatrix}$,则 $\boldsymbol{A}^\top = \begin{bmatrix}1 & 3 \\ 2 & 4\end{bmatrix}$。
- 性质:$(\boldsymbol{A}\boldsymbol{B})^\top = \boldsymbol{B}^\top \boldsymbol{A}^\top$;标量的转置是其自身 $a = a^\top$。
2.2.2 矩阵加法与标量乘法
- 矩阵加法:对应元素相加,要求形状相同。
- 标量乘法:每个元素乘以该标量。
- 例子:$2 \begin{bmatrix}1 & 2 \\ 3 & 4\end{bmatrix} + 3 = \begin{bmatrix}5 & 7 \\ 9 & 11\end{bmatrix}$(标量加法是广播后的结果,实际是先加标量再乘)。
2.2.3 矩阵乘法 (Matrix Product)
- 定义:$\boldsymbol{C} = \boldsymbol{A}\boldsymbol{B}$,其中 $\boldsymbol{A}$ 为 $m\times n$,$\boldsymbol{B}$ 为 $n\times p$,则 $\boldsymbol{C}$ 为 $m\times p$,且 $$ C_{i,j} = \sum_{k=1}^n A_{i,k} B_{k,j} $$
- 例子:
$$ \begin{bmatrix}1 & 2 \\ 3 & 4\end{bmatrix} \begin{bmatrix}5 & 6 \\ 7 & 8\end{bmatrix} = \begin{bmatrix}1\cdot5+2\cdot7 & 1\cdot6+2\cdot8 \\ 3\cdot5+4\cdot7 & 3\cdot6+4\cdot8\end{bmatrix} = \begin{bmatrix}19 & 22 \\ 43 & 50\end{bmatrix} $$ - 性质:
- 不满足交换律:$\boldsymbol{A}\boldsymbol{B} \neq \boldsymbol{B}\boldsymbol{A}$(通常)。
- 满足结合律:$(\boldsymbol{A}\boldsymbol{B})\boldsymbol{C} = \boldsymbol{A}(\boldsymbol{B}\boldsymbol{C})$。
- 满足分配律:$\boldsymbol{A}(\boldsymbol{B}+\boldsymbol{C}) = \boldsymbol{A}\boldsymbol{B} + \boldsymbol{A}\boldsymbol{C}$。
- 点积 (Dot Product):两个同长度向量 $\boldsymbol{x}, \boldsymbol{y}$ 的点积为 $\boldsymbol{x}^\top \boldsymbol{y} = \sum_i x_i y_i$,可以视为矩阵乘法的特例($1\times n$ 乘 $n\times 1$)。
2.2.4 Hadamard积 (Hadamard Product)
- 定义:对应元素相乘,记作 $\boldsymbol{A} \odot \boldsymbol{B}$,要求形状相同。
- 例子:$\begin{bmatrix}1 & 2 \\ 3 & 4\end{bmatrix} \odot \begin{bmatrix}5 & 6 \\ 7 & 8\end{bmatrix} = \begin{bmatrix}5 & 12 \\ 21 & 32\end{bmatrix}$。
- 作用:常用于神经网络中的门控机制(如LSTM的门运算)。
2.2.5 广播 (Broadcasting)
- 定义:在形状不同的矩阵与向量之间进行运算时,自动将向量复制扩展成合适形状的机制。例如,矩阵 $\boldsymbol{A} \in \mathbb{R}^{m\times n}$ 加上向量 $\boldsymbol{b} \in \mathbb{R}^n$,结果是 $\boldsymbol{A}$ 的每一行都加上 $\boldsymbol{b}$。
- 例子:
$$ \begin{bmatrix}1 & 2 \\ 3 & 4\end{bmatrix} + \begin{bmatrix}5 & 6\end{bmatrix} = \begin{bmatrix}6 & 8 \\ 8 & 10\end{bmatrix} $$ 这里向量 $[5,6]$ 被广播成两行。
2.3 矩阵的重要性质与相关概念
2.3.1 单位矩阵 (Identity Matrix)
- 定义:主对角线全为1,其余为0的方阵,记作 $\boldsymbol{I}_n$ 或 $\boldsymbol{I}$。对于任意向量 $\boldsymbol{x}$,有 $\boldsymbol{I}\boldsymbol{x} = \boldsymbol{x}$。
- 例子:$\boldsymbol{I}_3 = \begin{bmatrix}1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1\end{bmatrix}$。
2.3.2 逆矩阵 (Inverse Matrix)
- 定义:对于方阵 $\boldsymbol{A}$,若存在矩阵 $\boldsymbol{A}^{-1}$ 使得 $\boldsymbol{A}^{-1}\boldsymbol{A} = \boldsymbol{I}$,则称 $\boldsymbol{A}$ 可逆,$\boldsymbol{A}^{-1}$ 为其逆矩阵。
- 作用:可用于解线性方程组 $\boldsymbol{A}\boldsymbol{x} = \boldsymbol{b}$,即 $\boldsymbol{x} = \boldsymbol{A}^{-1}\boldsymbol{b}$。
- 注意:并非所有方阵都可逆。当矩阵不可逆(奇异)时,方程组可能无解或有无穷多解。
2.3.3 线性相关与生成子空间 (Linear Dependence and Span)
- 线性组合:$\sum_i c_i \boldsymbol{v}^{(i)}$ 称为向量组 $\{\boldsymbol{v}^{(i)}\}$ 的线性组合。
- 生成子空间:所有可能的线性组合构成的集合,记作 $\text{span}\{\boldsymbol{v}^{(i)}\}$。
- 线性相关:若存在一组不全为零的系数 $c_i$ 使得线性组合为零向量,则称向量组线性相关;否则线性无关。
- 与矩阵的关系:矩阵 $\boldsymbol{A}$ 的列向量生成的子空间称为列空间。方程组 $\boldsymbol{A}\boldsymbol{x} = \boldsymbol{b}$ 有解当且仅当 $\boldsymbol{b}$ 位于列空间中。
- 可逆的充要条件:方阵 $\boldsymbol{A}$ 可逆当且仅当其列向量线性无关(即列空间张满整个空间)。
2.3.4 范数 (Norm)
- 定义:衡量向量大小的函数,满足非负性、齐次性和三角不等式。
- $L^p$ 范数:$\|\boldsymbol{x}\|_p = \left(\sum_i |x_i|^p\right)^{1/p}$。
- 常用范数:
- $L^2$ 范数(欧几里得范数):$\|\boldsymbol{x}\|_2 = \sqrt{\sum_i x_i^2}$,通常简写为 $\|\boldsymbol{x}\|$。
- $L^1$ 范数:$\|\boldsymbol{x}\|_1 = \sum_i |x_i|$,常用于稀疏性约束(如LASSO)。
- $L^\infty$ 范数:$\|\boldsymbol{x}\|_\infty = \max_i |x_i|$。
- Frobenius 范数(矩阵范数):$\|\boldsymbol{A}\|_F = \sqrt{\sum_{i,j} A_{i,j}^2}$,类似于向量的 $L^2$ 范数。
2.3.5 特殊矩阵
- 对角矩阵 (Diagonal Matrix):只有主对角线非零的矩阵。记作 $\text{diag}(\boldsymbol{v})$,其中 $\boldsymbol{v}$ 为对角线元素。其逆简单(若对角元非零),乘法运算高效(只需缩放)。
- 对称矩阵 (Symmetric Matrix):满足 $\boldsymbol{A} = \boldsymbol{A}^\top$ 的矩阵。常出现在协方差矩阵、距离矩阵等场合。
- 正交矩阵 (Orthogonal Matrix):方阵 $\boldsymbol{Q}$ 满足 $\boldsymbol{Q}^\top \boldsymbol{Q} = \boldsymbol{Q}\boldsymbol{Q}^\top = \boldsymbol{I}$。其逆等于转置,计算方便,且几何意义是保持长度不变的旋转/反射。
2.4 深入主题:分解与特征分析
2.4.1 特征分解 (Eigendecomposition)
- 定义:对方阵 $\boldsymbol{A}$,若非零向量 $\boldsymbol{v}$ 满足 $\boldsymbol{A}\boldsymbol{v} = \lambda \boldsymbol{v}$,则 $\boldsymbol{v}$ 是特征向量,$\lambda$ 是对应特征值。
- 分解形式:若 $\boldsymbol{A}$ 有 $n$ 个线性无关的特征向量,则可分解为 $\boldsymbol{A} = \boldsymbol{V}\text{diag}(\boldsymbol{\lambda})\boldsymbol{V}^{-1}$。对于实对称矩阵,可正交对角化:$\boldsymbol{A} = \boldsymbol{Q}\boldsymbol{\Lambda}\boldsymbol{Q}^\top$,其中 $\boldsymbol{Q}$ 是正交矩阵,$\boldsymbol{\Lambda}$ 是对角矩阵。
- 几何意义:矩阵 $\boldsymbol{A}$ 的作用相当于沿着特征向量方向拉伸(缩放因子为特征值)。见图2.3。
- 应用:
- 判断矩阵的正定性:所有特征值>0为正定;≥0为半正定。
- 优化二次型 $f(\boldsymbol{x}) = \boldsymbol{x}^\top\boldsymbol{A}\boldsymbol{x}$ 在单位球面上的最大值/最小值即为最大/最小特征值。
- PCA的基础。
2.4.2 奇异值分解 (Singular Value Decomposition, SVD)
- 定义:任意实矩阵 $\boldsymbol{A} \in \mathbb{R}^{m\times n}$ 可分解为 $\boldsymbol{A} = \boldsymbol{U}\boldsymbol{D}\boldsymbol{V}^\top$,其中:
- $\boldsymbol{U} \in \mathbb{R}^{m\times m}$ 正交矩阵,列向量为左奇异向量;
- $\boldsymbol{V} \in \mathbb{R}^{n\times n}$ 正交矩阵,列向量为右奇异向量;
- $\boldsymbol{D} \in \mathbb{R}^{m\times n}$ 对角矩阵,对角线元素为奇异值(非负,通常降序排列)。
- 与特征分解的关系:
- $\boldsymbol{U}$ 的列是 $\boldsymbol{A}\boldsymbol{A}^\top$ 的特征向量;
- $\boldsymbol{V}$ 的列是 $\boldsymbol{A}^\top\boldsymbol{A}$ 的特征向量;
- 非零奇异值是 $\boldsymbol{A}^\top\boldsymbol{A}$ 特征值的平方根。
- 优点:适用于任何矩阵(包括非方阵、奇异矩阵),比特征分解更通用。
2.4.3 Moore-Penrose 伪逆 (Pseudoinverse)
- 定义:对于非方阵或奇异矩阵,可定义伪逆 $\boldsymbol{A}^+$ 来近似求解线性方程组。
- 公式:$\boldsymbol{A}^+ = \lim_{\alpha \searrow 0} (\boldsymbol{A}^\top\boldsymbol{A} + \alpha \boldsymbol{I})^{-1}\boldsymbol{A}^\top$,实际计算常用 SVD:$\boldsymbol{A}^+ = \boldsymbol{V}\boldsymbol{D}^+\boldsymbol{U}^\top$,其中 $\boldsymbol{D}^+$ 是将 $\boldsymbol{D}$ 中非零元素取倒数再转置得到的对角矩阵。
- 意义:
- 当 $\boldsymbol{A}$ 列数 > 行数(欠定),$\boldsymbol{x} = \boldsymbol{A}^+\boldsymbol{y}$ 给出最小 $L^2$ 范数的解。
- 当 $\boldsymbol{A}$ 行数 > 列数(超定),$\boldsymbol{x} = \boldsymbol{A}^+\boldsymbol{y}$ 给出最小二乘解(即 $\|\boldsymbol{A}\boldsymbol{x} - \boldsymbol{y}\|_2$ 最小)。
2.4.4 迹 (Trace)
- 定义:$\operatorname{Tr}(\boldsymbol{A}) = \sum_i A_{i,i}$。
- 性质:
- $\operatorname{Tr}(\boldsymbol{A}) = \operatorname{Tr}(\boldsymbol{A}^\top)$;
- 循环置换不变性:$\operatorname{Tr}(\boldsymbol{A}\boldsymbol{B}\boldsymbol{C}) = \operatorname{Tr}(\boldsymbol{C}\boldsymbol{A}\boldsymbol{B}) = \operatorname{Tr}(\boldsymbol{B}\boldsymbol{C}\boldsymbol{A})$(只要乘法有意义);
- Frobenius 范数可用迹表示:$\|\boldsymbol{A}\|_F = \sqrt{\operatorname{Tr}(\boldsymbol{A}\boldsymbol{A}^\top)}$。
2.4.5 行列式 (Determinant)
- 定义:方阵 $\boldsymbol{A}$ 的行列式 $\det(\boldsymbol{A})$ 是一个标量,等于所有特征值的乘积。
- 几何意义:衡量矩阵对应的线性变换对空间的“缩放”程度。若行列式为0,则变换将空间压缩到更低维(体积变为0);若为1,则保持体积。
2.5 综合实例:主成分分析 (PCA)
PCA 是本章理论的最佳应用,展示了如何利用线性代数解决实际问题。
- 问题:对 $m$ 个 $n$ 维数据点 $\{\boldsymbol{x}^{(i)}\}$ 进行有损压缩,希望用更少的维度 $l < n$ 表示数据,且重构误差最小。
- 编码与解码:
- 解码器:$g(\boldsymbol{c}) = \boldsymbol{D}\boldsymbol{c}$,其中 $\boldsymbol{D} \in \mathbb{R}^{n\times l}$ 的列正交且单位范数。
- 编码器:$f(\boldsymbol{x}) = \boldsymbol{D}^\top\boldsymbol{x}$(通过最小化重构误差推导得出)。
- 推导过程:
- 对单个点,最优编码 $\boldsymbol{c}^* = \arg\min_{\boldsymbol{c}} \|\boldsymbol{x} - \boldsymbol{D}\boldsymbol{c}\|_2^2$,通过求导得 $\boldsymbol{c} = \boldsymbol{D}^\top\boldsymbol{x}$。
- 对所有点,需要最小化所有点的重构误差之和,即 $\|\boldsymbol{X} - \boldsymbol{X}\boldsymbol{D}\boldsymbol{D}^\top\|_F^2$,约束 $\boldsymbol{D}^\top\boldsymbol{D} = \boldsymbol{I}_l$。
- 通过迹运算和特征分解,可证明最优的 $\boldsymbol{D}$ 由 $\boldsymbol{X}^\top\boldsymbol{X}$ 最大的 $l$ 个特征值对应的特征向量组成。
- 结论:PCA 的解就是数据协方差矩阵的特征向量。这完美展示了特征分解在降维中的核心作用。
3. 知识体系图
4. 实例辅助理解
4.1 特征分解实例
考虑矩阵 $\boldsymbol{A} = \begin{bmatrix}2 & 1 \\ 1 & 2\end{bmatrix}$。
- 特征值:解 $\det(\boldsymbol{A} - \lambda \boldsymbol{I}) = (2-\lambda)^2 - 1 = 0$,得 $\lambda_1 = 3, \lambda_2 = 1$。
- 特征向量:对 $\lambda_1=3$,解 $(\boldsymbol{A}-3\boldsymbol{I})\boldsymbol{v}=0$,得 $\boldsymbol{v}_1 = \frac{1}{\sqrt{2}}[1,1]^\top$;对 $\lambda_2=1$,得 $\boldsymbol{v}_2 = \frac{1}{\sqrt{2}}[1,-1]^\top$。
- 验证:$\boldsymbol{A}\boldsymbol{v}_1 = 3\boldsymbol{v}_1$,$\boldsymbol{A}\boldsymbol{v}_2 = 1\boldsymbol{v}_2$。
- 几何意义:矩阵 $\boldsymbol{A}$ 将空间中沿 $[1,1]$ 方向拉伸3倍,沿 $[1,-1]$ 方向不变。
4.2 SVD 实例
矩阵 $\boldsymbol{A} = \begin{bmatrix}1 & 1 \\ 1 & 1\end{bmatrix}$。
- 计算 $\boldsymbol{A}^\top\boldsymbol{A} = \begin{bmatrix}2 & 2 \\ 2 & 2\end{bmatrix}$,其特征值为 $4$ 和 $0$,对应特征向量分别为 $[1,1]/\sqrt{2}$ 和 $[1,-1]/\sqrt{2}$。因此 $\boldsymbol{V} = \frac{1}{\sqrt{2}}\begin{bmatrix}1 & 1 \\ 1 & -1\end{bmatrix}$,$\boldsymbol{D} = \begin{bmatrix}2 & 0 \\ 0 & 0\end{bmatrix}$。
- $\boldsymbol{A}\boldsymbol{A}^\top$ 相同,所以 $\boldsymbol{U} = \boldsymbol{V}$。
- 于是 $\boldsymbol{A} = \boldsymbol{U}\boldsymbol{D}\boldsymbol{V}^\top = \frac{1}{\sqrt{2}}\begin{bmatrix}1 & 1 \\ 1 & -1\end{bmatrix} \begin{bmatrix}2 & 0 \\ 0 & 0\end{bmatrix} \frac{1}{\sqrt{2}}\begin{bmatrix}1 & 1 \\ 1 & -1\end{bmatrix}^\top = \begin{bmatrix}1 & 1 \\ 1 & 1\end{bmatrix}$。
奇异值 $\sigma_1 = 2, \sigma_2 = 0$,表明矩阵秩为1,仅有一个非零奇异值。
4.3 伪逆实例
仍用上例 $\boldsymbol{A}$,其伪逆 $\boldsymbol{A}^+$ 由 $\boldsymbol{V}\boldsymbol{D}^+\boldsymbol{U}^\top$ 计算,其中 $\boldsymbol{D}^+ = \begin{bmatrix}1/2 & 0 \\ 0 & 0\end{bmatrix}$,得 $\boldsymbol{A}^+ = \begin{bmatrix}1/4 & 1/4 \\ 1/4 & 1/4\end{bmatrix}$。
验证:$\boldsymbol{A}\boldsymbol{A}^+\boldsymbol{A} = \boldsymbol{A}$,$\boldsymbol{A}^+\boldsymbol{A}\boldsymbol{A}^+ = \boldsymbol{A}^+$。
5. 与前后的联系
- 前承:本章内容是后续第3章(概率论)、第4章(数值计算)的基础。例如,概率论中的协方差矩阵需用到矩阵运算和特征分解;数值计算中的优化问题涉及梯度、Hessian矩阵等。
- 后续应用:
- 第5章机器学习基础中,线性回归的解析解用到伪逆。
- 第6章深度前馈网络中的反向传播依赖矩阵微分。
- 第7章正则化中的 $L^2$ 正则化(权重衰减)可通过矩阵求导分析。
- 第9章卷积网络本质上是用卷积操作代替矩阵乘法,但底层的线性代数思想一致。
- 第13章线性因子模型、第14章自编码器、第20章深度生成模型等,都大量使用特征分解、SVD等工具。
6. 总结与重点
6.1 核心要点
- 线性代数是深度学习的“语言”:所有数据、运算、优化都建立在此之上。
- 基本对象层次:标量 < 向量 < 矩阵 < 张量,需理解各自的使用场景。
- 关键运算:矩阵乘法是神经网络的核心(加权求和);广播机制简化代码;范数衡量大小。
- 矩阵分解是理解数据结构的利器:
- 特征分解揭示了矩阵的“本质方向”(特征向量)和“强度”(特征值)。
- SVD 通用性更强,适用于任何矩阵,是 PCA、伪逆的基础。
- PCA 是理论与实践的完美结合:通过特征分解找到最佳投影方向,实现降维。
6.2 常见难点
- 矩阵乘法的非交换性:初学者容易误以为 $\boldsymbol{A}\boldsymbol{B} = \boldsymbol{B}\boldsymbol{A}$,需通过大量练习建立正确直觉。
- 特征值与特征向量的几何意义:不仅要会计算,更要理解它们代表了矩阵作用在空间中的“主轴”和“伸缩系数”。
- 奇异值分解与特征分解的关系:容易混淆,要记住 SVD 对非方阵也适用,且奇异值总是非负的。
- 伪逆的作用:不仅要掌握公式,还要明白它在解线性方程组时的最小范数/最小二乘意义。
6.3 学习建议
- 动手计算:对简单的2×2矩阵手动进行乘法、求逆、特征分解,加深理解。
- 联系实际:将每个概念与深度学习中的具体操作挂钩(如权重矩阵就是矩阵,卷积核可视为小矩阵,特征映射对应特征向量)。
- 善用编程验证:使用 Python 的 NumPy 库实现矩阵运算、SVD、PCA,将抽象符号转化为具体代码。
- 绘制概念图:自己画出本章的知识结构图,厘清各概念间的包含与递进关系。
通过以上讲解,希望你不仅掌握了线性代数的基本概念,更理解了它们在深度学习中的核心地位。下一章我们将进入概率论,它是处理不确定性和信息量的数学工具,同样无处不在。
《深度学习》(Ian Goodfellow 著)第3章“概率与信息论”详细讲解
1. 本章概述与定位
概率论和信息论是深度学习的核心数学工具。现实世界充满不确定性,而概率论为我们提供了量化不确定性的语言和推理规则。信息论则帮助我们量化不确定性本身,并衡量概率分布之间的差异。本章为全书所有涉及不确定性的内容(如噪声数据、随机模型、贝叶斯推断、最大似然估计、正则化、生成模型等)奠定基础。无论你是想理解模型为何能够泛化,还是想设计新的损失函数,本章的知识都不可或缺。
2. 由浅入深:从不确定性到概率论
2.1 为什么要使用概率?(3.1)
核心问题:为什么机器学习必须处理不确定性?
不确定性的三大来源:
- 系统内在的随机性:例如量子力学中粒子位置的不可预测性,或者我们假设一个游戏中的扑克牌是真正随机洗牌的。
- 不完全观测:即使系统本质是确定的,我们无法观测所有变量,也会导致不确定性。例如蒙提霍尔问题中,参赛者不知道门后的奖品,只能根据有限信息做出概率推断。
- 不完备建模:当我们使用简化模型时,会丢弃信息,导致预测不确定。例如用离散网格表示连续空间,物体位置只能在一个单元格内,无法精确定位。
概率论的作用:概率论提供了一套形式化的规则,让我们可以在不确定的情况下进行推理和决策。它不仅仅是描述随机事件的频率(频率派概率),也可以表示我们对命题的相信程度(贝叶斯派概率)。本书主要使用概率论来设计AI算法,使其能够量化不确定性并进行合理决策。
2.2 随机变量(3.2)
定义:随机变量是可以随机取不同值的变量。我们通常用普通小写字母(如 $x$)表示变量本身,用脚本字体(如 $\mathrm{x}$)表示其可能取的值。随机变量可以是离散的(取值有限或可数无穷)或连续的(取值为实数)。
例子:
- 抛一枚硬币,结果可以是正面或反面,这是一个离散随机变量。
- 测量一个人的身高,这是一个连续随机变量(理论上可以取任意实数值,尽管我们通常只测量到厘米)。
2.3 概率分布(3.3)
概率分布描述了随机变量取每个可能值的概率。
2.3.1 离散型随机变量与概率质量函数(PMF)
- 定义:概率质量函数 $P(\mathrm{x}=x)$ 给出了随机变量 $\mathrm{x}$ 取值为 $x$ 的概率。
- 性质:
- $0 \le P(x) \le 1$。
- $\sum_x P(x) = 1$(归一化)。
- 联合概率分布:多个随机变量的概率分布称为联合分布,如 $P(\mathrm{x}=x, \mathrm{y}=y)$。
- 例子:抛一枚公平硬币,$P(\text{正面}) = 0.5, P(\text{反面}) = 0.5$。掷一个公平的六面骰子,$P(\text{点数为}i) = 1/6, i=1,\dots,6$。
2.3.2 连续型随机变量与概率密度函数(PDF)
- 定义:概率密度函数 $p(x)$ 满足:
- $p(x) \ge 0$。
- $\int p(x) dx = 1$。
- 解释:$p(x)$ 本身不是概率,而是概率密度。随机变量落在某个无穷小区间 $[x, x+dx]$ 内的概率为 $p(x)dx$。
- 例子:均匀分布 $U(a,b)$ 的概率密度函数为 $p(x) = 1/(b-a)$ 对于 $x \in [a,b]$,否则为 0。
2.4 边缘概率(3.4)
定义:从联合分布中,通过求和(离散)或积分(连续)消去其他变量,得到某个变量子集的概率分布。
- 离散:$P(\mathrm{x}=x) = \sum_y P(\mathrm{x}=x, \mathrm{y}=y)$。
- 连续:$p(x) = \int p(x,y) dy$。
例子:假设有一个联合分布 $P(\text{天气}, \text{心情})$,我们想得到 $P(\text{天气})$,只需对所有心情求和。
2.5 条件概率(3.5)
定义:给定某个事件发生时,另一事件发生的概率。公式为:
$$ P(\mathrm{y}=y \mid \mathrm{x}=x) = \frac{P(\mathrm{y}=y, \mathrm{x}=x)}{P(\mathrm{x}=x)} $$要求 $P(\mathrm{x}=x) > 0$。
解释:条件概率缩小了样本空间,只考虑满足条件的事件。
例子:已知今天下雨($\mathrm{x}=下雨$),求明天也下雨的概率 $P(\mathrm{y}=下雨 \mid \mathrm{x}=下雨)$。如果下雨天中第二天仍然下雨的概率是 0.6,则条件概率为 0.6。
重要区分:条件概率不同于“干预”。干预询问“如果我们让某事件发生,结果会怎样”,这需要因果模型,本书不讨论。
2.6 条件概率的链式法则(3.6)
定义:任何联合概率分布可以分解为一系列条件概率的乘积:
$$ P(\mathrm{x}^{(1)}, \mathrm{x}^{(2)}, \dots, \mathrm{x}^{(n)}) = P(\mathrm{x}^{(1)}) \prod_{i=2}^n P(\mathrm{x}^{(i)} \mid \mathrm{x}^{(1)}, \dots, \mathrm{x}^{(i-1)}) $$这直接来自条件概率的定义。
例子:对于三个变量 $a,b,c$:
$$ P(a,b,c) = P(a \mid b,c) P(b \mid c) P(c) $$链式法则是构建许多概率模型(如自回归模型、RNN语言模型)的基础。
2.7 独立性与条件独立性(3.7)
独立性:两个随机变量 $\mathrm{x}$ 和 $\mathrm{y}$ 独立,如果
$$ P(\mathrm{x}=x, \mathrm{y}=y) = P(\mathrm{x}=x) P(\mathrm{y}=y) \quad \forall x,y $$记为 $\mathrm{x} \perp \mathrm{y}$。
条件独立性:给定 $\mathrm{z}$ 时,$\mathrm{x}$ 和 $\mathrm{y}$ 条件独立,如果
$$ P(\mathrm{x}=x, \mathrm{y}=y \mid \mathrm{z}=z) = P(\mathrm{x}=x \mid \mathrm{z}=z) P(\mathrm{y}=y \mid \mathrm{z}=z) \quad \forall x,y,z $$记为 $\mathrm{x} \perp \mathrm{y} \mid \mathrm{z}$。
例子:
- 抛两次硬币,结果独立。
- 考虑两个事件:今天下雨($\mathrm{x}$)和明天地震($\mathrm{y}$)。它们可能是独立的。但给定“明天有地震预警”($\mathrm{z}$),$\mathrm{x}$ 和 $\mathrm{y}$ 可能不再独立,因为预警的出现会同时影响对地震和天气的信念(但这只是例子,实际上不成立)。
2.8 期望、方差与协方差(3.8)
这些是描述概率分布的数字特征。
期望(Expectation):函数 $f$ 关于分布 $P$ 的期望是平均取值。
- 离散:$\mathbb{E}_{\mathrm{x}\sim P}[f(x)] = \sum_x P(x) f(x)$。
- 连续:$\mathbb{E}_{\mathrm{x}\sim p}[f(x)] = \int p(x) f(x) dx$。
- 线性:$\mathbb{E}[\alpha f + \beta g] = \alpha\mathbb{E}[f] + \beta\mathbb{E}[g]$。
方差(Variance):衡量函数值围绕期望的离散程度。
$$ \mathrm{Var}(f(x)) = \mathbb{E}\left[(f(x) - \mathbb{E}[f(x)])^2\right] $$方差大表示取值分散,方差小表示集中。
协方差(Covariance):衡量两个变量线性相关的程度。
$$ \mathrm{Cov}(f(x), g(y)) = \mathbb{E}[(f(x)-\mathbb{E}[f(x)])(g(y)-\mathbb{E}[g(y)])] $$协方差为正表示正相关,负表示负相关,零不一定独立(可能有非线性关系)。
协方差矩阵:对于随机向量 $\boldsymbol{x} \in \mathbb{R}^n$,协方差矩阵是一个 $n \times n$ 矩阵,其元素 $\mathrm{Cov}(\boldsymbol{x})_{i,j} = \mathrm{Cov}(\mathrm{x}_i, \mathrm{x}_j)$。对角线是方差。
例子:掷骰子,点数的期望是 $ (1+2+3+4+5+6)/6 = 3.5$。方差是 $\frac{1}{6}\sum_{i=1}^6 (i-3.5)^2 \approx 2.92$。
2.9 常用概率分布(3.9)
本节介绍在机器学习中频繁出现的几种分布。
2.9.1 伯努利分布(Bernoulli Distribution)
- 描述:单个二进制随机变量(0或1)的分布。
- 参数:$\phi \in [0,1]$,表示取值为1的概率。
- 公式:$P(\mathrm{x}=1) = \phi$,$P(\mathrm{x}=0) = 1-\phi$。
- 期望与方差:$\mathbb{E}[\mathrm{x}] = \phi$,$\mathrm{Var}(\mathrm{x}) = \phi(1-\phi)$。
2.9.2 多项分布(Multinoulli Distribution)
- 描述:单个离散随机变量,有 $k$ 个可能的取值(分类分布)。
- 参数:向量 $\boldsymbol{p} \in [0,1]^{k-1}$,其中 $p_i$ 是第 $i$ 类的概率,最后一类概率由 $1-\sum_{i=1}^{k-1} p_i$ 确定。
- 应用:用于表示分类问题中每个类别的概率。
2.9.3 高斯分布(Gaussian Distribution)
- 描述:最常用的连续分布,又称正态分布。
- 单变量形式:$\mathcal{N}(x; \mu, \sigma^2) = \sqrt{\frac{1}{2\pi\sigma^2}} \exp\left(-\frac{1}{2\sigma^2}(x-\mu)^2\right)$。
- $\mu$:均值(期望)。
- $\sigma$:标准差,$\sigma^2$ 方差。
- 多变量形式:$\mathcal{N}(\boldsymbol{x}; \boldsymbol{\mu}, \boldsymbol{\Sigma}) = \sqrt{\frac{1}{(2\pi)^n \det(\boldsymbol{\Sigma})}} \exp\left(-\frac{1}{2}(\boldsymbol{x}-\boldsymbol{\mu})^\top \boldsymbol{\Sigma}^{-1} (\boldsymbol{x}-\boldsymbol{\mu})\right)$。
- $\boldsymbol{\mu}$:均值向量。
- $\boldsymbol{\Sigma}$:协方差矩阵(正定对称)。
- 为什么常用:
- 中心极限定理:大量独立随机变量的和近似服从高斯分布。
- 在给定方差下,高斯分布具有最大熵(最不确定),因此是对真实分布最“无偏”的假设。
2.9.4 指数分布与拉普拉斯分布
- 指数分布:$p(x;\lambda) = \lambda \mathbf{1}_{x\ge 0} \exp(-\lambda x)$,用于建模等待时间等非负量。
- 拉普拉斯分布:$\mathrm{Laplace}(x;\mu,\gamma) = \frac{1}{2\gamma} \exp\left(-\frac{|x-\mu|}{\gamma}\right)$,在 $\mu$ 处有一个尖峰,常用于稀疏诱导先验(如 L1 正则化)。
2.9.5 狄拉克分布与经验分布
- 狄拉克δ函数:$\delta(x-\mu)$ 是一个广义函数,表示所有概率质量集中在 $\mu$ 点。用于定义经验分布。
- 经验分布:给定数据集 $\{\boldsymbol{x}^{(1)},\dots,\boldsymbol{x}^{(m)}\}$,经验分布为 $\hat{p}(\boldsymbol{x}) = \frac{1}{m}\sum_{i=1}^m \delta(\boldsymbol{x} - \boldsymbol{x}^{(i)})$。它将概率质量均匀分配给每个数据点。
2.9.6 混合分布
- 定义:由多个“成分分布”混合而成。首先从一个多项分布中选一个成分,然后从该成分中抽样。 $$ P(\mathrm{x}) = \sum_i P(\mathrm{c}=i) P(\mathrm{x} \mid \mathrm{c}=i) $$
- 例子:高斯混合模型(GMM),每个成分是高斯分布,广泛用于聚类和密度估计。
2.10 常用函数的有用性质(3.10)
本节介绍在深度学习中频繁出现的两个函数及其性质。
logistic sigmoid 函数:
$$ \sigma(x) = \frac{1}{1 + \exp(-x)} $$性质:
- 将实数映射到 (0,1),常用于表示概率(如伯努利分布的参数 $\phi$)。
- 导数:$\frac{d}{dx}\sigma(x) = \sigma(x)(1-\sigma(x))$。
- $\sigma(-x) = 1 - \sigma(x)$。
- $\log\sigma(x) = -\zeta(-x)$,其中 $\zeta$ 是 softplus。
softplus 函数:
$$ \zeta(x) = \log(1 + \exp(x)) $$性质:
- 导数:$\frac{d}{dx}\zeta(x) = \sigma(x)$。
- 它是正部函数 $x^+ = \max(0,x)$ 的平滑近似。
- $\zeta(x) - \zeta(-x) = x$。
这些函数在神经网络激活函数、损失函数推导中非常常见。
2.11 贝叶斯规则(3.11)
定义:给定 $P(\mathrm{y} \mid \mathrm{x})$,$P(\mathrm{x})$,我们可以计算后验概率:
$$ P(\mathrm{x} \mid \mathrm{y}) = \frac{P(\mathrm{x}) P(\mathrm{y} \mid \mathrm{x})}{P(\mathrm{y})} $$其中 $P(\mathrm{y}) = \sum_x P(\mathrm{y} \mid \mathrm{x}) P(\mathrm{x})$(离散)或积分(连续)。
意义:贝叶斯规则让我们能够根据观测数据更新对未知变量的信念。这是贝叶斯统计和许多机器学习算法的核心。
例子:假设某种疾病的患病率 $P(\text{疾病})=0.01$。有一种检测方法,灵敏度 $P(\text{阳性} \mid \text{疾病}) = 0.99$,假阳性率 $P(\text{阳性} \mid \text{无病}) = 0.05$。如果某人检测结果为阳性,那么他真正患病的概率为:
$$ P(\text{疾病} \mid \text{阳性}) = \frac{0.01 \times 0.99}{0.01\times 0.99 + 0.99\times 0.05} \approx 0.167 $$这个结果往往出乎意料,但贝叶斯规则给出了正确的量化。
2.12 连续型变量的技术细节(3.12)
本节简要介绍测度论的一些概念,以确保对连续概率的严格理解。
- 测度论:处理连续变量时,必须小心某些“病态”集合,它们可能导致概率悖论。测度论定义了哪些集合是“可测的”,从而避免悖论。
- 零测集:体积为零的集合,如 $\mathbb{R}^2$ 中的一条线,其概率为零。一个性质若在除了零测集外所有点成立,则称“几乎处处”成立。
- 变量变换:当随机变量 $\boldsymbol{y} = g(\boldsymbol{x})$,且 $g$ 可逆时,概率密度变换公式为: $$ p_{\boldsymbol{x}}(\boldsymbol{x}) = p_{\boldsymbol{y}}(g(\boldsymbol{x})) \left| \det\left(\frac{\partial g(\boldsymbol{x})}{\partial \boldsymbol{x}}\right) \right| $$ 这是因为变换会拉伸或压缩空间,需要雅可比行列式来调整概率密度。这是理解变分自编码器(VAE)中重参数化技巧的基础。
2.13 信息论(3.13)
信息论提供了量化信息的方法,与概率论紧密相连。
自信息:事件 $\mathrm{x}=x$ 的自信息为 $I(x) = -\log P(x)$。
- 性质:概率越小,信息量越大;独立事件的信息可加。
- 单位:若以 $e$ 为底,单位是奈特(nat);以 2 为底,单位是比特(bit)。
香农熵:分布 $P$ 的熵是平均自信息:
$$ H(\mathrm{x}) = \mathbb{E}_{\mathrm{x}\sim P}[I(x)] = -\mathbb{E}_{\mathrm{x}\sim P}[\log P(x)] $$熵度量了分布的不确定性。确定性分布熵为 0,均匀分布熵最大。
KL散度(相对熵):衡量两个分布 $P$ 和 $Q$ 的差异。
$$ D_{\mathrm{KL}}(P\|Q) = \mathbb{E}_{\mathrm{x}\sim P}\left[\log \frac{P(x)}{Q(x)}\right] $$性质:
- 非负,且等于 0 当且仅当 $P=Q$ 几乎处处成立。
- 不对称:$D_{\mathrm{KL}}(P\|Q) \neq D_{\mathrm{KL}}(Q\|P)$。
- 可以解释为用分布 $Q$ 编码来自 $P$ 的样本时所需的额外比特数。
交叉熵:
$$ H(P,Q) = H(P) + D_{\mathrm{KL}}(P\|Q) = -\mathbb{E}_{\mathrm{x}\sim P}[\log Q(x)] $$在机器学习中,最小化交叉熵等价于最小化 KL 散度(因为 $H(P)$ 是常数)。这就是分类问题中常用的交叉熵损失函数。
例子:二分类问题,真实分布 $P$ 是 one-hot(例如 $P(1)=1, P(0)=0$),模型预测为 $Q$,则交叉熵 $H(P,Q) = -\log Q(1)$,即负对数似然。
2.14 结构化概率模型(3.14)
当随机变量很多时,直接表示联合分布需要指数级参数。结构化概率模型(图模型)利用变量间的(条件)独立性来分解联合分布,减少参数。
- 有向图模型(贝叶斯网络):用有向无环图表示因果关系,联合分布分解为每个节点在给定父节点下的条件概率的乘积: $$ p(\boldsymbol{x}) = \prod_i p(x_i \mid \text{Pa}(x_i)) $$
- 无向图模型(马尔可夫随机场):用无向图表示变量间的相互作用,联合分布分解为多个因子(势函数)的乘积,再除以归一化常数(配分函数): $$ p(\boldsymbol{x}) = \frac{1}{Z} \prod_{\mathcal{C}} \phi^{(\mathcal{C})}(\mathcal{C}) $$
作用:结构化概率模型是后续章节(如第16章)深入讨论的基础。在本书前两部分,仅将其作为描述算法依赖关系的语言。
3. 知识体系图
4. 实例辅助
条件概率:设 $\mathrm{x}$ 表示天气(晴/雨),$\mathrm{y}$ 表示带伞与否。已知 $P(\text{晴})=0.7, P(\text{雨})=0.3$,$P(\text{带伞} \mid \text{雨}) = 0.9, P(\text{带伞} \mid \text{晴})=0.1$。则某人带伞的概率 $P(\text{带伞}) = 0.7\times0.1 + 0.3\times0.9 = 0.34$。
链式法则:文本生成中,生成句子“I love deep learning”的概率可以分解为 $P(\text{I}) \times P(\text{love} \mid \text{I}) \times P(\text{deep} \mid \text{I, love}) \times P(\text{learning} \mid \text{I, love, deep})$。
协方差:两个随机变量 $\mathrm{x}$ 和 $\mathrm{y}$ 的协方差为 0 不一定独立,例如 $\mathrm{x}$ 在 $[-1,1]$ 均匀分布,$\mathrm{y} = \mathrm{x}^2$,则协方差为 0(因为对称性),但显然不独立。
高斯混合:用两个高斯分布(一个均值-2,一个均值+2)混合可以建模双峰分布。
KL散度不对称:设 $P$ 是两个高斯混合,$Q$ 是单高斯。最小化 $D_{\mathrm{KL}}(P\|Q)$ 会使 $Q$ 覆盖 $P$ 的两个峰(试图拟合所有模式),而最小化 $D_{\mathrm{KL}}(Q\|P)$ 会使 $Q$ 选择其中一个峰拟合(避免在低概率区域放置质量)。这对应于图 3.6。
5. 与前后的联系
- 前承:第2章线性代数为本章的协方差矩阵、高斯分布等提供了基础。
- 后续应用:
- 第5章机器学习基础:最大似然估计(基于似然)、贝叶斯估计(基于贝叶斯规则)、正则化(可解释为MAP)。
- 第6章深度前馈网络:输出层常使用 softmax 产生概率分布,损失函数为交叉熵。
- 第7章正则化:KL散度可用于理解变分推断,贝叶斯先验对应权重衰减。
- 第13-20章:生成模型(VAE、GAN、玻尔兹曼机)大量依赖概率图模型、变分推断和信息论。
- 信息论:贯穿全书,用于设计损失函数、评估模型(如困惑度)、理解信息瓶颈等。
6. 总结与重点
6.1 核心要点
- 概率论是处理不确定性的语言:随机变量、分布、边缘/条件概率、独立/条件独立构成基础词汇。
- 链式法则:任何联合分布可以分解,是自回归模型的核心。
- 贝叶斯规则:提供了根据数据更新信念的方法,是贝叶斯统计的基石。
- 常用分布:伯努利、多项、高斯、指数、拉普拉斯、狄拉克、混合分布,各自有适用场景。
- 信息论:熵衡量不确定性,KL散度衡量分布差异,交叉熵是常用的损失函数。
- 结构化概率模型:利用独立性简化联合分布,为复杂模型提供框架。
6.2 常见难点
- 概率密度函数的理解:$p(x)$ 不是概率,而是密度。初学者容易混淆 $p(x)$ 和概率 $P(\mathrm{x}=x)$(后者对于连续变量为0)。
- 条件概率与联合概率的转换:链式法则容易记错顺序。
- 独立性与协方差的关系:协方差为0不一定独立,独立一定协方差为0(在一定条件下)。
- KL散度的不对称性:这是许多变分推断方法(如VAE)的核心,需要理解两种方向的不同结果。
- 变量变换的雅可比:在生成模型中(如Normalizing Flows)至关重要,需要掌握。
6.3 学习建议
- 多做练习:手动计算一些简单分布的期望、方差、KL散度,加深理解。
- 联系实际:将每个分布与常见的机器学习概念对应(如伯努利对应二分类,高斯对应MSE损失,拉普拉斯对应L1损失)。
- 可视化:用Python绘制常见分布的PDF、PMF,观察形状变化。
- 动手推导:尝试从基本定义推导贝叶斯公式、链式法则、变量变换公式。
- 思考不对称性:在阅读后续章节时,时刻注意 KL 散度方向的选择(如变分推断中使用的 $D_{\mathrm{KL}}(q\|p)$ 还是 $D_{\mathrm{KL}}(p\|q)$ 及其含义)。
通过本章的学习,你已经掌握了处理不确定性的数学工具。下一章将介绍数值计算,这是将概率模型实际应用于计算机时必须面对的实现问题。
《深度学习》(Ian Goodfellow 著)第4章“数值计算”详细讲解
1. 本章概述与定位
在深度学习中,我们处理的数学模型大多基于连续数学(实数、函数、导数等),而计算机只能以有限的精度表示实数,进行近似计算。这种离散性与连续性的矛盾,使得数值计算问题成为实现深度学习算法时必须面对的核心挑战。本章旨在介绍数值计算中的关键问题,以及如何设计和实现算法来避免或减轻这些问题。
核心问题:如何在有限精度下可靠地实现数学运算,确保算法的稳定性与正确性?
本章首先讨论数值误差的两种主要形式——溢出与下溢,然后介绍病态条件这一衡量问题对误差敏感度的概念。接着,本章将重点转向基于梯度的优化——这是绝大多数深度学习算法的核心。最后,介绍约束优化,并以线性最小二乘作为实例,展示如何将前述概念应用于具体问题。
2. 由浅入深:从数值误差到优化算法
2.1 基本概念:为什么数值计算如此重要?
数学公式在纸面上是完美的,但在计算机中实现时,由于浮点数精度的限制,会引入舍入误差。这些误差在大量运算后可能累积放大,导致算法失效。因此,我们必须了解误差的来源,并设计数值稳定的算法。
2.1.1 溢出(Overflow)与下溢(Underflow)(4.1)
- 下溢:当接近零的数被四舍五入为零时发生。许多函数在零附近的行为与正数附近截然不同,例如除以零或取对数($\log 0 = -\infty$)会引发程序错误。
- 溢出:当数值极大,超出浮点表示范围时,被近似为无穷大($\infty$),后续运算通常会产生 NaN(Not a Number)。
例子:softmax 函数的数值稳定性 softmax 函数定义为:
$$ \text{softmax}(\boldsymbol{x})_i = \frac{\exp(x_i)}{\sum_{j=1}^n \exp(x_j)} $$当所有 $x_i$ 都很大时(如 $x_i = 1000$),$\exp(1000)$ 会溢出;当所有 $x_i$ 都很小时(如 $x_i = -1000$),$\exp(-1000)$ 会下溢,分母可能变为零。 解决方案:计算 $\text{softmax}(\boldsymbol{z})$,其中 $z_i = x_i - \max_k x_k$。这样,最大的指数变为 $\exp(0)=1$,避免了溢出;同时分母至少包含一个 1,不会下溢到零。但分子的下溢仍可能导致整体为零,因此对于 $\log \text{softmax}$,应直接计算稳定版本,而不是先算 softmax 再取 log。
2.1.2 病态条件(Conditioning)(4.2)
定义:条件数衡量一个函数对于输入微小变化的敏感程度。对于矩阵求逆问题 $f(\boldsymbol{x}) = \boldsymbol{A}^{-1}\boldsymbol{x}$,条件数为 $\max_{i,j} |\lambda_i / \lambda_j|$,即最大与最小特征值之比。条件数很大时,称为病态。
意义:病态问题中,输入数据的微小误差(如测量噪声)会被放大,导致输出结果不可靠。即使算法本身精确,病态问题的固有性质也会导致解不稳定。
例子:考虑矩阵 $\boldsymbol{A} = \begin{bmatrix} 1 & 1 \\ 1 & 1.0001 \end{bmatrix}$,其特征值约为 $2.0001$ 和 $0.0001$,条件数约 20000。求解 $\boldsymbol{A}\boldsymbol{x} = \boldsymbol{b}$ 时,$\boldsymbol{b}$ 的微小变化会导致 $\boldsymbol{x}$ 的巨大变化。
2.2 基于梯度的优化(4.3)
优化是寻找最小化(或最大化)某个函数 $f(\boldsymbol{x})$ 的参数 $\boldsymbol{x}$。在深度学习中,我们通常最小化损失函数。
2.2.1 导数与梯度(Derivative & Gradient)
- 导数(一元函数):$f'(x)$ 表示函数在 $x$ 处的斜率,指导如何改变 $x$ 以减小 $f(x)$:$f(x - \epsilon f'(x)) \approx f(x) - \epsilon (f'(x))^2 < f(x)$。
- 梯度(多元函数):$\nabla_{\boldsymbol{x}} f(\boldsymbol{x})$ 是一个向量,每个分量为偏导数。它指向函数值增加最快的方向,负梯度则指向下降最快的方向。
2.2.2 方向导数与最速下降
- 方向导数:沿单位向量 $\boldsymbol{u}$ 的斜率,为 $\boldsymbol{u}^\top \nabla_{\boldsymbol{x}} f(\boldsymbol{x})$。
- 最速下降:选择使方向导数最小的 $\boldsymbol{u}$,即 $\boldsymbol{u} = -\nabla_{\boldsymbol{x}} f(\boldsymbol{x}) / \|\nabla_{\boldsymbol{x}} f(\boldsymbol{x})\|$,因此更新公式为 $\boldsymbol{x}' = \boldsymbol{x} - \epsilon \nabla_{\boldsymbol{x}} f(\boldsymbol{x})$,其中 $\epsilon$ 是学习率。
2.2.3 临界点与最值
- 临界点:梯度为零的点,包括局部最小值、局部最大值、鞍点。
- 局部最小:附近所有点都比它大。
- 局部最大:附近所有点都比它小。
- 鞍点:既有比它大的方向,也有比它小的方向。
- 全局最小:整个定义域上的最小值。在深度学习中,我们通常满足于找到“足够低”的值。
2.2.4 二阶导数与曲率
- 二阶导数:衡量一阶导数如何变化,即曲率。
- 海森矩阵(Hessian):$\boldsymbol{H}(f)(\boldsymbol{x})_{i,j} = \frac{\partial^2}{\partial x_i \partial x_j} f(\boldsymbol{x})$,是梯度的雅可比矩阵。若二阶偏导连续,海森矩阵对称。
- 曲率的影响:二阶导数的信息可以帮助预测梯度下降的步长是否合适。对 $f(\boldsymbol{x})$ 做二阶泰勒展开: $$ f(\boldsymbol{x}) \approx f(\boldsymbol{x}^{(0)}) + (\boldsymbol{x}-\boldsymbol{x}^{(0)})^\top \boldsymbol{g} + \frac{1}{2} (\boldsymbol{x}-\boldsymbol{x}^{(0)})^\top \boldsymbol{H} (\boldsymbol{x}-\boldsymbol{x}^{(0)}) $$ 沿负梯度方向更新 $\boldsymbol{x} = \boldsymbol{x}^{(0)} - \epsilon \boldsymbol{g}$,代入得: $$ f(\boldsymbol{x}^{(0)}-\epsilon \boldsymbol{g}) \approx f(\boldsymbol{x}^{(0)}) - \epsilon \boldsymbol{g}^\top \boldsymbol{g} + \frac{1}{2} \epsilon^2 \boldsymbol{g}^\top \boldsymbol{H} \boldsymbol{g} $$ 若 $\boldsymbol{g}^\top \boldsymbol{H} \boldsymbol{g}$ 很大(正曲率),则步长 $\epsilon$ 需要很小以避免越过最小值;若为负(负曲率),梯度下降可能会加速下降。最优步长近似为 $\epsilon^* = \frac{\boldsymbol{g}^\top \boldsymbol{g}}{\boldsymbol{g}^\top \boldsymbol{H} \boldsymbol{g}}$。
2.2.5 海森矩阵与临界点类型
通过海森矩阵的特征值可以判断临界点类型:
- 所有特征值 > 0:局部最小。
- 所有特征值 < 0:局部最大。
- 特征值有正有负:鞍点。
- 有零特征值:无法判断。
2.2.6 条件数与牛顿法
- 条件数(对海森矩阵):最大特征值与最小特征值之比。条件数大意味着不同方向的曲率差异大,梯度下降会在窄谷中来回震荡(见图4.6)。
- 牛顿法:利用海森矩阵的逆来修正梯度方向,直接跳到二阶近似的极小点: $$ \boldsymbol{x}^* = \boldsymbol{x}^{(0)} - \boldsymbol{H}^{-1} \nabla_{\boldsymbol{x}} f(\boldsymbol{x}^{(0)}) $$ 牛顿法在局部最小附近收敛快,但在鞍点处会被吸引(因为海森矩阵有负特征值)。此外,计算和存储海森矩阵的逆在大规模问题中不现实。
2.2.7 优化算法的分类
- 一阶方法:仅使用梯度(如梯度下降)。
- 二阶方法:使用海森矩阵(如牛顿法)。
2.2.8 Lipschitz 连续与凸优化
- Lipschitz 连续:函数变化率有界,即 $|f(\boldsymbol{x}) - f(\boldsymbol{y})| \le \mathcal{L} \|\boldsymbol{x} - \boldsymbol{y}\|$。这保证梯度下降的稳定性。
- 凸优化:对凸函数(海森矩阵半正定),所有局部最小都是全局最小,且有许多高效算法。然而深度学习中的损失函数通常是非凸的,凸优化仅作为子程序。
2.3 约束优化(4.4)
实际问题中,参数往往受限于某个集合 $\mathbb{S}$(如权重范数不能太大)。我们希望在满足约束的条件下最小化函数。
2.3.1 简单方法:投影
- 每次梯度下降后,将 $\boldsymbol{x}$ 投影回可行域 $\mathbb{S}$(如裁剪权重到范数限制内)。
2.3.2 重参数化
- 将约束通过变量替换转化为无约束问题。例如,要求 $\|\boldsymbol{x}\|_2 = 1$,可令 $\boldsymbol{x} = [\cos\theta, \sin\theta]^\top$,优化 $\theta$。
2.3.3 广义拉格朗日函数与KKT条件
- KKT(Karush-Kuhn-Tucker)方法:将约束问题转化为无约束问题。引入拉格朗日乘子 $\lambda_i$(等式约束)和 $\alpha_j \ge 0$(不等式约束),定义广义拉格朗日函数: $$ L(\boldsymbol{x}, \boldsymbol{\lambda}, \boldsymbol{\alpha}) = f(\boldsymbol{x}) + \sum_i \lambda_i g^{(i)}(\boldsymbol{x}) + \sum_j \alpha_j h^{(j)}(\boldsymbol{x}) $$ 其中 $g^{(i)}$ 为等式约束,$h^{(j)}$ 为不等式约束。
- 原始问题:$\min_{\boldsymbol{x}} \max_{\boldsymbol{\lambda}} \max_{\boldsymbol{\alpha}, \boldsymbol{\alpha} \ge 0} L(\boldsymbol{x}, \boldsymbol{\lambda}, \boldsymbol{\alpha})$ 等价于约束优化,因为违反约束时内层最大化会趋于无穷,迫使解满足约束。
2.4 实例:线性最小二乘(4.5)
问题:最小化 $f(\boldsymbol{x}) = \frac{1}{2} \|\boldsymbol{A}\boldsymbol{x} - \boldsymbol{b}\|_2^2$。
- 无约束解:梯度 $\nabla_{\boldsymbol{x}} f = \boldsymbol{A}^\top(\boldsymbol{A}\boldsymbol{x} - \boldsymbol{b})$,令其为零得正规方程 $\boldsymbol{A}^\top\boldsymbol{A}\boldsymbol{x} = \boldsymbol{A}^\top\boldsymbol{b}$,解为 $\boldsymbol{x} = (\boldsymbol{A}^\top\boldsymbol{A})^{-1}\boldsymbol{A}^\top\boldsymbol{b}$。
- 约束版本:如 $\|\boldsymbol{x}\|_2^2 \le 1$。拉格朗日函数为 $L(\boldsymbol{x}, \lambda) = \frac{1}{2}\|\boldsymbol{A}\boldsymbol{x} - \boldsymbol{b}\|_2^2 + \lambda(\boldsymbol{x}^\top\boldsymbol{x} - 1)$,$\lambda \ge 0$。 求导得 $(\boldsymbol{A}^\top\boldsymbol{A} + 2\lambda \boldsymbol{I})\boldsymbol{x} = \boldsymbol{A}^\top\boldsymbol{b}$,即 $\boldsymbol{x} = (\boldsymbol{A}^\top\boldsymbol{A} + 2\lambda \boldsymbol{I})^{-1}\boldsymbol{A}^\top\boldsymbol{b}$。 通过调整 $\lambda$ 使得范数满足约束(若未约束解已满足,则 $\lambda=0$,否则需增大 $\lambda$ 直到范数正好为1)。这体现了正则化(岭回归)的思想。
3. 知识体系图
4. 实例辅助理解
4.1 溢出与下溢:softmax 稳定化
| |
4.2 病态条件:解线性方程组
| |
4.3 梯度下降与曲率
考虑二次函数 $f(x) = \frac{1}{2} a x^2$,梯度 $f'(x) = ax$,海森 $H = a$。梯度下降更新 $x' = x - \epsilon a x = (1 - \epsilon a)x$。当 $\epsilon > 2/a$ 时,更新会越过最小值并发散。若 $a$ 很大(强曲率),则需要很小的学习率。
4.4 约束优化:权重衰减
在线性回归中,加入 $L^2$ 正则化等价于在拉格朗日函数中加入约束 $\|\boldsymbol{w}\|^2 \le C$。解为 $\boldsymbol{w} = (\boldsymbol{X}^\top\boldsymbol{X} + \lambda \boldsymbol{I})^{-1}\boldsymbol{X}^\top \boldsymbol{y}$,这正是岭回归公式,其中 $\lambda$ 由约束 $C$ 决定。
5. 与前后的联系
- 前承:第2章线性代数提供了矩阵运算、特征分解等基础,第3章概率论提供了不确定性描述。本章的数值计算技术依赖于这些基础,例如海森矩阵的特征值分析用到第2章的知识。
- 后续应用:
- 第5章机器学习基础:梯度下降是训练几乎所有模型的核心算法。
- 第6章深度前馈网络:反向传播算法基于梯度计算,需要数值稳定性。
- 第7章正则化:权重衰减的拉格朗日解释直接联系本章的约束优化。
- 第8章优化:本章是第8章优化算法的基石,第8章会深入讨论动量、自适应学习率等高级方法。
- 第11章实践方法论:调试策略中包括检查梯度范数,防止溢出/下溢。
6. 总结与重点
6.1 核心要点
- 数值稳定性是实现深度学习算法不可忽视的基础问题,必须处理溢出和下溢。
- 病态条件是问题本身的属性,决定了算法对误差的敏感度,影响算法选择。
- 梯度下降是最基本的优化算法,理解其原理(导数、梯度、学习率、临界点)至关重要。
- 二阶信息(海森矩阵)提供了曲率信息,可用于改进优化(如牛顿法),但计算代价高。
- 约束优化通过拉格朗日乘子将约束融入目标,是正则化的理论依据。
6.2 常见难点
- 学习率的选择:太大导致震荡甚至发散,太小收敛慢。二阶信息可帮助确定理论最优步长,但实际中需通过试错调整。
- 鞍点的困扰:梯度为零但不极小,一阶方法可能停滞,但随机梯度可逃离;牛顿法会被鞍点吸引,需要修改。
- 海森矩阵的可计算性:对于大模型,无法显式计算海森矩阵,需要近似方法(如共轭梯度、L-BFGS)。
- KKT条件的理解:广义拉格朗日函数和对偶问题的转换需要扎实的数学基础。
6.3 学习建议
- 动手编程:实现 softmax 稳定版、梯度下降、牛顿法(小规模问题),观察数值行为。
- 可视化:绘制简单函数的梯度下降路径,理解学习率、曲率的影响。
- 联系实际:在后续章节中遇到优化问题时,回顾本章概念(如为什么 Adam 需要二阶矩估计)。
- 理解而非死记:重点掌握思想(如为什么要稳定、为什么约束可以转为惩罚),而不是单纯背诵公式。
通过本章的学习,你已经掌握了将数学公式转化为可靠计算机程序所需的核心数值计算知识。下一章将把这些知识应用到机器学习的基础概念中,正式开启学习算法之旅。
《深度学习》(Ian Goodfellow 著)第5章“机器学习基础”详细讲解
1. 本章概述与定位
第5章是全书承前启后的关键章节。在之前的三章(线性代数、概率论、数值计算)中,我们已经建立了深度学习所需的数学工具;从本章开始,我们正式进入机器学习领域,为后续深入学习各种深度学习模型奠定概念基础。
本章旨在回答一个核心问题:什么是机器学习?它的基本要素、核心挑战以及常见的解决框架是什么? 通过本章的学习,读者将掌握机器学习的基本语言——任务、性能度量、经验、模型容量、过拟合、欠拟合、偏差-方差权衡、最大似然估计、贝叶斯推断等,并了解监督学习、无监督学习的代表性简单算法。本章最后还引入了深度学习的动机——传统机器学习在高维复杂数据上遇到的困难,从而引出后续章节对深度模型的探讨。
2. 由浅入深:从定义到深度学习的动机
2.1 机器学习的定义与三要素
定义:根据 Mitchell (1997),“一个计算机程序被认为能从经验 $E$ 中学习,解决任务 $T$,达到性能度量 $P$,当且仅当,利用经验 $E$ 后,它在任务 $T$ 上的性能(由 $P$ 度量)有所提高。”
这个定义抽象出了机器学习的三个核心要素:
- 任务 $T$:机器学习系统要完成的事情。常见任务包括分类、回归、转录、机器翻译、结构化输出、异常检测、合成与采样、缺失值填补、去噪、密度估计等。
- 性能度量 $P$:衡量系统完成任务好坏的定量指标。对于分类任务,常用准确率(accuracy)或错误率(error rate);对于密度估计,常用平均对数概率。
- 经验 $E$:学习过程中系统接触的数据。根据经验的不同,机器学习可分为:
- 监督学习:经验包含输入 $\boldsymbol{x}$ 和对应的目标输出 $y$(标签),目的是学习从 $\boldsymbol{x}$ 到 $y$ 的映射。
- 无监督学习:经验只包含输入 $\boldsymbol{x}$,目的是发现数据内在的结构(如聚类、密度估计、降维)。
- 强化学习:经验来自与环境的交互,系统通过奖励信号学习行为策略(本书不重点讨论)。
例子:对于垃圾邮件分类系统,任务 $T$ 是判断一封邮件是否为垃圾邮件;性能度量 $P$ 可以是分类准确率;经验 $E$ 是已标注的邮件数据集(每封邮件有标签“垃圾”或“正常”)。
2.2 第一个学习算法:线性回归
线性回归是最简单、最经典的机器学习模型,本书用它作为贯穿全文的例子,帮助我们理解各种概念。
- 模型定义:假设输入 $\boldsymbol{x} \in \mathbb{R}^n$,输出 $y \in \mathbb{R}$,模型预测为 $\hat{y} = \boldsymbol{w}^\top \boldsymbol{x} + b$。参数 $\boldsymbol{w}$ 为权重,$b$ 为偏置。
- 性能度量:通常使用均方误差(MSE): $$ \mathrm{MSE}_{\text{test}} = \frac{1}{m} \sum_i (\hat{y}^{(i)} - y^{(i)})^2 $$
- 学习目标:最小化训练集上的 MSE,即: $$ \boldsymbol{w}^* = \arg\min_{\boldsymbol{w}} \frac{1}{m} \|\boldsymbol{X}\boldsymbol{w} - \boldsymbol{y}\|_2^2 $$ 通过求导并令梯度为零,得到正规方程: $$ \boldsymbol{w} = (\boldsymbol{X}^\top \boldsymbol{X})^{-1} \boldsymbol{X}^\top \boldsymbol{y} $$ 这是线性回归的解析解。图 5.1 展示了线性回归拟合数据点的效果。
2.3 容量、过拟合与欠拟合
机器学习面临的核心挑战是:模型不仅要拟合训练数据,更要对未见过的新数据(测试数据)表现良好。这种能力称为泛化。
2.3.1 基本概念
- 训练误差:模型在训练集上的平均损失。
- 泛化误差(测试误差):模型在新样本上的期望损失。
- 过拟合:模型过于复杂,以至于“记住”了训练数据中的噪声,导致训练误差很低但泛化误差很高。
- 欠拟合:模型过于简单,无法捕捉训练数据中的基本规律,导致训练误差和泛化误差都很高。
2.3.2 模型容量
模型的容量(capacity)是指它拟合各种函数的能力。容量越高,模型越能表示复杂的函数关系。
- 控制容量:可以通过选择假设空间(hypothesis space)来调节。例如,线性回归的假设空间是所有线性函数;引入 $x^2$ 特征后,假设空间扩展到二次函数;更高次多项式对应更大容量。
- 容量与误差的关系:图 5.3 展示了典型的“U形”泛化误差曲线——容量过低时欠拟合,容量过高时过拟合,存在一个最优容量使泛化误差最小。
- 有效容量:受优化算法、正则化等因素影响,模型实际能达到的容量可能低于理论上的表示能力。
2.3.3 非参数模型与参数模型
- 参数模型:参数数量固定,与训练数据量无关。如线性回归。
- 非参数模型:模型复杂度随训练数据量增长。例如最近邻回归(k-NN),它存储所有训练样本,预测时根据最近的样本决定输出。图 5.10 展示了 k-NN 划分输入空间形成的 Voronoi 图。
2.3.4 贝叶斯误差
即使是最理想的“预言机”(知道真实数据分布),由于数据中可能存在内在噪声(如两个相同输入对应不同输出),也无法达到零误差。这个最小可能误差称为贝叶斯误差。
2.3.5 没有免费午餐定理
该定理指出:没有一种机器学习算法在所有可能的数据分布上总是优于其他算法。这意味着我们必须根据具体问题选择或设计算法,算法中的偏好(如对平滑函数的偏好)要与实际数据分布匹配。
2.4 超参数与验证集
- 超参数:不是由学习算法本身学习得到,而是需要人工设定的参数。例如多项式回归中的多项式次数、正则化系数 $\lambda$。
- 验证集:从训练数据中划分出一部分,用于评估不同超参数配置的性能,从而选择最佳超参数。通常训练集占 80%,验证集占 20%。
- 交叉验证:当数据量较小时,可采用 $k$ 折交叉验证:将数据分成 $k$ 份,轮流用其中 $k-1$ 份训练,1 份验证,最后平均验证误差。
2.5 点估计、偏差与方差
2.5.1 点估计
点估计:用数据计算一个统计量来近似真实参数 $\theta$。例如样本均值 $\hat{\mu}_m = \frac{1}{m}\sum_i x^{(i)}$ 是对总体均值 $\mu$ 的估计。
2.5.2 偏差
- 偏差:$\mathrm{bias}(\hat{\theta}_m) = \mathbb{E}(\hat{\theta}_m) - \theta$。
- 无偏估计:偏差为零,即期望等于真值。例如样本均值是总体均值的无偏估计。
- 渐近无偏:当样本量趋于无穷时,偏差趋于零。
2.5.3 方差与标准误差
- 方差:$\mathrm{Var}(\hat{\theta})$,衡量估计值在不同数据集上的波动程度。
- 标准误差:$\mathrm{SE}(\hat{\theta}) = \sqrt{\mathrm{Var}(\hat{\theta})}$。例如样本均值的标准误差为 $\sigma / \sqrt{m}$。
2.5.4 偏差-方差权衡
- 均方误差(MSE)可以分解为: $$ \mathrm{MSE} = \mathbb{E}[(\hat{\theta} - \theta)^2] = \mathrm{Bias}(\hat{\theta})^2 + \mathrm{Var}(\hat{\theta}) $$
- 权衡:模型容量增加通常导致偏差下降、方差上升,最优容量出现在两者平衡处(图 5.6)。这是理解过拟合与欠拟合的统计视角。
2.5.5 一致性
一致性:当样本量 $m \to \infty$ 时,估计值 $\hat{\theta}_m$ 依概率收敛到真值 $\theta$。这是估计量的渐近性质。
2.6 最大似然估计
最大似然估计(MLE)是机器学习中最常用的估计原则。
2.6.1 定义
给定独立同分布的数据 $\mathbb{X} = \{\boldsymbol{x}^{(1)},\dots,\boldsymbol{x}^{(m)}\}$,模型分布为 $p_{\text{model}}(\boldsymbol{x}; \boldsymbol{\theta})$,则似然函数为:
$$ \mathcal{L}(\boldsymbol{\theta}) = \prod_{i=1}^m p_{\text{model}}(\boldsymbol{x}^{(i)}; \boldsymbol{\theta}) $$最大似然估计选择使似然最大的参数:
$$ \boldsymbol{\theta}_{\mathrm{ML}} = \arg\max_{\boldsymbol{\theta}} \prod_{i=1}^m p_{\text{model}}(\boldsymbol{x}^{(i)}; \boldsymbol{\theta}) $$等价于最大化对数似然(或最小化负对数似然):
$$ \boldsymbol{\theta}_{\mathrm{ML}} = \arg\max_{\boldsymbol{\theta}} \sum_{i=1}^m \log p_{\text{model}}(\boldsymbol{x}^{(i)}; \boldsymbol{\theta}) $$2.6.2 与KL散度的关系
最大化对数似然等价于最小化经验分布 $\hat{p}_{\text{data}}$ 与模型分布之间的 KL 散度:
$$ D_{\mathrm{KL}}(\hat{p}_{\text{data}} \| p_{\text{model}}) = \mathbb{E}_{\boldsymbol{x}\sim\hat{p}_{\text{data}}}[\log \hat{p}_{\text{data}}(\boldsymbol{x}) - \log p_{\text{model}}(\boldsymbol{x})] $$第一项与模型无关,因此最小化 KL 散度等价于最小化交叉熵 $-\mathbb{E}_{\hat{p}_{\text{data}}}[\log p_{\text{model}}]$。
2.6.3 条件最大似然
对于监督学习,我们关心条件分布 $p(\boldsymbol{y} \mid \boldsymbol{x}; \boldsymbol{\theta})$,条件最大似然估计为:
$$ \boldsymbol{\theta}_{\mathrm{ML}} = \arg\max_{\boldsymbol{\theta}} \sum_{i=1}^m \log p(\boldsymbol{y}^{(i)} \mid \boldsymbol{x}^{(i)}; \boldsymbol{\theta}) $$例:线性回归作为最大似然 假设 $p(y \mid \boldsymbol{x}) = \mathcal{N}(y; \boldsymbol{w}^\top\boldsymbol{x}, \sigma^2)$,则条件对数似然为:
$$ \sum_{i=1}^m \log p(y^{(i)} \mid \boldsymbol{x}^{(i)}) = -m\log\sigma - \frac{m}{2}\log(2\pi) - \frac{1}{2\sigma^2} \sum_{i=1}^m (\hat{y}^{(i)} - y^{(i)})^2 $$最大化该式等价于最小化 $\sum (\hat{y}^{(i)} - y^{(i)})^2$,即 MSE。因此线性回归的 MSE 损失可以看作高斯噪声假设下的最大似然估计。
2.6.4 MLE 的性质
- 一致性:在适当条件下,MLE 是相合估计。
- 渐近有效性:随着样本量增加,MLE 的方差趋近于 Cramér-Rao 下界,即它是渐近最优的无偏估计(在一定意义上)。
2.7 贝叶斯统计
与频率派将 $\theta$ 视为固定未知值不同,贝叶斯统计将 $\theta$ 视为随机变量,具有先验分布 $p(\theta)$。观测数据后,我们得到后验分布:
$$ p(\boldsymbol{\theta} \mid \boldsymbol{x}^{(1)},\dots,\boldsymbol{x}^{(m)}) = \frac{p(\boldsymbol{x}^{(1)},\dots,\boldsymbol{x}^{(m)} \mid \boldsymbol{\theta}) p(\boldsymbol{\theta})}{p(\boldsymbol{x}^{(1)},\dots,\boldsymbol{x}^{(m)})} $$- 预测:贝叶斯预测通过积分后验得到: $$ p(x^{(m+1)} \mid \boldsymbol{x}^{(1)},\dots,\boldsymbol{x}^{(m)}) = \int p(x^{(m+1)} \mid \boldsymbol{\theta}) p(\boldsymbol{\theta} \mid \boldsymbol{x}^{(1)},\dots,\boldsymbol{x}^{(m)}) d\boldsymbol{\theta} $$
- 优点:自然包含了参数不确定性,通常在小数据时泛化更好。
- 缺点:积分通常难以计算。
例:贝叶斯线性回归 假设先验 $p(\boldsymbol{w}) = \mathcal{N}(\boldsymbol{w}; \boldsymbol{\mu}_0, \boldsymbol{\Lambda}_0)$,则后验也是高斯分布,均值为 $\boldsymbol{\mu}_m = (\boldsymbol{X}^\top\boldsymbol{X} + \boldsymbol{\Lambda}_0^{-1})^{-1}(\boldsymbol{X}^\top\boldsymbol{y} + \boldsymbol{\Lambda}_0^{-1}\boldsymbol{\mu}_0)$。当 $\boldsymbol{\Lambda}_0 = \frac{1}{\alpha}\boldsymbol{I}$ 且 $\boldsymbol{\mu}_0 = \boldsymbol{0}$ 时,后验均值与岭回归($L^2$ 正则化)解一致。
2.7.1 最大后验估计
最大后验(MAP)估计是贝叶斯推断的一种点估计近似:
$$ \boldsymbol{\theta}_{\mathrm{MAP}} = \arg\max_{\boldsymbol{\theta}} p(\boldsymbol{\theta} \mid \boldsymbol{x}) = \arg\max_{\boldsymbol{\theta}} \log p(\boldsymbol{x} \mid \boldsymbol{\theta}) + \log p(\boldsymbol{\theta}) $$加上对数先验项相当于在最大似然目标中加入正则化。例如高斯先验对应 $L^2$ 正则化,拉普拉斯先验对应 $L^1$ 正则化。
2.8 监督学习算法简介
2.8.1 概率监督学习
- 逻辑回归:用于二分类。假设 $P(y=1 \mid \boldsymbol{x}) = \sigma(\boldsymbol{w}^\top\boldsymbol{x} + b)$,损失函数为交叉熵。没有解析解,通过梯度下降优化。
- 支持向量机:类似逻辑回归,但输出类别而非概率。利用核技巧将输入映射到高维特征空间,使线性模型能处理非线性问题。核函数如高斯核(RBF)实现无限维特征空间中的点积。
- k-近邻:非参数方法,根据与测试点最近的 $k$ 个训练点的标签决定输出。缺点是无法学习特征重要性,且计算成本高。
- 决策树:将输入空间划分为区域,每个区域对应一个输出。通过轴对齐的分割构建树结构,但难以学习非轴对齐的决策边界。
2.9 无监督学习算法简介
2.9.1 主成分分析(PCA)
- 目标:找到数据的低维表示,同时尽可能保留信息(最小化重构误差)。
- 方法:学习一个正交变换 $\boldsymbol{W}$,使得投影后数据的协方差矩阵对角化。主成分是数据协方差矩阵的特征向量。
- 性质:PCA 得到的表示各维度线性无关,是简单的“解耦”示例。
2.9.2 k-均值聚类
- 目标:将数据划分为 $k$ 个簇,每个点属于最近质心所代表的簇。
- 算法:交替执行两步:分配每个点到最近质心;更新质心为簇内点的均值。
- 表示:输出是 one-hot 编码,属于稀疏表示,但丢失了相似性信息(如红色卡车与灰色卡车在不同簇,无法体现它们比灰色卡车与灰色汽车更相似)。
2.10 随机梯度下降
- 问题:当训练集很大时,批量梯度下降每次迭代需计算所有样本的梯度,代价过高。
- 核心思想:用小批量(minibatch)样本的梯度作为全梯度无偏估计,进行参数更新。
- 更新规则: $$ \boldsymbol{g} = \frac{1}{m'} \sum_{i=1}^{m'} \nabla_{\boldsymbol{\theta}} L(\boldsymbol{x}^{(i)}, y^{(i)}, \boldsymbol{\theta}) $$ $$ \boldsymbol{\theta} \leftarrow \boldsymbol{\theta} - \epsilon \boldsymbol{g} $$
- 优点:每次更新计算量与 $m'$ 成正比,与总样本数 $m$ 无关;能处理大规模数据集;可以实现在线学习。
2.11 构建机器学习算法的通用配方
几乎所有机器学习算法都可以用以下框架描述:
- 数据集:包含特征的样本(可能还有标签)。
- 模型:参数化的函数族 $f(\boldsymbol{x}; \boldsymbol{\theta})$。
- 代价函数:$J(\boldsymbol{\theta})$,通常包括数据项(如负对数似然)和正则化项。
- 优化算法:用于最小化 $J(\boldsymbol{\theta})$ 的方法,如 SGD、牛顿法等。
这种模块化视角有助于理解不同算法之间的联系与差异。
2.12 深度学习面临的挑战
2.12.1 维度灾难
随着输入维度增加,数据在高维空间中变得极其稀疏。为了在均匀网格上估计函数,需要的样本数量随维度指数增长。图 5.9 直观展示了从 1D 到 3D 网格数量爆炸式增长。
2.12.2 局部不变性与平滑先验
许多传统算法(如 k-NN、核方法、决策树)依赖局部平滑先验——即函数在输入点附近变化缓慢。这种先验在低维有效,但在高维空间,由于样本稀疏,局部区域往往不包含任何训练点,导致无法泛化。深度学习的优势在于能学习更复杂的先验(如层次化组合),从而突破这一限制。
2.12.3 流形学习
流形假设:现实世界的高维数据(如图像、语音、文本)往往集中在高维空间的一个低维流形上。也就是说,数据的大部分变化只由少数自由因素(流形坐标)决定。
- 流形:局部类似于欧氏空间的连通区域。
- 意义:如果数据位于低维流形上,我们就可以用流形坐标表示数据,而不是原始高维坐标,从而降低维度,简化学习问题。图 5.11 展示了二维空间中采样于一条一维流形的数据点。
流形学习是深度学习的重要动机:深度网络可以逐层学习从原始输入到流形坐标的映射,自动发现数据的内在结构。
3. 知识体系图
4. 实例辅助
4.1 过拟合与欠拟合:多项式回归
图 5.2 展示了使用不同次数多项式拟合二次函数生成的数据点:
- 线性(次数1):欠拟合,无法捕捉曲率。
- 二次(次数2):拟合良好,泛化好。
- 九次(次数9):过拟合,虽然完美穿过所有训练点,但预测曲线剧烈震荡,泛化差。
4.2 偏差-方差分解:射击靶子
- 偏差:子弹平均落点与靶心的偏离。
- 方差:子弹落点的散布程度。
- 低偏差高方差:子弹围绕靶心散布但平均在靶心(过拟合)。
- 高偏差低方差:子弹集中但偏离靶心(欠拟合)。
4.3 最大似然估计:抛硬币
抛硬币 10 次,7 次正面。伯努利模型 $P(\text{正面})=\theta$,似然 $L(\theta) = \theta^7 (1-\theta)^3$。取对数求导得 $\hat{\theta}_{\mathrm{ML}} = 0.7$,即样本频率。
4.4 正则化作为 MAP
线性回归中,若对权重施加高斯先验 $p(w) \propto \exp(-\frac{\alpha}{2}w^2)$,则 MAP 估计为最小化 $\mathrm{MSE} + \frac{\alpha}{2}\|w\|^2$,即 $L^2$ 正则化(权重衰减)。图 5.5 展示了不同 $\lambda$ 下九次多项式拟合的效果,$\lambda$ 较大时函数更平滑(欠拟合),$\lambda$ 适中时拟合合理,$\lambda=0$ 时过拟合。
4.5 维度灾难:网格划分
假设每个特征需要区分 10 个区间,则 1 维需要 10 个网格单元,2 维需要 100 个,3 维需要 1000 个……随着维度增加,需要的样本数指数增长。图 5.9 直观展示了这一点。
5. 与前后的联系
- 前承:第2-4章提供的数学工具(线性代数、概率、数值计算)是本章所有概念的基础。例如,线性回归的正规方程用到矩阵求逆;偏差-方差分解用到期望;最大似然用到概率分布。
- 后续应用:
- 第6章深度前馈网络:将本章的线性模型推广到非线性,并深入讨论梯度下降、正则化等。
- 第7章正则化:详细展开本章介绍的正则化思想,如参数范数惩罚、数据集增强、dropout 等。
- 第8章优化:深入讨论本章的随机梯度下降及其变种。
- 第9-10章卷积网络与循环网络:将本章的监督学习思想应用于特定结构数据。
- 第13-20章生成模型与结构化模型:基于本章的贝叶斯和概率图模型思想。
6. 总结与重点
6.1 核心要点
- 机器学习三要素:任务 $T$、性能度量 $P$、经验 $E$。
- 泛化是核心挑战:模型需在未见数据上表现良好,这通过控制容量和正则化实现。
- 过拟合与欠拟合:容量过大导致过拟合,容量过小导致欠拟合,最优容量通过验证集选择。
- 偏差-方差权衡:泛化误差可分解为偏差平方与方差之和,是理解过拟合/欠拟合的统计视角。
- 最大似然估计:是大多数深度学习模型(分类、回归)的损失函数设计依据,与KL散度、交叉熵等价。
- 贝叶斯与MAP:提供了正则化的理论解释(先验对应惩罚项)。
- 简单算法:线性回归、逻辑回归、SVM、k-NN、决策树、PCA、k-均值等是理解更复杂模型的基石。
- 随机梯度下降:是大规模学习的核心优化算法。
- 深度学习的动机:传统算法依赖局部平滑先验,在高维数据上失效;流形假设和层次化组合是深度学习的解决思路。
6.2 常见难点
- 偏差-方差分解的直观理解:易混淆偏差和方差的具体含义,需结合例子(如靶子)理解。
- 最大似然与最小二乘的关系:需理解 MSE 损失对应高斯噪声下的 MLE。
- 正则化与先验的对应:L1 对应拉普拉斯先验,L2 对应高斯先验。
- 维度灾难的本质:不是维度本身导致问题,而是高维空间中数据稀疏,局部区域无样本。
- 流形假设的现实性:需理解为什么图像、文本等高维数据会集中在低维流形(如自然图像的变化受少数因素控制)。
6.3 学习建议
- 动手编程:实现线性回归(解析解和梯度下降)、逻辑回归、k-NN 和 PCA,观察数据、模型与结果。
- 可视化:绘制多项式拟合曲线、偏差-方差图、学习曲线等,直观感受概念。
- 数学推导:尝试自己推导线性回归的正规方程、MLE 与 MSE 的等价性、偏差-方差分解。
- 联系实际:思考当前遇到的机器学习问题属于哪种任务,选用哪种性能度量,如何避免过拟合。
- 阅读扩展:如对某一算法(SVM、决策树)感兴趣,可参考 Murphy (2012) 或 Bishop (2006) 等教材深入了解。
通过本章的学习,你已经掌握了机器学习的基础知识框架,为后续深入学习深度学习模型做好了准备。下一章将正式进入深度学习的核心——深度前馈网络。
《深度学习》(Ian Goodfellow 著)第6章“深度前馈网络”详细讲解
1. 本章概述与定位
深度前馈网络(Deep Feedforward Networks),也称为前馈神经网络或多层感知机(MLP),是深度学习的基石模型。本章系统地介绍了这类网络的基本概念、架构设计、激活函数、损失函数以及核心的训练算法——反向传播(Backpropagation)。读者将通过本章掌握如何构建一个能够逼近任意函数的深度模型,并理解其背后的数学原理与实现细节。
本章的重要性不言而喻:几乎所有现代深度学习应用(如卷积网络、循环网络、自编码器等)都可以看作是深度前馈网络的变体或扩展。因此,深入理解本章内容是后续学习卷积网络(第9章)、循环网络(第10章)以及各种生成模型(第20章)的必要前提。
2. 由浅入深:从线性模型到深度前馈网络
2.1 线性模型的局限性
在上一章(第5章)中,我们学习了线性回归和逻辑回归等线性模型。这些模型具有简洁的解析解(或凸优化性质),但它们只能表示线性函数。现实世界中的问题往往是非线性的,例如经典的异或(XOR)问题:
| $x_1$ | $x_2$ | XOR 输出 $y$ |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
用线性模型(例如 $y = w_1 x_1 + w_2 x_2 + b$)无法正确拟合 XOR 函数。为什么?因为线性模型试图用一个超平面将四个点分开,而 XOR 的数据分布无法被一个线性超平面正确分割(见图6.1左)。事实上,线性模型在四个点上解出的最优解是 $w_1=w_2=0, b=0.5$,输出恒为 0.5,无法区分。
2.2 引入隐藏层和非线性
要解决非线性问题,我们需要引入非线性特征变换。深度前馈网络的核心思想就是:学习一个非线性映射 $\boldsymbol{h} = f^{(1)}(\boldsymbol{x};\boldsymbol{\theta})$,将原始输入变换到一个新的特征空间,然后在这个特征空间上使用线性模型(第二层)完成最终任务。
数学上,一个两层的神经网络可以表示为:
$$ \boldsymbol{h} = g(\boldsymbol{W}^{\top}\boldsymbol{x} + \boldsymbol{c}) $$$$ y = \boldsymbol{w}^{\top}\boldsymbol{h} + b $$其中 $g$ 是一个逐元素作用的非线性激活函数,例如ReLU(Rectified Linear Unit):
$$ g(z) = \max\{0, z\} $$2.3 解决 XOR 问题的实例
图6.2展示了一个包含一个隐藏层(两个隐藏单元)的网络结构,其参数可以手动设计来完美解决 XOR。设:
$$ \boldsymbol{W} = \begin{bmatrix} 1 & 1 \\ 1 & 1 \end{bmatrix},\quad \boldsymbol{c} = \begin{bmatrix} 0 \\ -1 \end{bmatrix},\quad \boldsymbol{w} = \begin{bmatrix} 1 \\ -2 \end{bmatrix},\quad b = 0 $$计算过程(取 $\boldsymbol{x}=[0,1]^\top$):
- 线性变换:$\boldsymbol{z} = \boldsymbol{W}^{\top}\boldsymbol{x} + \boldsymbol{c} = [1,0]^\top$
- ReLU激活:$\boldsymbol{h} = \max\{0,\boldsymbol{z}\} = [1,0]^\top$
- 输出:$y = \boldsymbol{w}^{\top}\boldsymbol{h} = 1$
类似地,其他三个输入也能得到正确输出。这个例子说明:通过一个隐藏层,网络将原始输入映射到了一个线性可分的特征空间(见图6.1右),从而解决了 XOR 问题。
3. 核心知识点
3.1 网络的基本结构
- 输入层:接收原始数据 $\boldsymbol{x}$,通常不进行计算。
- 隐藏层:位于输入和输出之间,执行非线性变换。可以有多个隐藏层,构成“深度”。
- 输出层:产生最终预测,其设计取决于任务类型(回归、二分类、多分类等)。
- 参数:每一层的权重矩阵 $\boldsymbol{W}^{(k)}$ 和偏置向量 $\boldsymbol{b}^{(k)}$(或 $\boldsymbol{c}$)。
3.2 激活函数(Hidden Units)
激活函数为网络引入非线性,是隐藏层的核心。
3.2.1 整流线性单元(ReLU)及其变体
- ReLU:$g(z) = \max\{0, z\}$。优点是计算简单,梯度不饱和(正半轴导数为1),有效缓解梯度消失。但缺点是在负半轴梯度为0,可能导致神经元“死亡”(dying ReLU)。
- Leaky ReLU:$g(z) = \max\{0, z\} + \alpha \min\{0, z\}$,其中 $\alpha$ 是一个小的正数(如0.01),使得负半轴也有微小梯度。
- 参数化ReLU(PReLU):将 $\alpha$ 作为可学习参数。
- Maxout单元:将输入分成 $k$ 组,输出每组中的最大值,可以看作是学习激活函数本身。
3.2.2 Sigmoid 与 Tanh
- Logistic Sigmoid:$\sigma(z) = \frac{1}{1+e^{-z}}$,将实数映射到 $(0,1)$。缺点是两端饱和,梯度消失严重,现已较少用作隐藏层激活函数,但仍常用于输出层(二分类)。
- Tanh:$\tanh(z) = 2\sigma(2z)-1$,输出范围 $(-1,1)$,零中心化,比 sigmoid 稍好,但仍存在饱和问题。
3.2.3 其他隐藏单元
- 线性单元:无激活函数,等同于线性层,可用于降维(如低秩近似)。
- Softmax单元:常用于输出层,也可作为隐藏层中的“开关”(如注意力机制)。
- 径向基函数(RBF)单元:$h_i = \exp\left(-\frac{1}{2\sigma_i^2}\|\boldsymbol{W}_{:,i} - \boldsymbol{x}\|^2\right)$,对输入敏感,难以优化。
- Softplus:$\zeta(z) = \log(1+e^z)$,是 ReLU 的平滑版本,但实验表现不如 ReLU。
3.3 架构设计
3.3.1 深度与宽度
- 深度:隐藏层的数量。
- 宽度:每一层中隐藏单元的数量。
- 通用近似定理:一个包含足够多隐藏单元的单隐藏层前馈网络可以任意精度逼近任何从有限维空间到有限维空间的Borel可测函数(Hornik et al., 1989)。但该定理未说明所需单元数,也未保证学习算法能找到该函数。
3.3.2 深度的重要性
尽管单层网络足以逼近任意函数,但可能需要指数级数量的单元。深度网络可以通过逐层组合简单概念,用更少的单元表示复杂函数(Montufar et al., 2014)。例如,图6.5展示了深度整流网络如何通过折叠操作指数级增加线性区域的数目。实验也表明(图6.6,图6.7),深度越深,泛化能力往往越好。
3.3.3 其他架构考虑
- 链式结构:最常见的架构,每一层是前一层的函数。
- 跳跃连接:从第 $i$ 层连接到第 $i+2$ 层或更高层,有助于梯度流动。
- 稀疏连接:每个输出只与部分输入连接,如卷积网络。
3.4 输出单元与损失函数
输出单元的设计应与任务匹配,并且与损失函数紧密结合。
3.4.1 线性单元(高斯输出分布)
用于回归问题,输出 $\hat{y} = \boldsymbol{w}^{\top}\boldsymbol{h} + b$。假设输出服从高斯分布 $p(y \mid \boldsymbol{x}) = \mathcal{N}(y; \hat{y}, \boldsymbol{I})$,则最大似然等价于最小化均方误差(MSE)。
3.4.2 Sigmoid 单元(伯努利输出分布)
用于二分类。输出 $\hat{y} = \sigma(\boldsymbol{w}^{\top}\boldsymbol{h} + b)$,表示 $P(y=1 \mid \boldsymbol{x})$。交叉熵损失为:
$$ J(\boldsymbol{\theta}) = -\log P(y \mid \boldsymbol{x}) = -\log \sigma((2y-1)z) = \zeta((1-2y)z) $$其中 $z = \boldsymbol{w}^{\top}\boldsymbol{h} + b$,$\zeta$ 是 softplus。该损失在错误预测时梯度不会消失。
3.4.3 Softmax 单元(多项输出分布)
用于多分类。输出向量 $\hat{\boldsymbol{y}} = \text{softmax}(\boldsymbol{z})$,其中 $z_i = \boldsymbol{W}_{i,:}^{\top}\boldsymbol{h} + b_i$。交叉熵损失为:
$$ -\log P(y=i \mid \boldsymbol{x}) = -z_i + \log\sum_j e^{z_j} $$该损失不会因 softmax 饱和而停止学习,因为 $z_i$ 直接出现在损失中。
3.4.4 其他输出类型
- 异方差高斯输出:同时预测均值 $\mu(\boldsymbol{x})$ 和方差 $\sigma^2(\boldsymbol{x})$(或精度 $\beta(\boldsymbol{x})$),需保证方差为正(如通过 softplus)。
- 混合密度网络:输出为高斯混合模型的参数,用于多模态回归。
- 结构化输出:输出序列、树等,需结合循环网络(第10章)或结构化概率模型。
3.5 梯度下降与反向传播
3.5.1 计算图
计算图是表示数学表达式的有向无环图,节点表示变量,边表示操作。例如图6.8展示了线性回归、ReLU 层等的计算图。
3.5.2 链式法则
反向传播基于链式法则。对于标量 $z$ 依赖于 $y$,$y$ 依赖于 $x$,有:
$$ \frac{\partial z}{\partial x} = \frac{\partial z}{\partial y} \frac{\partial y}{\partial x} $$对于向量:
$$ \nabla_{\boldsymbol{x}} z = \left(\frac{\partial \boldsymbol{y}}{\partial \boldsymbol{x}}\right)^{\top} \nabla_{\boldsymbol{y}} z $$其中 $\frac{\partial \boldsymbol{y}}{\partial \boldsymbol{x}}$ 是雅可比矩阵。
3.5.3 反向传播算法
算法6.1和6.2给出了简化的反向传播流程:先执行前向传播,然后从输出节点开始反向计算梯度,利用链式法则累积梯度。算法6.5和6.6是更通用的版本,适用于任意计算图。
核心思想:反向传播通过动态规划避免重复计算子表达式,时间复杂度与原始图中的边数呈线性关系,而非指数增长(对比式6.55)。
3.5.4 全连接 MLP 的反向传播实例
算法6.3和6.4展示了带一个隐藏层的 MLP 的前向和反向计算。关键步骤:
- 计算输出层梯度 $\boldsymbol{g} \leftarrow \nabla_{\hat{\boldsymbol{y}}} J$
- 逐层反向传播:$\boldsymbol{g} \leftarrow \nabla_{\boldsymbol{a}^{(k)}} J = \boldsymbol{g} \odot f'(\boldsymbol{a}^{(k)})$(对于逐元素激活函数)
- 计算参数梯度:$\nabla_{\boldsymbol{W}^{(k)}} J = \boldsymbol{g} \boldsymbol{h}^{(k-1)\top} + \lambda \nabla_{\boldsymbol{W}^{(k)}}\Omega$
- 将梯度传播到前一层:$\boldsymbol{g} \leftarrow \nabla_{\boldsymbol{h}^{(k-1)}} J = \boldsymbol{W}^{(k)\top} \boldsymbol{g}$
3.5.5 符号到符号导数
现代框架(如 TensorFlow, Theano)采用符号到符号的方式:构建一个与原始计算图平行的导数计算图,然后统一求值。这样便于高阶导数计算(如图6.10)。
3.5.6 一般化的反向传播
每个操作(如矩阵乘法)都需要定义 bprop 方法,用于计算输入相对于输出的梯度。例如矩阵乘法 $\boldsymbol{C} = \boldsymbol{A}\boldsymbol{B}$,若已知输出梯度 $\boldsymbol{G}$,则对 $\boldsymbol{A}$ 的梯度为 $\boldsymbol{G}\boldsymbol{B}^{\top}$,对 $\boldsymbol{B}$ 的梯度为 $\boldsymbol{A}^{\top}\boldsymbol{G}$。
3.5.7 复杂性讨论
- 计算代价:反向传播的时间通常与前向传播相当,因为每个操作对应一个 Jacobian 乘积。
- 内存代价:需存储中间激活值供反向使用,这是深度网络内存开销的主要来源。
- 高阶导数:可通过再次反向传播计算 Hessian-向量积,用于优化或分析。
3.6 历史注解
本章最后简要回顾了前馈网络的发展历史,包括:
- 链式法则早在17世纪就已发现,但用于神经网络的反向传播是在20世纪80年代由多个研究者独立重新发现(Rumelhart et al., 1986a)。
- 早期的感知机只能解决线性问题,导致神经网络陷入低谷。反向传播的提出开启了连接主义时代。
- 损失函数从 MSE 转向交叉熵,以及激活函数从 sigmoid/tanh 转向 ReLU,是深度网络成功的关键改进。
- 尽管现代深度网络架构复杂,但其核心依然是基于梯度的优化,本章的算法至今仍是训练的基础。
4. 知识体系图
5. 实例辅助:XOR 问题的详细计算
为了深入理解前馈网络的工作原理,我们重新用矩阵形式计算 XOR 问题的前向传播。假设输入矩阵 $\boldsymbol{X}$ 包含所有四个样本(每行一个样本):
$$ \boldsymbol{X} = \begin{bmatrix} 0 & 0 \\ 0 & 1 \\ 1 & 0 \\ 1 & 1 \end{bmatrix} $$权重和偏置如前面所设:
$$ \boldsymbol{W} = \begin{bmatrix} 1 & 1 \\ 1 & 1 \end{bmatrix}, \quad \boldsymbol{c} = \begin{bmatrix} 0 \\ -1 \end{bmatrix}, \quad \boldsymbol{w} = \begin{bmatrix} 1 \\ -2 \end{bmatrix}, \quad b = 0 $$第一步:计算隐藏层的线性变换 $\boldsymbol{Z} = \boldsymbol{X}\boldsymbol{W} + \boldsymbol{c}$(广播加法):
$$ \boldsymbol{X}\boldsymbol{W} = \begin{bmatrix} 0\cdot1+0\cdot1 & 0\cdot1+0\cdot1 \\ 0\cdot1+1\cdot1 & 0\cdot1+1\cdot1 \\ 1\cdot1+0\cdot1 & 1\cdot1+0\cdot1 \\ 1\cdot1+1\cdot1 & 1\cdot1+1\cdot1 \end{bmatrix} = \begin{bmatrix} 0 & 0 \\ 1 & 1 \\ 1 & 1 \\ 2 & 2 \end{bmatrix} $$加上 $\boldsymbol{c}$(每行加):
$$ \boldsymbol{Z} = \begin{bmatrix} 0+0 & 0-1 \\ 1+0 & 1-1 \\ 1+0 & 1-1 \\ 2+0 & 2-1 \end{bmatrix} = \begin{bmatrix} 0 & -1 \\ 1 & 0 \\ 1 & 0 \\ 2 & 1 \end{bmatrix} $$第二步:应用 ReLU 激活 $\boldsymbol{H} = \max\{0, \boldsymbol{Z}\}$:
$$ \boldsymbol{H} = \begin{bmatrix} \max(0,0) & \max(0,-1) \\ \max(0,1) & \max(0,0) \\ \max(0,1) & \max(0,0) \\ \max(0,2) & \max(0,1) \end{bmatrix} = \begin{bmatrix} 0 & 0 \\ 1 & 0 \\ 1 & 0 \\ 2 & 1 \end{bmatrix} $$第三步:计算输出 $\hat{\boldsymbol{y}} = \boldsymbol{H}\boldsymbol{w} + b$:
$$ \boldsymbol{H}\boldsymbol{w} = \begin{bmatrix} 0\cdot1 + 0\cdot(-2) \\ 1\cdot1 + 0\cdot(-2) \\ 1\cdot1 + 0\cdot(-2) \\ 2\cdot1 + 1\cdot(-2) \end{bmatrix} = \begin{bmatrix} 0 \\ 1 \\ 1 \\ 0 \end{bmatrix} $$加上 $b=0$ 得最终预测,与真实值一致。
这个例子直观展示了:经过隐藏层,原始输入被映射到新的特征空间,使得线性分类器能够工作。
6. 与前后的联系
- 前承:
- 第2-4章提供了线性代数、概率论、数值计算的数学基础。
- 第5章介绍了机器学习的基本概念(模型、代价函数、优化、过拟合等),本章在此基础上具体化到深度前馈网络。
- 后续应用:
- 第7章正则化:本章只介绍了基本的梯度下降,正则化策略(如权重衰减、dropout)将在第7章详细讨论。
- 第8章优化:本章的梯度下降是基础,第8章将深入动量、自适应学习率等高级优化算法。
- 第9章卷积网络:卷积网络是前馈网络的一种特殊结构,本章的全连接层是卷积层的基础。
- 第10章循环网络:循环网络通过时间展开也形成了深度前馈结构,反向传播算法(BPTT)是本章算法的直接扩展。
- 第14章自编码器:自编码器是一种特殊的前馈网络,其编码器和解码器都是前馈网络。
- 第20章生成模型:如 VAE 和 GAN,其生成器和判别器通常由前馈网络构成。
7. 总结与重点
7.1 核心要点
- 深度前馈网络是通过组合多个简单函数(层)来学习复杂函数的模型,其核心是引入隐藏层和非线性激活函数。
- 激活函数的选择至关重要,ReLU 因其简单有效成为默认选择,但需注意其变体和适用场景。
- 输出单元应与任务匹配,损失函数通常由负对数似然(交叉熵)导出,这保证了梯度良好。
- 反向传播是计算梯度的核心算法,基于计算图和链式法则,高效且精确。
- 架构设计涉及深度、宽度、连接模式,深度网络具有指数级表示优势,但需配合合适的优化和正则化。
- 通用近似定理保证单层网络足够,但深度网络更高效。
7.2 常见难点
- 激活函数的梯度饱和:sigmoid 和 tanh 在两端梯度趋于0,导致学习缓慢,这是 ReLU 受欢迎的原因。
- 梯度消失与爆炸:深层网络反向传播时,梯度可能指数级衰减或增长,本章仅提及,将在第8、10章深入讨论。
- 反向传播的实现细节:初学者容易混淆符号导数和数值实现,需理解计算图与自动微分。
- 隐藏层单元数的选择:没有理论公式,需通过实验(验证集)确定。
- ReLU 死亡问题:当权重初始化不当或学习率过大时,ReLU 可能永久失活,可通过 Leaky ReLU 或适当初始化缓解。
7.3 学习建议
- 动手实现:用 NumPy 手动实现一个两层的神经网络(包括前向和反向),在 XOR 数据集上训练,观察权重如何演化。
- 使用框架:用 TensorFlow 或 PyTorch 实现 MLP 在 MNIST 上的分类,熟悉自动微分和优化器。
- 可视化:绘制训练过程中损失曲线、激活值分布、梯度范数,理解网络行为。
- 阅读论文:可阅读通用近似定理(Hornik et al.)和深度表示能力(Montufar et al.)的原始论文,加深理论理解。
- 对比实验:尝试不同激活函数、深度、宽度对模型性能的影响,体会设计选择的意义。
通过本章的学习,你已经掌握了深度前馈网络的核心概念和训练方法。接下来,我们将学习如何让这些网络更好地泛化(第7章正则化)以及如何更有效地优化(第8章优化),为构建实用深度学习系统打下坚实基础。
《深度学习》(Ian Goodfellow 著)第7章“深度学习中的正则化”详细讲解
1. 本章概述与定位
正则化是机器学习中用于改善模型泛化能力(即对未见数据的表现)的一系列技术的总称。第5章已经引入了过拟合、欠拟合和偏差-方差权衡等基本概念,而本章则系统地介绍了深度学习中常用且有效的正则化策略。
本章的核心思想是:通过向学习算法中引入额外的信息(偏好或约束),在不显著增加训练误差的前提下,降低测试误差。这些策略可以是显式的(如在损失函数中加入参数范数惩罚),也可以是隐式的(如通过数据集增强、多任务学习等)。本章涵盖了从经典(L1/L2正则化)到现代(Dropout、对抗训练)的丰富技术,为读者提供了应对深度学习过拟合问题的完整工具箱。
2. 由浅入深:从泛化到正则化
2.1 泛化与过拟合
回顾第5章,机器学习的目标是使模型在测试集(未见过的新数据)上表现良好,即具有好的泛化能力。然而,当模型容量过高时,它可能过拟合:完美记住训练数据中的噪声,导致测试误差增大。正则化的目标就是降低泛化误差,即使这可能以增加训练误差为代价(见图5.3中测试误差的U形曲线,最优容量位于欠拟合与过拟合之间的平衡点)。
2.2 正则化的本质
正则化可以理解为向学习算法中注入先验知识或偏好。从贝叶斯角度看,正则化项对应于模型参数的先验分布(例如L2正则化对应高斯先验,L1对应拉普拉斯先验)。从优化角度看,正则化在原始目标函数(如负对数似然)基础上添加了一个惩罚项,从而引导参数向某些区域(如原点)靠近。
2.3 正则化的常见分类
本章讨论的正则化技术可以分为以下几类:
- 参数范数惩罚:直接约束参数的大小(如L2、L1)。
- 约束优化视角:将范数惩罚视为带有不等式约束的优化问题。
- 数据层面:通过增加或修改数据来提升泛化(如数据集增强、噪声注入)。
- 模型层面:通过共享参数、集成多个模型等(如多任务学习、Dropout)。
- 训练过程层面:通过早停(Early Stopping)来限制有效训练时间。
- 表示层面:鼓励稀疏表示或对输入变换的不变性(如稀疏编码、切线传播)。
下面我们将逐一详细讲解这些技术。
3. 核心正则化技术
3.1 参数范数惩罚
3.1.1 L2参数正则化(权重衰减)
定义:在目标函数 $J(\boldsymbol{\theta})$ 上添加平方范数惩罚项:
$$ \tilde{J}(\boldsymbol{\theta}) = J(\boldsymbol{\theta}) + \frac{\alpha}{2} \|\boldsymbol{w}\|_2^2 $$其中 $\alpha \ge 0$ 是正则化系数,$\boldsymbol{w}$ 表示所有权重(通常偏置不参与正则化,因为偏置对数据拟合影响较小)。
原理:
- 梯度下降视角:更新规则变为 $\boldsymbol{w} \leftarrow \boldsymbol{w} - \epsilon (\alpha \boldsymbol{w} + \nabla_{\boldsymbol{w}} J)$,即每次更新前先对权重做比例收缩 $(1-\epsilon \alpha)$,然后再减去梯度项。
- 二次近似分析:假设未正则化的最优解为 $\boldsymbol{w}^*$,Hessian矩阵为 $\boldsymbol{H}$。则正则化后的解为 $\tilde{\boldsymbol{w}} = (\boldsymbol{H} + \alpha \boldsymbol{I})^{-1} \boldsymbol{H} \boldsymbol{w}^*$。沿 $\boldsymbol{H}$ 的特征向量方向,该方向的权重被缩放为 $\frac{\lambda_i}{\lambda_i + \alpha}$。因此,在不重要方向(特征值 $\lambda_i$ 小)上的权重被衰减得更厉害;在重要方向($\lambda_i$ 大)上的权重几乎不变。这解释了 L2 正则化如何抑制那些对目标函数贡献小的权重成分。
例子:线性回归中,L2 正则化对应岭回归,其解为 $\boldsymbol{w} = (\boldsymbol{X}^\top\boldsymbol{X} + \alpha \boldsymbol{I})^{-1} \boldsymbol{X}^\top \boldsymbol{y}$。图7.1展示了在二维参数空间中,L2 正则化如何将解推向原点,尤其是在目标函数变化平缓的方向上。
3.1.2 L1参数正则化
定义:添加 L1 范数惩罚:
$$ \tilde{J}(\boldsymbol{\theta}) = J(\boldsymbol{\theta}) + \alpha \|\boldsymbol{w}\|_1 = J(\boldsymbol{\theta}) + \alpha \sum_i |w_i| $$原理:
- 梯度更新:$\nabla_{\boldsymbol{w}} \tilde{J} = \nabla_{\boldsymbol{w}} J + \alpha \text{sign}(\boldsymbol{w})$,其中 $\text{sign}$ 逐元素取符号。
- 稀疏性:在二次近似和对角Hessian假设下,L1 正则化会将部分权重精确地推到零(如果 $|w_i^*| < \alpha / H_{ii}$),从而产生稀疏解(图7.1中不同方向?实际上 L1 会沿坐标轴方向使权重变为0,产生稀疏性)。这与 L2 不同,L2 只会使权重缩小但非零。
- 贝叶斯解释:L1 正则化等价于拉普拉斯先验(Laplace prior),其密度函数在零点处呈尖峰,鼓励稀疏性。
例子:LASSO 回归(L1 正则化的线性回归)可用于特征选择,将不重要的特征对应的权重置零。
3.2 作为约束的范数惩罚
将正则化项视为对参数的约束 $\Omega(\boldsymbol{\theta}) \le k$,可以通过广义拉格朗日函数来理解:
$$ \mathcal{L}(\boldsymbol{\theta}, \alpha) = J(\boldsymbol{\theta}) + \alpha (\Omega(\boldsymbol{\theta}) - k), \quad \alpha \ge 0 $$对于固定的最优 $\alpha^*$,最小化 $\mathcal{L}(\boldsymbol{\theta}, \alpha^*)$ 等价于原始的正则化目标。这种观点有助于设计显式约束的优化方法:在每次梯度更新后,将参数投影回约束区域(例如将权重的列范数限制在一定范围内)。显式约束有时比惩罚更优,因为它可以防止权重无限增长,尤其在训练后期或使用大学习率时。
3.3 正则化与欠定问题
当问题欠定(如样本数少于特征数)时,$\boldsymbol{X}^\top\boldsymbol{X}$ 不可逆,无正则化将有无穷多解。添加正则化(如 $\alpha \boldsymbol{I}$)保证矩阵可逆,从而获得唯一解。这正是伪逆(Moore-Penrose pseudoinverse)的极限形式:$\boldsymbol{X}^+ = \lim_{\alpha \to 0} (\boldsymbol{X}^\top\boldsymbol{X} + \alpha \boldsymbol{I})^{-1} \boldsymbol{X}^\top$。
3.4 数据集增强
思想:生成更多训练数据(通常是人为构造的)以增加训练集规模,从而减少过拟合。
常见方法:
- 图像:平移、旋转、缩放、翻转、添加噪声等。对于物体识别,这些变换通常不改变类别,因此可以在原样本上施加变换后作为新样本。
- 语音:添加背景噪声、改变音调等。
- 注意:变换必须与任务相符(例如光学字符识别中不能水平翻转 ‘b’ 和 ’d’)。
理论解释:数据集增强相当于向模型引入一个先验:模型应对这些变换保持不变。与切线传播(见3.13)相比,数据集增强能处理更大的变换,但计算成本稍高。
3.5 噪声鲁棒性
3.5.1 向输入添加噪声
向输入添加噪声(如高斯噪声)可以看作数据集增强的一种形式。对于某些模型,这等价于对权重范数的惩罚(Bishop, 1995)。
3.5.2 向权重添加噪声
在训练过程中向权重添加噪声(如用于RNN的权重噪声)可以被解释为一种贝叶斯推断的随机实现。对线性回归的分析表明,添加微小权重噪声等价于一个额外的正则化项 $\eta \mathbb{E}_{p(\boldsymbol{x})}[\|\nabla_{\boldsymbol{w}} \hat{y}\|^2]$,鼓励模型对权重扰动不敏感,即寻找平坦的极小值区域。
3.5.3 向输出目标添加噪声
- 标签平滑(Label Smoothing):对于分类问题,将硬目标(0/1)替换为软目标(如 $\frac{\epsilon}{k-1}$ 和 $1-\epsilon$),防止模型过度自信,提高泛化。
3.6 半监督学习
半监督学习利用无标签数据来改善监督学习。通过无标签数据,模型可以学习数据分布 $P(\boldsymbol{x})$ 的结构,从而帮助学习条件分布 $P(y \mid \boldsymbol{x})$。常见做法:
- 先使用无监督学习(如自编码器)学习一个表示 $\boldsymbol{h} = f(\boldsymbol{x})$,然后在此表示上训练分类器。
- 联合训练:在损失函数中同时包含监督部分(如交叉熵)和无监督部分(如重构误差),共享参数。
3.7 多任务学习
多任务学习通过共享参数同时学习多个相关任务,从而提高泛化能力(见图7.2)。共享的参数(通常是低层表示)从多个任务中受益,相当于获得了更多训练样本,从而减少过拟合。任务特定参数(高层)则各自学习任务差异。
3.8 早停(Early Stopping)
早停是最简单且最常用的正则化方法之一。在训练过程中,定期监控验证集误差,一旦验证误差开始上升(即出现过拟合),就停止训练,并返回验证误差最低时的模型参数(见图7.3)。
原理:
- 在二次误差和梯度下降的简化假设下,早停等价于 L2 正则化(Bishop, 1995)。具体地,参数轨迹被限制在一个以初始值为中心的球内,有效容量由学习率与迭代次数的乘积决定。
- 与权重衰减相比,早停自动确定正则化强度,无需额外超参数搜索,但需要验证集。
算法:算法7.1给出早停的伪代码。后续可用全部数据重新训练相同步数(算法7.2)或继续训练直至验证误差低于早停时的训练误差(算法7.3)。
3.9 参数绑定与参数共享
- 参数绑定:通过惩罚项(如 $\|\boldsymbol{w}^{(A)} - \boldsymbol{w}^{(B)}\|^2$)强制不同模型的参数接近,但各自独立。
- 参数共享:强制某些参数完全相等,例如卷积神经网络中同一卷积核在整个输入空间共享。这不仅减少参数数量,还编码了平移不变性的先验。
3.10 稀疏表示
与稀疏参数(L1正则化)不同,稀疏表示鼓励隐藏单元激活值的稀疏性,即大部分 $h_i$ 接近零。方法包括:
- 对表示 $\boldsymbol{h}$ 施加 L1 惩罚。
- 使用 KL 散度惩罚平均激活(如稀疏自编码器)。
- 使用硬约束,如正交匹配追踪(OMP)强制每个样本只有 $k$ 个非零特征。
3.11 Bagging 与其他集成方法
Bagging(Bootstrap Aggregating)通过训练多个不同的模型(例如在不同数据子集上)并平均它们的预测来降低泛化误差(图7.5)。若各模型误差独立,平均后方差减为 $1/k$(式7.51)。集成方法通常能显著提升性能,但代价是训练和推理成本增加。
3.12 Dropout
Dropout 是深度学习中最强大的正则化技术之一。它通过随机“丢弃”一部分神经元(及其连接)来训练一个由所有子网络组成的集成。
训练过程:
- 每次前向传播时,对每个输入和隐藏单元以概率 $p$ 保留(或以概率 $1-p$ 置零),采样一个二进制掩码。
- 反向传播仅更新保留的单元。
- 不同小批量使用不同的掩码,相当于训练了指数多个不同的子网络(图7.6,7.7)。
推理过程:
- 不能显式平均所有子网络(数量太多)。常用近似:使用权重比例推断规则(weight scaling inference rule),即在测试时保留所有单元,但将权重乘以保留概率 $p$(或训练时乘以 $1/p$)。对于某些线性模型,这是精确的(式7.58-7.66)。
- 更精确的近似可通过几何平均或采样多个掩码实现。
为什么有效:
- 从集成学习角度看,Dropout 近似了 Bagging。
- 从生物学角度看,类似有性繁殖中的基因互换,迫使每个特征独立有效,避免协同适应(co-adaptation)。
- 从噪声角度看,Dropout 是向隐藏单元注入乘性噪声,比加性噪声更难以抵消。
变种:
- DropConnect:随机丢弃权重而非神经元输出。
- Fast Dropout:通过解析近似避免采样噪声。
3.13 对抗训练
对抗样本:对输入施加微小扰动,使模型以高置信度错误分类(图7.8)。这种现象源于模型的局部线性性质:高维空间中,沿梯度方向改变每个输入一点点可以累积成大的输出变化。
对抗训练:在训练中加入对抗样本,使模型对其鲁棒。这相当于引入局部恒定性先验,鼓励模型在训练点附近保持输出不变。对抗训练可视为半监督学习的一种形式(虚拟对抗训练)。
3.14 切线距离、切线传播与流形正切分类器
切线距离:基于流形假设,用样本点处的切线近似流形,并计算切线之间的距离作为相似度度量。
切线传播:在训练目标中加入正则项 $\sum_i (\nabla_{\boldsymbol{x}} f(\boldsymbol{x})^\top \boldsymbol{v}^{(i)})^2$,其中 $\boldsymbol{v}^{(i)}$ 是已知的流形切向量(如平移、旋转方向)。这迫使函数沿切向变化缓慢,即对指定变换不变(图7.9)。
流形正切分类器:通过自编码器(第14章)从数据中学习切向量,然后用切线传播正则化分类器,避免手动指定切向。
4. 概念关系图
5. 与前后的联系
- 前承:
- 第5章介绍了偏差-方差分解、过拟合、正则化基本思想,本章在此基础上展开。
- 第2、3、4章提供了理解本章公式所需的线性代数(特征分解、范数)、概率(先验)和数值计算(优化)。
- 后续应用:
- 第8章优化:早停、对抗训练等与优化过程密切相关;权重衰减与动量等结合。
- 第9章卷积网络:参数共享(卷积核)、数据集增强(图像变换)、Dropout 在 CNN 中应用广泛。
- 第10章循环网络:Dropout 在 RNN 中的变种、梯度裁剪(对抗梯度爆炸)等。
- 第14章自编码器:稀疏自编码器、去噪自编码器(输入噪声注入)、收缩自编码器(惩罚雅可比)等直接使用本章思想。
- 第20章生成模型:对抗训练在 GAN 中的应用,半监督学习在生成模型中的应用。
6. 总结与重点
6.1 核心要点
- 正则化的目标:在保持训练误差可接受的前提下,减少泛化误差。这是通过向学习算法中引入偏好(先验)实现的。
- 参数范数惩罚:L2 使权重向零收缩但不为零,L1 使部分权重精确为零(稀疏性)。可从贝叶斯角度理解为高斯/拉普拉斯先验。
- 数据增强:利用领域知识生成新样本,等效于引入不变性先验。
- 早停:限制训练时间,等价于 L2 正则化,且自动确定正则化强度。
- Dropout:通过随机丢弃神经元训练集成,近似于 Bagging,简单有效,是深度学习的标志性正则化技术。
- 对抗训练:通过对输入施加对抗扰动,增强模型对局部扰动的鲁棒性,本质是局部恒定性先验。
- 多任务学习与参数共享:利用相关任务增加有效样本量,降低过拟合。
- 流形学习视角:切线传播、流形正切分类器等鼓励模型沿数据流形变化缓慢,反映数据内在结构。
6.2 常见难点
- L1 vs L2 稀疏性:L1 为何能产生稀疏解?可从次梯度或约束区域形状理解(L1 球的角点更容易与等高线相切)。
- Dropout 的权重比例规则:为何测试时要乘保留概率?这保证期望输入相同。但在非线性网络中只是近似。
- 早停与 L2 等价的假设:需要二次误差、梯度下降、小学习率等条件,在实际中并非精确成立,但提供了直观理解。
- 对抗样本的成因:过度线性导致,并非模型“理解”错误,而是利用了高维空间的线性叠加特性。
- 流形切向量的获取:切线传播需要已知切向,而流形正切分类器通过自编码器学习,但自编码器本身也需训练。
6.3 学习建议
- 对比实验:在简单数据集(如 MNIST)上分别使用 L2、Dropout、早停等,观察验证误差曲线,体会不同正则化效果。
- 可视化:绘制 L1 和 L2 正则化下的权重分布,观察稀疏性;可视化对抗样本,理解微小扰动如何导致错误。
- 推导关键公式:亲手推导 L2 正则化的二次分析、早停与 L2 等价关系、Dropout 在线性模型中的精确性。
- 联系实际:思考自己项目中哪些正则化方法可能有效,结合数据规模、模型容量和领域知识选择。
- 阅读进阶材料:Dropout 原始论文(Srivastava et al., 2014)、对抗训练(Goodfellow et al., 2014b)、流形正切分类器(Rifai et al., 2011)等。
通过本章的学习,你已经掌握了深度学习中最常用且最重要的正则化策略。在下一章,我们将探讨如何更好地优化深度模型,使这些正则化技术发挥最大效用。
《深度学习》(Ian Goodfellow 著)第8章“深度模型中的优化”详细讲解
1. 本章概述与定位
第8章聚焦于深度学习中优化算法的特殊性。与第4章介绍的通用数值优化不同,深度学习的优化目标通常是高度非凸的、高维的、且带有大量噪声的损失函数。本章深入分析了这些挑战,并介绍了一系列专门为训练深度神经网络设计的优化算法和策略。
本章内容可分为四大部分:
- 机器学习优化与纯优化的区别:为什么要用代理损失函数、小批量估计。
- 神经网络优化面临的挑战:病态、局部极小值、鞍点、悬崖、长期依赖、不精确梯度等。
- 基本与高级优化算法:从SGD、动量到自适应学习率方法(AdaGrad、RMSProp、Adam)以及二阶近似(牛顿法、共轭梯度、BFGS)。
- 优化策略与元算法:批归一化、坐标下降、Polyak平均、预训练、课程学习等。
通过本章学习,读者将理解为何深度网络的优化如此困难,以及如何选择合适的算法和策略来克服这些困难。
2. 机器学习优化与纯优化的区别
2.1 经验风险最小化(Empirical Risk Minimization, ERM)
在机器学习中,我们希望最小化泛化误差(期望风险):
$$ J^*(\boldsymbol{\theta}) = \mathbb{E}_{(\boldsymbol{x},y) \sim p_{\text{data}}} L(f(\boldsymbol{x};\boldsymbol{\theta}), y) $$但真实分布 $p_{\text{data}}$ 未知,我们只能最小化经验风险:
$$ J(\boldsymbol{\theta}) = \frac{1}{m} \sum_{i=1}^m L(f(\boldsymbol{x}^{(i)};\boldsymbol{\theta}), y^{(i)}) $$这称为经验风险最小化。然而,直接最小化经验风险容易导致过拟合,且许多有用损失函数(如0-1损失)不可微。
2.2 代理损失函数与早停
- 代理损失函数:用一个可微的、与原始目标相近的函数替代不可微目标。例如,分类问题中用负对数似然替代0-1损失。代理损失有时能带来额外好处(如推动类别分离更远)。
- 早停:由于代理损失最小化可能无限逼近零,但泛化误差可能先降后升,因此常用早停(第7章)在验证集误差上升时停止训练。
2.3 批量算法与小批量算法
深度学习中的目标函数通常是对训练样本的求和:
$$ J(\boldsymbol{\theta}) = \frac{1}{m} \sum_{i=1}^m L(\boldsymbol{x}^{(i)}, y^{(i)}; \boldsymbol{\theta}) $$梯度也是样本梯度的平均:
$$ \nabla_{\boldsymbol{\theta}} J = \frac{1}{m} \sum_{i=1}^m \nabla_{\boldsymbol{\theta}} L(\boldsymbol{x}^{(i)}, y^{(i)}; \boldsymbol{\theta}) $$计算全批量梯度在大数据集上代价高昂。小批量随机梯度下降(minibatch SGD)每次随机抽取一个小批量样本计算梯度估计,既利用了并行计算,又引入噪声,有时能帮助逃离鞍点。小批量大小需权衡:
- 太小:梯度方差大,收敛慢,但可能正则化效果更好。
- 太大:计算收益递减,可能陷入尖锐极小值。
- 通常选择2的幂次(如32、64、128、256)以适应GPU架构。
3. 神经网络优化面临的挑战
3.1 病态(Ill-Conditioning)
定义:海森矩阵 $\boldsymbol{H}$ 的条件数(最大特征值与最小特征值之比)过大时,梯度下降会在某些方向震荡,学习缓慢。
表现:即使梯度很大,学习率也必须很小,因为强曲率方向会导致 overshoot。图8.1展示了梯度范数在训练中不减反增的现象,这正是病态的体现。
3.2 局部极小值
在非凸问题中,存在多个局部极小值。但研究表明,对于大型神经网络,大多数局部极小值都有相近的低代价,且高代价的局部极小值很少见。权重空间对称性(如隐藏单元置换)会导致无数等价极小值,但代价相同。因此,局部极小值并非主要障碍。
3.3 鞍点(Saddle Points)
高维非凸函数中,鞍点远多于局部极小值。鞍点处梯度为零,但海森矩阵有正有负(图4.5)。一阶方法(如SGD)可能被卡在鞍点附近,但噪声和动量有助于逃离。二阶方法(如牛顿法)则会被吸引到鞍点,需特殊处理(如“无鞍牛顿法”)。
3.4 悬崖与梯度爆炸
深层网络或RNN中,多个矩阵连乘可能导致梯度指数级增长,形成“悬崖”(图8.3)。当参数接近悬崖时,梯度更新可能将参数抛向远方,破坏已有优化成果。解决方案是梯度裁剪(gradient clipping):若梯度范数超过阈值,按比例缩放(式10.49)。
3.5 长期依赖
在RNN中,梯度通过时间反向传播会面临梯度消失或爆炸(第10.7节)。即使前向传播稳定,反向传播也可能因多次矩阵乘法而出现指数级缩放。
3.6 不精确梯度
实际中,梯度估计通常有噪声(小批量)或有偏(如对比散度)。优化算法需对此鲁棒。
3.7 局部与全局结构的差异
局部下降方向可能不指向全局最优解。图8.4展示了一个例子:局部梯度指向山下,但实际需要翻越山峰才能到达更低区域。这导致训练时间变长(图8.2)。
4. 基本优化算法
4.1 随机梯度下降(SGD)
算法:
$$ \boldsymbol{g} \leftarrow \frac{1}{m'} \sum_{i=1}^{m'} \nabla_{\boldsymbol{\theta}} L(\boldsymbol{x}^{(i)}, y^{(i)}; \boldsymbol{\theta}) $$$$ \boldsymbol{\theta} \leftarrow \boldsymbol{\theta} - \epsilon \boldsymbol{g} $$学习率 $\epsilon$ 需随训练衰减,常采用线性衰减(式8.14)或指数衰减。收敛性要求 $\sum \epsilon_k = \infty$ 且 $\sum \epsilon_k^2 < \infty$。
4.2 动量(Momentum)
思想:积累过去梯度的指数衰减移动平均,以加速学习,尤其在曲率差异大时抑制震荡(图8.5)。
更新规则:
$$ \boldsymbol{v} \leftarrow \alpha \boldsymbol{v} - \epsilon \nabla_{\boldsymbol{\theta}} J $$$$ \boldsymbol{\theta} \leftarrow \boldsymbol{\theta} + \boldsymbol{v} $$$\alpha \in [0,1)$ 控制之前梯度的贡献。物理类比:速度为 $\boldsymbol{v}$,梯度为力,$\alpha$ 为摩擦系数。最终速度可达 $\frac{\epsilon \| \boldsymbol{g} \|}{1-\alpha}$。
4.3 Nesterov动量
改进:在计算梯度前先按当前速度更新参数(“向前看”):
$$ \tilde{\boldsymbol{\theta}} = \boldsymbol{\theta} + \alpha \boldsymbol{v} $$$$ \boldsymbol{g} \leftarrow \nabla_{\tilde{\boldsymbol{\theta}}} J $$$$ \boldsymbol{v} \leftarrow \alpha \boldsymbol{v} - \epsilon \boldsymbol{g} $$$$ \boldsymbol{\theta} \leftarrow \boldsymbol{\theta} + \boldsymbol{v} $$在凸优化中,Nesterov加速梯度能达到 $O(1/k^2)$ 的收敛率,优于动量的 $O(1/k)$。
5. 参数初始化策略
良好的初始化对训练深度网络至关重要。目标:
- 打破对称性:不同单元需有不同的初始参数。
- 保持前向和反向信号尺度稳定。
常用方法:
- 随机初始化:通常从高斯或均匀分布中采样,均值为0。
- 归一化初始化(Glorot & Bengio, 2010):对全连接层,权重从 $U(-\sqrt{\frac{6}{m+n}}, \sqrt{\frac{6}{m+n}})$ 采样,其中 $m,n$ 为输入、输出单元数。旨在保持各层激活方差一致。
- 正交初始化(Saxe et al., 2013):用随机正交矩阵初始化,并乘以增益因子(如对ReLU用 $\sqrt{2}$),有助于信息流动。
- 稀疏初始化:每个单元只有 $k$ 个非零权重,保持输入总和独立于输入维度。
- 偏置初始化:通常为0,但某些情况下可设小正值(如ReLU设为0.1)或根据输出统计设置(如softmax偏置设为先验概率)。
6. 自适应学习率算法
6.1 AdaGrad
思想:对每个参数独立地缩放学习率,与历史梯度平方和的平方根成反比(图算法8.4)。
$$ \boldsymbol{r} \leftarrow \boldsymbol{r} + \boldsymbol{g} \odot \boldsymbol{g} $$$$ \Delta \boldsymbol{\theta} = -\frac{\epsilon}{\delta + \sqrt{\boldsymbol{r}}} \odot \boldsymbol{g} $$优点:在凸问题上理论性质好;缺点:累积平方和不断增长,学习率过早衰减,不适用于非凸深度学习。
6.2 RMSProp
改进:用指数衰减平均替代累积和(算法8.5):
$$ \boldsymbol{r} \leftarrow \rho \boldsymbol{r} + (1-\rho) \boldsymbol{g} \odot \boldsymbol{g} $$$$ \Delta \boldsymbol{\theta} = -\frac{\epsilon}{\sqrt{\delta + \boldsymbol{r}}} \odot \boldsymbol{g} $$RMSProp在非凸问题上表现更好,是深度学习的常用算法之一。
6.3 Adam
思想:结合动量和RMSProp,同时估计一阶矩(动量)和二阶矩(未中心化的方差),并添加偏置修正(算法8.7):
$$ \boldsymbol{s} \leftarrow \rho_1 \boldsymbol{s} + (1-\rho_1) \boldsymbol{g} $$$$ \boldsymbol{r} \leftarrow \rho_2 \boldsymbol{r} + (1-\rho_2) \boldsymbol{g} \odot \boldsymbol{g} $$$$ \hat{\boldsymbol{s}} = \frac{\boldsymbol{s}}{1-\rho_1^t}, \quad \hat{\boldsymbol{r}} = \frac{\boldsymbol{r}}{1-\rho_2^t} $$$$ \Delta \boldsymbol{\theta} = -\epsilon \frac{\hat{\boldsymbol{s}}}{\sqrt{\hat{\boldsymbol{r}}} + \delta} $$Adam通常对超参数鲁棒,是当前最流行的优化器之一。
6.4 如何选择优化算法
没有统一结论。SGD + 动量简单有效,但需调学习率;Adam自适应,默认参数常能工作;RMSProp与动量结合也常见。实践中常从Adam开始,若需精细调参可换SGD。
7. 二阶近似方法
二阶方法利用海森矩阵的曲率信息,有望加速收敛,但计算成本高。
7.1 牛顿法
更新公式:
$$ \boldsymbol{\theta}^* = \boldsymbol{\theta}_0 - \boldsymbol{H}^{-1} \boldsymbol{g} $$需计算并存储海森逆($O(n^3)$),且海森需正定。在非凸问题中,海森可能不正定,需正则化(如加对角 $\alpha \boldsymbol{I}$)。深度学习中极少使用全牛顿法。
7.2 共轭梯度(Conjugate Gradients)
用于解线性系统 $\boldsymbol{A}\boldsymbol{x} = \boldsymbol{b}$,或最小化二次型。对于非二次问题,非线性共轭梯度需定期重置搜索方向。共轭梯度避免显式存储海森,但每次需线搜索,计算代价仍高。
7.3 BFGS
BFGS(Broyden–Fletcher–Goldfarb–Shanno)是一种拟牛顿法,迭代更新海森逆的近似 $\boldsymbol{M}_t$,仅需梯度信息。内存需求 $O(n^2)$,对深度网络仍过大。L-BFGS(Limited-memory BFGS)存储有限步的向量来近似,内存 $O(n)$,但需在完整数据集上计算,不适用于小批量。
8. 优化策略与元算法
8.1 批归一化(Batch Normalization, BN)
动机:深度网络中,前层参数变化会导致后层输入分布变化(内部协变量偏移),使训练困难。BN通过标准化每层小批量输入(减去均值除以标准差),并引入可学习的缩放和平移参数,使分布稳定。
优点:
- 允许更高学习率。
- 减少对初始化的依赖。
- 有轻微正则化效果(可减少Dropout需求)。
实现:训练时用当前小批量统计;测试时用移动平均统计。BN常置于线性变换之后、激活函数之前。
8.2 坐标下降(Coordinate Descent)
每次优化一个变量(或一组变量),固定其他。在稀疏编码等可分离问题中有效,但变量强相关时收敛慢。
8.3 Polyak平均
对参数轨迹做指数衰减平均(式8.39),得到更稳定的参数估计,常用于提高泛化。
8.4 监督预训练
先训练浅层网络,然后逐层添加并微调(图8.7)。虽然现代方法已较少使用,但在某些困难问题上仍有效。
8.5 设计易于优化的模型
- 使用线性单元(如ReLU)和残差连接,使梯度更易流动。
- 添加辅助输出(如GoogLeNet的辅助分类器),为低层提供额外梯度信号。
8.6 延续方法与课程学习
延续方法:构造一系列逐渐变难的代价函数,从简单开始优化,逐步逼近原问题。课程学习:先让模型学习简单样本,再引入复杂样本。这在语言建模等任务中被证明有效。
9. 知识体系图
10. 与前后的联系
- 前承:
- 第4章数值计算:梯度下降基础、病态、牛顿法、约束优化等概念是本章基石。
- 第5章机器学习基础:经验风险最小化、小批量SGD、过拟合等。
- 第6章深度前馈网络:反向传播算法提供梯度。
- 第7章正则化:早停、参数范数惩罚等与优化过程交织。
- 后续应用:
- 第9章卷积网络:批归一化在CNN中常用,动量/Adam用于训练。
- 第10章循环网络:梯度裁剪、长期依赖挑战、LSTM等。
- 第11章实践方法论:超参数调优(学习率、动量等)与本章算法选择直接相关。
- 第12章应用:大规模分布式优化(异步SGD)。
11. 总结与重点
11.1 核心要点
- 优化挑战:病态、鞍点、悬崖、长期依赖等是深度网络优化的主要障碍。
- SGD及其变种:动量、Nesterov动量加速收敛,改善病态问题。
- 自适应学习率:AdaGrad、RMSProp、Adam自动调整学习率,简化调参。
- 二阶方法:理论强大但实用困难,L-BFGS偶有应用。
- 批归一化:革命性技术,稳定训练、加速收敛、减少过拟合。
- 初始化策略:好的初始化至关重要,如Glorot初始化、正交初始化。
- 课程学习与预训练:在某些任务中有效,但现代端到端训练更常见。
11.2 常见难点
- 学习率调度:如何选择初始学习率、衰减策略?需结合验证集和训练曲线。
- 动量与Nesterov区别:Nesterov在凸问题上有理论优势,实践中两者差异不大。
- Adam的偏置修正:为何需要?因为一阶、二阶矩初始为0,早期估计有偏。
- 批归一化在推理时:使用全局统计而非小批量统计,注意实现细节。
- 梯度裁剪阈值:需根据梯度范数分布设定,过大无效,过小阻碍学习。
11.3 学习建议
- 动手实现:用NumPy实现SGD、动量、Adam,在简单问题上观察行为。
- 可视化:绘制损失曲面、梯度轨迹、学习率变化,直观理解优化过程。
- 实验对比:在MNIST/CIFAR上比较不同优化器、初始化、学习率调度的效果。
- 阅读源码:查看PyTorch/TensorFlow中优化器的实现,理解参数含义。
- 理论结合实践:理解挑战的同时,通过调参体会各算法优劣。
通过本章的学习,你已经掌握了深度学习中优化算法的核心思想与实践技巧。在接下来的章节中,这些算法将与特定架构(CNN、RNN)结合,解决更复杂的实际问题。
《深度学习》(Ian Goodfellow 著)第9章“卷积网络”详细讲解
1. 本章概述与定位
卷积神经网络(Convolutional Neural Networks, CNNs)是深度学习中最具影响力的架构之一,专门用于处理具有网格结构的数据,如图像(2D像素网格)、时间序列(1D时间轴)和视频(3D时空网格)。本章系统地介绍了卷积网络的核心组件——卷积操作、池化、多通道处理,以及它们的变体和设计选择。此外,本章还探讨了卷积网络的动机(稀疏交互、参数共享、等变表示)、神经科学基础、历史发展,并提供了实际应用中的指导。
卷积网络的成功源于其巧妙地编码了局部性和平移不变性等先验知识,这使得它在计算机视觉、语音识别等领域取得了革命性突破。理解本章内容对于后续学习现代卷积架构(如ResNet、GoogLeNet)以及处理图像、视频等任务至关重要。
2. 由浅入深:从基础概念到卷积网络
2.1 什么是卷积?
2.1.1 连续卷积的定义
在数学中,卷积是两个函数 $x$ 和 $w$ 的一种运算,定义为:
$$ s(t) = (x * w)(t) = \int x(a) w(t-a) da $$它表示函数 $w$ 在时间上翻转后与 $x$ 的滑动加权平均。在信号处理中,$x$ 称为输入,$w$ 称为核(kernel),输出 $s$ 称为特征图(feature map)。
2.1.2 离散卷积
在计算机中,时间和空间都是离散的,因此使用离散卷积:
$$ s(t) = (x * w)(t) = \sum_{a=-\infty}^{\infty} x(a) w(t-a) $$通常,核 $w$ 只在有限区间内非零,因此求和实际是有限的。
2.1.3 二维卷积
对于图像,输入是二维张量 $I$,核是二维张量 $K$,二维卷积定义为:
$$ S(i,j) = (I * K)(i,j) = \sum_m \sum_n I(m,n) K(i-m, j-n) $$由于卷积满足交换律,也可写作:
$$ S(i,j) = \sum_m \sum_n I(i-m, j-n) K(m,n) $$在机器学习库中,通常实现的是互相关(cross-correlation),即不翻转核:
$$ S(i,j) = \sum_m \sum_n I(i+m, j+n) K(m,n) $$这并不影响学习,因为核参数会适应这种操作。本书中统称为卷积,并默认使用互相关版本(图9.1)。
2.2 卷积的动机:三大优势
2.2.1 稀疏交互(Sparse Interactions)
传统全连接层中,每个输出单元与每个输入单元相连,而卷积层中,每个输出只与局部区域(感受野)的输入相连,通过核大小控制。这使得:
- 参数数量大大减少(从 $m \times n$ 降至 $k \times n$,其中 $k$ 是核大小,远小于 $m$)。
- 计算量减少。
- 模型统计效率提高。
如图9.2和图9.3所示,稀疏连接使得深层单元的感受野逐渐扩大,但仍能捕获全局信息。
2.2.2 参数共享(Parameter Sharing)
在卷积层中,同一个核在整个输入上滑动,因此同一组参数被用于所有位置。这进一步减少了参数量(从 $k \times n$ 降至 $k$),且保证了平移等变性(见下文)。图9.5对比了全连接和卷积的参数共享。
2.2.3 等变表示(Equivariant Representations)
等变性:若函数 $f$ 满足 $f(g(x)) = g(f(x))$,则称 $f$ 对变换 $g$ 等变。卷积对平移是等变的:如果将输入平移,输出特征图也会相应平移。这对于检测图像中无论出现在何处的特征(如边缘)非常有用。图9.6展示了卷积如何高效实现边缘检测。
2.3 池化(Pooling)
池化层通常跟在卷积层之后,对特征图进行下采样。常见池化操作:
- 最大池化(Max Pooling):取池化窗口内的最大值。
- 平均池化(Average Pooling):取窗口内平均值。
- L2 范数池化等。
池化的作用:
- 引入平移不变性:对输入的微小平移,池化输出近似不变(图9.8)。
- 降维:减少特征图尺寸,降低后续层计算量。
- 扩大感受野:后续层可覆盖更大区域。
- 处理变长输入:通过调整池化窗口大小,可输出固定尺寸的特征。
池化也可以跨通道进行,学习对某些变换的不变性(图9.9)。当使用步长大于1的池化时,可实现降采样(图9.10)。
2.4 卷积与池化作为无限强先验
将卷积网络与全连接网络对比:卷积可以看作在全连接网络上施加了一个无限强先验,即:
- 每个隐藏单元只与局部输入相连(稀疏性)。
- 同一层的所有单元共享相同的权重(平移等变性)。 池化则施加了局部平移不变性先验。这些先验在图像处理中非常合理,因此卷积网络通常比全连接网络泛化更好。但如果任务需要精确保留位置信息,则可能欠拟合。
3. 核心知识点详解
3.1 基本卷积函数的变体
3.1.1 多通道卷积
实际输入通常是多通道的(如RGB图像有3个通道),输出也可能有多通道(多个不同的特征图)。因此卷积核是一个四维张量:输出通道、输入通道、高度、宽度。输出特征图的一个通道是对所有输入通道的卷积结果求和(加上偏置)得到的。
3.1.2 步幅(Stride)
步幅是核每次滑动的像素数。步幅 $s > 1$ 可对输出进行降采样(图9.12)。数学上,步幅卷积等价于先做单位步幅卷积再每隔 $s$ 采样,但直接计算更高效。
3.1.3 填充(Padding)
为避免特征图尺寸过快缩小,可在输入周围填充零(或其它值)。常用填充方式:
- 有效卷积(valid):不填充,输出尺寸 $m - k + 1$。
- 相同卷积(same):填充使得输出尺寸等于输入尺寸(步幅为1时)。
- 全卷积(full):填充使得每个像素被访问 $k$ 次,输出尺寸 $m + k - 1$。 零填充的效果见图9.13。
3.1.4 局部连接层
若不共享参数,但保持局部连接,则得到局部连接层(图9.14中)。这在某些任务中有用(如人脸识别中不同区域需不同特征)。
3.1.5 平铺卷积(Tiled Convolution)
折衷方案:学习一组 $t$ 个核,在空间上循环使用(图9.16)。这比局部连接层参数少,比卷积更具多样性。
3.1.6 转置卷积(Transposed Convolution)
用于从特征图重建输入(如自编码器、生成模型)。它不是卷积的逆运算,而是将输入通过卷积操作进行上采样。实现上,相当于将卷积核旋转180°后做卷积,需注意输入输出尺寸匹配。
3.2 结构化输出
卷积网络不仅可用于分类,还可输出结构化对象,如每个像素的标签(语义分割)。这可通过:
- 使用步长为1的卷积和池化,保持空间维度。
- 使用转置卷积上采样。
- 结合循环网络迭代细化(图9.17)。
3.3 数据类型
卷积网络适用于多种网格数据,见表9.1:
- 1D:音频波形、时间序列。
- 2D:图像、声谱图。
- 3D:视频、医学CT扫描。
多通道可以是颜色通道、多传感器数据等。
3.4 高效卷积算法
- 快速傅里叶变换(FFT):将卷积转化为频域点乘,适用于大核。
- 可分离卷积:若核可分解为多个一维核的乘积,则可用多次一维卷积替代,大幅降低计算。
- 现代框架利用GPU并行优化卷积(如cuDNN)。
3.5 随机或无监督特征
早期由于计算资源有限,常用无监督方法预训练卷积核:
- 随机初始化:简单但有效(如 Jarrett et al. 2009)。
- 手工设计:如Gabor滤波器。
- 无监督学习:如用k-means聚类图像块,将聚类中心作为卷积核(Coates et al. 2011)。
- 逐层贪婪预训练:用无监督学习(如卷积深度信念网络)逐层训练。
如今,有监督端到端训练是主流,但无监督方法在某些场景仍有价值。
3.6 神经科学基础
卷积网络的设计灵感来自视觉皮层的研究(Hubel & Wiesel):
- 简单细胞:对特定方向的边缘有响应,相当于卷积层。
- 复杂细胞:对简单细胞的响应进行池化,获得平移不变性,相当于池化层。
- 超复杂细胞:对更复杂模式响应。
图9.18展示了Gabor函数(模拟简单细胞感受野),图9.19展示了机器学习模型学到的Gabor-like特征。
3.7 卷积网络的历史
- 1980年代:Fukushima提出Neocognitron,包含卷积和池化思想。
- 1989年:LeCun等人用反向传播训练卷积网络识别手写数字。
- 1998年:LeNet-5用于银行支票识别。
- 2012年:AlexNet在ImageNet上大胜,引发深度学习热潮。
- 此后,VGG、GoogLeNet、ResNet等不断刷新记录。
4. 知识体系图
5. 实例辅助
5.1 卷积计算实例
假设输入 $I$ 为 $4\times4$ 矩阵:
$$ \begin{bmatrix} 1 & 2 & 3 & 4 \\ 5 & 6 & 7 & 8 \\ 9 & 10 & 11 & 12 \\ 13 & 14 & 15 & 16 \end{bmatrix} $$核 $K$ 为 $2\times2$:
$$ \begin{bmatrix} 0 & 1 \\ 2 & 3 \end{bmatrix} $$使用步幅1、无填充的互相关(不翻转):
- 左上角输出:$1\cdot0 + 2\cdot1 + 5\cdot2 + 6\cdot3 = 0+2+10+18=30$
- 依次滑动,得到 $3\times3$ 输出。
5.2 池化实例
对上述卷积输出进行 $2\times2$ 最大池化,步幅2:
- 左上 $2\times2$ 块最大值,得到降采样后的特征图。
5.3 多通道卷积
输入有RGB三个通道,核也有三个通道,分别与对应通道卷积后求和,加上偏置,得到一个输出通道。多个输出通道需多个这样的核组。
5.4 转置卷积
将 $2\times2$ 输入通过转置卷积上采样到 $4\times4$,核为 $3\times3$,步幅2,填充1,可实现类似于“反卷积”的效果。
6. 与前后的联系
前承:
- 第2章线性代数:矩阵乘法、张量。
- 第4章数值计算:优化算法。
- 第5章机器学习基础:过拟合、泛化。
- 第6章深度前馈网络:反向传播、激活函数。
- 第7章正则化:数据集增强、参数共享、Dropout在CNN中的应用。
- 第8章优化:批归一化在CNN中常用。
后续应用:
- 第10章循环网络:卷积可视为RNN在空间上的特例,RNN也可用于处理序列,两者可结合(如卷积LSTM)。
- 第11章实践方法论:CNN的设计选择(深度、核大小、步幅)是调参重点。
- 第12章应用:CNN在计算机视觉(图像分类、检测、分割)、语音识别、自然语言处理(文本卷积)中的广泛应用。
- 第14章自编码器:卷积自编码器。
- 第15章表示学习:CNN学习层次化特征。
- 第20章深度生成模型:DCGAN等生成模型基于CNN。
7. 总结与重点
7.1 核心要点
- 卷积操作:通过核在输入上滑动计算点积,具有稀疏交互、参数共享、平移等变性三大优势。
- 池化:提供平移不变性和降采样,有助于泛化和计算效率。
- 多通道与变体:步幅、填充、多通道卷积是构建现代CNN的基本组件;转置卷积用于上采样。
- 先验视角:卷积和池化编码了局部性和平移不变性的无限强先验。
- 历史与神经科学:CNN受视觉皮层启发,并经历了从LeNet到AlexNet再到ResNet的发展。
- 实现效率:通过FFT、GPU加速、可分离卷积等提高速度。
7.2 常见难点
- 卷积与互相关的区别:大多数框架实现的是互相关,但学习到的核会适应,不影响结果。
- 感受野计算:深层单元的感知区域由核大小、步幅、层数共同决定,需掌握递推公式。
- 转置卷积的棋盘效应:步幅不整除时可能产生重叠,导致输出不平滑,需谨慎设计。
- 空洞卷积:虽未在本章详述,但常用于分割任务,是卷积的扩展。
- 池化与步幅卷积的选择:两者都可降采样,现代网络倾向于用步幅卷积替代池化。
7.3 学习建议
- 动手实现:用NumPy实现简单的卷积和池化前向/反向,加深理解。
- 可视化:用工具(如TensorBoard)可视化卷积核和特征图,观察学习到的模式。
- 经典网络复现:复现LeNet-5、AlexNet、VGG等,理解设计演变。
- 调参实验:在小型数据集(CIFAR-10)上尝试不同核大小、深度、填充方式,观察对性能的影响。
- 阅读论文:原始论文(LeCun 1989, Krizhevsky 2012, He 2016等)有助于深入理解。
通过本章的学习,你已经掌握了卷积网络的核心概念和设计原则。在接下来的章节中,你将看到这些原理如何应用于序列数据(第10章)和实际任务(第12章)。卷积网络是深度学习的基石之一,理解它将为你打开计算机视觉乃至更广阔领域的大门。
《深度学习》(Ian Goodfellow 著)第10章“序列建模:循环和递归网络”详细讲解
1. 本章概述与定位
循环神经网络(Recurrent Neural Networks, RNNs)是深度学习中处理序列数据的核心架构。与卷积网络处理网格状数据(如图像)不同,RNN专门用于处理变长序列,如文本、语音、时间序列等。其关键在于通过循环连接在时间步之间共享参数,使得网络能够捕获序列中的时间依赖关系。
本章内容极为丰富,从基本RNN的展开计算图开始,逐步深入到双向RNN、编码器-解码器架构、深度RNN、递归神经网络,然后重点讨论长期依赖问题及其解决方案——门控RNN(LSTM、GRU),最后介绍优化技巧和显式记忆机制。通过本章学习,读者将掌握序列建模的核心思想与技术,为自然语言处理、语音识别、时间序列预测等应用奠定基础。
2. 由浅入深:从基础概念到高级架构
2.1 序列数据的挑战与RNN的动机
2.1.1 为什么需要专门处理序列的模型?
传统的前馈网络(如MLP)假设输入是独立同分布的固定大小向量,无法处理变长序列,也无法利用序列中的顺序信息。例如,在句子“我 爱 北京”和“北京 爱 我”中,词的顺序决定了语义,而前馈网络无法区分。此外,序列中重要的信息可能出现在任意位置,需要模型具有时间不变性——即无论事件发生在序列的早期还是晚期,都能被同样地识别。
2.1.2 RNN的核心思想
RNN通过引入循环连接,使得网络的隐藏状态可以沿着时间轴传递,从而形成一个记忆。具体地,在每个时间步 $t$,隐藏状态 $\boldsymbol{h}^{(t)}$ 是当前输入 $\boldsymbol{x}^{(t)}$ 和上一时刻隐藏状态 $\boldsymbol{h}^{(t-1)}$ 的函数:
$$ \boldsymbol{h}^{(t)} = f(\boldsymbol{h}^{(t-1)}, \boldsymbol{x}^{(t)}; \boldsymbol{\theta}) $$这个循环结构使得信息可以在时间上流动,且参数 $\boldsymbol{\theta}$ 在所有时间步共享,体现了参数共享的思想,类似于卷积网络在空间上的参数共享。
2.2 展开计算图
为了直观理解RNN的信息流和梯度计算,可以将循环结构展开成时间轴上的前馈网络(图10.1、10.2)。展开后的计算图是一个深度网络,其深度等于序列长度。这种展开有两大优势:
- 共享参数:所有时间步使用相同的变换 $f$,使得模型能够处理变长序列,且参数数量与序列长度无关。
- 梯度计算:通过展开图,可以直接应用反向传播(即通过时间的反向传播,BPTT)计算梯度。
2.3 基本RNN的设计模式
本章介绍了三种常见RNN设计模式(图10.3、10.4、10.5):
- 每个时间步都有输出,且隐藏层之间有循环连接(图10.3):这是最通用的形式,隐藏状态既传递信息又用于产生输出。
- 每个时间步都有输出,但只有输出到隐藏的循环(图10.4):信息只能通过输出传递到未来,表达能力受限,但训练时可并行(教师强制)。
- 隐藏层之间有循环,但只在序列末尾输出(图10.5):用于将整个序列编码为一个固定大小的向量(如句子编码)。
2.3.1 前向传播公式(以图10.3为例)
给定输入序列 $\boldsymbol{x}^{(1)}, \dots, \boldsymbol{x}^{(\tau)}$,初始化 $\boldsymbol{h}^{(0)}$(通常为零向量)。对于 $t=1$ 到 $\tau$:
$$ \boldsymbol{a}^{(t)} = \boldsymbol{b} + \boldsymbol{W}\boldsymbol{h}^{(t-1)} + \boldsymbol{U}\boldsymbol{x}^{(t)} $$$$ \boldsymbol{h}^{(t)} = \tanh(\boldsymbol{a}^{(t)}) $$$$ \boldsymbol{o}^{(t)} = \boldsymbol{c} + \boldsymbol{V}\boldsymbol{h}^{(t)} $$$$ \hat{\boldsymbol{y}}^{(t)} = \text{softmax}(\boldsymbol{o}^{(t)}) $$损失为各时间步损失之和:
$$ L = \sum_{t=1}^\tau L^{(t)} = -\sum_{t=1}^\tau \log \hat{y}^{(t)}_{y^{(t)}} $$其中参数 $\boldsymbol{\theta} = \{\boldsymbol{b}, \boldsymbol{c}, \boldsymbol{W}, \boldsymbol{U}, \boldsymbol{V}\}$ 共享于所有时间步。
2.4 通过时间的反向传播(BPTT)
BPTT 是反向传播在展开RNN上的直接应用。算法先执行前向传播并存储所有中间变量,然后从最后一个时间步开始反向计算梯度。
以图10.3为例,梯度计算过程如下(推导见10.2.2节):
- 初始化 $\nabla_{\boldsymbol{o}^{(t)}} L = \hat{\boldsymbol{y}}^{(t)} - \boldsymbol{1}_{y^{(t)}}$(对于交叉熵损失)。
- 从 $t=\tau$ 到 $t=1$: $$ \nabla_{\boldsymbol{h}^{(t)}} L = \boldsymbol{V}^\top \nabla_{\boldsymbol{o}^{(t)}} L + \boldsymbol{W}^\top \text{diag}(1-(\boldsymbol{h}^{(t+1)})^2) \nabla_{\boldsymbol{h}^{(t+1)}} L $$ 其中第二项仅在 $t<\tau$ 时存在。
- 然后计算对各参数的梯度,注意参数在所有时间步共享,因此需累加各时间步的贡献: $$ \nabla_{\boldsymbol{c}} L = \sum_t \nabla_{\boldsymbol{o}^{(t)}} L,\quad \nabla_{\boldsymbol{V}} L = \sum_t (\nabla_{\boldsymbol{o}^{(t)}} L) \boldsymbol{h}^{(t)\top} $$ 等等。
BPTT 的时间复杂度为 $O(\tau)$,且无法并行(因为序列依赖),内存开销也为 $O(\tau)$(需存储所有中间状态)。
2.5 教师强制(Teacher Forcing)
对于具有输出到隐藏循环的RNN(图10.4),训练时可以使用教师强制:在时间步 $t$,将真实的输出 $y^{(t)}$(而非模型预测)作为下一时间步的输入(图10.6)。这可以将序列分解为独立的条件概率,允许并行训练。但测试时没有真实输出,需用模型自己的预测,导致训练与测试不一致(exposure bias)。解决方法包括混合使用真实输出和预测输出(课程学习)。
2.6 作为有向图模型的RNN
RNN可以解释为对序列 $y^{(1)},\dots,y^{(\tau)}$ 的联合概率建模(图10.7、10.8)。通过引入隐藏变量 $\boldsymbol{h}^{(t)}$,模型利用条件概率的链式法则:
$$ P(y^{(1)},\dots,y^{(\tau)}) = \prod_{t=1}^\tau P(y^{(t)} \mid \boldsymbol{h}^{(t)}) $$其中 $\boldsymbol{h}^{(t)}$ 是过去信息的确定性函数。这种参数化方式使得模型能够以 $O(1)$(相对于序列长度)的参数表示任意复杂的联合分布,但代价是优化困难。
2.7 基于上下文的序列建模
在许多应用中,输出序列依赖于一个额外的上下文输入 $\boldsymbol{x}$。这可以通过以下方式实现(图10.9、10.10):
- 将 $\boldsymbol{x}$ 作为每个时间步的额外输入(通过权重矩阵 $\boldsymbol{R}$)。
- 将 $\boldsymbol{x}$ 作为初始状态 $\boldsymbol{h}^{(0)}$。
- 对于输入序列 $\boldsymbol{x}^{(1)},\dots,\boldsymbol{x}^{(\tau)}$,可将其作为每个时间步的输入,同时保持输出序列与输入对齐(图10.10)或不对齐(编码器-解码器)。
3. 高级RNN架构
3.1 双向RNN(Bidirectional RNN)
在许多任务中(如语音识别、手写识别),当前输出可能依赖于未来的输入。双向RNN通过两个独立的RNN层分别从正向和反向处理序列,然后将它们的隐藏状态拼接作为输出(图10.11)。这样每个时间步的输出都利用了整个序列的上下文信息。
双向RNN不能用于实时预测(需完整序列),但在离线批处理任务中非常有效。
3.2 编码器-解码器架构(Encoder-Decoder / Sequence-to-Sequence)
编码器-解码器架构(图10.12)用于将输入序列映射到输出序列,两者长度可以不同。它由两部分组成:
- 编码器:读取输入序列,将其编码为一个固定长度的上下文向量 $\boldsymbol{C}$(通常是最后一个隐藏状态)。
- 解码器:以 $\boldsymbol{C}$ 为初始状态或每个时间步的额外输入,自回归地生成输出序列。
这一架构在机器翻译(Sutskever et al., 2014)、摘要生成等领域取得巨大成功。缺点是固定长度的上下文向量可能无法容纳长序列信息,因此后续引入了注意力机制(第12.4.5.1节)。
3.3 深度RNN
将RNN在时间上展开已经具有深度,但每个时间步内的变换(如从 $\boldsymbol{h}^{(t-1)}$ 到 $\boldsymbol{h}^{(t)}$)仍是“浅层”的(通常是一个仿射变换加非线性)。深度RNN通过在每个时间步内引入多层隐藏层来增加深度(图10.13a),或者将输入到隐藏、隐藏到隐藏、隐藏到输出的变换分别用多层网络实现(图10.13b)。然而,这会使梯度路径变长,加剧梯度消失。解决方案包括在隐藏到隐藏路径中引入跳跃连接(图10.13c)。
3.4 递归神经网络(Recursive Neural Networks)
递归神经网络(图10.14)是RNN的推广,其计算图不是链式而是树状结构,用于处理具有层次结构的数据(如自然语言的句法树)。每个节点根据其子节点的表示计算自己的表示,通过共享参数实现高效建模。递归网络在自然语言处理和计算机视觉中均有应用,但需要预先指定树结构(如解析树)。
4. 长期依赖的挑战
4.1 梯度消失与爆炸
RNN在时间上展开后深度极大,反向传播时梯度需经过多个时间步的 Jacobian 矩阵连乘。若这些矩阵的奇异值大部分小于1,梯度会指数级衰减(梯度消失);若大于1,则指数级增长(梯度爆炸)。这导致模型难以学习长距离依赖(图10.15)。例如,一个简单的线性RNN $\boldsymbol{h}^{(t)} = \boldsymbol{W}^\top \boldsymbol{h}^{(t-1)}$ 中,$\boldsymbol{h}^{(t)} = (\boldsymbol{W}^t)^\top \boldsymbol{h}^{(0)}$,特征值模长决定信息衰减速度。
4.2 长期依赖与混沌边缘
为了存储信息,RNN需进入稳定但接近混沌的区域(即特征值接近1),但这会使得梯度几乎不衰减,从而产生爆炸风险。因此,简单RNN在实际中很难学习超过10-20步的依赖。
5. 解决长期依赖的策略
5.1 回声状态网络(Echo State Networks, ESN)
ESN是一种储层计算方法,其思想是固定输入到隐藏和隐藏到隐藏的权重(随机初始化),只训练输出权重。通过将循环层置于“混沌边缘”(谱半径略小于1),储层能记住输入历史,输出层只需线性组合即可完成任务。ESN训练简单(凸优化),但需仔细设计储层。
5.2 渗漏单元与多时间尺度
通过在循环连接中引入渗漏单元(leaky units),即线性自连接权重接近1,可使信息缓慢衰减,从而捕获长时依赖。不同单元可设置不同时间常数(如不同组的单元用不同渗漏系数),形成多时间尺度(图10.13中未直接展示,但概念类似)。
5.3 门控RNN:LSTM与GRU
门控RNN通过引入可学习的门控机制,动态控制信息流动,是目前最成功的长期依赖解决方案。
5.3.1 长短时记忆网络(LSTM)
LSTM(图10.16)的核心是记忆单元 $\boldsymbol{s}^{(t)}$,它具有线性自循环,权重由遗忘门 $\boldsymbol{f}^{(t)}$ 控制。更新公式:
$$ \boldsymbol{f}^{(t)} = \sigma(\boldsymbol{b}_f + \boldsymbol{U}_f \boldsymbol{x}^{(t)} + \boldsymbol{W}_f \boldsymbol{h}^{(t-1)}) $$$$ \boldsymbol{g}^{(t)} = \sigma(\boldsymbol{b}_g + \boldsymbol{U}_g \boldsymbol{x}^{(t)} + \boldsymbol{W}_g \boldsymbol{h}^{(t-1)}) \quad \text{(输入门)} $$$$ \boldsymbol{s}^{(t)} = \boldsymbol{f}^{(t)} \odot \boldsymbol{s}^{(t-1)} + \boldsymbol{g}^{(t)} \odot \tanh(\boldsymbol{b} + \boldsymbol{U}\boldsymbol{x}^{(t)} + \boldsymbol{W}\boldsymbol{h}^{(t-1)}) $$$$ \boldsymbol{o}^{(t)} = \sigma(\boldsymbol{b}_o + \boldsymbol{U}_o \boldsymbol{x}^{(t)} + \boldsymbol{W}_o \boldsymbol{h}^{(t-1)}) \quad \text{(输出门)} $$$$ \boldsymbol{h}^{(t)} = \tanh(\boldsymbol{s}^{(t)}) \odot \boldsymbol{o}^{(t)} $$门控机制允许网络决定何时遗忘旧记忆、何时写入新信息、何时输出信息。这使得梯度能通过线性自循环顺畅流动,缓解梯度消失。
5.3.2 门控循环单元(GRU)
GRU是LSTM的简化版本,将遗忘门和输入门合并为更新门 $\boldsymbol{u}^{(t)}$,并引入重置门 $\boldsymbol{r}^{(t)}$:
$$ \boldsymbol{u}^{(t)} = \sigma(\boldsymbol{b}_u + \boldsymbol{U}_u \boldsymbol{x}^{(t)} + \boldsymbol{W}_u \boldsymbol{h}^{(t-1)}) $$$$ \boldsymbol{r}^{(t)} = \sigma(\boldsymbol{b}_r + \boldsymbol{U}_r \boldsymbol{x}^{(t)} + \boldsymbol{W}_r \boldsymbol{h}^{(t-1)}) $$$$ \tilde{\boldsymbol{h}}^{(t)} = \tanh(\boldsymbol{b} + \boldsymbol{U}\boldsymbol{x}^{(t)} + \boldsymbol{W}(\boldsymbol{r}^{(t)} \odot \boldsymbol{h}^{(t-1)})) $$$$ \boldsymbol{h}^{(t)} = (1-\boldsymbol{u}^{(t)}) \odot \boldsymbol{h}^{(t-1)} + \boldsymbol{u}^{(t)} \odot \tilde{\boldsymbol{h}}^{(t)} $$GRU参数更少,计算更高效,在某些任务上与LSTM性能相当。
5.4 优化长期依赖
5.4.1 梯度裁剪(Gradient Clipping)
对于梯度爆炸,最简单的解决方法是梯度裁剪:若梯度范数超过阈值,则按比例缩放(式10.49)。这防止参数更新步长过大,避免破坏已有优化(图10.17)。
5.4.2 正则化促进信息流动
通过添加正则项鼓励梯度保持大小(式10.52),可使模型学习更长的依赖。但实验表明,LSTM等门控机制通常更有效。
6. 显式记忆
人类不仅拥有隐式知识(如行走),还能显式地存储和操作事实(如会议时间)。神经网络通常难以精确记忆事实,为此研究者提出了显式记忆机制。
6.1 记忆网络与神经图灵机
记忆网络(Memory Networks)和神经图灵机(Neural Turing Machines, NTM)通过一个可读写的外部记忆矩阵来增强网络(图10.18)。网络通过注意力机制(软寻址)选择要读取或写入的记忆单元,从而实现类似计算机内存的操作。由于使用了连续权重,整个系统可端到端训练。
- 读操作:根据注意力权重对记忆单元加权求和。
- 写操作:结合擦除和加法向量修改记忆。
这种架构使网络能够学习简单的算法(如排序、复制),并展现出强大的记忆能力。
6.2 注意力机制
注意力机制最早在机器翻译中用于对齐源语言和目标语言(Bahdanau et al., 2015),其本质是动态计算上下文向量作为编码器隐藏状态的加权和,权重由当前解码器状态与各编码器状态的相似度决定。注意力机制已成为现代序列模型(如Transformer)的基石。
7. 知识体系图
8. 实例辅助
8.1 简单RNN前向传播实例
假设输入 $\boldsymbol{x}^{(t)}$ 为二维向量,隐藏状态也是二维。参数为随机值。对于序列长度3,可手动计算每个时间步的隐藏状态和输出,体验信息如何流动。
8.2 BPTT计算示例
对上述简单RNN,从最后一层反向传播梯度,观察梯度如何随时间衰减或增长,理解梯度消失/爆炸。
8.3 LSTM门控示例
考虑一个LSTM单元,其遗忘门 $\boldsymbol{f}^{(t)}$ 接近1,则记忆单元几乎不变,实现长期记忆;输入门 $\boldsymbol{g}^{(t)}$ 控制新信息写入量;输出门控制是否将记忆输出。可构造具体数值验证。
8.4 编码器-解码器翻译
假设源语言句子“I love China”编码为向量,解码器逐词生成目标语言“我 爱 中国”。每个解码步依赖上一时刻输出和上下文向量,展示自回归生成过程。
9. 与前后的联系
- 前承:
- 第2章线性代数:矩阵乘法、特征值(用于分析梯度消失)。
- 第4章数值计算:梯度下降、优化算法。
- 第5章机器学习基础:过拟合、泛化。
- 第6章深度前馈网络:反向传播、激活函数。
- 第7章正则化:Dropout在RNN中的应用(需特殊处理)。
- 第8章优化:动量、自适应学习率、梯度裁剪。
- 后续应用:
- 第11章实践方法论:序列模型的调试与超参数选择。
- 第12章应用:自然语言处理(机器翻译、情感分析)、语音识别、视频理解。
- 第15章表示学习:词嵌入与RNN结合。
- 第20章深度生成模型:RNN作为生成模型(如字符级语言模型)。
10. 总结与重点
10.1 核心要点
- RNN通过循环连接和参数共享处理变长序列,展开后可用BPTT训练。
- 三种基本模式:每个时间步输出+隐藏循环(最通用)、输出到隐藏循环(可并行训练)、序列末尾输出(编码器)。
- 双向RNN利用未来信息,编码器-解码器实现变长到变长的映射。
- 长期依赖是RNN的主要挑战,源于梯度消失/爆炸。
- **门控RNN(LSTM/GRU)**通过可学习的门控机制有效缓解梯度消失,成为实际应用的首选。
- 显式记忆(记忆网络、神经图灵机)进一步增强了网络的存储和推理能力。
10.2 常见难点
- BPTT的理解:需区分时间步上的梯度传播与空间层上的反向传播,两者叠加。
- LSTM的门控作用:每个门的具体功能易混淆,需结合公式理解(遗忘门控制过去记忆,输入门控制新信息,输出门控制输出)。
- 梯度消失与爆炸的原因:与Jacobian矩阵的特征值有关,需结合线性RNN的例子理解。
- 注意力机制与显式记忆的关系:注意力可视为一种软寻址的显式记忆。
- 教师强制的局限性:训练与测试不一致导致性能下降,需通过计划采样(scheduled sampling)缓解。
10.3 学习建议
- 手动实现:用NumPy实现简单RNN的前向和BPTT,再实现LSTM,加深对公式的理解。
- 使用框架:在PyTorch/TensorFlow中构建RNN/LSTM,应用于文本生成或分类任务。
- 可视化:绘制梯度范数随时间的变化,观察消失/爆炸现象。
- 阅读论文:LSTM原始论文(Hochreiter & Schmidhuber, 1997)、编码器-解码器(Sutskever et al., 2014)、注意力(Bahdanau et al., 2015)。
- 对比实验:比较简单RNN、LSTM、GRU在长序列任务(如添加问题)上的表现。
通过本章的学习,你已经掌握了处理序列数据的核心模型——循环神经网络及其变体。这些知识将为你进入自然语言处理、语音识别等前沿领域打下坚实基础。下一章将介绍如何在实际项目中应用这些模型,包括性能度量、超参数调优和调试策略。
《深度学习》(Ian Goodfellow 著)第11章“实践方法论”详细讲解
1. 本章概述与定位
如果说前面几章是深度学习理论的“内功心法”,那么第11章就是将这些理论转化为实际项目的“实战指南”。本章旨在为读者提供一套系统化的工程实践流程,帮助你在面对真实问题时,能够有条不紊地设计、调试和优化深度学习系统。本章内容基于作者及其团队在工业界(如Google)的丰富经验,总结出了一套行之有效的设计方法论。
本章的核心思想是:不要盲目地尝试各种算法,而要建立一个可重复的、数据驱动的决策循环。这个循环包括:明确目标 → 快速建立基线 → 诊断问题 → 迭代改进。本章将详细介绍每一步的具体操作,包括如何选择性能指标、如何建立第一个合理的系统、如何判断是否需要更多数据、如何系统性地调参、以及如何调试复杂的深度学习模型。
2. 由浅入深:从目标设定到系统调试
2.1 第一步:确定目标——性能指标与期望值
在开始任何项目之前,必须明确两个问题:
- 用什么指标衡量成功?(性能指标)
- 希望达到什么水平?(目标值)
2.1.1 性能指标的选择
性能指标应与业务目标直接相关,而不仅仅是学术上的方便。常见指标包括:
- 准确率/错误率:适用于分类任务,但当类别不平衡时可能产生误导。
- 精确率与召回率:用于检测任务(如疾病筛查)。精确率 = TP/(TP+FP),召回率 = TP/(TP+FN)。常通过PR曲线或F-score($F = 2pr/(p+r)$)综合衡量。
- 覆盖率:模型能够给出预测的样本比例。例如在街景门牌号识别中,系统可以拒绝低置信度的样本,交给人工处理。此时需要在准确率和覆盖率之间权衡。
- 点击率、用户满意度等业务指标。
例子:街景门牌号识别项目的目标是达到98%的准确率(与人类相当),同时保持95%的覆盖率。这两个指标共同决定了系统的商业价值。
2.1.2 确定合理的期望值
- 贝叶斯误差:理论上可能达到的最小误差,由数据中的固有噪声决定。
- 人类表现:在许多任务中,人类表现可作为参考上限。
- 已有基准:学术论文或行业报告中的结果。
- 业务需求:系统要落地所需达到的最低标准。
重要:设定目标后,所有后续决策都应围绕如何达到这些目标展开。
2.2 第二步:快速建立基线系统
在投入大量时间优化之前,应尽快搭建一个端到端的基线系统。这个系统不必完美,但必须能够跑通整个流程(从数据输入到指标输出),以便后续迭代。基线的选择原则是简单、可靠、易于实现。
2.2.1 基线模型的选择指南
根据数据类型和任务,推荐以下基线:
| 数据类型 | 任务 | 推荐基线模型 |
|---|---|---|
| 固定大小向量 | 分类/回归 | 线性回归/逻辑回归(先尝试简单模型) |
| 图像 | 分类/检测 | 卷积网络(如小型CNN,带ReLU) |
| 序列 | 语言模型/翻译 | 门控RNN(LSTM或GRU) |
| 任何类型 | 通用 | 带正则化的适度大小MLP |
优化算法:
- 默认选择:带动量的SGD(学习率衰减策略:线性衰减到固定最小值、指数衰减、或验证误差平缓时降低学习率)或Adam(自适应学习率,通常表现稳健)。
- 批归一化:对于卷积网络或带sigmoid的网络,批归一化可显著改善优化,应尽早加入。
正则化:
- 早停:几乎总是使用。
- Dropout:简单有效,兼容大多数模型。
- 权重衰减:适度加入。
预训练:
- 如果任务与已有成熟任务相似(如ImageNet分类),直接使用预训练模型(迁移学习)是极好的起点。
无监督学习:
- 在自然语言处理等领域,无监督词嵌入(如Word2Vec、GloVe)通常能带来显著提升,应在基线中考虑。而在计算机视觉中,当前有监督预训练效果更好。
2.2.2 基线系统的意义
- 验证整个流程:从数据加载、模型定义、训练循环到指标计算,确保没有bug。
- 提供对比基准:后续所有改进都应与基线比较,判断是否真正有效。
- 快速获得反馈:可以在几天甚至几小时内得到一个可工作的系统,而不是花费数月调参后才发现方向错误。
2.3 第三步:决定是否收集更多数据
基线建立后,需要分析系统的表现,判断瓶颈所在,从而决定下一步行动。
2.3.1 诊断流程
检查训练集性能:
- 如果训练误差高 → 模型欠拟合。解决方案:增加模型容量(更多层/更多单元)、改进优化(调整学习率、使用更好的优化器)、检查数据质量(是否存在噪声或错误标签)。
- 如果训练误差可接受 → 进入下一步。
检查验证集性能:
- 如果验证误差也低 → 系统已满足目标,完成。
- 如果验证误差远高于训练误差 → 模型过拟合。解决方案:
- 收集更多数据(最有效,但需考虑成本)。
- 降低模型容量(减少层数/单元数)。
- 增加正则化(增大权重衰减、增加Dropout、早停等)。
- 集成方法(如Bagging、Dropout本身也是一种集成)。
2.3.2 何时收集更多数据
- 过拟合时,收集更多数据通常是最好的选择,但需权衡成本与收益。可以绘制学习曲线(训练误差和验证误差随训练集大小变化的曲线),通过外推判断增加数据能否达到目标(见图5.4)。如果曲线表明增加数据能显著降低验证误差,则值得投入。
- 如果数据收集成本过高,则需在正则化和模型简化上下功夫。
2.4 第四步:超参数调优
超参数是控制模型行为但不由训练算法直接学习的参数。调优的目标是找到一组超参数,使验证误差最小。
2.4.1 手动调参
手动调参需要理解超参数与模型容量的关系(见表11.1):
| 超参数 | 增加容量时 | 说明 |
|---|---|---|
| 隐藏单元数 | 增加 | 更多单元 → 更高表示能力 |
| 层数 | 增加 | 更深 → 更高表示能力,但可能更难优化 |
| 学习率 | 需调至最优 | 过大或过小都会降低有效容量 |
| 卷积核宽度 | 增加 | 更宽核 → 更多参数,但输出尺寸可能减小 |
| 隐式零填充 | 增加 | 保持尺寸,增加容量 |
| 权重衰减系数 | 减小 | 减小惩罚 → 权重可更大 |
| Dropout保留率 | 增大 | 保留更多单元 → 减少正则化 |
核心思想:通过观察训练误差和验证误差,判断模型处于欠拟合还是过拟合,然后调整相应超参数。通常最优模型是容量足够大但正则化得当的模型。
学习率调优:学习率是最重要的超参数。可尝试对数尺度上的值(如0.1, 0.01, 0.001, 0.0001),观察训练误差曲线(图11.1)。最佳学习率通常使训练误差下降最快且平稳。
2.4.2 自动超参数优化
手动调参耗时且依赖经验,自动算法可提高效率。
- 网格搜索:对每个超参数指定一组候选值,枚举所有组合。适用于超参数较少(≤3)的情况,但组合数随参数个数指数增长。
- 随机搜索(Bergstra & Bengio, 2012):对每个超参数定义分布(如均匀分布、对数均匀分布),随机采样组合。随机搜索比网格搜索更高效,尤其当只有少数超参数影响结果时(图11.2)。
- 基于模型的优化:将超参数选择视为一个优化问题,用贝叶斯回归模型(如高斯过程)拟合验证误差与超参数的关系,在探索与利用间平衡。代表算法:Spearmint、TPE、SMAC。这类方法可能比随机搜索更快找到好参数,但实现复杂,且需等待每次训练完成,无法利用中间结果。
2.5 第五步:调试策略
深度学习系统bug隐蔽,因为即使部分组件错误,其他部分也可能自适应补偿,导致性能尚可但未达最优。本节提供一系列调试技巧。
2.5.1 可视化模型行为
- 对于图像任务,可视化模型预测(如检测框、分割掩码)叠加在输入上,直观判断是否合理。
- 对于语音生成,试听生成的音频。
- 对于语言模型,观察生成的文本。
2.5.2 可视化最差错误
- 找出模型最 confident 但预测错误的样本,分析其原因。例如街景项目中,发现模型对裁剪过紧的图片自信地给出错误答案,从而发现问题根源是检测模块的裁剪策略。
- 这可以帮助发现数据预处理、标签错误或模型盲点。
2.5.3 根据训练和测试误差推理
- 低训练误差 + 高测试误差 → 过拟合 → 需正则化或更多数据。
- 高训练误差 + 高测试误差 → 欠拟合或代码bug。需进一步测试。
2.5.4 在小数据集上过拟合
- 选择极小的数据集(如一个样本或几个样本),训练模型。如果能完美拟合(训练误差接近0),说明模型和优化器能正常工作;否则,可能存在bug(如梯度计算错误、权重未更新等)。
2.5.5 比较反向传播导数与数值导数
- 当自己实现自定义操作时,用有限差分验证梯度是否正确。对参数 $\theta$,计算: $$ f'(\theta) \approx \frac{f(\theta + \epsilon) - f(\theta - \epsilon)}{2\epsilon} $$ 并与反向传播得到的梯度比较。$\epsilon$ 应选适中值(如 $10^{-4}$),避免数值误差。对于向量函数,可用随机投影简化。
2.5.6 监控激活值和梯度直方图
- 观察隐藏层预激活值的分布,判断是否饱和(如tanh输出接近±1)或死区(ReLU常为0)。
- 监控梯度范数,确保其未爆炸或消失。一个经验法则:参数更新的范数应约为参数范数的1%左右。若远大于此,学习率可能过大;若远小于,学习率可能过小。
2.5.7 验证算法保证
- 对于有理论保证的算法(如某些近似推断),可检查其保证是否成立(如目标函数单调下降)。由于浮点误差,需设定容忍度。
2.6 实例:街景门牌号识别
本章以街景门牌号识别项目为例,展示了上述方法论的完整应用:
- 目标设定:98%准确率,95%覆盖率。
- 基线系统:卷积网络(当时尚未流行序列输出),用多个softmax独立预测每一位数字。
- 诊断:覆盖率低于90%。可视化最差错误发现是检测模块裁剪过紧。
- 改进:扩大裁剪范围,覆盖率提升10%。
- 进一步优化:设计更合理的输出层(CTC或序列损失),调大模型容量,最终达到目标。
这个案例强调了数据问题优先于算法问题,以及可视化错误的重要性。
3. 知识体系图
4. 实例辅助
4.1 性能指标实例:疾病检测
- 假设某疾病患病率1%。开发一个检测模型。
- 如果模型总是预测“无病”,准确率99%但召回率0%,毫无价值。
- 需同时关注召回率和精确率。设阈值为0.5,计算TP/FP/FN/TN,得精确率和召回率,进而得F-score。
4.2 学习曲线实例
在MNIST上训练一个小型CNN,分别用1000、5000、10000、50000张图片训练,绘制验证误差曲线。若曲线趋于平缓,说明增加数据收益递减;若仍下降,则值得收集更多数据。
4.3 超参数调优:学习率
训练一个简单MLP,尝试学习率 $10^{-1}, 10^{-2}, 10^{-3}, 10^{-4}$,绘制训练损失曲线。学习率太大(0.1)损失可能震荡不降;太小(1e-4)收敛极慢;适中(0.01)平稳下降。
4.4 调试:梯度检查
自定义一个操作 $y = x^2$,手动实现前向和反向。用有限差分验证反向传播是否正确。
4.5 监控激活值
训练一个深层网络,绘制每层激活值的直方图。若某层ReLU全部为0,说明该层死亡,可能需调整初始化或学习率。
5. 与前后的联系
- 前承:
- 第5章机器学习基础:性能度量、过拟合/欠拟合、验证集、交叉验证。
- 第6章深度前馈网络:模型结构、激活函数、反向传播。
- 第7章正则化:早停、Dropout、权重衰减。
- 第8章优化:SGD、动量、自适应学习率、批归一化。
- 第9-10章CNN/RNN:特定架构的选择指南。
- 后续应用:
- 第12章应用:将本章方法论应用于计算机视觉、语音、NLP等具体领域。
- 第13-20章研究专题:在探索新算法时,本章的调试技巧和超参数调优方法同样适用。
6. 总结与重点
6.1 核心要点
- 明确目标:先定好性能指标和期望值,所有决策围绕目标展开。
- 快速建立基线:用简单可靠的模型搭建端到端流程,为后续改进提供基准。
- 诊断决定行动:根据训练/验证误差判断是欠拟合还是过拟合,再选择增加容量、增加数据或加强正则化。
- 系统化调参:理解超参数对容量的影响,手动或自动搜索最优组合。
- 调试是科学:可视化、小数据过拟合、梯度检查、监控统计等手段定位问题。
- 实例是最好的老师:通过街景项目理解各步骤如何在实际中应用。
6.2 常见难点
- 指标选择不当:如在不平衡问题上只用准确率,导致模型偏向多数类。
- 过早投入调参:未先诊断问题本质,盲目调参可能事倍功半。
- 忽视数据质量:模型表现差时,首先应考虑数据是否有噪声、标注错误、预处理问题。
- 调试依赖直觉:没有系统方法,靠猜测定位bug。
- 学习曲线误读:需确保训练集和验证集分布一致,否则曲线无意义。
6.3 学习建议
- 模拟项目:找一个公开数据集(如CIFAR-10),按照本章流程走一遍:设定目标(如90%准确率)、建基线、诊断、调参、调试,记录每一步的思考和结果。
- 复现街景案例:虽无法获得真实数据,但可模拟类似问题(如OCR),实践从数据问题到模型改进的全过程。
- 阅读相关文献:Bergstra & Bengio (2012) 关于随机搜索的论文、Srivastava et al. (2014) Dropout论文,加深理解。
- 使用工具:学会用TensorBoard或Weights & Biases监控训练过程,用Scikit-learn的learning_curve工具绘制学习曲线。
- 加入开源项目:参与实际深度学习项目,体验团队协作中的调试和调参。
通过本章的学习,你已经掌握了将深度学习理论转化为实际应用的系统方法。接下来的章节将展示这些方法在计算机视觉、语音识别、自然语言处理等领域的精彩应用。记住:实践出真知,多动手、多思考、多总结,你将成为一名优秀的深度学习实践者。
《深度学习》(Ian Goodfellow 著)第12章“应用”详细讲解
1. 本章概述与定位
第12章是深度学习的“实战篇”,它将前序章节介绍的理论、模型和优化技术,应用到真实世界的各大领域。通过本章,读者将看到深度学习如何解决计算机视觉、语音识别、自然语言处理等复杂任务,并了解在工业级应用中需要考虑的工程问题(如大规模分布式训练、模型压缩等)。本章不仅展示了深度学习的强大能力,也揭示了针对不同领域数据特点的模型设计思路。
本章共分为五大部分:
- 12.1 大规模深度学习:介绍如何利用硬件和分布式系统训练超大规模模型。
- 12.2 计算机视觉:卷积网络在图像分类、检测、分割等任务中的应用。
- 12.3 语音识别:从传统HMM-GMM到端到端深度学习的演进。
- 12.4 自然语言处理:词嵌入、循环网络、注意力机制、机器翻译等。
- 12.5 其他应用:推荐系统、强化学习、生成模型等。
2. 大规模深度学习
随着数据集和模型规模的爆炸式增长,单机训练已无法满足需求。本节介绍实现大规模深度学习的关键技术。
2.1 快速CPU实现
在GPU普及之前,研究者通过优化CPU代码来加速训练。例如:
- 定点运算:使用整数运算代替浮点运算,在保证精度的前提下提升速度(Vanhoucke et al., 2011)。
- 缓存优化:设计数据结构以减少缓存未命中。
- 向量指令:利用CPU的SIMD指令集(如SSE、AVX)并行处理数据。
尽管现在GPU成为主流,但这些优化思想在嵌入式设备或特定场景中仍有价值。
2.2 GPU实现
GPU(图形处理器)因其高度并行化和高内存带宽,成为深度学习训练的标配。关键进展包括:
- CUDA:NVIDIA推出的通用并行计算平台,使研究者能用类C语言编写GPU程序。
- cuDNN:NVIDIA针对深度学习优化的库,提供高效卷积、池化等操作。
- 主流框架:TensorFlow、PyTorch等通过调用cuDNN实现GPU加速,用户无需直接编写GPU代码。
GPU的并行架构特别适合神经网络中的矩阵运算和卷积,可带来数十倍甚至上百倍的加速。
2.3 大规模分布式实现
当单卡GPU内存或算力不足时,需将训练分布到多台机器或多块GPU上。常用策略:
数据并行:将训练数据分到多个worker,每个worker持有完整模型副本,计算本地梯度后同步更新参数。同步方式:
- 同步SGD:所有worker计算完梯度后平均,再更新。保证收敛稳定性,但存在木桶效应。
- 异步SGD:每个worker独立计算梯度并异步更新参数服务器上的参数(图12.1)。虽可能引入梯度延迟,但吞吐量更高。Dean et al. (2012) 用异步SGD在数千台机器上训练了当时最大的网络。
模型并行:将模型拆分到不同设备上,每个设备负责一部分计算。例如,将卷积网络的不同层放在不同GPU上,或将同一层的不同通道拆分。模型并行通常与数据并行结合使用。
参数服务器:一种分布式架构,中心节点(或分布式存储)维护全局参数,worker从服务器拉取参数、计算梯度、推送更新。
2.4 模型压缩
在实际部署中(如移动端),模型大小和推理速度至关重要。模型压缩技术旨在减小模型尺寸而不显著损失精度:
- 权值剪枝:移除绝对值小于阈值的权重,将稠密矩阵变为稀疏矩阵。
- 量化:用低精度(如8位整数)表示权重,减少存储和计算。
- 知识蒸馏(Hinton et al., 2015):用大模型(教师)的输出作为软标签训练小模型(学生),使学生模仿教师的泛化行为。
- 参数共享:如哈希技巧(HashedNet)将多个权重映射到同一个桶。
2.5 动态结构
为降低推理成本,模型可根据输入动态调整计算路径:
- 条件计算:只激活与当前输入相关的部分网络(如混合专家模型,MoE)。
- 早退机制:在级联分类器中,简单样本提前退出,复杂样本才进入深层网络。
这些技术可大幅减少平均计算量,但需谨慎设计以避免性能下降。
3. 计算机视觉
计算机视觉是深度学习最早取得突破的领域。本节概述主要任务和代表性模型。
3.1 图像分类
任务:将整张图像分到预定义的类别中。
- 经典数据集:ImageNet(1000类,1400万张图像)。
- 里程碑模型:
- AlexNet (Krizhevsky et al., 2012):首次在ImageNet上大幅超越传统方法,使用ReLU、Dropout、数据增强和GPU训练。
- VGGNet (Simonyan & Zisserman, 2014):证明小卷积核(3×3)堆叠可以取得更好效果。
- GoogLeNet (Szegedy et al., 2015):引入Inception模块,在同一层中使用不同尺寸的卷积核,并增加1×1卷积降维。
- ResNet (He et al., 2016):通过残差连接(skip connection)解决了极深网络(152层)的梯度消失问题,成为后续模型的标配。
3.2 目标检测
任务:在图像中定位多个物体,并给出类别和边界框。
- 两阶段方法:
- R-CNN (Girshick et al., 2014):先用选择性搜索生成候选区域,再对每个区域用CNN分类。
- Fast R-CNN:共享全图卷积特征,通过RoI池化提取区域特征,加速训练和推理。
- Faster R-CNN:引入区域提议网络(RPN),将候选区域生成也融入CNN,实现端到端训练。
- 一阶段方法:
- YOLO (Redmon et al., 2016):将图像划分为网格,每个网格直接预测边界框和类别概率,速度极快但精度稍低。
- SSD (Liu et al., 2016):结合多尺度特征图预测,平衡速度与精度。
3.3 图像分割
- 语义分割:为每个像素分配类别标签(如道路、天空、人)。
- FCN (Long et al., 2015):将全连接层替换为卷积层,输出空间维度与输入对应,并通过反卷积上采样。
- U-Net (Ronneberger et al., 2015):编码器-解码器结构,带跳跃连接,特别适合医学图像分割。
- 实例分割:不仅分割,还要区分不同个体。
- Mask R-CNN (He et al., 2017):在Faster R-CNN基础上增加分割分支,同时输出边界框和像素级掩码。
3.4 其他视觉任务
- 人脸识别:用大规模人脸数据集训练,学习具有判别性的特征嵌入(如FaceNet),通过三元组损失或ArcFace等优化。
- 姿态估计:检测人体关键点,常用方法包括堆叠沙漏网络(Hourglass)和CPN。
- 视频理解:处理时空信息,模型如C3D、I3D、TSN等。
4. 语音识别
语音识别将音频信号转换为文本。深度学习彻底改变了这一领域。
4.1 传统方法
- HMM-GMM:隐马尔可夫模型(HMM)建模时序,高斯混合模型(GMM)建模声学特征。需要复杂的语音学知识和手工设计特征(如MFCC)。
4.2 深度学习的引入
- 混合系统:用DNN或RNN代替GMM计算HMM状态的后验概率(Hinton et al., 2012)。DNN能更好地区分音素,大幅降低词错误率(WER)。
- 端到端系统:直接学习从音频到文本的映射,无需HMM。
- CTC (Connectionist Temporal Classification) (Graves et al., 2006):允许输出序列长度小于输入,引入空白标签处理对齐问题。典型模型为DeepSpeech (Hannun et al., 2014)。
- RNN-T (Graves, 2012):结合编码器、预测网络和联合网络,更适合流式识别。
- 注意力机制:类似机器翻译的编码器-解码器结构,将音频编码为向量序列,解码时通过注意力对齐(Chorowski et al., 2015)。
4.3 关键技术
- 声学特征:常用梅尔频谱图(Mel-spectrogram)或滤波器组(Fbank)作为输入。
- 数据增强:速度扰动、SpecAugment(对频谱图进行时间/频率掩码)等。
- 语言模型:通常结合外部语言模型(如RNN或Transformer)进行解码。
5. 自然语言处理
自然语言处理(NLP)使计算机理解、生成和处理人类语言。本节涵盖从词表示到复杂任务的演进。
5.1 词嵌入(Word Embeddings)
将离散的单词映射到连续向量空间,使语义相近的词向量距离接近。
- Word2Vec (Mikolov et al., 2013):两种架构——CBOW(根据上下文预测中心词)和Skip-gram(根据中心词预测上下文)。
- GloVe (Pennington et al., 2014):基于全局词共现矩阵的分解。
- FastText (Bojanowski et al., 2017):考虑子词信息,可处理未登录词。
5.2 循环网络与语言模型
- RNN语言模型:给定上文预测下一个词,通过反向传播训练。LSTM和GRU缓解长期依赖。
- ELMo (Peters et al., 2018):用双向LSTM学习上下文相关的词表示,动态生成词向量。
5.3 序列到序列模型与注意力
- Seq2Seq (Sutskever et al., 2014):编码器-解码器结构,将源序列编码为固定向量,再解码为目标序列。用于机器翻译、摘要等。
- 注意力机制 (Bahdanau et al., 2015):解码时动态计算编码器各隐藏状态的加权和,避免信息瓶颈。注意力权重可视为对齐。
5.4 Transformer与预训练模型
- Transformer (Vaswani et al., 2017):完全基于自注意力(self-attention)和前馈网络,抛弃循环和卷积,实现并行计算。核心组件:
- 多头注意力:在不同子空间捕获不同依赖。
- 位置编码:注入序列位置信息。
- 层归一化与残差连接。
- BERT (Devlin et al., 2018):基于Transformer编码器,通过掩码语言模型(MLM)和下句预测任务预训练,再微调下游任务。掀起“预训练+微调”范式。
- GPT系列:基于Transformer解码器的自回归语言模型,通过大规模预训练实现少样本学习。
5.5 其他NLP任务
- 命名实体识别(NER):识别文本中的实体(人名、地名等),常用BiLSTM-CRF。
- 情感分析:分类文本情感极性,可用CNN或RNN。
- 机器翻译:目前主流为基于Transformer的模型(如Google的GNMT)。
- 问答系统:如SQuAD数据集上的阅读理解,模型需从篇章中定位答案。
6. 其他应用
6.1 推荐系统
深度学习可捕捉用户与物品的复杂交互:
- 协同过滤:用矩阵分解或神经协同过滤(NCF)学习用户和物品嵌入。
- 序列推荐:用RNN建模用户历史行为,预测下一交互(如GRU4Rec)。
- 多模态推荐:结合文本、图像等信息。
6.2 强化学习
深度强化学习(DRL)将深度学习与强化学习结合,使智能体从高维输入中学习策略:
- DQN (Mnih et al., 2015):用CNN处理游戏画面,通过Q-learning学习玩Atari游戏。
- 策略梯度:如PPO、A3C,直接优化策略。
- AlphaGo:结合蒙特卡洛树搜索和深度网络,击败人类围棋冠军。
6.3 生成模型
- 变分自编码器(VAE):学习数据的潜在表示,可生成新样本。
- 生成对抗网络(GAN):生成器与判别器博弈,生成逼真图像(如StyleGAN)。
- 扩散模型:逐步去噪生成数据,近期在图像生成领域表现优异。
6.4 其他领域
- 医疗:医学图像分析(X光、CT)、蛋白质结构预测(AlphaFold)。
- 金融:风险控制、算法交易。
- 自动驾驶:感知(目标检测、车道线识别)、决策规划。
7. 知识体系图
8. 与前后的联系
前承:
- 第6-10章:深度前馈网络、卷积网络、循环网络是本章所有应用的基础。
- 第7章正则化:Dropout、批归一化在视觉、NLP模型中广泛应用。
- 第8章优化:动量、Adam等优化器用于训练所有模型。
- 第11章实践方法论:本章的应用案例正是第11章方法的完美体现(目标设定、基线、调试、调参)。
后续:
- 第13-20章研究专题:本章中提到的生成模型、注意力机制等将在后续章节深入探讨。
9. 总结与重点
9.1 核心要点
- 大规模深度学习依赖硬件和分布式技术:GPU、数据并行、异步SGD、模型压缩是工业级应用的基石。
- 计算机视觉以卷积网络为核心:从分类到检测、分割,架构不断演进,但卷积+池化+全连接的组合仍是基础。
- 语音识别经历从混合系统到端到端的转变:CTC和注意力机制简化了流程,降低了领域知识要求。
- 自然语言处理从词嵌入到Transformer:预训练模型(BERT、GPT)成为通用解决方案,极大地推动了NLP发展。
- 深度学习正在渗透各行各业:推荐、强化学习、生成模型等展现出巨大潜力。
9.2 常见难点
- 分布式训练的同步问题:异步SGD的梯度延迟可能导致收敛不稳定,需仔细调整学习率。
- 目标检测中的锚点设计:锚点大小、比例需要根据数据集调整,否则影响召回率。
- 端到端语音识别的对齐:CTC需引入空白标签,训练初期可能难以收敛。
- Transformer的位置编码:绝对位置编码和相对位置编码的选择影响长序列建模。
- 预训练模型的微调:学习率需远小于预训练阶段,且可能需逐层解冻。
9.3 学习建议
- 动手实践:尝试用PyTorch/TensorFlow复现经典模型(如ResNet、BERT)并在标准数据集上训练。
- 阅读代码:研究GitHub上知名实现(如FAIR的Detectron、HuggingFace的Transformers),学习工程技巧。
- 关注前沿:阅读顶会论文(CVPR/ICCV/NeurIPS/ACL/ICML),了解最新进展。
- 跨领域思考:思考一个领域的模型(如注意力)如何迁移到其他领域。
- 参与竞赛:Kaggle等平台提供真实数据集,可检验自己的实践能力。
通过本章的学习,你已见证了深度学习从理论到实践的辉煌成就。希望你能将这些知识应用于自己的项目中,推动技术创新。
《深度学习》(Ian Goodfellow 著)第13章“线性因子模型”详细讲解
1. 本章概述与定位
线性因子模型(Linear Factor Models)是无监督学习中的一类经典模型,它们假设观测数据是由少数潜在的隐变量(latent variables,也称为因子)通过线性组合再加上噪声生成的。这些模型不仅是理解数据降维、特征提取的基础,也为后续更复杂的深度生成模型(如自编码器、变分自编码器、深度信念网络等)提供了理论基石。
本章系统介绍了四种主要的线性因子模型:概率主成分分析(Probabilistic PCA)、因子分析(Factor Analysis)、独立成分分析(Independent Component Analysis, ICA)、慢特征分析(Slow Feature Analysis, SFA),以及稀疏编码(Sparse Coding)。虽然这些模型在形式上都是线性的,但它们各自对因子和噪声的假设不同,从而适用于不同的场景。通过本章学习,读者将理解如何通过概率建模的方式描述数据生成过程,并掌握从数据中学习隐变量的基本思想。
2. 由浅入深:从基本概念到模型家族
2.1 线性因子模型的基本思想
线性因子模型假设观测到的数据向量 $\boldsymbol{x} \in \mathbb{R}^n$ 是由一个低维的隐变量向量 $\boldsymbol{h} \in \mathbb{R}^l$(通常 $l < n$)通过线性变换生成的,同时可能叠加噪声。其一般形式为:
$$ \boldsymbol{x} = \boldsymbol{W} \boldsymbol{h} + \boldsymbol{b} + \boldsymbol{\epsilon} $$其中:
- $\boldsymbol{W} \in \mathbb{R}^{n \times l}$ 是因子载荷矩阵(factor loading matrix),将隐变量映射到观测空间;
- $\boldsymbol{b} \in \mathbb{R}^n$ 是观测的均值(偏置);
- $\boldsymbol{\epsilon}$ 是噪声项,通常假设服从某种概率分布(如高斯分布)。
这个模型的核心思想是:高维观测数据的变化主要由少数潜在因子驱动,而噪声则解释了剩余的变异。学习该模型的目标是从观测数据中估计出 $\boldsymbol{W}$、$\boldsymbol{b}$ 以及隐变量 $\boldsymbol{h}$ 的后验分布。
例子:假设我们观测到许多张人脸图片(高维像素),那么潜在的因子可能包括“光照方向”、“表情”、“身份”等。线性因子模型试图用这些因子的线性组合来重构人脸。
2.2 概率主成分分析(Probabilistic PCA)
2.2.1 模型定义
概率PCA(PPCA)是PCA的概率化扩展。它假设隐变量 $\boldsymbol{h}$ 服从标准正态分布,噪声 $\boldsymbol{\epsilon}$ 服从各向同性的高斯分布:
$$ p(\boldsymbol{h}) = \mathcal{N}(\boldsymbol{h}; \boldsymbol{0}, \boldsymbol{I}) $$$$ p(\boldsymbol{x} \mid \boldsymbol{h}) = \mathcal{N}(\boldsymbol{x}; \boldsymbol{W}\boldsymbol{h} + \boldsymbol{b}, \sigma^2 \boldsymbol{I}) $$其中 $\sigma^2$ 是噪声方差。于是观测数据的边缘分布为:
$$ p(\boldsymbol{x}) = \int p(\boldsymbol{x} \mid \boldsymbol{h}) p(\boldsymbol{h}) d\boldsymbol{h} = \mathcal{N}(\boldsymbol{x}; \boldsymbol{b}, \boldsymbol{W}\boldsymbol{W}^\top + \sigma^2 \boldsymbol{I}) $$2.2.2 参数估计
参数 $\boldsymbol{W}, \boldsymbol{b}, \sigma^2$ 可通过最大似然估计(MLE)得到。对数似然函数为:
$$ \log p(\boldsymbol{X} \mid \boldsymbol{W}, \boldsymbol{b}, \sigma^2) = \sum_{i=1}^m \log \mathcal{N}(\boldsymbol{x}^{(i)}; \boldsymbol{b}, \boldsymbol{C}), \quad \boldsymbol{C} = \boldsymbol{W}\boldsymbol{W}^\top + \sigma^2 \boldsymbol{I} $$MLE 的解与经典PCA密切相关:当 $\sigma^2 \to 0$ 时,$\boldsymbol{W}$ 的列张成的空间与数据的前 $l$ 个主成分方向一致。事实上,PPCA 的最优 $\boldsymbol{W}$ 由数据的样本协方差矩阵的前 $l$ 个特征向量乘以一个缩放因子得到。
2.2.3 与经典PCA的关系
- 经典PCA可以看作PPCA在噪声趋于零时的极限。
- PPCA提供了一个概率框架,可以处理缺失数据、进行贝叶斯推断、计算隐变量的后验分布等。
- 隐变量的后验分布 $p(\boldsymbol{h} \mid \boldsymbol{x})$ 也是高斯分布,其均值 $\boldsymbol{W}^\top (\boldsymbol{W}\boldsymbol{W}^\top + \sigma^2 \boldsymbol{I})^{-1} (\boldsymbol{x} - \boldsymbol{b})$ 在 $\sigma^2 \to 0$ 时退化为 $\boldsymbol{W}^\top (\boldsymbol{x} - \boldsymbol{b})$,即经典PCA的投影。
2.3 因子分析(Factor Analysis)
2.3.1 模型定义
因子分析与PPCA非常相似,唯一的区别在于噪声的协方差矩阵。因子分析假设噪声 $\boldsymbol{\epsilon}$ 服从对角但非各向同性的高斯分布:
$$ p(\boldsymbol{x} \mid \boldsymbol{h}) = \mathcal{N}(\boldsymbol{x}; \boldsymbol{W}\boldsymbol{h} + \boldsymbol{b}, \boldsymbol{\Psi}) $$其中 $\boldsymbol{\Psi}$ 是对角矩阵,对角线元素 $\psi_j$ 表示每个观测维度特有的方差(称为唯一性方差,uniqueness)。隐变量的先验仍为标准正态:
$$ p(\boldsymbol{h}) = \mathcal{N}(\boldsymbol{h}; \boldsymbol{0}, \boldsymbol{I}) $$于是观测的边缘分布为:
$$ p(\boldsymbol{x}) = \mathcal{N}(\boldsymbol{x}; \boldsymbol{b}, \boldsymbol{W}\boldsymbol{W}^\top + \boldsymbol{\Psi}) $$2.3.2 与PPCA的区别
- PPCA假设噪声在所有维度上同方差(isotropic),而因子分析允许不同维度有不同的噪声方差。
- 因此,因子分析更能适应各维度测量尺度不同的情况。
- 参数估计通常使用期望最大化(EM)算法,因为直接求MLE没有封闭解。
2.3.3 例子
假设我们测量学生的数学、物理、语文成绩。因子可能是一个“学术能力”因子,而每个科目的测量误差(如考试偶然失误)可能不同。因子分析通过允许不同方差来建模这种差异。
2.4 独立成分分析(ICA)
2.4.1 基本思想
ICA旨在将观测数据分解为统计独立的成分。与PCA(只要求不相关)不同,ICA追求更高阶的独立性。其基本模型为(无噪声版本):
$$ \boldsymbol{x} = \boldsymbol{W} \boldsymbol{h} $$其中 $\boldsymbol{h}$ 的各分量相互独立,且通常假设非高斯分布(高斯分布无法区分独立成分,因为旋转后的联合分布仍为高斯)。ICA的目标是估计分离矩阵 $\boldsymbol{W}$,使得 $\boldsymbol{h} = \boldsymbol{W}^{-1} \boldsymbol{x}$ 的分量尽可能独立。
2.4.2 不可识别性
ICA存在一些固有的模糊性:
- 排列不确定性:独立成分的顺序可以任意交换。
- 缩放不确定性:每个成分可以乘以任意非零常数,同时调整 $\boldsymbol{W}$ 的对应列。
因此,通常约定成分具有单位方差。
2.4.3 目标函数
ICA通过最大化非高斯性或最小化互信息来学习。常用的目标包括:
- 负熵最大化:负熵衡量与高斯分布的差异,非高斯性越强,负熵越大。
- 互信息最小化:最小化 $I(h_1, \dots, h_l) = \sum_i H(h_i) - H(\boldsymbol{h})$。
常用的算法有FastICA、Infomax等。
2.4.4 例子
ICA最著名的应用是“鸡尾酒会问题”:多个麦克风记录下多人同时说话的混合声音,ICA可以分离出各个独立声源。
2.5 慢特征分析(SFA)
2.5.1 基本思想
SFA从时序数据中学习变化缓慢的特征。其动机是:重要的潜在因素(如物体身份)通常变化较慢,而噪声变化较快。SFA寻找输入信号的线性变换,使得输出特征随时间变化尽可能缓慢。
给定一个时间序列 $\boldsymbol{x}(t)$,SFA的目标是找到映射 $g_j(\boldsymbol{x}) = \boldsymbol{w}_j^\top \boldsymbol{x}$,使得在一段时间内特征的时间差分的平方期望最小:
$$ \Delta_j = \langle \dot{g}_j^2 \rangle_t \quad \text{最小化} $$同时约束:
- 零均值:$\langle g_j \rangle_t = 0$(避免常数解)
- 单位方差:$\langle g_j^2 \rangle_t = 1$(避免平凡零解)
- 去相关:$\langle g_j g_k \rangle_t = 0$ 对于 $j < k$(确保不同特征携带不同信息)
2.5.2 求解
SFA通过求解广义特征值问题得到 $\boldsymbol{w}_j$。首先对输入数据进行白化(零均值、单位协方差),然后对时间差分的协方差矩阵进行特征分解,最小的特征值对应最慢的特征。
2.5.3 例子
在视频中,物体的位置变化较快,但物体的身份不变。SFA可能学到“物体身份”这一慢变特征,而忽略快速变化的像素。
2.6 稀疏编码(Sparse Coding)
2.6.1 模型定义
稀疏编码学习一个过完备的基(即 $l > n$),并要求表示 $\boldsymbol{h}$ 是稀疏的(大部分元素为零或接近零)。其生成模型为:
$$ \boldsymbol{x} = \boldsymbol{W} \boldsymbol{h} + \boldsymbol{\epsilon} $$但通常不假设 $\boldsymbol{h}$ 的显式先验,而是通过优化目标函数同时学习 $\boldsymbol{W}$ 和 $\boldsymbol{h}$:
$$ \min_{\boldsymbol{W}, \{\boldsymbol{h}^{(i)}\}} \sum_{i=1}^m \|\boldsymbol{x}^{(i)} - \boldsymbol{W} \boldsymbol{h}^{(i)}\|_2^2 + \lambda \|\boldsymbol{h}^{(i)}\|_1 $$其中 $\|\boldsymbol{h}\|_1$ 是L1范数,促进稀疏性。$\boldsymbol{W}$ 通常约束列范数为1以避免退化。
2.6.2 训练
- 固定 $\boldsymbol{W}$,对每个样本求解L1正则化的最小二乘问题(称为稀疏编码或字典学习)。
- 固定 $\boldsymbol{h}^{(i)}$,更新 $\boldsymbol{W}$ 以最小化重构误差(通常用梯度下降或共轭梯度)。
2.6.3 与线性因子模型的关系
稀疏编码虽然使用线性组合,但其表示 $\boldsymbol{h}$ 不是通过一个简单的概率先验得到的,而是通过优化得到的。它可以看作是一种最大后验估计(MAP),其中先验为拉普拉斯分布(对应L1正则化)。
2.6.4 例子
在图像处理中,稀疏编码可以学习到类似Gabor滤波器的基,这些基能稀疏地表示自然图像中的边缘和纹理。
2.7 流形解释
PCA可以解释为学习数据的低维线性流形。将数据投影到主成分上,相当于将数据点映射到流形上的坐标。因子分析、ICA等也有类似的几何解释,但流形可能是非线性的。线性因子模型可以看作是在学习一个嵌入在高维空间中的线性子空间(流形的切线空间)。
3. 概念关系图
4. 与前后的联系
- 前承:
- 第2章线性代数:矩阵分解、特征值、协方差矩阵。
- 第3章概率论:高斯分布、贝叶斯规则、最大似然估计。
- 第5章机器学习基础:无监督学习、表示学习。
- 第6章深度前馈网络:反向传播可用于求解稀疏编码。
- 后续:
- 第14章自编码器:自编码器可以看作非线性因子模型的扩展,其中编码器和解码器是非线性的。
- 第15章表示学习:线性因子模型是表示学习的早期实例。
- 第16章结构化概率模型:线性因子模型是简单的有向概率图模型。
- 第20章深度生成模型:如变分自编码器(VAE)将线性因子模型中的线性变换替换为神经网络,并引入变分推断。
5. 总结与重点
5.1 核心要点
- 线性因子模型:假设数据由潜在因子的线性组合加上噪声生成,是无监督学习的基础。
- 概率PCA与因子分析:两者都是高斯隐变量模型,区别在于噪声协方差结构(各向同性 vs 对角)。
- 独立成分分析:追求成分的统计独立性,需要非高斯性,常用于盲源分离。
- 慢特征分析:从时序数据中学习变化缓慢的特征,强调时间结构。
- 稀疏编码:学习过完备基,并要求表示稀疏,通过L1正则化实现。
- 共同框架:所有模型都试图发现数据背后的低维结构,只是对隐变量和噪声的假设不同。
5.2 常见难点
- PCA的概率解释:理解为什么PPCA的最优解与PCA相同,以及噪声方差的作用。
- ICA的非高斯性要求:为什么高斯分布无法识别独立成分?因为高斯的线性混合仍然是高斯,旋转不变。
- 稀疏编码的优化:L1正则化导致解的非光滑性,需用特殊算法(如ISTA、FISTA)。
- SFA的约束:去相关和单位方差确保特征不冗余,且具有排序性。
5.3 学习建议
- 动手实现:用Python实现PPCA和因子分析的EM算法,在小数据集上验证。
- 可视化:对自然图像块应用稀疏编码,可视化学习到的基,观察其是否形成Gabor滤波器。
- 对比实验:在同一个数据集上比较PCA、ICA、稀疏编码的结果,理解各自特点。
- 阅读论文:了解ICA的经典算法(FastICA)和稀疏编码的在线学习算法。
通过本章的学习,你已经掌握了线性因子模型家族,为后续学习非线性深度生成模型打下了坚实基础。这些模型不仅本身有广泛应用,也是理解深度学习表示学习能力的钥匙。
《深度学习》(Ian Goodfellow 著)第14章“自编码器”详细讲解
1. 本章概述与定位
自编码器(Autoencoder)是一种利用无监督学习来学习数据高效表示的神经网络。它通过将输入复制到输出来学习,但在这个过程中,模型被迫发现数据的内在结构。本章是表示学习(第15章)和深度生成模型(第20章)的基础。
自编码器的核心思想非常简单:网络由一个编码器和一个解码器组成。编码器将输入 $\boldsymbol{x}$ 映射到一个低维(或稀疏、或其他约束的)隐藏表示 $\boldsymbol{h}$,解码器再将 $\boldsymbol{h}$ 映射回重构 $\hat{\boldsymbol{x}}$。通过最小化 $\boldsymbol{x}$ 与 $\hat{\boldsymbol{x}}$ 之间的差异,自编码器学会了提取数据中最重要的特征。
本章将介绍从基础到高级的各种自编码器变体,包括欠完备自编码器、稀疏自编码器、去噪自编码器、收缩自编码器等,并探讨它们与流形学习、概率建模的联系。
2. 由浅入深:从基本自编码器到高级变体
2.1 基本自编码器
2.1.1 结构与动机
一个基本的自编码器由两部分组成:
- 编码器 $ \boldsymbol{h} = f(\boldsymbol{x}) $
- 解码器 $ \hat{\boldsymbol{x}} = g(\boldsymbol{h}) $
训练目标是使重构误差 $ L(\boldsymbol{x}, \hat{\boldsymbol{x}}) $ 最小化。如果自编码器成功地完成了这个任务,那么隐藏表示 $\boldsymbol{h}$ 被认为捕获了输入 $\boldsymbol{x}$ 中最关键的信息。
最常见的损失函数是均方误差(MSE):
$$ L(\boldsymbol{x}, \hat{\boldsymbol{x}}) = \|\boldsymbol{x} - \hat{\boldsymbol{x}}\|^2 $$或对于二值输入,可使用交叉熵。
例子:假设输入是28×28的手写数字图像(784维)。如果我们用一个隐藏层只有32个神经元的自编码器,那么模型被迫将784维压缩到32维,再重构回784维。如果重构效果不错,说明32维隐藏表示保留了原始图像的关键信息。
2.1.2 欠完备自编码器(Undercomplete Autoencoder)
当隐藏层的维度小于输入维度时,自编码器被称为欠完备。此时,自编码器无法完美复制输入(因为信息瓶颈),只能学习到数据中最重要的特征。这类似于PCA,但自编码器可以使用非线性激活函数,因此能学习到比线性子空间更复杂的流形。
与PCA的关系:如果编码器和解码器都是线性的(即 $ \boldsymbol{h} = \boldsymbol{W}\boldsymbol{x} + \boldsymbol{b} $,$ \hat{\boldsymbol{x}} = \boldsymbol{V}\boldsymbol{h} + \boldsymbol{c} $),且使用MSE损失,那么自编码器学习到的隐藏表示与PCA给出的主成分张成相同的子空间。非线性自编码器则可以学习更丰富的表示。
2.2 正则自编码器(Regularized Autoencoder)
如果隐藏层维度大于等于输入维度(过完备),自编码器可能直接学习到恒等映射,而无法提取有用特征。为此,我们需要对自编码器施加正则化,迫使它学习数据的结构而非简单地复制。
2.2.1 稀疏自编码器(Sparse Autoencoder)
稀疏自编码器通过在损失函数中加入对隐藏表示的稀疏性惩罚来工作。常用的惩罚项是L1范数:
$$ \Omega(\boldsymbol{h}) = \lambda \sum_i |h_i| $$或者使用KL散度惩罚,强制隐藏神经元的平均激活接近一个小的目标值(如0.05)。稀疏自编码器通常使用过完备的隐藏层,但通过稀疏性约束,每个输入只激活少数神经元。
公式(L1惩罚):
$$ J = \|\boldsymbol{x} - \hat{\boldsymbol{x}}\|^2 + \lambda \sum_i |h_i| $$例子:在稀疏自编码器中,学习到的隐藏表示可能每个样本只对应少数几个非零的“特征”,类似于稀疏编码(第13章),但这里的编码器是前馈网络,而不是优化问题。
2.2.2 权重衰减
在自编码器中也可以使用权重衰减(L2正则化)来惩罚权重的大小,这有助于防止过拟合,但通常不足以阻止学习恒等映射,因此常与其他正则化结合使用。
2.3 表示能力、层大小和深度
万能近似定理指出,一个足够宽的单隐藏层前馈网络可以逼近任何函数。对于自编码器,这意味着一个足够大的单隐藏层自编码器可以近似任何从输入到输出的恒等映射。但是,我们真正关心的是学习到有用的表示,而不仅仅是复制。
深度自编码器(多个隐藏层)通常比浅层自编码器更高效:它们可以用更少的参数学习更复杂的函数,并且能够学习到层次化的特征(类似第1章中的人脸识别例子)。例如,深度自编码器可以先学习边缘,再学习局部形状,最后学习物体部件。
实验:图14.3(本书未提供,但可类比)展示了深度自编码器在MNIST上学习到的特征,低层类似边缘检测器,高层则对应数字的完整结构。
2.4 随机编码器和解码器
将编码器和解码器视为概率模型。编码器输出隐变量 $\boldsymbol{h}$ 的分布 $q(\boldsymbol{h} \mid \boldsymbol{x})$,解码器输出重构 $\boldsymbol{x}$ 的分布 $p(\boldsymbol{x} \mid \boldsymbol{h})$。这时,自编码器的训练目标可以是最小化负对数似然:
$$ -\log p(\boldsymbol{x}) \le -\mathbb{E}_{\boldsymbol{h} \sim q}[\log p(\boldsymbol{x} \mid \boldsymbol{h})] + D_{\mathrm{KL}}(q(\boldsymbol{h} \mid \boldsymbol{x}) \| p(\boldsymbol{h})) $$这正是变分自编码器(VAE)的雏形(第20章)。本章仅引入概念,为后续做铺垫。
2.5 去噪自编码器(Denoising Autoencoder, DAE)
2.5.1 动机与定义
去噪自编码器不直接重构原始输入,而是从一个损坏的输入 $\tilde{\boldsymbol{x}}$ 重构出干净的输入 $\boldsymbol{x}$。损坏过程可以是加性高斯噪声、随机掩码(将部分像素置零)等。训练目标是最小化重构误差 $ \|\boldsymbol{x} - g(f(\tilde{\boldsymbol{x}}))\|^2 $。
关键点:DAE必须学会捕获数据分布的结构,以便从损坏版本中恢复出干净的样本。这迫使编码器提取对噪声鲁棒的特征。
2.5.2 与流形学习的关系
DAE可以看作是在学习数据流形的结构。如果数据集中在一个低维流形附近,那么损坏过程将样本推离流形,而DAE必须学会将这些点投影回流形。因此,DAE隐式地学习了流形的切平面。
理论结果(Alain & Bengio, 2014):当噪声较小时,DAE估计的 $g(f(\tilde{\boldsymbol{x}})) - \tilde{\boldsymbol{x}}$ 近似于对数密度的梯度乘以噪声方差,即:
$$ g(f(\tilde{\boldsymbol{x}})) - \tilde{\boldsymbol{x}} \approx \sigma^2 \frac{\partial \log p(\tilde{\boldsymbol{x}})}{\partial \tilde{\boldsymbol{x}}} $$因此,DAE能够估计数据分布得分的梯度,这与得分匹配(score matching)有关。
2.6 用自编码器学习流形
本节深入探讨自编码器与流形学习的关系。
- 流形假设:现实世界的高维数据(如图像)往往集中在一个低维流形附近。
- 自编码器通过最小化重构误差,学习将输入映射到流形上的一个点(编码),然后从该点重构。如果流形结构良好,编码应能参数化流形上的坐标。
几何解释:对于流形上的点 $\boldsymbol{x}$,理想的编码器应将其映射到流形的局部坐标,解码器则将这些坐标映射回流形上的点。正则自编码器(如DAE、收缩自编码器)通过不同方式鼓励编码对垂直于流形的方向不敏感。
2.7 收缩自编码器(Contractive Autoencoder, CAE)
2.7.1 定义
收缩自编码器在损失函数中加入对编码器输出的雅可比矩阵的惩罚项。具体地,它鼓励编码器在输入变化时输出变化小,即编码函数在训练点附近是收缩的。惩罚项为:
$$ \Omega(\boldsymbol{h}) = \lambda \left\| \frac{\partial \boldsymbol{h}}{\partial \boldsymbol{x}} \right\|_F^2 $$其中 $\| \cdot \|_F$ 是Frobenius范数,即雅可比矩阵所有元素的平方和。
2.7.2 几何意义
雅可比矩阵的Frobenius范数度量了编码器对输入微小扰动的敏感性。惩罚它变小,意味着编码器在输入空间的大多数方向上变化缓慢。理想情况下,编码器应在垂直于流形的方向上变化快(因为这些方向对应数据分布外的变化),而在沿着流形的方向上变化慢。但CAE通过惩罚所有方向的导数,可能抑制沿流形的变化,因此需要权衡。
CAE与DAE有密切联系:DAE通过注入噪声隐式地惩罚雅可比,而CAE显式地惩罚它。
例子:对于二维数据集中在一维正弦曲线附近,CAE的编码器应将该曲线拉直为一维坐标,而垂直于曲线的方向上的导数被惩罚为零。
2.8 预测稀疏分解(Predictive Sparse Decomposition, PSD)
PSD是一种结合了稀疏编码和自编码器的方法。它学习一个编码器,能够快速预测输入对应的稀疏表示,而无需迭代优化。训练过程包括:
- 对每个样本,通过稀疏编码(如L1正则化最小二乘)得到稀疏表示 $\boldsymbol{h}^*$。
- 训练编码器 $f(\boldsymbol{x})$ 以预测 $\boldsymbol{h}^*$(最小化 $\|f(\boldsymbol{x}) - \boldsymbol{h}^*\|^2$),同时训练解码器 $g$ 以重构输入(最小化 $\|\boldsymbol{x} - g(f(\boldsymbol{x}))\|^2$)。
这样,PSD既得到了前馈的快速编码器,又保持了表示的稀疏性。
2.9 自编码器的应用
自编码器在实际中有广泛用途:
- 降维与可视化:类似于PCA,但非线性降维可以更好地保持数据结构(如t-SNE初始化有时用自编码器)。
- 特征提取:自编码器的隐藏层可作为特征输入给下游监督模型(如分类器),尤其是在无标签数据多、标签数据少的情况下(半监督学习)。
- 预训练:在深度学习早期,常用逐层贪婪预训练(用自编码器)来初始化深度网络,缓解梯度消失问题。虽然现在有了更好的初始化方法(如批归一化、残差连接),但自编码器预训练在某些任务中仍有价值。
- 异常检测:训练一个自编码器在正常数据上,若重构误差大,则可能是异常点,因为异常点不符合学习到的流形。
- 生成模型:变分自编码器(VAE)可直接用于生成新样本。
3. 知识体系图
4. 实例辅助
4.1 欠完备自编码器实例
在MNIST上训练一个自编码器:输入层784,隐藏层32(线性+ReLU),输出层784(线性或sigmoid)。训练后,取一个测试样本,观察重构效果。再比较PCA(保留32主成分)的重构,通常自编码器更好。
4.2 稀疏自编码器实例
在MNIST上使用隐藏层784(过完备),添加L1惩罚(λ=0.001)。训练后,可视化隐藏层权重的图像,应该看到许多类似边缘或笔画的模式,且每个输入只激活少数神经元。
4.3 去噪自编码器实例
对MNIST图像添加高斯噪声(σ=0.3)作为损坏输入,训练DAE重构原始图像。测试时,输入带噪声的图像,观察DAE能否去噪。与普通自编码器比较,DAE去噪能力更强。
4.4 收缩自编码器实例
在MNIST上训练CAE,惩罚系数λ适当。计算测试样本编码的雅可比范数,应比普通自编码器小。可视化编码器对输入扰动的敏感性,可发现沿流形方向变化小,垂直于流形方向变化大。
5. 与前后的联系
- 前承:
- 第6章深度前馈网络:自编码器就是一种特殊的前馈网络。
- 第13章线性因子模型:自编码器是非线性扩展,PCA对应线性欠完备自编码器,稀疏编码对应稀疏自编码器。
- 后续:
- 第15章表示学习:自编码器是表示学习的核心模型之一。
- 第20章深度生成模型:变分自编码器(VAE)直接基于本章的随机编码器/解码器概念,GAN也可看作自编码器的对抗版本。
6. 总结与重点
6.1 核心要点
- 自编码器是通过重构输入来学习表示的无监督模型。
- 欠完备自编码器通过信息瓶颈学习低维表示,类似于非线性PCA。
- 正则自编码器(稀疏、去噪、收缩)通过不同正则化防止学习恒等映射,迫使模型捕捉数据分布的结构。
- 去噪自编码器从损坏输入重构原始输入,隐式学习数据流形。
- 收缩自编码器显式惩罚编码器对输入的敏感性,鼓励特征在流形切方向上不变。
- 自编码器广泛应用于降维、特征提取、预训练、异常检测等领域。
6.2 常见难点
- 欠完备与过完备:欠完备自然产生瓶颈,过完备需正则化,否则退化为恒等映射。
- 稀疏自编码器的惩罚项选择:L1简单,但KL散度需要设定目标稀疏度,需调参。
- 去噪自编码器的噪声类型:不同噪声导致不同的特征(如掩码噪声学习填充能力)。
- 收缩自编码器的雅可比计算:对于高维输入和隐藏层,计算全雅可比可能昂贵,需高效实现(如随机投影)。
- 与VAE的区别:本章未深入变分推断,但需注意VAE是概率生成模型,而基本自编码器是确定性判别模型。
6.3 学习建议
- 动手实现:用PyTorch/TensorFlow实现基本自编码器、稀疏自编码器、去噪自编码器,在MNIST上比较重构质量和学习到的特征。
- 可视化:可视化隐藏层权重(如果是全连接)或特征图(卷积自编码器),观察学习到的模式。
- 阅读论文:Vincent et al. (2008) 去噪自编码器、Rifai et al. (2011) 收缩自编码器。
- 思考应用:思考自编码器如何用于自己的数据(如异常检测、特征提取)。
通过本章学习,你已掌握了自编码器的核心思想及其变体。这些模型不仅是表示学习的基础,也是通向深度生成模型的桥梁。
《深度学习》(Ian Goodfellow 著)第15章“表示学习”详细讲解
1. 本章概述与定位
表示学习(Representation Learning)是深度学习的核心主题之一。它的目标是自动从数据中学习出有效的特征表示,使得后续任务(如分类、回归、生成)更加容易。本书前面的章节已经介绍了多种模型(前馈网络、卷积网络、循环网络、自编码器等),它们本质上都是在学习数据的表示。本章将这些分散的思想整合起来,深入探讨表示学习的原理、策略和优势。
本章将回答以下关键问题:
- 什么是好的表示?它应该具备哪些性质?
- 如何通过无监督预训练来学习表示?
- 如何将学习到的表示迁移到新任务中?
- 分布式表示为什么比局部表示更强大?
- 深度如何带来表示能力的指数级增益?
- 如何通过提供线索来帮助模型发现潜在原因?
通过本章学习,读者将建立对表示学习的系统性理解,为后续研究生成模型、结构化概率模型等打下基础。
2. 由浅入深:从基本概念到高级主题
2.1 表示学习的动机
2.1.1 为什么需要学习表示?
在第5章中,我们了解到传统机器学习依赖人工设计的特征(如像素值、词频等),而这些特征往往不能直接反映数据的本质结构。例如,用像素值表示图像,很难直接从中看出物体类别,因为像素值受光照、角度、背景等因素影响巨大。好的表示应该能够解耦(disentangle)这些变化的潜在因素,使得每个因素由表示中的一个独立维度控制。
例子:对于人脸图像,理想的表示应该能够分离出“身份”、“表情”、“光照方向”、“姿态”等因素。这样,改变“表情”维度,就可以生成同一身份不同表情的图像,而不会影响身份。
2.1.2 表示学习的优势
- 简化后续任务:在好的表示上,简单的线性分类器就能达到高精度。
- 可迁移性:在一个任务上学到的表示可能对另一个相关任务也有用。
- 可解释性:解耦的表示有助于理解数据的生成过程。
2.2 贪婪逐层无监督预训练
2.2.1 历史背景
在深度学习复兴的早期(约2006年),训练深层网络非常困难,因为随机初始化会导致梯度消失或爆炸。Hinton et al. (2006) 提出了一种逐层预训练的方法:先用无监督学习训练第一层,将其输出作为第二层的输入,再训练第二层,以此类推,最后用监督学习微调整个网络。这种方法使得训练深层网络成为可能。
2.2.2 算法流程
- 逐层预训练:对每一层,将其输入(原始数据或上一层的输出)视为无监督学习任务(如用受限玻尔兹曼机RBM、自编码器等)的目标,学习该层的参数。训练时只更新当前层,固定之前层的参数。
- 联合微调:将所有层堆叠起来,加上一个输出层,用监督学习(如反向传播)对整个网络进行微调。
关键点:预训练阶段每层学习的是输入的某种表示,而下一层则试图学习更抽象的表示。这类似于第1章中提到的层次化概念构建。
2.2.3 为什么有效?
- 初始化良好:预训练将参数置于一个比随机初始化更好的起点,有助于梯度传播。
- 正则化效果:无监督预训练隐含地引入了对数据分布的偏好,可能有助于防止过拟合。
- 探索表示空间:预训练阶段迫使每层发现数据中的结构,这些结构在微调时可以被利用。
2.2.4 实例
在MNIST上,先用RBM逐层预训练一个深度信念网络(DBN),再用BP微调。实验表明,预训练得到的网络比随机初始化的网络泛化更好,尤其在训练样本较少时。
2.2.5 现代视角
随着更好的初始化方法(如Xavier初始化、He初始化)、正则化技术(如Dropout、批归一化)和优化算法(如Adam)的出现,逐层预训练在大多数监督任务中已不再必要。但在无监督学习、半监督学习和迁移学习中,预训练思想仍然至关重要(如BERT、GPT的预训练)。
2.3 迁移学习与领域自适应
2.3.1 基本概念
迁移学习:将一个任务(源任务)上学到的知识应用到另一个相关任务(目标任务)上。在深度学习中,最常见的做法是微调(fine-tuning):先在源任务的大规模数据集上预训练一个模型,然后在目标任务的小数据集上继续训练(通常用较小的学习率)。
领域自适应:是迁移学习的一种特殊情况,其中源任务和目标任务相同,但数据分布不同(例如,源域是自然图像,目标域是手绘图像)。领域自适应旨在缩小域间的分布差异。
2.3.2 为什么迁移有效?
神经网络的前几层学习的是通用特征(如边缘、颜色斑点),这些特征在不同任务间可能共享。高层则学习任务特定特征。因此,迁移前几层的参数可以带来显著的性能提升,尤其当目标任务数据量少时。
2.3.3 迁移策略
- 特征提取器:固定预训练网络的前几层,只训练新添加的分类层。
- 微调:对整个网络进行小学习率的训练,有时会逐层解冻(先解冻高层,再低层)。
- 层迁移:只迁移部分层,其余层随机初始化。
2.3.4 实例
在ImageNet上预训练的ResNet,可以迁移到医学图像分类任务。即使医学图像与自然图像差异较大,前几层的边缘检测器仍然有用。微调后的模型往往比从零训练的模型性能更好。
2.3.5 领域自适应的常用方法
- 最大均值差异(MMD):在损失函数中加入惩罚项,使源域和目标域的特征分布尽量接近。
- 对抗训练:用域判别器区分特征来自哪个域,特征提取器则试图骗过判别器,从而学习域不变特征。
- 重构:用自编码器重构目标域数据,迫使特征保留域信息。
2.4 半监督学习中因果因素的解耦
2.4.1 半监督学习的动机
在许多实际问题中,有标签数据很少,无标签数据却很丰富。半监督学习旨在利用无标签数据来改善监督学习性能。其核心假设是:数据的分布 $P(\boldsymbol{x})$ 包含关于条件分布 $P(y \mid \boldsymbol{x})$ 的信息。
2.4.2 解耦因果因素
一个好的表示应该将生成数据的因果因素(causal factors)与无关因素分离开。例如,在手写数字识别中,数字的类别是因果因素,而笔画粗细、倾斜角度是无关因素。如果表示能够分离这些因素,那么只用少量有标签数据就能学会分类,因为无标签数据可以帮助模型理解哪些因素是变化的。
2.4.3 生成模型视角
假设数据由隐变量 $\boldsymbol{h}$ 生成,其中一部分 $\boldsymbol{h}_c$ 与类别相关,另一部分 $\boldsymbol{h}_s$ 与风格相关。无标签数据可以用于学习整个生成过程,而有标签数据则指定了 $\boldsymbol{h}_c$ 与 $y$ 的对应关系。这可以通过变分自编码器(VAE)或生成对抗网络(GAN)来实现。
2.4.4 实例
用VAE在MNIST上训练,隐变量假设为10维(类别)加上若干风格维度。训练时,对于有标签数据,强制类别维度的one-hot编码与标签一致;对于无标签数据,则允许模型自由分配。最终,模型能学会用类别维度表示数字,用风格维度表示笔画粗细等。
2.5 分布式表示
2.5.1 局部表示 vs 分布式表示
- 局部表示(local representation):每个输入由一个单独的神经元(或符号)表示,如one-hot编码。例如,词表中的每个单词对应一个索引。
- 分布式表示(distributed representation):每个输入由多个神经元组成的模式表示,每个神经元参与多个输入的表示。例如,词嵌入(word embedding)中,每个单词用一个密集向量表示,语义相近的词向量在空间中也接近。
2.5.2 分布式表示的优点
- 指数级表示能力:假设有 $n$ 个神经元,每个可取 $k$ 种值(如连续值),分布式表示可以表示 $k^n$ 种不同概念,而局部表示只能表示 $n$ 种。实际上,神经元的激活通常是连续的,因此表示能力更强。
- 泛化能力:分布式表示允许模型在表示空间中进行插值。如果模型学会了“国王-王后”的类比,它可以在向量空间中找到这种关系。
- 抗噪声:由于信息分散在多个神经元中,部分神经元损坏不会完全丢失信息。
2.5.3 例子
- 词嵌入:用300维向量表示单词,“国王”和“王后”的向量之差与“男人”和“女人”的向量之差近似。
- 卷积网络:高层特征图中每个通道可视为一种分布式表示,不同组合对应不同物体。
2.5.4 与神经科学的联系
分布式表示被认为与大脑中的编码方式类似:概念由多个神经元的协同活动表示,而不是单个“祖母细胞”。
2.6 深度带来的指数级增益
2.6.1 理论结果
一些函数可以用深度网络高效表示,但用浅层网络表示时需要指数级数量的神经元。例如,Montúfar et al. (2014) 证明,深度整流网络可以划分出指数级数量的线性区域。这意味着深度网络在表示复杂函数时比浅层网络更高效。
2.6.2 例子:奇偶函数
考虑一个 $n$ 位二进制输入的奇偶函数(输出为输入中1的个数的奇偶性)。用单隐藏层网络可能需要 $O(2^n)$ 个神经元,而用深度网络只需 $O(n)$ 个神经元(通过逐层计算异或)。这展示了深度带来的计算优势。
2.6.3 实际意义
深度允许模型重复使用低级特征来构建高级特征,从而在参数数量上更加经济。这也是为什么深度网络在许多任务上优于浅层网络的原因之一。
2.7 提供线索以发现潜在原因
2.7.1 多任务学习
多任务学习(第7章)可以视为一种提供线索的方式。同时学习多个相关任务迫使模型提取对多个任务都有用的共同因素,从而学到更泛化的表示。
2.7.2 对比学习
对比学习是一种自监督学习方法,它通过构造正负样本对来学习表示:使得同一图像的不同增强(如裁剪、旋转)的表示接近,不同图像的表示远离。这迫使模型学习到对语义变换不变的特征,而忽略像素级噪声。SimCLR、MoCo等是典型代表。
2.7.3 提供辅助信息
可以通过引入辅助任务来引导表示学习,例如:
- 在图像分类中加入对图像旋转角度的预测。
- 在语言模型中加入下一句预测(如BERT的NSP任务)。
- 在视频处理中加入时序顺序预测。
这些辅助任务提供了额外的监督信号,帮助模型发现数据中的潜在因素。
3. 概念关系图
4. 实例辅助
4.1 分布式表示实例:词嵌入
假设我们有一个简单的词向量空间,其中“国王”向量减去“男人”向量加上“女人”向量 ≈ “王后”向量。这个性质来自于分布式表示捕捉了词之间的语义关系。
4.2 深度增益实例:电路
考虑一个计算 $n$ 位输入异或的电路。用两层逻辑门可以实现,但用一层(如线性阈值门)可能需要指数级门数。深度网络类似。
4.3 迁移学习实例:猫狗识别
先在ImageNet(1000类)上预训练ResNet,然后在只有几百张猫狗图片的数据集上微调最后一层。微调后模型能准确分类,而随机初始化训练则容易过拟合。
4.4 半监督学习实例:数字识别
在MNIST中,只给10张有标签图片(每类一张),其余无标签。训练一个变分自编码器,隐变量包括类别维度和风格维度。用有标签数据引导类别维度,无标签数据帮助学习风格。最终模型在测试集上能达到不错的效果。
5. 与前后的联系
- 前承:
- 第6章深度前馈网络:表示学习的基础模型。
- 第7章正则化:多任务学习、Dropout等正则化技术有助于学习好表示。
- 第8章优化:优化算法影响表示学习的质量。
- 第9章卷积网络:卷积层学习层次化表示。
- 第10章循环网络:RNN学习序列的表示。
- 第14章自编码器:自编码器是学习表示的重要工具。
- 后续:
- 第16章结构化概率模型:表示学习与图模型结合。
- 第20章深度生成模型:变分自编码器、GAN等直接从表示生成数据。
6. 总结与重点
6.1 核心要点
- 表示学习的目标:自动发现数据中的潜在因素,形成解耦、分布式的表示。
- 逐层预训练:历史重要技术,为深度网络训练提供良好起点,现代思想已融入预训练-微调范式。
- 迁移学习:利用预训练表示解决新任务,是实际应用的关键。
- 半监督学习:利用无标签数据改善表示,尤其当标签稀缺时。
- 分布式表示:信息分布在多个维度,具有指数级表示能力和泛化优势。
- 深度优势:深度网络能以更少参数表示某些复杂函数,体现为指数级增益。
- 提供线索:多任务、对比学习等方法提供额外监督,引导表示学习。
6.2 常见难点
- 解耦因素的理解:如何定义“解耦”?通常指表示中每个维度独立变化,但实际很难完全实现。
- 分布式表示与局部表示的权衡:局部表示在某些任务中(如精确匹配)可能更有效,但缺乏泛化。
- 深度增益的理论与实际:理论上的指数级增益不一定在所有任务中都出现,但深度确实普遍有效。
- 迁移学习中的负迁移:当源任务与目标任务不相关时,预训练可能损害性能,需谨慎选择源任务。
- 半监督学习的假设:如果无标签数据分布与有标签数据不同,半监督学习可能失效。
6.3 学习建议
- 动手实践:使用PyTorch/TensorFlow实现一个简单的自编码器,并在MNIST上观察学到的表示。尝试迁移学习:用预训练的ResNet在CIFAR-10上微调。
- 阅读经典论文:Hinton et al. (2006) 关于深度信念网络的预训练;Mikolov et al. (2013) Word2Vec;Devlin et al. (2018) BERT。
- 思考应用:在自己的项目中如何利用预训练模型?如何处理领域自适应问题?
- 理论结合实践:通过实验比较浅层与深层网络的表示能力,验证深度带来的优势。
通过本章的学习,你已经掌握了表示学习的核心思想、方法和前沿进展。这些知识将帮助你在实际应用中设计更有效的深度学习系统,并为后续研究生成模型、结构化概率模型等打下坚实基础。
《深度学习》(Ian Goodfellow 著)第16章“深度学习中的结构化概率模型”详细讲解
1. 本章概述与定位
第16章“深度学习中的结构化概率模型”旨在将概率图模型(PGM)与深度学习相结合。在前面的章节中,我们已经看到了许多深度模型(如前馈网络、卷积网络、循环网络)在监督学习中的成功应用,但它们通常将输出视为相互独立的(如分类问题中每个类别的概率由softmax独立给出)。然而,许多现实任务(如自然语言处理中的序列标注、图像分割)的输出具有复杂的依赖结构,需要模型能够显式地建模这些依赖关系。
本章介绍如何利用图模型的语言来描述随机变量之间的依赖关系,并探讨如何在深度学习中融入这种结构化建模的思想。通过学习本章,读者将理解:
- 为什么需要结构化概率模型?
- 有向图模型与无向图模型的区别与联系。
- 如何从图模型中采样?
- 如何学习图模型的结构和参数?
- 如何利用深度网络来增强图模型的表达能力(如深度玻尔兹曼机、深度信念网络)。
- 推断(inference)的重要性及近似推断的基本思想。
本章为后续章节(如第17-20章)中更高级的生成模型和推断方法打下理论基础。
2. 由浅入深:从基础概念到深度学习结合
2.1 非结构化建模的挑战
在传统机器学习中,如果我们想对一个包含 $n$ 个离散随机变量的联合分布 $P(x_1, x_2, \dots, x_n)$ 进行建模,最直接的方法是使用一个表格,列出所有可能的 $2^n$(或 $k^n$)种取值组合的概率。这种方法当 $n$ 稍大时就会遇到维度灾难——参数数量随 $n$ 指数增长。此外,我们通常没有足够的样本来估计所有这些参数,且存储和计算都不可行。
例子:对一个有 100 个二值像素的图像,表格需要 $2^{100}$ 个参数,比宇宙中的原子数还多。
2.2 结构化概率模型的动机
结构化概率模型(也称图模型)通过利用变量之间的条件独立性来简化联合分布的表示。它将联合分布分解为多个因子的乘积,每个因子只涉及一小部分变量。这样,参数数量大大减少,且模型更容易解释和学习。
2.3 图模型的基本类型
2.3.1 有向图模型(贝叶斯网络)
有向图模型使用有向无环图(DAG)来表示变量之间的因果关系。每个节点对应一个随机变量,有向边表示“父节点对子节点有直接影响”。联合分布分解为每个变量在给定其父节点下的条件概率的乘积:
$$ P(\boldsymbol{x}) = \prod_{i} P(x_i \mid \text{Pa}(x_i)) $$其中 $\text{Pa}(x_i)$ 表示 $x_i$ 的父节点集合。
例子:图3.7展示了简单的有向图:
$$ P(a,b,c,d,e) = P(a) P(b \mid a) P(c \mid a,b) P(d \mid b) P(e \mid c) $$这种分解明确指出了条件独立关系:例如,给定 $a,b$,$c$ 与 $d,e$ 独立?需要具体看。
2.3.2 无向图模型(马尔可夫随机场)
无向图模型使用无向图来表示变量之间的相互作用。联合分布分解为多个定义在团(clique)上的势函数(factor)的乘积,再除以一个归一化常数(配分函数):
$$ P(\boldsymbol{x}) = \frac{1}{Z} \prod_{\mathcal{C}} \phi_{\mathcal{C}}(\boldsymbol{x}_{\mathcal{C}}) $$其中 $Z = \sum_{\boldsymbol{x}} \prod_{\mathcal{C}} \phi_{\mathcal{C}}(\boldsymbol{x}_{\mathcal{C}})$ 是配分函数,确保概率和为1。势函数必须非负,但不一定等于概率。
例子:图3.8中:
$$ P(a,b,c,d,e) = \frac{1}{Z} \phi^{(1)}(a,b,c) \phi^{(2)}(b,d) \phi^{(3)}(c,e) $$2.3.3 因子图
因子图是一种将变量节点和因子节点分开表示的图,可以统一表示有向和无向模型。它明确写出每个因子与哪些变量相连。
2.4 条件独立性与图结构
- 有向图中的条件独立性可以通过d-分离(d-separation)准则判断。
- 无向图中的条件独立性由图分离(graph separation)决定:给定一组节点 $S$,如果从 $A$ 到 $B$ 的所有路径都被 $S$ 阻隔(即路径上有一个节点在 $S$ 中),则 $A$ 与 $B$ 在给定 $S$ 下独立。
这些性质使得图模型成为描述变量间关系的有力工具。
2.5 从图模型采样
2.5.1 从有向图采样
有向图模型通常可以直接使用祖先采样(ancestral sampling):按照拓扑顺序,先采样没有父节点的变量,然后依次采样每个变量,给定其父节点的采样值。
2.5.2 从无向图采样
无向图模型由于存在复杂的依赖循环,无法直接采样,通常需要使用马尔可夫链蒙特卡洛(MCMC)方法,如吉布斯采样(Gibbs sampling)。吉布斯采样每次固定其他变量,从一个变量的条件分布中采样,迭代进行直到收敛。
2.6 结构化建模的优势
- 参数效率:利用条件独立性,参数数量从指数级降到多项式级。
- 可解释性:图结构直观地展示了变量间的依赖关系。
- 模块化:可以组合不同的因子来构建复杂模型。
2.7 学习依赖关系
学习图模型通常包括两个任务:
- 结构学习:确定图的结构(哪些边存在)。这是一个组合优化问题,通常用启发式搜索或正则化方法。
- 参数学习:给定结构,估计因子中的参数。对于有向图,通常是最大化条件似然;对于无向图,需要计算配分函数 $Z$ 的梯度,这通常难以计算,需要近似方法(如对比散度)。
2.8 推断与近似推断
推断(inference)是指给定部分观测变量,计算其他变量的后验概率或边缘概率。例如,在医学诊断中,给定一些症状(观测),推断疾病(隐变量)的概率。
- 精确推断:对于树状结构,可以用置信传播(belief propagation)等算法。对于一般图,精确推断是NP难的。
- 近似推断:包括变分推断(variational inference)和采样法(如MCMC)。变分推断通过引入一个简单的近似分布 $q$ 来逼近真实后验,并最小化 $D_{\mathrm{KL}}(q\|p)$。
2.9 深度学习与结构化概率模型的结合
深度学习模型(如神经网络)可以用来参数化图模型中的条件概率分布或势函数,从而增强其表达能力。
2.9.1 深度信念网络(Deep Belief Network, DBN)
DBN 是一种混合图模型,由多个受限玻尔兹曼机(RBM)堆叠而成。顶层是一个无向图(RBM),下层是有向的生成模型。DBN 可以通过逐层贪婪预训练(第15章)来学习,然后用于生成或作为特征提取器。
2.9.2 深度玻尔兹曼机(Deep Boltzmann Machine, DBM)
DBM 是完全无向的多层网络,所有层之间的连接都是双向的。它比 DBN 更难训练(因为需要近似推断),但能学习更丰富的表示。
2.9.3 结构化输出与条件随机场(CRF)
在许多应用中,输出变量本身具有结构(如序列、树、网格)。条件随机场是一种无向图模型,用于建模给定输入 $x$ 下输出 $y$ 的条件分布 $P(y|x)$。CRF 常与神经网络结合,如 CNN-CRF 用于图像分割,BiLSTM-CRF 用于序列标注。
2.9.4 变分自编码器(VAE)与图模型
VAE(第20章)可以看作是一个有向图模型,其中隐变量 $z$ 通过神经网络生成观测 $x$。推断网络(编码器)近似后验 $q(z|x)$,这也是变分推断的实例。
3. 核心概念详解
3.1 结构化概率模型
定义:用图结构描述随机变量之间依赖关系的概率模型。
3.2 图(Graph)
- 节点:随机变量。
- 边:依赖关系。
3.3 有向图模型(贝叶斯网络)
- 定义:使用有向无环图,联合分布分解为条件概率乘积。
- 公式:$P(\boldsymbol{x}) = \prod_i P(x_i \mid \text{Pa}(x_i))$。
- 例子:隐马尔可夫模型(HMM)是有向图模型,其中状态序列构成一阶马尔可夫链。
3.4 无向图模型(马尔可夫随机场)
- 定义:使用无向图,联合分布分解为势函数乘积,除以配分函数。
- 公式:$P(\boldsymbol{x}) = \frac{1}{Z} \prod_{\mathcal{C}} \phi_{\mathcal{C}}(\boldsymbol{x}_{\mathcal{C}})$。
- 例子:图像去噪中的成对势模型(每个像素与相邻像素交互)。
3.5 因子图
- 定义:二部图,包含变量节点和因子节点,边表示变量属于该因子。
- 作用:统一表示有向和无向模型,便于推断算法(如和积算法)。
3.6 条件独立性
- 定义:给定一些变量,某些变量之间独立。
- 作用:简化联合分布表示,也是图模型的核心。
3.7 配分函数(Partition Function)
- 定义:无向图中归一化常数 $Z = \sum_{\boldsymbol{x}} \prod_{\mathcal{C}} \phi_{\mathcal{C}}(\boldsymbol{x}_{\mathcal{C}})$。
- 难点:通常难以计算,因为需要求和(或积分)所有可能状态。
3.8 采样
- 定义:从概率分布中生成样本。
- 方法:祖先采样(有向图)、吉布斯采样(无向图)、MCMC等。
3.9 推断
- 定义:计算未观测变量的后验概率。
- 精确推断:变量消除法、置信传播(树结构)。
- 近似推断:变分推断、MCMC。
3.10 变分推断
- 定义:用一族简单的分布 $q$ 来近似真实后验 $p$,最小化 KL 散度 $D_{\mathrm{KL}}(q\|p)$。
- 作用:将推断问题转化为优化问题。
3.11 学习
- 定义:从数据中估计图模型的参数。
- 有向图:最大似然估计,容易分解。
- 无向图:需计算配分函数的梯度,常用对比散度(CD)等近似。
3.12 深度信念网络(DBN)
- 结构:堆叠的RBM,顶层无向,下层有向。
- 学习:逐层无监督预训练 + 微调。
3.13 深度玻尔兹曼机(DBM)
- 结构:多层无向网络,所有层之间全连接。
- 特点:更强的表示能力,但推断和学习更复杂。
3.14 受限玻尔兹曼机(RBM)
- 结构:两层无向图模型(可见层和隐藏层),层内无连接。
- 能量函数:$E(\boldsymbol{v}, \boldsymbol{h}) = -\boldsymbol{a}^\top \boldsymbol{v} - \boldsymbol{b}^\top \boldsymbol{h} - \boldsymbol{v}^\top \boldsymbol{W} \boldsymbol{h}$。
- 条件分布:$P(\boldsymbol{h} \mid \boldsymbol{v})$ 和 $P(\boldsymbol{v} \mid \boldsymbol{h})$ 容易计算(因层内独立)。
- 学习:对比散度(CD-k)。
3.15 条件随机场(CRF)
- 定义:给定输入 $x$ 下输出 $y$ 的条件无向模型。
- 公式:$P(y|x) = \frac{1}{Z(x)} \prod_{\mathcal{C}} \phi_{\mathcal{C}}(y_{\mathcal{C}}, x)$。
- 应用:序列标注(如NER)、图像分割。
4. 知识体系图
5. 实例辅助
5.1 有向图实例:隐马尔可夫模型(HMM)
HMM 用于序列数据,如词性标注。假设观测序列 $x_1, x_2, \dots, x_T$,隐状态序列 $h_1, h_2, \dots, h_T$。图结构为 $h_t \to h_{t+1}$ 和 $h_t \to x_t$。联合分布:
$$ P(h,x) = P(h_1) \prod_{t=2}^T P(h_t \mid h_{t-1}) \prod_{t=1}^T P(x_t \mid h_t) $$5.2 无向图实例:图像去噪
设观测图像 $y$ 含噪声,真实图像 $x$ 为二值。图模型中每个像素 $x_i$ 与观测 $y_i$ 相连,且与相邻像素相连。势函数可定义为:
- 一元势:$\phi_i(x_i, y_i) = \exp(w_i x_i y_i)$(鼓励 $x_i$ 与 $y_i$ 一致)。
- 二元势:$\phi_{ij}(x_i, x_j) = \exp(v_{ij} x_i x_j)$(鼓励相邻像素一致)。
联合分布 $P(x|y) \propto \exp(\sum_i w_i x_i y_i + \sum_{ij} v_{ij} x_i x_j)$。这是一个伊辛模型。
5.3 RBM 实例:手写数字生成
RBM 可见层对应像素(二值或高斯),隐藏层学习特征。训练后,可以从模型中采样生成新图像(通过吉布斯采样)。
5.4 CRF 实例:命名实体识别
输入句子 $x$(单词序列),输出标签 $y$(如 PER、LOC、O)。使用 BiLSTM 提取每个词的上下文特征,然后输入到线性链 CRF,其中转移矩阵建模标签间的依赖(如 I-PER 必须跟在 B-PER 之后)。
6. 与前后的联系
- 前承:
- 第3章概率论:条件概率、贝叶斯规则、边缘化。
- 第5章机器学习基础:过拟合、正则化。
- 第6章前馈网络:作为函数近似器。
- 第13章线性因子模型:因子分析、PCA 等可视为简单图模型。
- 第14章自编码器:自编码器与 RBM 联系密切。
- 第15章表示学习:深度信念网络、深度玻尔兹曼机用于表示学习。
- 后续:
- 第17章蒙特卡洛方法:用于推断和学习的采样技术。
- 第18章配分函数:深入探讨配分函数的处理。
- 第19章近似推断:变分推断的详细展开。
- 第20章深度生成模型:VAE、GAN 等与图模型的结合。
7. 总结与重点
7.1 核心要点
- 结构化概率模型通过图结构表示变量间的依赖,避免指数级参数爆炸。
- 有向图使用条件概率分解,适合生成过程;无向图使用势函数和配分函数,适合对称交互。
- 配分函数是无向图模型的核心难点,需用近似方法处理。
- 推断是计算后验概率的过程,对于复杂图模型通常需要近似推断(变分或采样)。
- 深度学习与图模型的结合产生了强大的模型:RBM、DBN、DBM、CRF、VAE 等。
- 深度信念网络和深度玻尔兹曼机是早期深度生成模型的代表,推动了表示学习的发展。
- 条件随机场广泛应用于结构化输出任务,与神经网络结合成为主流。
7.2 常见难点
- 配分函数的不可解性:导致学习困难,需用对比散度、得分匹配等方法。
- 变分推断的精度:近似分布族的选择影响结果,需平衡计算与精度。
- 有向图与无向图的选择:两者可以互相转换,但建模直觉不同。
- RBM 的能量函数:理解能量模型与概率的关系是关键。
- 深度玻尔兹曼机的难训练性:需要两层近似,易陷入局部最优。
7.3 学习建议
- 动手实现:用 Python 实现一个简单的 RBM,在 MNIST 上训练并生成样本。
- 使用库:学习 Pyro、TensorFlow Probability 等概率编程库,实践变分推断。
- 阅读论文:Hinton 的 RBM 和 DBN 经典论文;CRF 与深度学习结合的综述。
- 画图理解:对于给定图结构,画出因子图,写出分解式,理解条件独立性。
- 对比模型:比较 HMM、CRF、RNN 在序列标注任务上的异同。
通过本章的学习,你已经掌握了结构化概率模型的基础理论及其与深度学习的结合方式。这些知识将帮助你设计更复杂的生成模型和处理结构化输出任务。接下来,我们将深入蒙特卡洛方法和近似推断,进一步提升对复杂概率模型的处理能力。
《深度学习》(Ian Goodfellow 著)第17章“蒙特卡罗方法”详细讲解
1. 本章概述与定位
在深度学习和概率建模中,我们经常需要计算复杂的积分或期望,例如:
- 计算后验分布的归一化常数(配分函数)。
- 在变分推断中计算难以解析的期望。
- 在生成模型中从复杂分布中采样。
这些计算往往无法通过解析方法完成,必须借助数值方法。蒙特卡罗方法(Monte Carlo Methods)是一类通过随机采样来近似数值计算的强大工具。本章将介绍蒙特卡罗方法的基本原理、重要性采样、马尔可夫链蒙特卡罗(MCMC)以及吉布斯采样,并讨论它们在高维复杂分布中面临的挑战。
本章内容是后续章节(如第18章配分函数、第19章近似推断、第20章深度生成模型)的基础,对于理解现代深度生成模型的训练和推断至关重要。
2. 由浅入深:从基础采样到高级MCMC
2.1 采样与蒙特卡罗估计
2.1.1 为什么需要采样?
在许多概率模型中,我们常常需要计算某个函数 $f(\boldsymbol{x})$ 关于分布 $p(\boldsymbol{x})$ 的期望:
$$ \mathbb{E}_{p}[f(\boldsymbol{x})] = \int f(\boldsymbol{x}) p(\boldsymbol{x}) d\boldsymbol{x} $$如果分布 $p$ 非常复杂(如深度生成模型的后验),积分无法解析计算。蒙特卡罗方法通过从 $p$ 中抽取独立样本 $\boldsymbol{x}^{(1)}, \dots, \boldsymbol{x}^{(n)}$,然后用样本均值近似期望:
$$ \hat{\mu}_n = \frac{1}{n} \sum_{i=1}^n f(\boldsymbol{x}^{(i)}) $$根据大数定律,当 $n \to \infty$ 时,$\hat{\mu}_n$ 收敛到真实期望。根据中心极限定理,估计的误差以 $O(1/\sqrt{n})$ 的速度减小。
2.1.2 例子:估计圆周率
考虑单位圆内接于正方形,在正方形内随机均匀投点,落在圆内的比例约等于圆面积与正方形面积之比 $\pi/4$。通过大量采样,可以估计 $\pi$。
2.2 重要性采样
2.2.1 动机
当无法直接从目标分布 $p$ 采样时,我们可以从一个容易采样的提议分布 $q$ 中采样,然后通过加权校正。这就是重要性采样。
2.2.2 定义
期望 $\mathbb{E}_{p}[f(\boldsymbol{x})]$ 可以改写为:
$$ \mathbb{E}_{p}[f(\boldsymbol{x})] = \int f(\boldsymbol{x}) \frac{p(\boldsymbol{x})}{q(\boldsymbol{x})} q(\boldsymbol{x}) d\boldsymbol{x} = \mathbb{E}_{q}[f(\boldsymbol{x}) w(\boldsymbol{x})] $$其中 $w(\boldsymbol{x}) = \frac{p(\boldsymbol{x})}{q(\boldsymbol{x})}$ 称为重要性权重。于是我们可以从 $q$ 中采样 $\boldsymbol{x}^{(i)}$,并计算加权平均:
$$ \hat{\mu}_n = \frac{1}{n} \sum_{i=1}^n f(\boldsymbol{x}^{(i)}) w(\boldsymbol{x}^{(i)}) $$如果 $q$ 与 $p$ 越接近,方差越小。实际中常用自归一化重要性采样,当 $p$ 的归一化常数未知时,用权重归一化。
2.2.3 退化问题
如果 $q$ 与 $p$ 偏差大,少数样本的权重可能极大,导致估计方差很大。有效样本量可衡量退化程度。
2.2.4 例子
假设 $p$ 是标准正态分布,$q$ 是均值为10的正态分布。从 $q$ 中采样,大部分样本落在 $p$ 的低概率区域,权重几乎为零,只有极少数落在原点附近的样本才有大权重,导致估计不稳定。
2.3 马尔可夫链蒙特卡罗方法(MCMC)
2.3.1 动机
重要性采样在高维空间中效率很低,因为很难找到与目标分布匹配的提议分布。MCMC方法通过构建一个马尔可夫链,其平稳分布恰好是目标分布 $p$,然后从链的状态中采样(丢弃初始的“烧入”期),这些样本近似服从 $p$。
2.3.2 马尔可夫链基础
- 马尔可夫链:状态序列 $\boldsymbol{x}^{(0)}, \boldsymbol{x}^{(1)}, \dots$,满足 $\boldsymbol{x}^{(t+1)}$ 只依赖于 $\boldsymbol{x}^{(t)}$,转移概率 $T(\boldsymbol{x}' \mid \boldsymbol{x})$。
- 平稳分布:如果链是遍历的,经过足够长时间后,状态分布收敛到平稳分布 $\pi(\boldsymbol{x})$,满足 $\pi(\boldsymbol{x}') = \sum_{\boldsymbol{x}} \pi(\boldsymbol{x}) T(\boldsymbol{x}' \mid \boldsymbol{x})$。
- 细致平衡:一个充分条件是 $\pi(\boldsymbol{x}) T(\boldsymbol{x}' \mid \boldsymbol{x}) = \pi(\boldsymbol{x}') T(\boldsymbol{x} \mid \boldsymbol{x}')$,此时 $\pi$ 是平稳分布。
2.3.3 Metropolis-Hastings算法
最通用的MCMC算法,步骤如下:
- 从当前状态 $\boldsymbol{x}$ 出发,根据提议分布 $q(\boldsymbol{x}' \mid \boldsymbol{x})$ 生成候选 $\boldsymbol{x}'$。
- 计算接受概率: $$ \alpha = \min\left(1, \frac{p(\boldsymbol{x}') q(\boldsymbol{x} \mid \boldsymbol{x}')}{p(\boldsymbol{x}) q(\boldsymbol{x}' \mid \boldsymbol{x})}\right) $$
- 以概率 $\alpha$ 接受候选($\boldsymbol{x}^{(t+1)} = \boldsymbol{x}'$),否则保持原状态($\boldsymbol{x}^{(t+1)} = \boldsymbol{x}$)。
这样构造的链满足细致平衡,平稳分布为 $p$。
2.3.4 随机游走Metropolis
最常用的提议分布是高斯分布:$\boldsymbol{x}' \sim \mathcal{N}(\boldsymbol{x}, \sigma^2 \boldsymbol{I})$,即对称提议,此时接受概率简化为 $\min(1, p(\boldsymbol{x}')/p(\boldsymbol{x}))$。步长 $\sigma$ 需适当选择:太小则链移动缓慢,太大则接受率低。
2.3.5 例子:从混合高斯采样
目标分布为 $p(x) = 0.3 \mathcal{N}(-5,1) + 0.7 \mathcal{N}(5,1)$。用随机游走Metropolis采样,初始值设为0,经过一定迭代后,样本分布应接近目标分布。
2.4 吉布斯采样
2.4.1 定义
吉布斯采样是Metropolis-Hastings的一种特殊情形,每次更新一个变量(或一组变量)的条件分布。对于高维分布,轮流从每个变量的全条件分布 $p(x_i \mid \boldsymbol{x}_{-i})$ 中采样,其他变量固定。由于总是接受,吉布斯采样没有拒绝步骤。
2.4.2 算法
对于 $\boldsymbol{x} = (x_1, \dots, x_d)$,一轮更新:
- 从 $p(x_1 \mid x_2, \dots, x_d)$ 采样新 $x_1$。
- 从 $p(x_2 \mid x_1, x_3, \dots, x_d)$ 采样新 $x_2$。
- …
- 从 $p(x_d \mid x_1, \dots, x_{d-1})$ 采样新 $x_d$。
重复上述过程。
2.4.3 适用条件
当全条件分布易于采样时(如RBM中隐藏层给定可见层是独立伯努利),吉布斯采样非常高效。常用于深度玻尔兹曼机、受限玻尔兹曼机等。
2.4.4 例子:二维高斯分布
给定二元高斯分布,条件分布 $p(x_1 \mid x_2)$ 是一元高斯,可直接采样。吉布斯采样交替更新 $x_1$ 和 $x_2$,链收敛到联合高斯。
2.5 混合分离的挑战
2.5.1 问题描述
当目标分布具有多个远距离的峰值(多模态)时,MCMC可能很难从一个模态跳到另一个模态。因为模态间的区域概率极低,提议被接受的概率几乎为零。这导致链被卡在一个模态中,无法探索整个分布。
2.5.2 例子:混合高斯
考虑 $p(x) = 0.5 \mathcal{N}(-20,1) + 0.5 \mathcal{N}(20,1)$。若链初始在左边模态,随机游走步长设为1,要跳到右边需要跨越概率几乎为零的区域,几乎不可能。
2.5.3 解决方案
- 并行回火:同时运行多个不同温度的链,高温链可以跨越模态,通过交换状态帮助低温链探索。
- 使用更智能的提议:如哈密顿蒙特卡罗(HMC)利用梯度信息,可能更容易穿越低概率区域。
- 初始化多个链:从不同起点开始,合并样本。
3. 核心概念详解
| 术语 | 定义 | 公式/原理 |
|---|---|---|
| 蒙特卡罗估计 | 用样本均值近似期望 | $\hat{\mu}_n = \frac{1}{n}\sum f(x^{(i)})$ |
| 重要性采样 | 从提议分布采样,加权校正 | $\hat{\mu}_n = \frac{1}{n}\sum f(x^{(i)}) \frac{p(x^{(i)})}{q(x^{(i)})}$ |
| 重要性权重 | 目标分布与提议分布之比 | $w(x) = p(x)/q(x)$ |
| 退化 | 权重集中在少数样本 | 有效样本量 $ESS = \frac{(\sum w_i)^2}{\sum w_i^2}$ |
| 马尔可夫链 | 下一状态只依赖当前状态的状态序列 | $P(X_{t+1} \mid X_t, X_{t-1}, \dots) = P(X_{t+1} \mid X_t)$ |
| 平稳分布 | 链长期运行后的分布 | $\pi$ 满足 $\pi T = \pi$ |
| 细致平衡 | 保证平稳分布的充分条件 | $\pi(x)T(x’ |
| Metropolis-Hastings | 接受-拒绝MCMC算法 | 接受概率 $\alpha = \min\left(1, \frac{p(x’)q(x |
| 随机游走Metropolis | 提议为对称随机游走 | $q(x' |
| 吉布斯采样 | 轮流从条件分布采样 | 更新 $x_i \sim p(x_i \mid x_{-i})$ |
| 混合分离 | MCMC难以在多模态分布中跳转 | 原因:模态间概率极低 |
4. 知识体系图
5. 实例辅助
5.1 重要性采样退化示例
目标分布 $p(x) = \mathcal{N}(0,1)$,提议分布 $q(x) = \mathcal{N}(10,1)$。采样1000个点,计算权重。大多数权重接近0,少数几个权重极大,导致加权均值方差很大。
5.2 Metropolis-Hastings采样二维混合高斯
设目标分布为二维混合高斯,有两个模态分别位于(-5,-5)和(5,5)。用随机游走Metropolis,步长 $\sigma=1$,初始点(-5,-5)。运行10000步,绘制样本轨迹,可见样本大多集中在初始模态,很少跳到另一模态。增大步长到 $\sigma=5$,接受率降低,但可能偶尔跳转。
5.3 吉布斯采样二维高斯
目标分布为 $\mathcal{N}\left(\begin{bmatrix}0\\0\end{bmatrix}, \begin{bmatrix}1 & 0.8\\0.8 & 1\end{bmatrix}\right)$。条件分布:
- $x_1 \mid x_2 \sim \mathcal{N}(0.8 x_2, 0.36)$
- $x_2 \mid x_1 \sim \mathcal{N}(0.8 x_1, 0.36)$
从 (0,0) 开始,交替采样,很快收敛到联合分布。
6. 与前后的联系
- 前承:
- 第3章概率论:随机变量、分布、期望、条件分布。
- 第13-16章:概率模型(线性因子模型、自编码器、结构化概率模型)需要采样或计算期望。
- 第16章配分函数:MCMC可用于估计配分函数。
- 后续:
- 第18章配分函数:MCMC(特别是对比散度)用于训练无向图模型。
- 第19章近似推断:变分推断与MCMC是两大近似推断方法,本章为MCMC打下基础。
- 第20章深度生成模型:GAN、VAE等需要采样,MCMC也可用于改进生成质量(如MCMC在潜在空间采样)。
7. 总结与重点
7.1 核心要点
- 蒙特卡罗方法:通过随机采样近似复杂积分和期望,是概率建模的必备工具。
- 重要性采样:从提议分布采样并加权,适用于无法直接采样的情况,但需注意退化。
- MCMC:通过构造平稳分布为目标分布的马尔可夫链,迭代采样逼近目标分布。
- Metropolis-Hastings:最通用的MCMC,接受概率确保细致平衡。
- 吉布斯采样:每次更新一个变量,条件分布易采样时非常高效。
- 混合分离:多模态分布中MCMC可能卡在单个模态,需特殊处理(并行回火等)。
7.2 常见难点
- 重要性权重的方差:提议分布选择不当导致权重方差大,需通过有效样本量监控。
- MCMC的收敛诊断:如何判断链已收敛到平稳分布?常用迹图、自相关、Gelman-Rubin诊断。
- 步长选择:MH中步长太小则链移动慢,太大则接受率低,需调整到接受率约0.234(对于随机游走)。
- 吉布斯采样的依赖关系:条件分布需可采样,否则需用MH更新。
- 混合分离与高维:高维空间中,多模态问题更严重,需要更高级方法。
7.3 学习建议
- 动手实现:用Python实现随机游走Metropolis采样一维混合高斯,观察样本分布和接受率。
- 可视化:绘制链的轨迹、自相关函数、不同步长的接受率曲线。
- 阅读文献:了解HMC、NUTS等高级MCMC算法,如Stan手册中的介绍。
- 练习吉布斯:在RBM或高斯混合模型上实现吉布斯采样。
- 思考应用:考虑在你的项目中何时需要采样,如何选择合适的蒙特卡罗方法。
通过本章的学习,你已经掌握了蒙特卡罗方法的核心思想和主要算法。这些知识将在后续章节中用于训练深度生成模型和进行近似推断,是成为深度学习专家的必备技能。
《深度学习》(Ian Goodfellow 著)第18章“面对配分函数”详细讲解
1. 本章概述与定位
在无向图模型(如受限玻尔兹曼机、深度玻尔兹曼机)中,联合概率分布通常表示为:
$$ p(\boldsymbol{x};\boldsymbol{\theta}) = \frac{1}{Z(\boldsymbol{\theta})} \tilde{p}(\boldsymbol{x};\boldsymbol{\theta}) $$其中 $\tilde{p}$ 是未归一化的概率(例如玻尔兹曼分布中的能量函数取负指数),而
$$ Z(\boldsymbol{\theta}) = \int \tilde{p}(\boldsymbol{x};\boldsymbol{\theta}) d\boldsymbol{x} $$是配分函数(partition function)。配分函数的作用是确保概率之和(或积分)为1,但它的计算往往极其困难,因为需要在整个高维空间上积分(或求和)。在训练这类模型时,我们通常采用最大似然估计,而似然梯度中恰好包含了配分函数的梯度,这导致无法直接优化。
本章系统介绍了处理配分函数的多种方法,包括:
- 近似梯度:对比散度(CD)、随机最大似然(SML,也称为持续性对比散度PCD)。
- 替代目标函数:伪似然、得分匹配、噪声对比估计(NCE)。
- 估计配分函数本身:重要性采样、退火重要采样等。
理解这些方法对于掌握深度生成模型(如RBM、DBM)的训练至关重要,也为后续学习更复杂的生成模型(如VAE、GAN)提供了对比基础。
2. 由浅入深:从配分函数问题到各种解法
2.1 配分函数的基本概念与挑战
2.1.1 定义与问题
考虑一个无向图模型,其概率密度(或质量函数)为:
$$ p(\boldsymbol{x};\boldsymbol{\theta}) = \frac{1}{Z(\boldsymbol{\theta})} \tilde{p}(\boldsymbol{x};\boldsymbol{\theta}), \quad Z(\boldsymbol{\theta}) = \sum_{\boldsymbol{x}} \tilde{p}(\boldsymbol{x};\boldsymbol{\theta}) \quad (\text{或积分}) $$对于连续型,求和变为积分。配分函数 $Z(\boldsymbol{\theta})$ 是一个关于参数 $\boldsymbol{\theta}$ 的函数,通常没有解析形式,且在高维空间中直接计算不可行。
2.1.2 例子:受限玻尔兹曼机(RBM)
RBM 的能量函数为:
$$ E(\boldsymbol{v},\boldsymbol{h}) = -\boldsymbol{a}^\top \boldsymbol{v} - \boldsymbol{b}^\top \boldsymbol{h} - \boldsymbol{v}^\top \boldsymbol{W} \boldsymbol{h} $$联合分布为:
$$ p(\boldsymbol{v},\boldsymbol{h}) = \frac{1}{Z} e^{-E(\boldsymbol{v},\boldsymbol{h})} $$边缘分布 $p(\boldsymbol{v}) = \frac{1}{Z} \sum_{\boldsymbol{h}} e^{-E(\boldsymbol{v},\boldsymbol{h})}$,其中配分函数 $Z = \sum_{\boldsymbol{v},\boldsymbol{h}} e^{-E(\boldsymbol{v},\boldsymbol{h})}$。即使对于中等大小的可见层和隐藏层,$Z$ 的计算也是指数级的。
2.2 对数似然梯度与配分函数的导数
假设我们有训练数据 $\{\boldsymbol{x}^{(1)},\dots,\boldsymbol{x}^{(m)}\}$,对数似然为:
$$ \ell(\boldsymbol{\theta}) = \sum_{i=1}^m \log p(\boldsymbol{x}^{(i)};\boldsymbol{\theta}) = \sum_{i=1}^m \log \tilde{p}(\boldsymbol{x}^{(i)};\boldsymbol{\theta}) - m \log Z(\boldsymbol{\theta}) $$对参数求梯度:
$$ \frac{\partial \ell}{\partial \boldsymbol{\theta}} = \sum_{i=1}^m \frac{\partial}{\partial \boldsymbol{\theta}} \log \tilde{p}(\boldsymbol{x}^{(i)};\boldsymbol{\theta}) - m \frac{\partial}{\partial \boldsymbol{\theta}} \log Z(\boldsymbol{\theta}) $$而
$$ \frac{\partial}{\partial \boldsymbol{\theta}} \log Z(\boldsymbol{\theta}) = \frac{1}{Z(\boldsymbol{\theta})} \frac{\partial Z}{\partial \boldsymbol{\theta}} = \frac{1}{Z(\boldsymbol{\theta})} \sum_{\boldsymbol{x}} \frac{\partial \tilde{p}(\boldsymbol{x};\boldsymbol{\theta})}{\partial \boldsymbol{\theta}} = \sum_{\boldsymbol{x}} p(\boldsymbol{x};\boldsymbol{\theta}) \frac{\partial \log \tilde{p}(\boldsymbol{x};\boldsymbol{\theta})}{\partial \boldsymbol{\theta}} = \mathbb{E}_{\boldsymbol{x} \sim p} \left[ \frac{\partial \log \tilde{p}(\boldsymbol{x};\boldsymbol{\theta})}{\partial \boldsymbol{\theta}} \right] $$因此,对数似然梯度可以写成:
$$ \frac{\partial \ell}{\partial \boldsymbol{\theta}} = \sum_{i=1}^m \frac{\partial \log \tilde{p}(\boldsymbol{x}^{(i)};\boldsymbol{\theta})}{\partial \boldsymbol{\theta}} - m \mathbb{E}_{\boldsymbol{x} \sim p} \left[ \frac{\partial \log \tilde{p}(\boldsymbol{x};\boldsymbol{\theta})}{\partial \boldsymbol{\theta}} \right] $$即正相(数据分布期望)减去负相(模型分布期望)。正相容易计算(只需对训练数据求和),而负相需要从模型分布 $p(\boldsymbol{x};\boldsymbol{\theta})$ 中采样,这正是难点所在。
几何解释:最大似然估计试图增大训练数据点的概率(正相),同时降低模型分布中其他点的概率(负相)。但负相需要对整个模型分布采样。
2.3 对比散度(Contrastive Divergence, CD)
2.3.1 核心思想
对比散度(Hinton, 2002)是一种近似计算负相梯度的方法。它用从模型分布中运行少量吉布斯采样步骤得到的样本(而不是平衡样本)来估计负相。通常只运行一步吉布斯采样(CD-1)。
2.3.2 算法步骤(以RBM为例)
- 从训练数据 $\boldsymbol{v}^{(0)}$ 开始。
- 根据条件分布 $p(\boldsymbol{h} \mid \boldsymbol{v}^{(0)})$ 采样 $\boldsymbol{h}^{(0)}$。
- 根据条件分布 $p(\boldsymbol{v} \mid \boldsymbol{h}^{(0)})$ 采样 $\boldsymbol{v}^{(1)}$(这一步得到重构)。
- 用 $\boldsymbol{v}^{(1)}$ 作为负相样本,计算梯度: $$ \frac{\partial \ell}{\partial \boldsymbol{\theta}} \approx \frac{\partial \log \tilde{p}(\boldsymbol{v}^{(0)};\boldsymbol{\theta})}{\partial \boldsymbol{\theta}} - \frac{\partial \log \tilde{p}(\boldsymbol{v}^{(1)};\boldsymbol{\theta})}{\partial \boldsymbol{\theta}} $$
- 更新参数。
2.3.3 为什么有效?
直觉上,一步吉布斯采样将数据点向模型分布方向移动了一步,得到的样本比数据点更靠近模型分布。梯度差试图将数据点概率推高,同时将“一步重构”的概率拉低。尽管这样得到的梯度并不是真实梯度的无偏估计,但实验表明它能有效训练RBM,且计算成本低。
2.3.4 局限性
- CD-1 的估计是有偏的,且当模型分布与数据分布差异大时,偏差可能较大。
- 增加吉布斯步数(如CD-10)可以减少偏差,但计算量增加。
- CD 可能无法很好地探索模型分布的多个模态(尤其是当模型有多峰时)。
2.4 随机最大似然 / 持续性对比散度(Stochastic Maximum Likelihood, SML / Persistent CD, PCD)
2.4.1 动机
CD 每次重新从数据点开始吉布斯采样,这使得负相样本始终靠近数据分布,可能无法充分代表模型分布。PCD(Tieleman, 2008)通过维护一个持续的状态(称为“幻想粒子”)来解决这个问题。
2.4.2 算法
- 初始化一组幻想粒子(例如从均匀分布随机采样)。
- 在每次参数更新后,用这些粒子的当前状态运行几步吉布斯采样(通常一步)来更新它们。
- 用更新后的粒子作为负相样本计算梯度。
这样,粒子链一直在模型分布附近游走,能够更好地探索模型分布。PCD 是对真实负相梯度的更准确近似,尤其是当学习率较小时,粒子链可以接近平衡分布。
2.4.3 优点与注意事项
- 比 CD 更准确,尤其是对于多模态分布。
- 需要存储幻想粒子,增加了内存开销。
- 如果学习率太大,粒子链可能跟不上模型分布的变化,导致近似失效。实践中常用“快速权重”技巧(fast weights)或适当降低学习率。
2.5 伪似然(Pseudolikelihood)
2.5.1 核心思想
伪似然(Besag, 1975)是一种完全避开配分函数的方法。它用所有条件概率的乘积来近似联合概率:
$$ \tilde{\ell}(\boldsymbol{\theta}) = \sum_{i=1}^m \sum_{j=1}^n \log p(x_j^{(i)} \mid \boldsymbol{x}_{-j}^{(i)}; \boldsymbol{\theta}) $$其中 $p(x_j \mid \boldsymbol{x}_{-j})$ 是在给定其他所有变量条件下第 $j$ 个变量的条件概率。在无向图模型中,这个条件概率通常很容易计算(因为它只涉及局部邻域,配分函数在条件中抵消了)。
2.5.2 为什么有效?
对于具有局部交互的模型(如图模型),条件概率只依赖于少数变量,计算简单。最大化伪似然等价于最大化每个变量给定邻居的预测能力,它倾向于使模型能够很好地预测每个变量,从而间接地学习到合理的联合分布。
2.5.3 例子
对于RBM,条件概率 $p(v_j \mid \boldsymbol{v}_{-j}, \boldsymbol{h})$ 并不简单,因为隐藏层存在。但伪似然通常应用于没有隐变量的模型,如马尔可夫随机场。对于有隐变量的模型,可以引入伪似然的变体,如平均场伪似然。
2.5.4 局限性
- 伪似然不是对联合分布的一致估计,但通常能给出合理的结果。
- 当变量间存在强依赖时,伪似然可能失效。
- 对于有大量变量的模型,计算所有条件概率可能仍然昂贵。
2.6 得分匹配(Score Matching)
2.6.1 核心思想
得分匹配(Hyvärinen, 2005)也是一种避免配分函数的方法。它不直接匹配概率,而是匹配对数密度的梯度(称为“得分函数”):
$$ \psi(\boldsymbol{x};\boldsymbol{\theta}) = \nabla_{\boldsymbol{x}} \log p(\boldsymbol{x};\boldsymbol{\theta}) = \nabla_{\boldsymbol{x}} \log \tilde{p}(\boldsymbol{x};\boldsymbol{\theta}) - \nabla_{\boldsymbol{x}} \log Z(\boldsymbol{\theta}) $$注意第二项与 $\boldsymbol{x}$ 无关,因此 $\nabla_{\boldsymbol{x}} \log Z(\boldsymbol{\theta}) = 0$。所以得分函数等于 $\nabla_{\boldsymbol{x}} \log \tilde{p}(\boldsymbol{x};\boldsymbol{\theta})$,完全不需要配分函数!
得分匹配的目标是使模型得分与数据得分的期望平方误差最小:
$$ J(\boldsymbol{\theta}) = \frac{1}{2} \int p_{\text{data}}(\boldsymbol{x}) \| \nabla_{\boldsymbol{x}} \log p_{\text{model}}(\boldsymbol{x};\boldsymbol{\theta}) - \nabla_{\boldsymbol{x}} \log p_{\text{data}}(\boldsymbol{x}) \|^2 d\boldsymbol{x} $$通过分部积分,可以转化为一个仅依赖于模型得分且不需要数据得分的表达式(假设数据密度在边界处为零)。对于指数族分布,得分匹配有解析形式。
2.6.2 优点
- 完全避免配分函数。
- 适用于连续型数据。
2.6.3 局限性
- 要求模型可微,且得分函数易于计算。
- 对于离散数据,需要改用比率匹配(ratio matching)。
- 得分匹配倾向于关注数据流形的局部结构,而不是全局概率质量,可能对多模态分布拟合不佳。
2.6.4 例子
对于RBM,得分匹配可以应用于连续可见单元的情况。但RBM通常是离散的,因此常用比率匹配(见18.4节)。
2.7 噪声对比估计(Noise Contrastive Estimation, NCE)
2.7.1 核心思想
NCE(Gutmann & Hyvärinen, 2010)将密度估计问题转化为一个二分类问题:区分来自真实数据分布的样本和来自某个已知噪声分布 $p_n$ 的样本。模型需要学习一个非归一化的概率 $\tilde{p}(\boldsymbol{x};\boldsymbol{\theta})$,同时学习一个参数 $c$ 来近似 $\log Z$,或者固定 $Z$ 并学习一个归一化模型。
具体地,我们构造一个包含 $k$ 个噪声样本对每个数据样本的混合分布。定义后验概率:
$$ P(\text{data} \mid \boldsymbol{x}) = \frac{p(\boldsymbol{x};\boldsymbol{\theta})}{p(\boldsymbol{x};\boldsymbol{\theta}) + k p_n(\boldsymbol{x})} $$其中 $p(\boldsymbol{x};\boldsymbol{\theta}) = \tilde{p}(\boldsymbol{x};\boldsymbol{\theta}) / Z$,但我们可以将 $\log Z$ 作为一个额外参数来学习,或者直接学习未归一化的模型并隐含地估计 $\log Z$。
NCE 的目标函数是最大化二分类的对数似然:
$$ J(\boldsymbol{\theta}, c) = \mathbb{E}_{\boldsymbol{x} \sim p_{\text{data}}} [\log P(\text{data} \mid \boldsymbol{x})] + k \mathbb{E}_{\boldsymbol{x} \sim p_n} [\log P(\text{noise} \mid \boldsymbol{x})] $$其中 $P(\text{noise} \mid \boldsymbol{x}) = 1 - P(\text{data} \mid \boldsymbol{x})$。
2.7.2 优点
- 避免计算配分函数,将问题转化为分类问题,可用随机梯度下降优化。
- 适用于任何未归一化模型。
- 如果噪声分布选得好,NCE 可以给出渐近一致的估计。
2.7.3 局限性
- 需要选择一个合适的噪声分布,通常选与数据分布接近的分布(如均匀分布、高斯分布)。
- 在高维空间中,很难找到好的噪声分布,导致分类任务过于简单,学不到有用信息。
- 对于复杂数据(如图像),NCE 可能不如其他方法有效。
2.7.4 例子
在语言模型中,NCE 常用于训练词嵌入(如 word2vec 中的负采样是其特例)。将目标词视为正样本,随机采样的词作为负样本,用 logistic 回归区分。
2.8 估计配分函数
有时我们需要估计配分函数本身(例如为了计算模型的似然或进行模型比较)。本章最后介绍了几种估计方法:
2.8.1 简单重要性采样
用提议分布 $q$ 采样:
$$ Z = \int \tilde{p}(\boldsymbol{x}) d\boldsymbol{x} = \int \frac{\tilde{p}(\boldsymbol{x})}{q(\boldsymbol{x})} q(\boldsymbol{x}) d\boldsymbol{x} = \mathbb{E}_{q} \left[ \frac{\tilde{p}(\boldsymbol{x})}{q(\boldsymbol{x})} \right] $$估计量 $\hat{Z} = \frac{1}{n} \sum_{i=1}^n \frac{\tilde{p}(\boldsymbol{x}^{(i)})}{q(\boldsymbol{x}^{(i)})}$,其中 $\boldsymbol{x}^{(i)} \sim q$。方差可能很大,需要 $q$ 与 $\tilde{p}$ 接近。
2.8.2 退火重要采样(Annealed Importance Sampling, AIS)
AIS(Neal, 2001)通过构造一系列中间分布 $p_0, p_1, \dots, p_n = p$,从简单分布(如 $p_0$ 容易采样)逐渐过渡到目标分布。通过重要性采样结合马尔可夫链,可以得到无偏的配分函数估计。AIS 在深度学习中用于估计RBM等模型的配分函数。
2.8.3 桥接采样(Bridging Sampling)
桥接采样是一种更高效的比率估计方法,通过两个分布之间的桥接分布来估计配分函数比。
3. 概念关系图
4. 实例辅助
4.1 CD 训练 RBM 实例
假设我们有一个简单的RBM,可见层2个单元,隐藏层2个单元。训练数据为四个样本:
$$ [0,0], [0,1], [1,0], [1,1] $$(均匀分布)。用CD-1训练:
- 取一个样本 $\boldsymbol{v} = [1,0]$。
- 计算隐藏层激活概率 $p(h_1=1 \mid \boldsymbol{v})$ 和 $p(h_2=1 \mid \boldsymbol{v})$,采样得到 $\boldsymbol{h}$(假设为 [1,0])。
- 用 $\boldsymbol{h}$ 重构可见层,得到 $\boldsymbol{v}'$(概率值,可采样得到 [0,1])。
- 更新权重:$\Delta W \propto \boldsymbol{v} \boldsymbol{h}^\top - \boldsymbol{v}' \boldsymbol{h}^\top$。
经过多轮训练,模型应能学习到数据的分布。
4.2 伪似然在简单MRF上的应用
考虑一个二值成对MRF:$p(\boldsymbol{x}) \propto \exp(\sum_i a_i x_i + \sum_{i 假设模型为单变量高斯 $p(x;\mu,\sigma) \propto \exp(-(x-\mu)^2/(2\sigma^2))$。得分函数为 $\psi(x) = -(x-\mu)/\sigma^2$。得分匹配目标可解析求出,得到 $\mu$ 等于样本均值,$\sigma^2$ 等于样本方差。 假设真实数据分布为标准正态,我们想学习一个未归一化的模型 $\tilde{p}(x;\theta) = \exp(-\theta x^2)$。噪声分布选为标准正态(但参数不同?)NCE训练时,对于每个数据点,我们同时从噪声分布中采样 $k$ 个点,用 logistic 回归区分。最终学习到的 $\theta$ 应使 $\tilde{p}$ 接近正态。 通过本章的学习,你已经掌握了处理配分函数的多种策略,这是理解和训练无向图模型的关键。接下来,我们将进入近似推断的深入探讨。 在概率图模型(尤其是包含隐变量的模型)中,推断是指给定观测变量,计算隐变量的后验分布 $ p(\boldsymbol{h} \mid \boldsymbol{v}) $。这个后验分布对于学习(如EM算法中的E步)和预测(如给定部分观测预测其他变量)都至关重要。然而,对于大多数复杂模型(如深度玻尔兹曼机、非线性图模型),精确后验是难以计算的,因为需要对所有隐变量求和或积分,这通常是NP难的。 本章系统介绍了近似推断(approximate inference)的各种方法,这些方法旨在用易于处理的计算来近似真实后验。主要内容包括: 理解近似推断对于训练深度生成模型(如变分自编码器VAE)、处理大规模图模型以及设计高效学习算法至关重要。本章为第20章深度生成模型(特别是VAE)提供了理论基础。 在概率图模型中,我们通常有一组观测变量 $\boldsymbol{v}$ 和一组隐变量 $\boldsymbol{h}$。联合分布为 $ p(\boldsymbol{v}, \boldsymbol{h}) $。推断的目标是计算给定观测下隐变量的后验分布: 其中 $ p(\boldsymbol{v}) = \sum_{\boldsymbol{h}} p(\boldsymbol{v}, \boldsymbol{h}) $ 是证据(边缘似然)。后验分布包含了关于隐变量的所有不确定性信息,常用于: 对于许多有趣模型(如深度玻尔兹曼机、非线性状态空间模型),后验分布没有解析形式,且计算 $ p(\boldsymbol{v}) $ 需要对所有隐变量求和(或积分),这通常是指数级的。例如,一个有 $ n $ 个二值隐变量的模型,需要求和 $ 2^n $ 项,当 $ n $ 稍大时无法实现。因此,我们需要近似推断。 近似推断主要分为两大类: 许多推断方法可以将问题重新表述为优化问题。例如,我们希望找到一个分布 $ q(\boldsymbol{h}) $ 来近似真实后验 $ p(\boldsymbol{h} \mid \boldsymbol{v}) $。衡量两个分布差异的一个常用指标是KL散度: 最小化这个KL散度等价于最大化证据下界(ELBO): 其中 $ H(q) $ 是 $ q $ 的熵。因为: 由于 KL 散度非负,$ \mathcal{L}(q) \le \log p(\boldsymbol{v}) $。因此最大化 ELBO 等价于最小化 KL 散度,同时 ELBO 也是对数证据的下界。这个视角将推断转化为优化问题。 EM算法是处理含隐变量模型参数估计的经典方法。它交替进行: 从优化视角看,EM算法是坐标上升法:在E步,对于固定 $\boldsymbol{\theta}$,ELBO 关于 $ q $ 的最大化恰好是令 $ q = p(\boldsymbol{h} \mid \boldsymbol{v}; \boldsymbol{\theta}) $;在M步,固定 $ q $,关于 $\boldsymbol{\theta}$ 最大化 ELBO。因此,EM算法可以被理解为在变分自由能上的交替优化。 例子:高斯混合模型(GMM)的EM算法: MAP推断(最大后验推断)是后验分布的一种点估计,即寻找使后验概率最大的隐变量值: 它忽略了后验的不确定性,但计算相对简单(通常转化为优化问题)。 稀疏编码(第13章)就是一个典型的MAP推断例子。在稀疏编码中,给定字典 $\boldsymbol{D}$,我们希望找到稀疏表示 $\boldsymbol{h}$ 使得重构误差小且 $\boldsymbol{h}$ 稀疏。这对应于优化问题: 其中 $\lambda \|\boldsymbol{h}\|_1$ 可以看作是拉普拉斯先验 $ p(\boldsymbol{h}) \propto e^{-\lambda \|\boldsymbol{h}\|_1} $ 的负对数,而 $\|\boldsymbol{v} - \boldsymbol{D}\boldsymbol{h}\|_2^2$ 是高斯似然的负对数。因此,稀疏编码的优化目标正是MAP目标。 例子:图像去噪中,用稀疏编码对图像块进行表示,得到稀疏系数,然后重构去噪图像。 变分推断的核心是选择一个易于处理的分布族 $\mathcal{Q}$(如高斯分布、平均场分布),然后在这个族中寻找与真实后验最接近的分布,即最小化 KL 散度 $ D_{\mathrm{KL}}(q \| p) $。 最常用的变分族是平均场(mean-field),它假设隐变量之间相互独立: 即每个隐变量有自己的独立分布。在这种假设下,可以推导出每个因子的更新方程(坐标上升)。对于每个 $ q_j $,最优形式为: 这通常使得 $ q_j $ 属于指数族,且参数由其他因子的期望决定。 在变分推断中,我们最大化 ELBO: 由于 $ \log p(\boldsymbol{v}) = \mathcal{L}(q) + D_{\mathrm{KL}}(q \| p) $,最大化 ELBO 等价于最小化 KL 散度。 对于贝叶斯高斯混合模型(参数也有先验),变分推断可以近似后验分布。假设隐变量包括每个样本的聚类分配和模型参数(均值、精度等),采用平均场假设,可以推导出迭代更新公式(类似于EM,但分布而不是点估计)。 除了推断,变分方法也可用于学习模型参数。将参数 $\boldsymbol{\theta}$ 也视为隐变量或通过点估计处理。在变分贝叶斯中,我们同时学习后验分布和参数。 传统的变分推断需要针对每个数据点进行迭代优化(如坐标上升),这在大规模数据上可能很慢。学成近似推断(learned approximate inference)的思想是训练一个神经网络(称为推断网络或识别模型)来直接从观测 $\boldsymbol{v}$ 映射到近似后验的参数。例如,在变分自编码器(VAE)中,编码器网络输出隐变量后验的均值和方差。 给定观测 $\boldsymbol{v}$,识别网络 $ f(\boldsymbol{v}; \boldsymbol{\phi}) $ 输出近似后验 $ q(\boldsymbol{h} \mid \boldsymbol{v}) $ 的参数(例如高斯分布的均值和协方差)。然后,ELBO 可以写成: 这个目标可以关于 $\boldsymbol{\theta}$ 和 $\boldsymbol{\phi}$ 联合优化,使用随机梯度下降和重参数化技巧(第20章)。 VAE 是学成近似推断的典型代表。它包含: 假设我们有一个图像块 $\boldsymbol{v} \in \mathbb{R}^{64}$,一个过完备字典 $\boldsymbol{D} \in \mathbb{R}^{64 \times 256}$。稀疏编码通过求解以下问题找到稀疏表示 $\boldsymbol{h}$: 这等价于MAP估计,其中似然 $ p(\boldsymbol{v} \mid \boldsymbol{h}) = \mathcal{N}(\boldsymbol{v}; \boldsymbol{D}\boldsymbol{h}, \sigma^2 \boldsymbol{I}) $,先验 $ p(\boldsymbol{h}) \propto \prod_j e^{-\lambda |h_j| / \sigma^2} $(拉普拉斯分布)。解得 $\boldsymbol{h}^*$ 即为后验的众数。 考虑贝叶斯线性回归: 权重先验 $ p(\boldsymbol{w}) = \mathcal{N}(\boldsymbol{w}; \boldsymbol{0}, \alpha^{-1} \boldsymbol{I}) $。后验 $ p(\boldsymbol{w} \mid \boldsymbol{X}, \boldsymbol{y}) $ 是高斯,可解析。但若假设先验更复杂(如拉普拉斯),后验无解析解,可用变分推断。假设 $ q(\boldsymbol{w}) = \prod_j q_j(w_j) $(平均场),通过迭代更新得到近似后验。 假设我们要生成手写数字图像。生成模型(解码器)为: 先验 $ p(\boldsymbol{z}) = \mathcal{N}(\boldsymbol{z}; \boldsymbol{0}, \boldsymbol{I}) $。识别网络(编码器)输出: 训练时,从 $ q $ 中采样 $\boldsymbol{z}$,计算重构误差和KL散度,反向传播更新参数。训练后的编码器可以快速为任何输入提供隐变量分布。 通过本章的学习,你已经掌握了近似推断的核心思想和方法,为理解和实现深度生成模型(如VAE)打下了坚实基础。下一章将深入探讨各种深度生成模型,包括VAE、GAN、玻尔兹曼机等。 深度生成模型是深度学习中最令人兴奋的领域之一,它旨在从数据中学习其潜在分布,并能够生成与训练数据相似的新样本。第20章作为全书的压轴章节,系统回顾了深度生成模型的发展历程,从经典的玻尔兹曼机家族(RBM、DBN、DBM)到现代的变分自编码器(VAE)和生成对抗网络(GAN),并涵盖了自回归模型、生成随机网络等多种范式。本章不仅展示了这些模型的原理和数学基础,还探讨了它们的联系与区别,以及如何评估生成样本的质量。 通过本章学习,读者将建立对深度生成模型的全面理解,为后续研究和应用(如图像生成、文本生成、药物发现等)奠定坚实基础。 生成模型的目标是学习训练数据 $\boldsymbol{x}$ 的真实分布 $p_{\text{data}}(\boldsymbol{x})$,并能够从该分布中采样出新样本。与判别模型(如分类器)不同,生成模型关注的是数据的产生过程。 核心挑战: 本章将介绍多种应对这些挑战的方法。 RBM是一种两层无向图模型,包含可见层 $\boldsymbol{v}$ 和隐藏层 $\boldsymbol{h}$,层内无连接,层间全连接。其能量函数为: 联合分布为: 可见层和隐藏层通常为二值(但也可扩展为高斯或ReLU单元)。 由于层内无连接,给定可见层时隐藏层条件独立,反之亦然: 这使吉布斯采样非常高效:可交替从条件分布中采样。 RBM的最大似然梯度包含正相(数据分布期望)和负相(模型分布期望)。正相容易计算(用数据点),负相需从模型采样。对比散度(CD)用一步吉布斯采样从数据点开始得到重构样本,近似负相: 训练RBM学习MNIST手写数字。隐藏层可学到边缘检测器、笔画特征等。训练后,可通过多次吉布斯采样生成新数字。 DBN由多个RBM堆叠而成,顶层是一个无向RBM,下层为有向生成模型。具体地,第一层RBM学习可见层到第一隐藏层的表示,然后将第一隐藏层的输出作为第二层RBM的输入,以此类推。整体联合分布为: 其中顶层是RBM联合分布,下层是条件分布(由RBM的权重转置定义)。 逐层贪婪预训练:先训练第一层RBM,固定其权重,然后将可见层通过第一层得到隐藏层激活,作为第二层RBM的训练数据,以此类推。预训练后,可用醒眠算法(wake-sleep)或反向传播微调整个网络。 从顶层RBM开始吉布斯采样,然后向下传播(通过条件分布)得到可见层样本。 DBM是多层无向图模型,所有层之间的连接都是双向的。例如两层DBM的能量函数为: 联合分布仍为 $p = e^{-E}/Z$。 DBM的学习常用随机最大似然(PCD)结合平均场变分推断。在E步,用平均场近似后验 $q(\boldsymbol{h} \mid \boldsymbol{v})$;在M步,用PCD更新参数。 DBM可用于学习图像的高层抽象特征,在MNIST和自然图像上取得良好效果。 将卷积操作引入RBM或DBM,可处理图像等具有空间结构的数据。卷积RBM(ConvRBM)的隐藏层是多个特征图,每个特征图与可见层通过卷积核连接,权值共享。这大大减少了参数数量,并保留了空间局部性。 通过设计特定的图结构,玻尔兹曼机可以处理序列数据(如语音、文本)。例如,时序RBM(TRBM)在时间轴上展开,连接相邻时间步的隐藏层,用于建模时间序列。 现代深度生成模型常需要从隐变量分布中采样,并希望梯度能够通过采样操作传播。本节介绍两种关键技术: 核心思想:将随机变量 $z \sim q(z \mid \boldsymbol{x})$ 表示为确定性函数 $z = g(\boldsymbol{\epsilon}, \boldsymbol{x})$,其中 $\boldsymbol{\epsilon} \sim p(\boldsymbol{\epsilon})$ 是辅助噪声变量,且 $g$ 可微。这样,对 $z$ 的采样变成了对 $\boldsymbol{\epsilon}$ 的采样,梯度可以绕过随机节点直接传到 $\boldsymbol{x}$。 例子:高斯分布 $z \sim \mathcal{N}(\mu, \sigma^2)$ 可重参数化为 $z = \mu + \sigma \epsilon$,$\epsilon \sim \mathcal{N}(0,1)$。在变分自编码器中,用此技巧使ELBO可微。 当无法重参数化时(如离散分布),可用对数导数技巧: 这允许通过蒙特卡罗采样估计梯度,但方差可能较大,常用控制变量法降低方差。 VAE由两部分组成: 训练目标是最大化证据下界(ELBO): 第一项是重构误差,第二项是正则化项,鼓励后验接近先验。 用重参数化技巧从 $q_{\boldsymbol{\phi}}$ 中采样 $\boldsymbol{z}$,使得ELBO可关于 $\boldsymbol{\theta}, \boldsymbol{\phi}$ 求导,用随机梯度下降优化。 从先验 $p(\boldsymbol{z})$ 采样 $\boldsymbol{z}$,然后通过解码器 $p_{\boldsymbol{\theta}}(\boldsymbol{x} \mid \boldsymbol{z})$ 生成 $\boldsymbol{x}$(通常取均值或采样)。 在MNIST上训练VAE,编码器将图像映射到隐空间,解码器从隐变量重构图像。训练后,可在隐空间插值生成平滑过渡的数字图像。 GAN由两个网络组成: 两者进行零和博弈,目标函数为: 判别器试图最大化区分真假的准确率,生成器试图最小化判别器正确识别生成样本的概率(即让判别器认为生成样本是真的)。 交替更新判别器和生成器: 理论上,当且仅当生成分布等于真实数据分布时,达到纳什均衡,此时 $D(\boldsymbol{x}) = 1/2$。 DCGAN生成人脸图像:从随机噪声生成逼真的人脸,隐空间可进行语义插值(如“微笑”向量)。 自回归模型将联合分布分解为条件概率的乘积(链式法则): 每个条件概率可用神经网络建模(如MLP、RNN、CNN)。这类模型易于计算似然(直接乘积),但生成时必须逐像素/词进行,速度慢。 PixelCNN生成图像:从左到右、从上到下逐像素生成,每个像素的条件概率由之前像素决定。 去噪自编码器(DAE)训练从损坏输入 $\tilde{\boldsymbol{x}}$ 重构干净输入 $\boldsymbol{x}$。研究表明,DAE学习到的分布与数据分布的梯度相关(Alain & Bengio, 2014)。可通过马尔可夫链蒙特卡罗从DAE中采样:从随机噪声开始,交替进行损坏和重构步骤。 GSN将DAE的采样过程参数化为一个马尔可夫链,训练链的转移算子使其收敛到数据分布。这结合了自编码器和MCMC的思想。 评估生成模型困难且主观。常用方法: 对于可计算似然的模型(如自回归模型、VAE下界),可直接比较测试集上的对数似然。但似然高的样本不一定视觉质量好(如可能模糊)。 最可靠但昂贵,通常用于最终比较。 通过本章的学习,你已经掌握了深度生成模型的丰富内容,为在科研或工业应用中探索生成式AI打下了坚实基础。4.3 得分匹配用于高斯分布
4.4 NCE 用于学习未归一化密度
5. 与前后的联系
6. 总结与重点
6.1 核心要点
6.2 常见难点
6.3 学习建议
《深度学习》(Ian Goodfellow 著)第19章“近似推断”详细讲解
1. 本章概述与定位
2. 由浅入深:从推断问题到近似推断
2.1 什么是推断?
2.2 精确推断的困难
2.3 近似推断的分类
3. 核心概念详解
3.1 推断作为优化
3.2 期望最大化(EM)算法
3.3 MAP推断和稀疏编码
3.4 变分推断和学习
3.4.1 平均场近似
3.4.2 变分下界(ELBO)
3.4.3 例子:混合高斯模型的变分贝叶斯
3.4.4 变分推断用于学习
3.5 学成近似推断
3.5.1 识别网络
3.5.2 优点
3.5.3 例子:变分自编码器(VAE)
4. 知识体系图
5. 实例辅助
5.1 MAP推断实例:稀疏编码
5.2 变分推断实例:贝叶斯线性回归
5.3 学成近似推断实例:VAE
6. 与前后的联系
7. 总结与重点
7.1 核心要点
7.2 常见难点
7.3 学习建议
《深度学习》(Ian Goodfellow 著)第20章“深度生成模型”详细讲解
1. 本章概述与定位
2. 生成模型的基本目标与挑战
3. 玻尔兹曼机家族
3.1 受限玻尔兹曼机(Restricted Boltzmann Machine, RBM)
3.1.1 定义与结构
3.1.2 条件分布与采样
3.1.3 学习:对比散度(CD)
3.1.4 例子
3.2 深度信念网络(Deep Belief Network, DBN)
3.2.1 结构
3.2.2 学习
3.2.3 生成样本
3.3 深度玻尔兹曼机(Deep Boltzmann Machine, DBM)
3.3.1 结构
3.3.2 与DBN的区别
3.3.3 学习与推断
3.3.4 例子
3.4 卷积玻尔兹曼机
3.5 用于结构化或序列输出的玻尔兹曼机
4. 通过随机操作的反向传播
4.1 重参数化技巧(Reparameterization Trick)
4.2 得分函数估计器(Score Function Estimator)
5. 有向生成网络
5.1 变分自编码器(Variational Autoencoder, VAE)
5.1.1 模型定义
5.1.2 重参数化与优化
5.1.3 生成样本
5.1.4 例子
5.1.5 变种
5.2 生成对抗网络(Generative Adversarial Network, GAN)
5.2.1 基本思想
5.2.2 训练过程
5.2.3 挑战与改进
5.2.4 例子
5.3 自回归网络(Autoregressive Networks)
5.3.1 原理
5.3.2 代表模型
5.3.3 例子
6. 从自编码器采样
6.1 去噪自编码器作为生成模型
6.2 生成随机网络(Generative Stochastic Networks, GSN)
7. 其他生成方案
8. 评估生成模型
8.1 似然
8.2 启发式指标
8.3 人类评估
9. 概念关系图
10. 与前后的联系
11. 总结与重点
11.1 核心要点
11.2 常见难点
11.3 学习建议