JHU 神经网络基础笔记(全)
001:神经网络基础导论与背景知识 🧠

在本节课中,我们将介绍《神经网络基础》课程的整体框架、学习目标、评分方式以及课程要求。我们将一起了解这门课程的核心内容、你需要具备的基础知识,以及如何通过课程的学习和项目实践来掌握神经网络的原理与应用。
课程概述
本课程将介绍神经网络,并重点推导其背后的数学理论。课程目标是获得经验,能够用公式构建模型,并使用Python在算法中实现它们。
我们将重点关注数学理论,同时也会在Python中进行大量实践操作。
课程非常强调研究,因为该领域发展迅速,如果不结合最新研究,将无法提供全面的知识。
先修知识与技能要求
上一节我们介绍了课程的整体目标,本节中我们来看看成功学习本课程需要具备哪些基础。
我期望每位学员都能熟练使用Python进行编程,这是在本课程中取得成功所必需的。本课程的所有代码都将使用Python编写。这并非苛刻要求,而是因为该领域的主流模型和工具大多基于Python,因此课程也以此为基础。
在数学方面,我期望学员熟悉以下几项内容:
- 多元微积分
- 线性代数
- 概率与统计
- 数学证明的书写
如果你对其中任何一项感到困难,请随时联系我,我很乐意提供帮助。这些是本课程的先决条件。
以下是来自可汗学院的相关学习链接,可供复习:
- 多元微积分
- 线性代数
- 概率与统计
课程目标与评分构成
了解了先修要求后,我们来看看课程结束时你能达到什么水平,以及如何获得成绩。
课程结束时,学生将能够实现、应用并从数学角度分析各种神经网络,并将其应用于现实世界。我不希望这仅仅是教科书式的学习,而是希望你能在遇到数据集时,能够思考并知道可以用它做什么。这是本课程的目标。
本课程与其他机器学习课程的不同之处在于,主要重点在于基础,即数学和底层算法。我不希望学生只是应用算法,而是希望你们理解它,然后基于对数学的理解来应用算法。
以下是本课程的评分构成:
1. 作业 (18%)
在课程的前六周,将布置六次作业。大部分问题是基于数学推导的,每次作业都会有一个编程问题,用于练习使用Python操作实现算法。因此,你每周都需要回答数学推导问题和至少一个编程问题。
2. 研究论文讨论 (12%)
每周,我将选择一篇研究论文供课堂讨论。我会介绍当周主题的相关研究,然后分配一篇论文。每位学生都需要阅读,并在讨论板上讨论论文的主要观点和发现。每位学生需要发布一个讨论帖,并评论自己的想法或回应同学的想法和评论。我希望这是一个互动过程。
3. 研究论文报告 (40%)
这是一项个人作业。你需要按以下步骤完成:
- 在网上搜索一篇你感兴趣的、经过同行评审的神经网络领域研究论文。
- 通过电子邮件将论文标题和作者姓名发送给讲师以获得批准。
- 就研究论文的发现和主题进行录屏演示,并将视频发布到讨论板上。
- 你还需要负责至少向一位同学的视频提出一个问题。
- 如果有人对你的视频提问,你应尽力回答。请注意,完美的回答不是重点,重点是获得阅读研究的经验。
4. 数据探索项目 (20%)
在课程的第一天,学生将被随机分组。这个项目是最终项目的前期提案。你需要:
- 寻找一个你感兴趣的数据集(例如来自Kaggle或你的工作,前提是数据可以公开)。
- 将其视为申请研究资金的提案来处理:说明为什么关心它、我们要做什么、我们认为可以利用神经网络的哪些结构等。此时你尚未实际应用神经网络。
- 在课程中期,你的小组将进行演示,向同学展示这个数据集和研究想法。演示需要录屏并发布到讨论板,时长约20分钟。
- 同学将根据评分标准进行评判。评论部分最为重要。所有评论将被匿名化后反馈给小组,以供下次演示改进。
5. 最终项目 (40%)
你将使用在数据探索项目中选择的同一个数据集。此时,你将应用在课程中或其他地方学到的神经网络技术,尝试从该数据集中提取信息。重点不在于获得完美的性能,而在于处理一个具有挑战性的数据集、探索它并从中学习。 项目包括:
- 提交代码。
- 进行最终的口头报告演示并发布到讨论板。
- 接受同学的同行评审。
- 在小组内部进行同行评审:你需要评价你的队友在这次项目中的贡献。这模拟了现实工作中同事评价的场景。
课程教材与理念
我们已经了解了课程的具体安排,现在来看看我们将使用什么材料,以及贯穿课程的核心教学理念。
主要教材是Ian Goodfellow等人所著的《Deep Learning》。作者在线免费提供了该书的PDF版本,我非常欣赏这本书。
课程前半部分将主要使用这本教材,后半部分我们将开始更多地探索公开的研究文献。
我希望每个人专注于学习本身,成绩自然会随之而来。但我理解作为学生的关切,因此解释了每部分的评分方式。
总结与展望 🚀

本节课中,我们一起学习了《神经网络基础》课程的导论与背景知识。
我们明确了课程的核心目标是理解神经网络的数学基础并用Python实现。我们了解了需要具备的Python编程和数学先修知识。我们详细拆解了课程的评分构成,包括作业、研究讨论、个人报告、小组数据探索项目以及最终的团队项目,这些设计旨在平衡理论理解、实践应用、研究能力与团队协作。
最后,我想强调的是,我们将共同面对学习材料,而不是你与我对抗。我热爱这个领域,也热爱讨论它。期待本学期与大家一同踏上这段学习冒险之旅。请记住,在组建小组时,请为你们的团队起一个“X战警”风格的名字!
我期待本学期与大家见面,如有任何问题,请通过电子邮件或办公时间联系。很快再见!
002:神经网络历史概述与基础原理 🧠

在本节课中,我们将学习神经网络的发展历史、核心概念及其背后的基础原理。我们将从人工智能的起源开始,逐步深入到机器学习和深度学习,并探讨其背后的数学基础。
历史概述
上一节我们介绍了课程的整体目标,本节中我们来看看神经网络的历史背景。
人工智能的概念可以追溯到20世纪30年代甚至更早。最早的重要工作由艾伦·图灵在1935年完成,他提交了一篇描述抽象计算机的论文,该计算机具有无限内存和扫描当前存储符号以产生更多符号的能力。
机器学习是人工智能的一个子集,而深度学习又是机器学习的一种类型。这可以用以下嵌套关系表示:
人工智能 ⊃ 机器学习 ⊃ 深度学习
在人工智能的早期,该领域解决的问题对人类来说在智力上很困难,但对计算机来说却相对容易。例如,创建能够在国际象棋等游戏中击败人类的算法。这类方法基于规则和有限状态。
人工智能的真正挑战在于解决那些对人类来说很容易,但难以用一套规则来形式化描述的问题。例如,视觉或语音识别。人类通常通过实例学习这些技能,这正是机器学习试图模仿的过程。
在基于知识的学习方法遇到瓶颈后,领域开始转向从原始数据中提取知识,这催生了机器学习的概念。简单的机器学习算法使计算机能够解决看似主观的现实世界问题。
然而,许多机器学习算法严重依赖于数据的特征表示。算法在原始数据的提取特征上寻找相关性,而不是原始形式本身。这就引出了一个核心问题:如何确定最优的特征?
一种解决方案是使用机器学习不仅学习从输入到输出的映射,还学习原始数据的最佳表示。这被称为表示学习。一个典型的例子是自编码器,它包含一个编码器和一个解码器,目标是将输入转换为一种新的表示,并尽可能保留原始信息。
深度学习通过引入数据的层次化表示来实现表示学习。一个例子是多层感知机,它将输入映射到输出的函数,由许多更简单的函数组合而成。随着层数增加,网络变得“更深”。
深度学习在过去有许多名称,如控制论、联结主义、人工神经网络等。最早的算法受到大脑工作方式的启发。深度学习的流行度随着硬件限制、不切实际的承诺等因素而起伏。随着硬件和软件的进步,深度学习模型规模增大,能力增强。同时,可用数据量的爆炸式增长也极大地推动了深度学习的发展。
深度学习已解决了许多日益复杂的问题,并在多个领域超越了人类的能力。
基础数学原理
上一节我们回顾了神经网络的历史,本节中我们将探讨一些学习过程中需要了解的基础数学知识。
以下是学习神经网络时有益的基础数学概念列表:
- 线性代数:涉及向量、矩阵、张量及其运算。
- 微积分:重点是导数和梯度,用于优化算法。
- 概率与统计:理解不确定性、分布和评估模型性能的基础。
总结


本节课中我们一起学习了神经网络从早期人工智能到现代深度学习的发展历程。我们了解了机器学习与深度学习的关系,探讨了表示学习的重要性,并回顾了推动该领域发展的关键因素。最后,我们列举了学习神经网络所需的核心数学基础。
003:深度学习数学基础 🧮
在本节课中,我们将学习深度学习的核心数学基础。这些概念是理解后续复杂模型和算法的基石。我们将涵盖线性代数、概率论与信息论以及数值计算中的关键知识点,并通过具体的证明和例题来加深理解。
线性代数基础
上一节我们介绍了课程的整体框架,本节中我们来看看线性代数中的核心概念。线性代数为我们提供了描述和处理数据的语言,尤其是在处理高维数据时。
以下是线性代数中需要掌握的核心概念列表:
- 标量、向量、矩阵和张量:数据的基本表示形式。
- 矩阵和向量的乘法:线性变换的基础操作。
- 单位矩阵和逆矩阵:矩阵运算中的特殊元素。
- 线性相关与张成空间:理解向量空间结构的关键。
- 范数:衡量向量大小的方式,例如 L2 范数公式为
||x||₂ = √(Σxᵢ²)。 - 特征分解:将矩阵分解为特征向量和特征值。
- 奇异值分解:矩阵的另一种重要分解形式。
- 伪逆:处理非方阵或奇异矩阵的广义逆。
- 迹:矩阵对角元素之和。
为了具体说明如何运用这些知识,我们来看一个线性代数中的例题。
例题:点到直线的投影
已知表达式 αu(其中 α ∈ ℝ,u 是 ℝⁿ 中的单位向量)定义了一条直线。试推导出该直线上与任意点 x ∈ ℝⁿ 距离最近的点 y 的表达式。这种用集合中最近点替换原点的操作称为投影。
证明过程如下:
我们的目标是找到直线上的点 y,使其与点 x 的距离最小。我们定义距离度量为平方范数,因为最小化平方距离等价于最小化距离本身。
我们知道 y 位于直线上,因此 y = αu。所以,我们需要求解以下优化问题:
min_α ||x - αu||²
将其展开:
||x - αu||² = (x - αu)ᵀ(x - αu) = xᵀx - 2αxᵀu + α²uᵀu
由于 u 是单位向量,uᵀu = ||u||² = 1。因此,问题简化为:
min_α (xᵀx - 2αxᵀu + α²)
为了找到最小值,我们对 α 求导并令其为零:
d/dα [xᵀx - 2αxᵀu + α²] = -2xᵀu + 2α = 0
解得:
α = xᵀu
将 α 代回 y = αu,得到投影点 y 的表达式:
y = (xᵀu) u
证明完毕。
概率与信息论
理解了线性代数中的投影概念后,我们转向概率与信息论。这部分知识对于理解机器学习中的不确定性、模型评估和决策至关重要。
以下是概率与信息论的核心概念列表:
- 随机变量:描述随机现象结果的变量。
- 概率分布:随机变量取值的概率规律。
- 边缘分布与条件概率:多元分布中的重要概念。
- 条件概率的链式法则:分解联合概率的工具。
- 独立性与条件独立性:简化模型的关键假设。
- 期望、方差和协方差:描述随机变量特征的核心量。
- 贝叶斯规则:根据新证据更新概率的法则。
- 连续变量:处理连续取值的随机变量。
- 信息论:量化信息的基本理论。
- 结构化概率模型:用图模型表示复杂的概率关系。
现在,我们通过一个例题来理解信息论中的一个基本性质——可加性。
例题:信息量的可加性
证明信息度量具有可加性。即,观察一系列概率分别为 p_i(i=1 到 n)的独立事件的组合所获得的信息量,等于按任意顺序单独观察每个事件所获信息量之和。
证明过程如下:
信息度量通常定义为事件发生概率的负对数(以2为底),单位是比特。对于一个概率为 p 的事件,其信息量为 I = -log₂(p)。
对于 n 个独立事件,其联合概率是各自概率的乘积:
P(联合事件) = ∏_{i=1}^{n} p_i
那么,观察这个联合事件所获得的信息量为:
I_联合 = -log₂(∏_{i=1}^{n} p_i)
根据对数的性质,乘积的对数等于对数的和:
I_联合 = -Σ_{i=1}^{n} log₂(p_i) = Σ_{i=1}^{n} [-log₂(p_i)] = Σ_{i=1}^{n} I_i
其中 I_i 是观察第 i 个单独事件所获得的信息量。这正好证明了信息量的可加性。
证明完毕。
数值计算
最后,我们探讨数值计算中的关键问题。在实际的深度学习模型训练中,数值稳定性直接关系到算法能否成功运行。
以下是数值计算中的核心议题列表:
- 上溢出与下溢出:计算机表示数字时的精度限制问题。
- 病态条件:输入微小变化导致输出巨大变化的不稳定系统。
- 基于梯度的优化:深度学习模型训练的核心方法。
- 约束优化:在特定限制条件下寻找最优解。
我们通过一个经典的约束优化问题来应用拉格朗日乘数法。
例题:最大化矩形面积
已知一个矩形的周长为20米。使用拉格朗日乘数法求使其面积最大的矩形尺寸。
求解过程如下:
设矩形的长为 x,宽为 y。目标是最大化面积 f(x, y) = xy。约束条件是周长固定:g(x, y) = 2x + 2y = 20。
构造拉格朗日函数 L:
L(x, y, λ) = f(x, y) - λ(g(x, y) - 20) = xy - λ(2x + 2y - 20)
分别对 x, y, λ 求偏导数并令其为零:
∂L/∂x = y - 2λ = 0=>y = 2λ∂L/∂y = x - 2λ = 0=>x = 2λ∂L/∂λ = -(2x + 2y - 20) = 0=>2x + 2y = 20
由方程1和2可知 x = y。代入方程3:
2x + 2x = 20 => 4x = 20 => x = 5
因此 y = 5。
所以,在周长为20米的约束下,面积最大的矩形是边长为5米的正方形。这是一个最大值点,因为当矩形退化为一条线时面积为0(最小值),而5 > 0。
求解完毕。

总结

本节课中我们一起学习了深度学习的三大数学支柱:线性代数、概率与信息论以及数值计算。我们不仅列出了核心概念,还通过点到直线的投影、信息量的可加性证明和拉格朗日乘数法求矩形最大面积三个具体例子,演示了如何运用这些数学工具解决实际问题。掌握这些基础是理解和构建更复杂神经网络模型的关键第一步。
004:机器学习基础概述 📚

在本节课中,我们将学习机器学习的基本概念,为后续深入学习神经网络和深度学习奠定基础。我们将从宏观视角理解机器学习,并探讨其核心组成部分,包括学习算法、模型评估、优化方法等。
什么是机器学习? 🤖
机器学习是人工智能的一个子领域,它涉及使用计算算法从数据中学习并做出预测或决策,而无需为特定任务进行显式编程。深度学习是机器学习的一个分支,专注于使用深层神经网络来建模复杂函数。
学习算法与任务 🎯
学习算法是帮助模型从数据中学习并做出预测的算法。其目标是最小化预测输出与实际输出之间的成本函数或误差。
一个计算机程序通过经验 E 学习,针对某类任务 T,并以性能度量 P 进行评估。如果算法在任务 T 上的性能 P 随着经验 E 的增加而提高,那么它就是在学习。
任务类型
任务是希望机器学习算法学习的具体能力。学习是实现任务的手段,而非任务本身。以下是一些常见的任务示例:
- 分类:将输入数据分配到预定义的类别中。
- 回归:预测连续数值输出。
- 异常检测:识别与大多数数据显著不同的数据点。
性能度量与经验 📊
性能度量是用于评估机器学习算法能力的定量指标,它因任务而异。
性能度量示例
以下是不同任务常用的性能度量:
- 分类任务:准确率、精确率、召回率、F1分数、ROC曲线。
- 回归任务:平均绝对误差 (MAE)、均方误差 (MSE)、R²分数。
经验(数据)
在机器学习和深度学习中,经验通常指模型从中学习的数据,常被称为训练集。数据使模型能够调整其参数并优化预测。
- 监督学习:经验涉及为模型提供输入-输出对(即带有标签的数据)。模型调整参数以使输出尽可能接近提供的标签。
- 无监督学习:模型仅获得输入数据,没有明确的输出或标签。其目标是理解数据的底层结构或分布。
模型容量、过拟合与欠拟合 ⚖️
上一节我们介绍了学习的基本框架,本节中我们来看看模型训练中常见的挑战:容量、过拟合和欠拟合。
模型容量
模型容量指模型拟合各种函数的能力,与模型复杂度密切相关。例如,具有更多神经元和层的神经网络比线性模型拥有更高的容量。高容量模型可以非常紧密地拟合训练数据,但可能在未见数据上泛化能力差。
过拟合
过拟合发生在高容量模型过于紧密地拟合训练数据时,它甚至开始捕捉数据中的噪声和异常值。这导致模型在训练数据上误差很低,但在未见数据上性能很差。在图表中,过拟合表现为训练集和验证集性能曲线之间存在巨大差距。
欠拟合
欠拟合是相反的情况,发生在模型容量过低,无法捕捉数据的潜在趋势或结构时。这导致训练误差和验证误差都很高,表明模型不够复杂。在图表中,欠拟合表现为训练和验证性能曲线都处于不理想的平台期。
超参数调优 🛠️
为了找到最佳的模型性能,我们需要调整超参数。超参数是指导训练过程的配置变量,它们影响模型架构和算法行为,例如学习率、神经网络中隐藏层的数量、正则化参数等。超参数本身不直接从数据中学习。
以下是几种常见的超参数调优方法:
- 网格搜索:暴力遍历预定义的超参数子集的所有组合,评估每种配置下的模型性能。这种方法全面但计算成本高、耗时。
- 随机搜索:从预定义的分布中随机测试超参数值。研究表明,随机搜索通常能以比网格搜索更少的试验次数找到合适的超参数集。
- 贝叶斯优化:一种基于概率模型的方法,它构建目标函数的概率模型来建议更好的超参数,通常比随机搜索更高效。
- 基于梯度的优化:如果超参数相对于目标函数是可微的,则可以计算梯度并使用梯度下降法进行优化,常用于神经架构搜索。
- 早停:在训练期间监控模型在验证集上的性能,如果性能停止改善或开始下降,则停止训练。这可以防止过拟合并节省计算资源。
- 交叉验证:通常与超参数调优结合使用,以获得更稳健的模型性能估计。它将训练数据划分为多个子集,模型在部分子集上训练,在其余子集上验证,并循环此过程,最后取平均性能。
- 正则化技术:如L1和L2正则化,它们包含控制正则化强度的超参数,调整这些参数也有助于防止过拟合。
实用建议:通常从粗略搜索(如随机搜索)开始,然后使用更精细的方法(如贝叶斯优化)进行优化。务必考虑计算成本,并确保拥有可靠的验证集来评估超参数。
偏差与方差 🎭
理解了如何调整模型后,我们需要深入模型误差的来源:偏差和方差。
偏差
偏差是由于模型过于简化所做的假设而导致的误差。高偏差模型可能错过特征与目标输出之间的相关关系,导致预测 consistently 不正确,从而造成欠拟合。例如,用线性回归去拟合非线性数据就会产生高偏差。
方差
方差是由于学习算法过于复杂而导致的误差。高方差模型会捕捉数据中的噪声,并对训练集中的微小波动高度敏感。这导致模型在训练数据上表现良好,但在未见数据上泛化能力差。例如,使用非常高次数的多项式回归拟合数据,会导致曲线剧烈摆动以拟合噪声。
偏差-方差权衡
理想情况下,我们希望模型同时具有低偏差和低方差。但在实践中,减少一个往往会增加另一个。增加模型复杂度会降低偏差但增加方差;降低模型复杂度会增加偏差但减少方差。偏差-方差权衡代表了追求良好模型时的这种张力。
绘制模型误差随模型复杂度的变化图,通常可以看到偏差下降而方差上升。最佳点位于中间某处,它提供了偏差和方差之间的平衡。
缓解策略:使用正则化(如L1、L2)可以防止系数变得过大,从而惩罚复杂度。交叉验证通过以多种方式分割数据来确保模型在不同数据子集上表现良好。
数据集划分与正则化 📈
为了有效管理偏差和方差,我们需要合理使用数据并采用正则化技术。
数据集的作用
- 训练集:用于训练模型,模型通过它来学习并随时间改进。
- 验证集:用于模型选择和超参数调优。
- 测试集:用于评估模型的最终性能。
增加训练数据量有助于缓解过拟合,因为更多的数据使得模型更难记住噪声和异常值。但需注意,简单地添加更多数据并不总是可行或有效,特别是当数据本身有噪声或不具代表性时。
正则化
正则化是一种用于防止过拟合的技术。它向损失函数添加惩罚项,以阻止模型过度拟合训练数据,从而降低方差。常见的正则化方法包括L1/L2正则化、Dropout和早停等。我们将在深度学习的上下文中进一步讨论这些方法。
损失函数 📉
现在,让我们看看驱动模型学习的核心:损失函数。
损失函数(有时称为成本函数)在机器学习中扮演着核心角色。它们衡量预测值与实际值之间的差异,并提供一个优化算法试图最小化的度量。损失函数的选择会显著影响模型性能,应根据问题性质(如回归、分类)进行选择。
以下是一些常见的损失函数示例:
- 均方误差 (MSE):主要用于回归问题,计算实际值与预测值之间平方距离的平均值。公式为:
MSE = (1/n) * Σ(y_i - ŷ_i)^2 - 平均绝对误差 (MAE):也用于回归问题,计算实际值与预测值之间绝对差异的平均值。公式为:
MAE = (1/n) * Σ|y_i - ŷ_i| - Huber损失:MSE和MAE的组合,对小误差值为二次型,对大误差值为线性型,使其对异常值不如MSE敏感。
- 交叉熵损失:用于分类问题,量化实际类别分布与预测类别分布之间的差异。
- 分类交叉熵损失:交叉熵损失向多类分类的扩展。
- 合页损失:常用于支持向量机,有时也用于神经网络,用于目标值为-1和1的二元分类。
- KL散度:衡量两个概率分布之间的差异,常用于无监督学习或模型间知识迁移。
- 余弦相似度损失:衡量两个向量(真实值与预测值)之间夹角的余弦值,对方向性而非幅度重要时有用。
- 对比损失和三元组损失:用于孪生网络或三元组网络,以学习嵌入表示,处理相似或不相似的数据对或三元组。
- 自定义损失函数:根据特定问题和需求,从业者可以设计自己的损失函数,以实现定制化的优化目标。
优化方法 🚀
有了损失函数,下一个问题是如何优化它。优化是训练机器学习模型的核心环节,涉及寻找使损失函数最小化的最佳模型参数。优化方法的选择取决于问题性质、数据集大小和模型 specifics。
随机优化
我们有一个依赖于参数θ的函数F,它是一个可微的随机函数。我们感兴趣的是最小化该函数关于其参数的期望值。随机性通常源于对数据点的随机子采样或函数本身固有的噪声。
在随机梯度下降中,由于使用小批量数据和噪声,损失函数表面不规则,我们需要较小的步长以避免发散。理想情况下,我们希望在垂直方向(梯度变化大的方向)减慢学习,在水平方向(梯度变化平缓的方向)加快学习。
以下是几种改进的优化算法:
- 带动量的SGD:通过计算梯度的指数移动平均来平滑更新步骤,允许使用更大的步长,加速收敛。
- RMSProp:通过按梯度平方的指数移动平均来调整步长,进一步减少垂直方向的更新幅度,增大水平方向的更新幅度,从而更有效地平滑噪声。
- Adam:结合了动量(一阶矩估计)和RMSProp(二阶矩估计)的思想。它计算梯度及其平方的指数移动平均值,并进行偏差校正,使得优化过程更加高效和稳定。Adam在实践中通常表现优异。
实验表明,Adam在多种任务(如分类任务CIFAR-10)上通常优于其他优化器。
模型评估与选择 ✅
最后,在训练好模型后,我们需要评估和选择最佳模型。模型评估与选择是机器学习工作流中的关键步骤,确保所选模型在未见数据上表现良好并具有良好的泛化能力。
评估方法
- 留出法:将数据分为训练集和测试集(或训练集、验证集、测试集三部分)。模型在训练集上训练,在验证集上评估和调优超参数,最后在测试集上评估最终性能。方法简单,但数据集较小时可能不稳定。
- K折交叉验证:将数据集分成K个子集(折)。模型依次在K-1折上训练,在剩余的1折上测试,重复K次,每次使用不同的折作为测试集,最后取K次评估的平均性能。这有助于减少留出法的方差,在数据量不足时是首选。
- 留一法交叉验证:K折交叉验证的特例,其中K等于数据点数。每个数据点依次作为测试集一次。计算成本高昂。
- 自助法:从数据集中有放回地随机抽取样本,模型在这些样本上训练和测试。这有助于了解模型的偏差和方差。
评估指标
根据任务类型选择合适的评估指标:
- 回归任务:均方误差 (MSE)、平均绝对误差 (MAE)、R²分数。也可以直接使用损失函数作为指标。
- 分类任务:准确率、精确率、召回率、F1分数、AUC。交叉熵损失也常作为指标。
- 聚类任务(无监督):轮廓系数(衡量一个点与自身簇和其他簇的接近程度)、戴维森堡丁指数 (DBI,值越低表示聚类越好)。
模型选择技术
之前讨论过的超参数调优方法,如网格搜索、随机搜索、贝叶斯优化和正则化,同时也是重要的模型选择技术。

总结 🎓
本节课中,我们一起学习了机器学习的基础知识。我们从机器学习的定义和其与深度学习的关系开始,探讨了学习算法、任务类型和性能度量。我们深入研究了模型容量、过拟合和欠拟合的概念,以及如何通过超参数调优来优化模型。我们分析了模型误差的来源——偏差和方差,并讨论了如何通过数据集划分和正则化来管理它们。接着,我们介绍了驱动模型训练的损失函数和各种优化方法,特别是像Adam这样高效的优化器。最后,我们涵盖了模型评估与选择的关键步骤和方法。这些概念为理解更复杂的深度学习模型奠定了坚实的基础。
005:深度前馈网络 🧠


在本节课中,我们将学习深度前馈网络(Deep Feedforward Neural Networks)的基础知识。我们将探讨其数学原理、核心组件(如激活函数和隐藏层)、训练方法(如梯度下降和反向传播),以及如何设计有效的网络架构。通过理解这些基础概念,我们可以为学习更复杂的深度学习模型打下坚实的基础。
深度前馈网络概述
深度前馈网络,通常被称为多层感知机(MLPs)。它们的作用是近似一个目标函数 F*。网络接收输入,并通过一系列没有反馈连接的层进行前向传播。

深度前馈网络是深度学习的核心构建模块,广泛应用于许多人工智能应用中。它们是理解更复杂网络架构的基础。从数学角度看,它们是非常强大的非线性函数逼近器。

通用逼近定理
一个著名的通用逼近定理指出,在合理的约束条件下,神经网络可以以任意精度逼近任何函数。
具体来说,一个具有单隐藏层的神经网络,可以逼近几乎处处连续的任何函数。这是机器学习中的一个重要定理。


需要谨慎理解的是,该定理阐述了网络的理论能力,但并未说明逼近函数的可学习性或训练效率。在实践中,人们发现具有许多层的深度网络,比浅层网络能更高效地逼近复杂函数。

该定理并未规定如何找到权重和偏置,也未说明对于给定的逼近需要多少隐藏单元。从更广泛的角度看,定理确保了神经网络在理论上可以逼近一个函数,而实践中的挑战在于如何有效地进行训练。

一个简单示例:异或(XOR)问题
让我们通过一个例子来理解。逻辑异或(XOR)是一个二元运算,当输入中为1的数量是奇数时,输出为1。观察其真值表可以发现,这是一个非线性可分问题。
感知机(Perceptron)会尝试绘制一个线性决策边界,但异或问题不是线性可分的,因此感知机无法解决这个问题。
多层感知机(MLPs)可以捕获非线性关系。它们由输入层、隐藏层和输出层组成,并使用非线性激活函数,例如Sigmoid函数。
一个典型的MLP结构可能包含两个输入神经元、两个隐藏神经元和一个输出神经元。输入是0和1,输出判断是否为异或真。
我们使用异或数据作为训练集,并实现反向传播算法来调整权重,从而迭代地减少预测误差。
最终,MLP创建了一个非线性的决策边界,成功地对异或点进行了正确分类。
激活函数
激活函数为神经网络引入了非线性,使MLPs能够学习非线性模式。常见的激活函数包括Sigmoid、ReLU和Tanh。
- Sigmoid和Tanh:将输出压缩到特定范围(Sigmoid为[0,1],Tanh为[-1,1])。但它们容易导致梯度消失问题,因为在输出接近饱和区时,其梯度接近于零,会显著减慢学习速度。
- 整流线性单元(ReLU):输出非负值,有助于缓解梯度消失问题,因为其正区间的导数为1。其变体包括Leaky ReLU、参数化ReLU(PReLU)和指数线性单元(ELU)等,但也存在“神经元死亡”等问题。
激活函数的研究非常活跃,还有Swish、Maxout、Softplus等多种选择。选择哪种激活函数通常取决于具体任务和网络深度。ReLU及其变体在深度网络中非常流行,而Sigmoid和Tanh则适用于特定场景,如二分类问题的输出层。
架构设计
架构设计涉及构建神经元的布局,决定网络的深度(层数)和宽度(每层的神经元数)。这直接影响模型的学习能力和计算成本。


- 深度 vs. 宽度:增加深度可以提升模型的表示能力,但也会带来训练挑战(如梯度消失/爆炸、过拟合)。增加宽度有助于网络学习更多特征,但会增加计算量。
- 挑战与技巧:
- 深度带来的挑战:梯度消失/爆炸、过拟合风险增加、前向/反向传播计算密集。
- 应对技巧:使用正则化(如L2正则化、Dropout)来惩罚大权重、避免过拟合;使用跳跃连接(如ResNet中的残差连接)来促进更深模型的训练。
- 输出层设计:取决于任务类型。
- 回归问题:通常使用线性激活函数,损失函数常用均方误差(MSE)。
- 分类问题:通常使用Softmax激活函数,损失函数常用交叉熵(Cross-Entropy)。
- 现实约束:设计时需考虑计算资源、数据可用性(数据少时复杂模型易过拟合)以及是否使用迁移学习(使用预训练架构)。
从简单的MLP到ResNet、Transformer等先进架构的演进,是由任务需求、数据集和硬件进步驱动的。因此,关注当前研究动态非常重要。
设计有效的模型既是理论也是实验,是一门艺术与科学的结合。关键在于平衡模型容量与可用数据及计算资源。
反向传播与微分
训练神经网络需要计算损失函数相对于权重的梯度。对于拥有成千上万甚至更多参数的网络,解析计算梯度是不切实际的,因此需要高效的计算方法。
反向传播依赖于链式法则,它将复杂的求导过程分解为更简单的部分。
- 前向传播:计算网络输出和损失。
- 反向传播:将梯度从输出层向输入层传播,利用链式法则计算各层参数的梯度。

我们可以用计算图来可视化这个过程,节点代表运算,边代表数据流,这有助于结构化反向传播过程。

反向传播算法步骤如下:
- 用随机值初始化网络权重。
- 对每个训练样本,执行前向传播和反向传播。
- 根据计算出的梯度调整权重。
反向传播也面临梯度下降法共同的挑战(如鞍点、局部最优),以及自身特有的一些问题(如梯度爆炸/消失、学习率选择、计算效率)。为此,发展出了如Rprop、共轭梯度等优化算法,它们超越了标准的反向传播,在某些场景下能提供更快的速度或更好的稳定性。
为了充分发挥反向传播的效能,可以采取以下策略:
- 明智地初始化权重:例如使用Xavier初始化方法。
- 考虑自适应优化方法:如Adam、RMSprop。
- 使用正则化:防止过拟合。
反向传播是深度学习的基石之一,它严谨且计算高效。该领域的研究每天都在持续改进。

总结


本节课我们一起学习了深度前馈网络的核心概念。我们从其作为通用函数逼近器的数学意义出发,通过异或问题理解了非线性激活函数和隐藏层的必要性。我们探讨了网络架构设计中的深度与宽度权衡,以及输出层的设计原则。最后,我们深入了解了模型训练的核心——基于梯度下降的反向传播算法及其面临的挑战与优化技巧。掌握这些基础知识,是迈向更高级深度学习领域的坚实第一步。
006:深度学习正则化 🛡️


在本节课中,我们将学习深度学习中的正则化技术。正则化是防止模型过拟合、提升其泛化能力的关键手段。我们将探讨多种正则化方法,包括参数范数惩罚、约束优化、数据增强、噪声注入、半监督学习以及多任务学习。
为什么需要正则化?🤔
上一节我们介绍了正则化的概念,本节中我们来看看为什么需要它。
深度神经网络是能力强大的模型,有时会过于灵活,存在很高的过拟合风险。过拟合是指模型学习了数据中的噪声,而非底层规律。我们训练模型的最终目标是使其在未见过的数据上也能表现良好,即具有良好的泛化能力。正则化对于实现这一目标至关重要。
正则化不仅仅是减少过拟合,它还需要在模型复杂度和拟合能力之间取得平衡。我们希望模型足够复杂以捕捉数据中的模式,但又不能过于激进以至于学习到不期望的噪声。这需要在两者之间找到一个平衡点。
正则化也融入了我们的先验信念。例如,我们通常认为更平滑的函数更可能是合理的。
以下是正则化在损失函数中的常见形式:
- L1 正则化:在损失函数中添加权重的 L1 范数作为惩罚项。
- L2 正则化:在损失函数中添加权重的 L2 范数(平方和)作为惩罚项。
这些方法有直观的解释,并且与贝叶斯统计中的先验分布(L1对应拉普拉斯先验,L2对应高斯先验)和最大后验概率估计有关。
关键要点是,正则化对于构建鲁棒且有效的模型至关重要。其理论基础植根于优化和统计学。虽然正则化方法多种多样,本节课我们只探讨其中几种。
参数范数惩罚 📏
现在,让我们深入了解第一种正则化方法:参数范数惩罚。
其核心思想是在损失函数中,根据权重的大小添加一个惩罚项。最常见的两种是 L1 和 L2 正则化。
总损失函数 J 可以表示为:
J(θ; X, y) = J_original(θ; X, y) + α * Ω(θ)
其中,Ω(θ) 是惩罚项,α 是超参数,用于控制惩罚的强度。
L1 正则化的一个重要特性是会导致稀疏性,即部分权重会变为精确的零。L2 正则化则会收缩权重值,但很少会使权重精确为零。在贝叶斯解释中,L1 正则化对应于拉普拉斯先验,L2 正则化对应于高斯先验。
在权重更新过程中,这些惩罚项会抑制权重的过度增长,有助于模型收敛和泛化。它们能防止权重变得异常大或异常小,促使模型学习更有用的特征。
超参数 α 的作用是平衡模型拟合程度和权重惩罚强度。如果 α 太大,会导致欠拟合;如果 α 太小,则正则化效果不足,可能导致过拟合。因此,需要通过调参来找到合适的 α 值。

参数范数惩罚并非万能药,通常需要与其他技术结合使用。但其计算效率高,适用于广泛的问题,且易于实现,因此常作为首选的基线正则化方法。

约束优化视角 🔒
上一节我们将正则化视为损失函数中的惩罚项,本节我们从约束优化的角度重新审视它。
直接添加惩罚项会改变目标函数,而约束则直接限制了解空间的范围。另一种正则化的视角是将模型参数约束在一定范围内。
例如,对于 L2 正则化,可以将其视为要求权重的 L2 范数不大于某个常数 K。这就将一个带惩罚的优化问题转化为了一个带约束的优化问题。约束限定了权重的取值范围,在参数空间中,L2 约束通常表示为一个球体,L1 约束则表示为一个菱形。
带惩罚的目标函数可以重新表述为带约束的形式。L2 惩罚对应一种“软”约束,而硬约束则在参数空间中划定了一个精确的边界。
另一种处理约束优化问题的方法是使用拉格朗日乘子法。它将带约束的问题转化为无约束问题,从而在计算上更易处理,其核心思想是将约束条件整合进目标函数。


在优化时,梯度下降法仍然适用。对于硬约束,需要在梯度下降后增加一个投影步骤,确保更新后的参数仍满足约束条件。
我们喜欢约束优化方法,是因为它为模型引入了稳定性,并且借助现代优化工具可以高效计算。它也能与其他正则化技术结合使用。
欠定问题与正则化 ⚖️
现在,我们讨论正则化在欠定问题中的作用。

欠定问题是指模型参数数量远多于训练样本数量的情况,这在深度学习中很常见。在这种情况下,存在无限多个解,但关键问题是:哪一个解是最好的?

欠定问题中过拟合的风险极高。正则化的作用是在偏差和方差之间引入权衡。它基于特定准则(如偏好小权重),从众多可能解中选择一个。通过引入偏差来降低方差,从而提升模型的泛化能力。
深度学习中的欠定问题非常普遍。我们构建的大型神经网络,其参数空间可能远超我们拥有的数据量。正则化技术帮助我们在这种情况下找到一个有意义且泛化能力强的解。在应用这些技术时,数学严谨性和启发式方法常常相辅相成。
数据增强 📈
除了在损失函数中添加惩罚项,还有另一种强大的正则化技术:数据增强。
深度模型通常非常“数据饥渴”,有限的数据容易导致过拟合。原始数据集本身可能不足以训练出泛化能力强的模型。
通过变换现有数据来创建新的训练样本,这种方法很有吸引力。数据增强保留了原始数据的标签,同时通过增加数据的多样性来增强模型对现实世界变化的鲁棒性,从而帮助模型更好地泛化到未见过的数据。
以下是几种流行的数据增强方法:
- 图像旋转、缩放、裁剪、翻转
- 亮度与对比度调整
- 平移
- 噪声注入
这些方法可以大致分为几何变换、仿射与透视变换以及噪声模型等类别。
作为一种正则化手段,数据增强通过创造更具挑战性的训练场景来减少过拟合。模型会学会对应用的变换保持不变性,从而提升在未见数据上的表现。
几何变换通常涉及旋转矩阵和缩放矩阵。仿射与透视变换则是仿射操作。噪声模型通常来自高斯分布等。
除了这些基础方法,还有更高级的技术,例如使用生成模型来创建增强数据,或者像 MixUp 这样混合两个样本的特征和标签的研究性方法。
需要注意的是,并非所有增强方法都适用于所有数据集。不当的增强可能引入噪声或错误标签,带来风险。同时,也需要考虑计算开销。

数据增强是工具箱中的重要工具,它能有效提升模型的泛化能力和鲁棒性。增强策略需要根据数据集和任务性质量身定制。这是一个活跃的研究领域,特别是合成数据生成方面。

噪声鲁棒性与噪声注入 🔊
接下来,我们探讨另一种提升模型鲁棒性的正则化技术:噪声注入。
噪声是指数据中不期望的扰动。现实世界中的数据大多天然带有噪声。噪声可能来自内部或外部,它会降低模型准确性,增加输出的不可预测性。
有趣的是,在训练过程中主动注入噪声,反而可以增强模型的鲁棒性。我们可以对输入、权重或激活函数注入噪声。这迫使模型学习更根本、更稳健的特征和模式,而不是记忆训练数据中的细微噪声。
常见的噪声类型包括高斯噪声、均匀噪声和椒盐噪声。作为正则化器,噪声注入能有效减少过拟合。从贝叶斯角度看,这也可以被视为一种模型平均。
噪声鲁棒性对于模型在实际应用中的部署至关重要。巧妙地注入噪声可以增强泛化能力。同时,我们也需要警惕对抗性威胁——即专门设计来欺骗模型的微小扰动。这是一个重要的研究领域。


半监督学习 🏷️➡️🏷️❓
半监督学习也可以作为一种正则化技术。
它同时利用有标签数据和无标签数据进行训练。这扩展了模型的知识和上下文,因为可以加入更多数据,从而在不进行大量人工标注的情况下提升模型性能。
半监督学习具有成本效益,并且由于使用了更大的数据集,通常能带来更好的泛化能力。在某些情况下,其性能可能超过纯监督学习方法。
然而,它也面临挑战。无标签数据的质量至关重要,使用低质量数据可能强化数据中已有的偏见和错误。此外,量化无标签数据对模型的具体贡献也很复杂。
实践中,半监督学习常与自训练方法、协同训练或迁移学习结合使用。随着对高效、可持续学习方法的追求,半监督学习仍然是一个不断发展和演进的活跃研究领域。

多任务学习 🎯🎯

最后,我们介绍多任务学习,这是另一种有效的正则化范式。
在多任务学习中,一个单一模型同时处理多个相关任务。这迫使模型在不同任务之间共享表征学习,从而同时优化多个目标。
这样做的好处包括提高效率、改善泛化能力,并促进任务间的知识迁移。例如,在目标检测中,一个模型同时完成“识别物体类别”和“定位物体位置”两个任务,这两个任务的知识可以相互促进,使模型对图像有更全面的理解。
实现多任务学习通常涉及设计联合损失函数,并确保任务间的协调性。关键挑战在于确定任务间的相关性、平衡不同任务的重要性,以及避免“负迁移”(即一个任务的学习干扰另一个任务的表现)。
多任务学习广泛应用于自然语言处理(如句法分析和情感分析)、计算机视觉(如检测、分割和识别)以及医疗健康(跨症状诊断)等领域。
多任务学习是迈向更通用、更全面人工智能的一步,它试图融合知识的广度与深度,利用多样化任务之间的协同效应来提升整体模型性能。
总结 📚
本节课我们一起学习了深度学习中多种重要的正则化技术。
我们从参数范数惩罚(L1/L2) 及其约束优化视角开始,理解了它们如何通过限制模型复杂度来防止过拟合。接着,我们探讨了数据增强和噪声注入,这两种方法通过增加训练数据的多样性和鲁棒性来提升泛化能力。然后,我们介绍了半监督学习,它利用无标签数据来扩展模型的知识。最后,我们了解了多任务学习,它通过让模型同时学习多个相关任务来共享和迁移知识,从而获得更强大的表征。

正则化是构建高效、鲁棒深度学习模型的基石。每种技术都有其适用场景和权衡,在实践中常常需要组合使用。除了本节课介绍的方法,还有如 Dropout 等更多研究活跃的正则化技术值得探索。掌握这些工具将帮助你设计出泛化能力更强、更可靠的神经网络模型。
007:卷积神经网络 (CNNs) 🧠


在本节课中,我们将学习卷积神经网络(CNNs)的基础知识。这是一种在深度学习中具有变革性意义的网络架构,尤其擅长处理图像和视频数据。我们将探讨其核心概念、工作原理、优势以及一些高级变体。
卷积神经网络概述 🚀
卷积神经网络代表了深度学习中最具变革性的创新之一。它们主要针对图像和视频数据设计,通过利用空间层次和模式来提取特征,这与传统的全连接前馈网络有显著区别。
CNNs的核心是卷积操作。这是一种融合两个函数以产生第三个函数的数学运算。在CNNs中,它使用一系列可学习的滤波器(或称为核),逐层地从数据中提取信息。
与标准神经网络不同,CNNs具有更稀疏的连接架构。并非每个输入节点都连接到每个输出节点。这种方式降低了网络的复杂性,使其能够提取局部和全局特征,同时减少过拟合并降低计算需求。

CNNs的应用已超越学术兴趣,驱动着当今许多人工智能应用,如图像分类、面部识别和视频分析。

卷积操作:核心概念 🔍
上一节我们介绍了CNNs的概况,本节中我们来看看驱动其功能的核心概念——卷积操作。
卷积操作是一种数学运算,它将两个函数融合以产生第三个函数。在CNNs的背景下,它用于从输入数据中提取基本特征。
对于函数 F 和 G,卷积操作符记为 F * G,其定义如下(连续形式):
(F * G)(t) = ∫ F(τ) G(t - τ) dτ
在离散形式下,积分变为求和。
在CNNs中,卷积操作涉及一个滤波器(或核)。该滤波器在输入数据(通常是图像)上滑动,并生成一个特征图。这个特征图会突出显示滤波器认为重要的特征。
例如,一个4x4的输入与一个3x3的滤波器进行卷积,通过滑动操作,可以产生一个输出。


CNNs中的滤波器是可训练参数的矩阵。当与输入特征进行卷积时,它们可以突出显示特定的特征,如边缘、纹理和颜色。
有时我们需要控制输出特征图的大小。以下是两种常用方法:
- 步长 (Stride):控制滤波器每次滑过输入的步幅。
- 填充 (Padding):通过在输入值周围添加零来控制空间尺寸。
卷积操作具有几个重要特性:
- 参数共享:同一个滤波器用于输入的所有部分,减少了参数总数。
- 连接稀疏性:每个输出元素仅依赖于一小部分输入元素。
- 平移不变性:无论特征出现在输入的哪个位置,都能被识别。
设计动机:为何需要CNNs?💡
了解了卷积操作后,我们来看看CNNs为何应运而生。
随着深度学习任务变得复杂,传统的全连接网络面临挑战:
- 全连接层参数过多。
- 缺乏空间层次和平移不变性。
- 处理大图像时计算成本高昂。

CNNs的设计灵感来源于人类的视觉皮层。视觉皮层中的神经元只对视觉场中有限区域的刺激做出反应。为了模仿这一点,CNNs引入了卷积的概念,首先关注局部特征,然后逐步构建全局特征。
想象一下识别一个物体:你会先识别边缘,然后将边缘组合成形状,再将形状组合成模式,最后根据模式识别物体。CNN正是以这种分层方式复现这一过程。

CNNs通过在整个输入的不同部分重用相同的滤波器,极大地减少了参数数量,有助于防止过拟合。同时,其架构使其能够识别特征,而不管这些特征在输入中的位置如何,这就是平移不变性。
由于这些基本动机和设计选择,CNNs极大地提高了图像识别任务的性能,并已成为计算机视觉领域事实上的标准。
池化层:下采样与特征保留 📉
上一节我们介绍了卷积层,本节中我们来看看CNNs中另一个常见的层——池化层。
池化是一种下采样形式,用于减少特征图的空间尺寸,同时保留基本信息并使CNN对小的平移变化更具鲁棒性。
我们使用池化层的原因如下:
- 维度缩减:减少计算量和参数,防止过拟合。
- 平移不变性:最小化对输入中轻微移位和失真的敏感性。
- 捕获主导特征:强调区域内最显著的特征。
以下是几种常见的池化类型:
- 最大池化 (Max Pooling):取特征图中一组值的最大值。
- 平均池化 (Average Pooling):取特征图中一组值的平均值。
- 最小池化 (Min Pooling):取特征图中一组值的最小值。
与卷积类似,池化也涉及核大小和步长。但不同之处在于,池化操作(如取最大值、平均值)没有可学习的参数。


最大池化能有效捕获区域内的主导特征。例如,在人脸图像中,如果池化区域包含眼睛的一部分,最大池化能确保该特征被保留到下一层。
平均池化则提供区域更平滑的表示,它不那么激进,保留了更一般的信息。
关于池化的有效性存在讨论。一些先进的架构(如残差网络、密集连接网络)通常使用步长卷积来代替池化以降低空间维度。
池化虽有优势,但也有权衡。每个池化操作都会丢弃一些数据。在保留信息和获得抽象之间取得平衡是关键。
卷积与池化:作为强先验的视角 🧮
现在让我们更深入地探讨卷积和池化,从数学角度将其视为一种“无限强的先验”。
在贝叶斯统计中,先验提供了关于未知参数的假设或信念。在深度学习中,某些架构选择可以对模型能够表示的函数类型施加强先验。

CNN中的卷积操作做出了两个强有力的假设:
- 平稳性 (Stationarity):相同的特征在输入的不同部分都有用。
- 局部性 (Locality):附近的输入是相关的,可以一起处理。

卷积之所以是“无限强的先验”,是因为它将函数空间限制在空间不变函数上,从而极大地限制了搜索范围。池化则对图像中的层次结构做出了更强的假设:网络的更高层通过组合较低层的特征来捕获更抽象的表示。
我们这样做是因为:
- 计算高效:它缩小了假设空间。
- 泛化能力强:大大降低了过拟合的机会。
- 直观合理:图像本身就具有空间层次和模式。
然而,这种先验并非总是有利的。对于非图像数据(如时间序列或表格数据),这种假设可能过于严格。一些先进技术会放松这些先验以捕获更复杂的模式。因此,理解数据特性以做出正确选择至关重要。
权衡如下:
- 优点:效率高,泛化能力强。
- 缺点:可能对某些任务限制过大。
卷积的变体:适应不同任务 🛠️


卷积是CNN的基础操作,但像所有基础概念一样,它也随着针对特定任务的优化而演变。
以下是几种卷积变体:
- 步长卷积 (Strided Convolutions):定义滤波器的步长大小(如2,3)。它能减少空间维度,从而控制计算成本。
- 空洞卷积 (Dilated Convolutions):在滤波器值之间引入间隙,以在不增加滤波器大小或计算成本的情况下捕获更广泛的上下文。
- 转置卷积 (Transposed Convolutions / Deconvolutions):用于上采样空间维度,常见于自编码器或生成对抗网络的解码器部分。
- 深度可分离卷积 (Depthwise & Separable Convolutions):优化计算效率。深度卷积对每个输入通道应用单个滤波器;可分离卷积结合了深度卷积和逐点卷积。
- 分组卷积 (Grouped Convolutions):将输入和输出通道分成组并分别进行卷积,灵感来源于AlexNet,旨在更好地适配GPU。
结构化输出:超越图像分类 🖼️➡️🗺️
卷积神经网络不仅用于图像分类,还能产生如图像和序列标签等结构化输出。
结构化输出是其元素间具有相互依赖关系的多维输出。例如,图像中每个像素都被分类(如人、狗、树、背景)。
这类任务包括:
- 像素级任务:如图像分割、图像生成、视觉输入的问题预测。
面临的挑战包括保持空间层次、平衡全局与局部上下文以及计算复杂性。

用于分割的CNNs:为每个像素分配一个标签,通常使用U-Net或全卷积网络结构。
图像到图像翻译:在保持结构的同时转换图像内容,例如将卫星图像转换为地图。
用于序列预测的CNNs:从图像中产生序列,例如读取图像中的文本。

结构化输出的损失函数用于衡量预测输出与真实结构化输出之间的差异,例如分割任务中使用的Dice损失。

训练技术也多种多样,例如用于图像到图像翻译的条件GAN,它通过对抗性方式帮助训练网络。
实际应用包括医学成像(如肿瘤分割)、自动驾驶和光学字符识别。


处理多种数据类型 📊
卷积神经网络可以处理多种数据类型,而不仅仅是二维图像。
基本数据类型包括标量、向量、矩阵和张量。
- 向量(1D):如音频信号、时间序列数据(金融、健康)。一维卷积操作在此类数据上表现良好。
- 矩阵(2D):如灰度图像,是像素强度的二维网格。
- 张量(3D+):如RGB彩色图像(三个通道的矩阵),或更高维数据如CT扫描、MRI(3D),以及作为3D帧序列的视频(4D)。

以这种复杂方式思考数据的原因是,不同的数据类型捕获不同的信息。CNN架构需要根据输入数据类型进行调整。数学上丰富的表示使其能够从数据中挖掘出深刻的见解。
处理这些数据也面临挑战,需要考虑调整卷积操作、管理计算资源,并在图像分辨率与网络深度/宽度之间进行权衡。


计算效率优化 ⚡
卷积层本身计算量很大。我们的目标是在不影响性能的前提下使其更快。
回顾一下,卷积是将滤波器(核)应用于输入矩阵以产生特征图的过程。
暴力卷积:直接计算特征图输出中的每个值,复杂度至少为 O(n²)(对于n x n输入和滤波器)。
为了提高效率,有以下几种方法:
- 基于FFT的卷积:使用快速傅里叶变换将空间数据转换到频域,在频域进行逐元素乘法,然后通过逆FFT转换回空间域。复杂度降至
O(n² log n),且可并行化。 - Im2col方法:将输入图像的部分重塑为列,将卷积转换为矩阵乘法。主流深度学习框架常用此方法。
- Winograd算法:针对特定滤波器(如3x3)的最小滤波算法,以减少乘法运算为代价增加加法运算。
- 步长卷积:如前所述,通过跳跃滑动减少操作次数。
这是一个非常活跃的研究领域,包括特定硬件优化、稀疏卷积、量化和剪枝等技术都在不断发展。

总结 📚

本节课我们一起学习了卷积神经网络。我们从CNN的概述和核心的卷积操作开始,探讨了其设计动机和优势。接着,我们了解了用于下采样的池化层,并从强先验的角度理解了这些操作。我们还介绍了多种卷积变体以适应不同任务,并探讨了CNN在产生结构化输出和处理多种数据类型方面的能力。最后,我们简要介绍了提升卷积计算效率的几种方法。希望本教程能帮助你建立起对卷积神经网络的基本理解。
008:循环神经网络 🧠

在本节课中,我们将学习循环神经网络。这是一种特殊的神经网络,因为它能够处理具有时间维度的数据。我们将探讨其基本概念、工作原理、不同类型以及如何优化它们以处理长期依赖关系。
序列建模简介
上一节我们介绍了课程主题,本节中我们来看看什么是序列建模。

序列建模旨在捕捉时间数据中的模式,其中顺序和时间至关重要。例如时间序列预测、语音识别和自然语言处理。
我们之所以需要序列建模,是因为现实世界的数据通常以序列形式出现,而传统的神经网络缺乏捕捉这种时间关系的设计。因此,循环神经网络应运而生。

循环神经网络是一种旨在识别跨时间模式的神经网络。其关键特性是具有循环连接,这赋予了RNN一种记忆形式。
理解循环神经网络对于深入研究现代人工智能和深度学习至关重要。
展开计算图
上一节我们了解了序列建模和RNN的基本概念,本节中我们来看看一个核心概念:展开计算图。

展开计算图指的是将循环计算的每一步都明确写出来的过程。

其目的是将RNN转换为具有前馈拓扑的网络,从而能够应用我们熟知的反向传播和优化技术。这样做可以更好地理解计算结构,并应用反向传播来优化网络。

以下是展开计算图的一些优点:
- 清晰度和表示:它允许应用随时间反向传播算法。
- 简化并行计算:在硬件上简化了并行计算。
然而,RNN也面临一些挑战,例如在收敛方面存在梯度爆炸和梯度消失的问题。此外,处理较长序列时,计算复杂度和内存管理也可能成为挑战。

在实践中,截断的BPTT是缓解这些挑战的常用方法,但需要在准确性和计算效率之间进行权衡。


循环神经网络概述
上一节我们讨论了计算图的展开,本节中我们更详细地看看循环神经网络本身。
循环神经网络是专门为识别时间数据中的模式而设计的神经网络。其关键特征是循环连接,这赋予了RNN独特的记忆形式。
我们使用RNN是因为传统的神经网络无法存储先前的信息。现实世界中的序列数据要求一种时间序列的处理方式,而RNN通过维护内部状态来“记住”过去的数据。
然而,传统RNN的一个主要问题是处理长期依赖关系的能力有限,例如理解一个很长的句子。
双向循环神经网络
上一节我们看到了传统RNN的局限性,本节中我们来看看一种变体:双向循环神经网络。

传统RNN按顺序(从左到右)处理序列。但有些任务需要未来的上下文信息来理解当前上下文。
因此,双向循环神经网络旨在同时利用过去和未来的信息。

它的工作原理是:在每个时间步维护两个隐藏层,分别用于前向和后向处理序列。这样,它就能同时理解过去和未来的内容。
双向RNN的好处包括:
- 全面理解序列上下文。
- 提高语音识别、词性标注等任务的准确性。
- 提供更丰富的数据表示。
其挑战在于:
- 需要访问整个序列,因此不适用于在线或实时任务。
- 计算复杂度增加,因为需要进行前向和后向两次处理。
- 可能存储两倍的数据,并有潜在的过拟合风险。
双向RNN的实际应用包括命名实体识别、机器翻译和音频信号处理。

编码器-解码器架构

现在让我们谈谈编码器-解码器序列到序列架构。这与自编码器类似,但应用于RNN领域。
编码器将输入序列压缩成一个固定大小的上下文向量。
解码器将上下文向量扩展成所需的输出序列。

编码器的作用是处理输入序列,创建一个全面的表示,并将其最终隐藏状态作为上下文传递给解码器。
解码器内部则使用编码器的上下文来开始其操作,并逐步生成输出序列。它还可以使用注意力机制来聚焦于输入序列的不同部分。
这种架构的优点包括:
- 灵活处理可变长度的输入和输出序列。
- 在翻译、摘要和问答等任务中非常强大。
- 编码器和解码器可以根据任务独立定制。
其挑战在于:
- 严重依赖上下文向量来传递信息。
- 序列越长,可能丢失的细节越多。注意力机制可以缓解这个问题,但会引入额外的复杂性。

深度循环神经网络
与所有神经网络一样,我们倾向于在可能的情况下构建更深的网络,RNN也不例外。本节我们讨论深度RNN。
基本的RNN通过循环连接处理序列,但存在一些缺点,例如难以处理长期依赖关系。
解决方案是增加更多层,构建更深的神经网络。
这样做是因为更多层意味着更丰富的层次化表示,能够捕捉序列中更复杂的模式和结构,并通过更多参数增强记忆和处理能力。
深度RNN的解剖结构如下:
- 在输入和输出之间有多个隐藏层。
- 每一层接收来自前一层的隐藏状态。
- 某一层的输出是下一层的输入。
其优势在于层次化特性,能实现更好的特征提取,增强处理复杂序列的能力,并在语言建模和语音识别等任务上有所改进。
挑战包括:
- 梯度消失和爆炸的风险增加。
- 训练计算密集。
- 需要仔细的初始化和先进的优化策略,这对所有深度神经网络都适用,但对RNN尤其重要。
递归神经网络

我们讨论了循环神经网络,现在来看看另一种结构:递归神经网络。

基本RNN适用于序列数据,而递归神经网络适用于具有层次化或树状结构的数据,例如自然语言、计算机程序或抽象语法树。
其核心思想是:数据并不总是线性的,很多时候是层次化的。树中的节点组合形成更高层级的节点,每个节点由一个向量表示。
通过组合子节点来形成父节点,使用权重矩阵来合并节点,并通过激活函数传递。递归传播一直进行,直到形成根节点。
其数学表示可以是:P = F(W * [C1, C2] + b),其中P是父节点,C1和C2是子节点,W是权重矩阵,F是激活函数(如tanh)。
递归神经网络与循环神经网络的主要区别在于:
- RNN用于序列,顺序很重要。
- 递归神经网络用于层次结构,结构很重要。
递归神经网络的应用包括为句子构建语法树、理解基于结构的句子含义(语义组合性),以及分析计算机程序的抽象语法树。
其优势在于能捕捉层次化模式。局限性在于比标准RNN更复杂,并且由于处理树状结构,计算需求更大。
递归神经网络的变体包括树状LSTM(将LSTM机制融入树结构)和用于无监督学习的递归自编码器。

长期依赖关系与挑战

我们一直在说RNN的一个难点是处理长期依赖关系。本节我们具体看看这个问题以及如何应对。
RNN被设计用来记住过去的信息,但能有效记住多远呢?这里的挑战在于将遥远的过去与现在联系起来。
当当前输出依赖于很久以前的输入时,这种情况就会发生。RNN理论上应该能够捕捉这些依赖关系,例如理解一个长句的主语。
然而,在反向传播过程中,梯度往往会变小,导致权重得不到显著调整,从而使网络“遗忘”。这使得RNN变得“短视”,只关注最近的输入,难以学习被长时间间隔分隔的模式,从而限制了其潜力。
理论上的解决方案包括:
- 梯度裁剪以处理梯度爆炸。
- 更好的权重初始化以促进梯度传播。
- 对于梯度消失问题,则需要引入新的架构。
处理多时间尺度的策略
RNN难以处理长期依赖,传统单元面临梯度消失和爆炸问题。我们需要策略来处理多个时间尺度。
泄漏单元 的思想是保留一些过去数据的记忆。它整合过去的信息,参数α决定了记住多少。它模仿了大脑中的泄漏整合神经元。
- 小的α意味着快速更新,适应近期事件,但遗忘更快。
- 大的α意味着缓慢适应,能捕捉更长期的依赖。

这为RNN提供了一系列时间尺度和敏感性。在网络中,可以变化这些α值。

其他策略包括:
- 跳跃连接:直接连接非相邻的时间步,缓解梯度消失问题,加速跨时间尺度的信息流动。
- 扩张循环网络:受扩张卷积启发,RNN层以不同的时间尺度运行,在不增加参数的情况下扩展感受野。
- 层次化RNN:将多个RNN堆叠成层次结构,更高层以更粗的时间尺度运行,从而高效捕捉多尺度时间结构。
时间尺度的重要性在于,现实世界的数据存在于多个时间尺度上(如股票市场的日价格和年总量)。处理多时间尺度有助于语音合成、视频分析,并提高RNN的泛化和预测能力。
门控循环单元:LSTM及其他
传统RNN存在梯度消失和爆炸问题,难以学习长期依赖。门控RNN是解决这一挑战的方案。
著名的长短期记忆网络由Hochreiter和Schmidhuber于1997年提出,它使用门来控制信息流,旨在长时间记住信息。
LSTM包含几个关键元素:
- 遗忘门:决定从细胞状态中丢弃哪些信息。使用sigmoid函数输出0(完全遗忘)到1(完全保留)之间的值。公式示例:
f_t = σ(W_f * [h_{t-1}, x_t] + b_f) - 输入门:决定哪些新信息存储在细胞状态中。它结合了一个sigmoid层和一个tanh层。
- 细胞状态更新:结合遗忘门的决定和输入门的新值来更新细胞状态。这是LSTM学习长期依赖的关键机制。
- 输出门:决定下一个隐藏状态是什么。它使用当前细胞状态并通过一个tanh函数。
除了LSTM,还有其他门控RNN:
- 门控循环单元:一种简化的LSTM变体,于2014年提出,它合并了遗忘门和输入门,参数比LSTM少,且通常同样有效。
- 高速网络:在前馈网络中使用门控机制。
这些门控单元是语音识别、机器翻译等任务的关键组件,展示了学习复杂模式和依赖关系的能力。

优化长期依赖关系

我们如何优化RNN以更好地捕捉长期和短期依赖呢?
长期依赖是指需要长时间维持的信息。传统RNN在这方面有限制,主要是因为梯度消失和爆炸问题。
应对梯度爆炸的方法包括梯度裁剪,即当梯度超过某个阈值时,将其缩放。
应对梯度消失的方法包括:
- 引入新架构,如LSTM。
- 更改激活函数,例如从tanh改为ReLU。
- 使用动态学习率,如RMSprop等自适应学习率算法,它们能加速收敛并带来更好性能。
- 进行权重初始化,例如正交初始化,这能显著影响训练动态,确保训练开始时梯度的多样性。
总结
本节课中,我们一起学习了循环神经网络的核心知识。我们从序列建模和RNN的基本概念出发,探讨了其计算图的展开方式。我们了解了不同类型的RNN,包括双向RNN、编码器-解码器架构、深度RNN以及用于层次化数据的递归神经网络。

我们重点分析了RNN处理长期依赖关系时面临的挑战,特别是梯度消失和爆炸问题。为此,我们介绍了多种策略,如泄漏单元、跳跃连接、扩张网络和层次化结构。最后,我们深入研究了解决这些问题的关键方案——门控循环单元,特别是LSTM和GRU,并讨论了优化RNN训练的各种技术。
理解这些概念是掌握现代序列建模和深度学习应用的重要基础。
009:自动编码器 🧠

在本节课中,我们将学习自动编码器。这是一种无监督的机器学习方法,旨在通过神经网络高效地编码和重构输入数据。我们将探讨其结构、不同类型、工作原理以及实际应用。
什么是自动编码器?🤔
自动编码器是一种设计用于重构其输入数据的神经网络。其目的是高效地编码数据,并保留其关键表示。你可以将其理解为某种形式的数据压缩。
自动编码器的结构如下:它包含一个编码器,用于将输入压缩为隐藏表示;包含隐藏层,即输入数据的压缩版本;还包含一个解码器,用于将隐藏表示扩展并重构为输出。
我们为何要这样做?原因包括数据压缩、去噪、降维以及生成模型。数据压缩能更高效地存储和传输数据。去噪可以移除数据中的噪声。降维有助于理解数据的核心特征。生成模型则可以生成与输入类似的新数据。
自动编码器有多种类型,例如欠完备、稀疏、去噪和变分自动编码器。其中一个关键概念是损失函数,它用于衡量原始输入与重构输出之间的差异。目标是最小化这种差异,使重构结果尽可能接近原始输入。


欠完备自动编码器 📉
上一节我们介绍了自动编码器的基本概念,本节中我们来看看欠完备自动编码器。
欠完备自动编码器的隐藏层单元数少于输入层。这种设计迫使自动编码器捕捉数据中更显著的特征,因为它必须找到数据中最重要的方面才能成功重构。
降维的目的是减少所考虑的随机变量的数量。其应用包括数据压缩、噪声消除和特征学习。
训练欠完备自动编码器时,目标是最小化重构误差。损失函数通常是输入与输出之间的均方误差。有时我们会使用正则化来避免平凡解。
那么,为什么我们要使用这种降维方法,而不是直接使用主成分分析(PCA)呢?因为PCA是一种线性技术,而我们有时需要非线性技术。欠完备自动编码器可以捕捉非线性关系。与PCA相比,自动编码器在降维可视化上通常能展现更复杂的结构。
以下是欠完备自动编码器的一些应用:
- 数据压缩
- 特征学习
- 降维可视化

其挑战在于可能学习到平凡的解决方案(例如恒等映射)。架构的选择会影响性能,可能需要正则化技术来指导学习。

正则化自动编码器 🛡️
上一节我们讨论了欠完备自动编码器,本节我们将探讨正则化自动编码器。
正则化是一种对模型复杂度添加惩罚项的技术,其目的是防止过拟合,并迫使模型学习更有用的特征。
以下是几种正则化自动编码器:
- 稀疏自动编码器:目标是限制隐藏层中活跃神经元的数量。通常通过在内部层激活上添加L1稀疏性惩罚来实现,这有助于学习更鲁棒和有意义的特征。
- 去噪自动编码器:其思想是在训练时向输入引入噪声,并尝试恢复原始的无噪声数据。这鼓励网络学习数据模式并忽略噪声。
- 对比自动编码器:它们使编码器函数对输入空间中的微小变化具有抵抗力,这是通过基于编码器激活的雅可比矩阵添加惩罚项来实现的,从而创建平滑的数据编码。
- 变分自动编码器:它结合了深度学习和贝叶斯推断的思想。它不将输入编码为单个点,而是编码为一个分布,因此它是一种可以生成新样本的生成模型。
正则化自动编码器的优势包括:对未见数据具有更好的泛化能力,能学习更有意义和可解释的特征,并且对噪声和变化更鲁棒。
其挑战在于:正则化方法的选择会极大地影响结果;需要仔细调整正则化强度;并非所有正则化都适用于所有类型的数据。
随机编码器与解码器 🎲
现在我们来讨论随机编码器和解码器。


随机自动编码器是指编码和/或解码过程涉及随机性的自动编码器。这与确定性自动编码器形成对比,后者每个输入都产生固定的输出。
引入随机性的原因包括:增强鲁棒性,使模型对噪声不那么敏感;鼓励模型捕捉最重要的特征;它本身也是一种正则化形式。
在编码过程中引入随机性的一种方法是变分自动编码器,其编码器输出一个分布的均值和方差,而不是一个固定点。
在解码过程中引入随机性则不太常见,但在某些上下文中也很有用。
变分自动编码器是随机自动编码器的一种流行形式。它对输入数据的分布做出假设,其损失函数包含一个重构损失项和一个正则化项(KL散度)。
其好处在于:可以生成新样本(生成模型);由于模型的随机性,对过拟合更鲁棒;非常灵活,可以与其他架构结合。

挑战包括:正则化方法的选择;需要仔细调整正则化项;并非所有正则化都适用于这些方法。
在实践中,实现随机性的一些方法包括:使用Dropout;向潜在空间注入噪声;使用蒙特卡洛采样等技术。
去噪自动编码器 🔊➡️🔇

接下来,我们深入了解去噪自动编码器。
去噪自动编码器的基本概念是:训练一个自动编码器,使其能够从带噪声的输入版本中重构出原始干净输入。其核心思想是捕捉数据的底层结构,同时忽略噪声。
其工作流程是:首先有意破坏输入数据(例如添加高斯噪声、掩码噪声或椒盐噪声)。然后,处理带噪声的输入,经过编码和解码,最后将输出与原始干净数据进行比较。目标是最小化重构输出与无噪声干净数据之间的差异。
我们这样做的原因包括:作为一种正则化手段,通过从噪声数据中重构,模型能更关注本质特征,减少过拟合;具有实际效用,能够处理现实世界中普遍存在的噪声数据;以及通过权重绑定(编码器和解码器共享权重)来减少过拟合和参数量。
此外,还有堆叠去噪自动编码器,即堆叠多个去噪自动编码器层,每层单独训练,这增强了特征提取能力。
去噪自动编码器面临的挑战包括:确定最佳噪声水平(解决方案:交叉验证、自适应噪声引入);确保模型不会学习到噪声本身(解决方案:监控训练过程、避免过于复杂的架构)。
流形与自动编码器 🗺️

现在,我们从流形的角度来思考自动编码器。

流形是高维空间中的一个连续、非自交的表面。在数据术语中,它是大部分概率质量所在的地方。
我们使用流形概念的原因是:高维数据通常位于或接近一个低维流形。理解这个结构可以带来更好的数据表示。压缩、去噪和许多其他任务都可以在这个更小的流形维度中找到。
流形假设指出,自然数据在其嵌入空间中形成低维流形。这意味着理解流形就等于理解数据。
自动编码器可以近似生成数据流形的函数,这是通过在潜在空间中学习一个压缩表示来实现的。编码器将数据点推向流形,从而捕捉数据的内在结构。解码器则学习从流形上或附近的点重构数据,充当从流形映射回原始数据空间的角色。
其好处包括:改进数据压缩;更好的噪声消除能力;增强泛化能力。
挑战在于:确定流形的正确维度;确保流形捕捉的是有意义的结构,而不仅仅是噪声。
关于切平面与自动编码器:在流形上的每个点都存在一个切平面,自动编码器可以很好地近似这些切平面。对比自动编码器(应为收缩自动编码器)则使自动编码器对沿着流形方向的变化更敏感,而对跨越流形的变化不那么敏感,从而产生一个在流形周围收缩的自动编码器。
深入探讨:收缩自动编码器 📐
让我们深入探讨收缩自动编码器。
“收缩”意味着关注点周围的局部稳定性,其目标是使自动编码器对输入的小变化不敏感。动机在于解决自动编码器可能存在的过度敏感问题,从而增强潜在表示的鲁棒性。
实现方法是在损失函数中添加一个正则项,该惩罚项惩罚编码器输出相对于其输入的大导数。大的导数意味着对输入变化过于敏感,惩罚这些可以使编码器更稳定。
雅可比矩阵捕捉了编码器输出相对于输入的变化率,是计算收缩惩罚的核心。
收缩自动编码器的损失函数结合了传统的重构损失和收缩惩罚项。
其优势包括:改进泛化能力;对噪声和小输入扰动更鲁棒;潜在空间中的特征更稳定。
在实现时需要考虑:惩罚系数的选择;雅可比矩阵计算的计算成本;对特定问题领域的适用性。
应用场景包括:去噪任务;以及那些输入的小变化不应 drastically 改变输出表示的领域。
挑战和局限性包括:参数调优(在重构和收缩性之间权衡);可能降低模型表达能力;找到收缩性的最佳平衡点。


预测稀疏分解 🔮
现在,让我们谈谈预测稀疏分解。
稀疏编码使用少量非零系数来表示数据。其挑战在于优化过程的复杂性和缓慢性。因此,我们需要一种快速而准确的替代方案。
预测稀疏分解结合了预测建模和稀疏编码,它利用前馈神经网络来实现。
其工作分为两个阶段:
- 预测阶段:使用神经网络预测稀疏编码。
- 精炼阶段:使用传统稀疏编码技术调整预测的稀疏编码。
在预测阶段,使用参数化函数(如神经网络)来预测稀疏编码,并训练它以最小化预测值与传统稀疏编码输出之间的差异。在精炼阶段,确保最终表示是真正稀疏的。
其损失函数结合了预测误差和稀疏性约束项。

这种方法的优势包括:由于神经网络的预测,速度比传统稀疏编码快;灵活,可根据特定需求进行微调;有效性,能以更少的时间获得与传统方法相当的结果。

它通常使用单层前馈神经网络,激活函数(如软阈值)能促进稀疏性。
实际应用包括图像压缩和特征提取。

挑战包括:超参数选择;可扩展性;实现真正的稀疏性;在速度与精炼精度之间进行权衡。

自动编码器的应用 💡
最后,我们来看看自动编码器的一些实际应用。
- 降维:类似于PCA,但是非线性的,更适用于复杂的数据分布。
- 异常检测:自动编码器学习重构正常数据,高重构误差则指示异常。可用于欺诈检测、系统健康监控等。
- 图像去噪:输入噪声图像,输出清晰图像。
- 图像生成:特别是变分自动编码器,作为生成模型可以创建新数据。
- 特征学习:可用于无监督特征学习,从编码器中提取压缩表示。
- 序列到序列学习:适用于自然语言处理任务,如翻译、聊天机器人、摘要。
- 信息检索:语义哈希,基于语义相似性进行快速文档检索。
- 协同过滤:推荐系统(如电影、音乐),自动编码器在此类任务中表现出色。
- 深度神经网络的预训练:以无监督方式训练自动编码器,然后使用其编码器部分作为深度网络的初始层,这有助于解决梯度消失等问题。
总结 📚

在本节课中,我们一起学习了自动编码器。我们从基本概念和结构入手,探讨了欠完备、正则化、随机、去噪等多种类型的自动编码器。我们还从流形的角度理解了其工作原理,并介绍了预测稀疏分解这一特定技术。最后,我们回顾了自动编码器在降维、去噪、生成模型、特征学习等多个领域的广泛应用。自动编码器是连接无监督学习与深度特征表示的重要桥梁。
010:生成式深度学习 🧠


在本节课中,我们将要学习生成式深度学习的基础知识。我们将探讨生成式模型的核心概念、两种主流的模型架构(生成对抗网络和变分自编码器),并了解它们的应用与挑战。
概述
生成式模型是一类专注于创造新数据的模型。与传统的分类或预测模型不同,生成式模型学习数据的底层分布,从而能够生成全新的数据样本。这类模型在音乐、图像、文本生成等领域有广泛应用,并且通常利用无监督学习,这在该领域非常重要。
上一节我们介绍了神经网络的基础,本节中我们来看看生成式模型如何工作。
生成式模型的特点
生成式模型具有以下几个核心特点:
- 创造新数据:能够生成全新的数据,如音乐、图像或文本。
- 学习数据分布:通过学习数据的底层分布来理解和解释数据。
- 利用无监督学习:能够从未标记的数据中学习,减少对标注数据的依赖。
生成式人工智能的应用
以下是生成式人工智能的一些主要应用场景:
- 数据增强:当原始数据量小或不平衡时,生成额外的训练数据。
- 异常检测:通过学习数据的正常分布,识别显著偏离该分布的异常值。
- 创造逼真数据:生成逼真的图像、音乐、文本等,扩展了艺术、设计和娱乐领域的创作能力。
- 数据解释:通过建模数据生成过程,帮助我们理解复杂的数据分布并提取有意义的模式。
- 半监督学习:结合有限的标记数据和大量未标记数据,提升模型性能。
- 隐私保护:生成合成数据集以模拟真实数据,从而在保护隐私(如医疗数据)的前提下训练模型。
主流生成式模型
我们将重点介绍两种流行的生成式模型:生成对抗网络 和 变分自编码器。
- 生成对抗网络 学习生成与真实数据难以区分的新数据。
- 变分自编码器 专注于将数据编码到潜在空间,并尝试从中重建数据。
接下来,让我们深入探讨生成对抗网络。
生成对抗网络详解 🤼
生成对抗网络由伊恩·古德费洛等人于2014年提出,它包含两个通过对抗过程同时训练的主要组件:生成器 和 判别器。这两个组件之间的交互使得GANs独特而强大。
生成器的角色
生成器的目标是产生尽可能逼真的人工数据,以“欺骗”网络,使其认为这些人工数据是真实的。
- 输入:通常是从高斯分布或均匀分布中采样的随机噪声向量。
- 输出:类似于真实数据的数据(例如,如果GAN在图像数据集上训练,则输出图像)。
- 架构:通常是深度神经网络,对于图像数据常使用反卷积神经网络。
- 目标:愚弄判别器,使其将生成的数据分类为“真实”。
判别器的角色
判别器充当“评论家”,其工作是避免被愚弄。本质上,它是一个二元分类器,判断输入是“真实”还是“虚假”。
- 输入:来自真实数据集的数据实例,或由生成器生成的虚假数据。
- 输出:一个概率分数,表示输入是真实数据的可能性。
- 架构:对于图像数据,通常是卷积神经网络。
- 目标:准确区分真实数据和虚假数据。
训练过程
训练过程涉及生成器和判别器之间的优化博弈。
- 训练判别器:在每个训练步骤中,首先训练判别器。向其展示一批真实数据和一批生成器生成的虚假数据。目标是最大化其区分真假数据的能力。
- 训练生成器:随后训练生成器。将生成器的输出馈送给判别器。生成器的目标是最大化判别器的错误率,即让判别器将其生成的虚假数据误分类为真实数据。
这是一种对抗性训练过程,生成器和判别器在不断竞争。生成器试图产生越来越逼真的数据,而判别器则试图更好地识别虚假数据。
损失函数与纳什均衡
GANs使用一种称为最小最大损失的目标函数来反映这种对抗关系。其公式基于博弈论:
min_G max_D V(D, G) = E_{x~p_data(x)}[log D(x)] + E_{z~p_z(z)}[log(1 - D(G(z)))]
- 第一项是判别器将真实数据正确分类为真实的期望对数概率,判别器试图最大化此项。
- 第二项是判别器将虚假数据正确分类为虚假的期望对数概率,生成器试图最小此项。
简单来说,判别器试图最大化区分真假数据的能力,而生成器试图最小化被检测为虚假的可能性。
纳什均衡是博弈论中的一个概念,指在游戏中,当其他参与者策略不变时,任何参与者都无法通过单方面改变策略而获益的状态。在GANs中,当生成器产生的数据如此逼真,以至于判别器无法区分真假(即分类准确率为50%,相当于随机猜测)时,就达到了均衡。此时,任何一方的策略改变都不会改善其性能。
然而,在实践中,完美的纳什均衡很少实现。训练过程通常旨在找到一个满意的点,使生成器能产生足够逼真的输出。
模式崩溃问题
模式崩溃是GAN训练中的一个常见问题。它发生在生成器发现数据分布中的一个特定子集(模式),并不断利用它来成功欺骗判别器时。
- 后果:生成器不再学习完整的数据分布,只产生该特定模式的变体,导致生成的数据缺乏多样性。
- 影响:破坏了对抗训练的平衡,判别器无法看到多样化的生成数据,学习过程变得低效。
为了解决模式崩溃,可以采用以下技术:
- 经验回放:保存历史生成的虚假数据并展示给判别器,防止其遗忘。
- 改进架构:使用如Wasserstein GAN等不同架构,其损失函数有助于缓解模式崩溃。
- 小批量判别:确保判别器同时查看多个数据点,使生成器难以持续产生相同输出。
- 展开GAN训练:基于判别器多步训练的结果向生成器提供反馈,使其对判别器策略有更全面的认识。
GANs的应用
GANs在多个领域有广泛应用:
- 图像与视频合成:生成逼真的图像和视频,用于创建虚拟训练环境以增强计算机视觉模型。
- 风格迁移:将一幅图像的风格应用到另一幅图像的内容上,用于艺术创作。
- 超分辨率:提升图像分辨率,为低分辨率图像添加细节。
- 数据增强:在数据稀缺时,为机器学习模型生成额外的训练数据。
- 药物发现:生成可能成为新药的分子结构,加速药物研发过程。
- 异常检测:通过学习数据的正常分布,检测安全或医疗诊断等领域中的异常。
- 深度伪造与克隆:(需注意伦理问题)用于创建高度逼真的人物视频或声音克隆。
变分自编码器详解 🔄
变分自编码器是另一种生成式模型,它学习将数据编码到一个潜在空间,然后再解码回原始数据。VAE由两个主要部分组成:编码器 和 解码器。
编码器
编码器的目的是将输入数据压缩成一个低维的表示(潜在变量)。
- 输入:原始数据。
- 输出:定义潜在变量分布的参数(例如,如果是高斯分布,则输出均值和方差)。
- 架构:通常是神经网络(对于简单数据是全连接网络,对于图像是卷积网络)。
潜在空间
潜在空间是数据以压缩形式表示的地方。在VAE中,这个空间是概率定义的。编码器不是将输入编码为单个点,而是输出定义潜在空间中可能值分布的参数。为了生成新的潜在变量,模型从该分布中采样。这个随机步骤对VAE的生成能力至关重要。
解码器
解码器的目的是获取潜在表示,并尽可能接近地重建原始输入数据。
- 输入:潜在空间表示。
- 输出:原始数据的重建。
- 架构:通常是神经网络,其结构通常与编码器镜像(例如,对于图像,使用反卷积神经网络进行上采样)。
训练与损失函数
VAE的训练基于变分推断(一种贝叶斯统计方法),目标是最大化数据的证据下界。
损失函数由两部分组成:
L(θ, φ; x) = -E_{z~q_φ(z|x)}[log p_θ(x|z)] + KL(q_φ(z|x) || p(z))
- 重建损失:鼓励解码后的样本匹配原始输入。
- KL散度:一个正则化项,衡量学习到的潜在变量分布与先验分布(通常是标准高斯分布)的差异。它确保潜在空间具有良好的属性,便于生成新数据。
KL散度在信息论中用于量化一个概率分布与另一个概率分布的差异。在VAE中,它惩罚与先验分布差异过大的变分分布,从而鼓励编码器以符合先验假设的方式映射输入,得到一个更有结构、更可解释的潜在空间。
重参数化技巧
由于从分布中采样的操作是不可微的,这阻碍了基于梯度的优化。重参数化技巧通过将随机性分离出来解决了这个问题。
原始采样:z ~ N(μ, σ²)
重参数化后:z = μ + σ ⊙ ε,其中 ε ~ N(0, 1)
这里,μ和σ由编码器输出,ε是从简单分布采样的辅助随机变量。这样,z就成为μ、σ和ε的确定性函数,梯度可以相对于μ和σ进行计算,因为ε现在与模型参数无关。
VAEs的应用
VAEs也有广泛的应用:
- 降维:作为非线性降维工具。
- 文本生成:生成连贯且多样的文本段落,应用于自然语言处理和机器翻译。
- 推荐系统:建模用户偏好并预测用户可能喜欢的项目。
- 语音合成:生成类人语音,用于文本转语音系统。
- 药物发现:与GANs类似,用于生成新的药物分子结构。
- 可解释AI:VAE的潜在空间可以被检查和操作,以理解数据中的变化因素,有助于创建可解释的AI系统。
伦理考量 ⚖️
在结束之前,我们必须思考生成式人工智能带来的伦理挑战。我们已经看到了生成式AI的优秀用例,但也目睹了其被滥用的案例。作为从业者,我们应始终将伦理问题放在心上,不断自问:我们为何要使用它?其潜在影响是什么?

总结
本节课中我们一起学习了生成式深度学习的核心内容。我们介绍了生成式模型的特点和应用,并深入探讨了两种主流模型:生成对抗网络和变分自编码器。我们了解了GANs中生成器与判别器的对抗训练过程、最小最大损失、纳什均衡以及模式崩溃等挑战。我们也学习了VAEs的编码器-解码器结构、变分下界损失函数、KL散度的作用以及重参数化技巧。最后,我们强调了在发展和应用这些强大技术时必须考虑的伦理问题。
012:4_马尔可夫决策过程 🧠

在本节课中,我们将学习强化学习中的一个核心假设——马尔可夫过程。我们将了解什么是马尔可夫链,并重点介绍贝尔曼方程及其在求解最优状态值和最优策略中的应用。
马尔可夫过程与马尔可夫链
在强化学习问题中,一个重要的假设通常是该问题是一个马尔可夫过程。
那么,什么是马尔可夫过程呢?在20世纪早期,安德烈·马尔可夫研究了无记忆的随机过程,我们称之为马尔可夫链。这些过程具有固定数量的状态,并且在每一步中,它会随机地从一种状态演变到另一种状态。
从状态 S 演变到状态 S' 的概率是固定的,并且它只取决于状态对 (S, S'),而不依赖于过去的状态。因此,它是无记忆的,不关心两步之前或之后发生了什么,只关心当前正在发生什么。
贝尔曼方程与最优状态值
上一节我们介绍了马尔可夫过程的基本概念,本节中我们来看看贝尔曼如何估计任何状态 S 的最优状态值。
贝尔曼找到了一种方法来估计任何状态 S 的最优状态值 V*(S)。V*(S) 是智能体在到达状态 S 后,假设其采取最优行动,平均可以预期的所有未来折扣奖励的总和。
他证明了如果智能体采取最优行动,那么被称为贝尔曼方程的公式成立,即你在右侧看到的这个公式。
这个递归方程表明,如果智能体采取最优行动,那么当前状态的最优值等于它采取一个最优行动后平均获得的奖励,加上该行动可能导致的所有可能下一个状态的预期最优值。
用公式表示如下:
V*(S) = max_a Σ_{S'} T(S, a, S') * [R(S, a, S') + γ * V*(S')]
其中:
T(S, a, S')是给定智能体选择行动a时,从状态S转移到状态S'的转移概率。R(S, a, S')是智能体从状态S出发,选择行动a后到达状态S'所获得的奖励。γ是一个折扣因子。
值迭代算法
这个方程引出了一个算法,可以精确估计每个可能状态的最优状态值。
以下是值迭代算法的步骤:
- 首先将所有状态值的估计初始化为零。
- 然后使用值迭代算法迭代更新它们。
这个算法的一个非常棒的结果是,给定足够的时间,这些估计保证会收敛到对应于最优策略的最优状态值。
在这个方程中,V_k(S) 表示算法在第 k 次迭代时对状态 S 的估计值。
从状态值到Q值
了解最优状态值实际上非常有用,它可以用于评估策略,但它并没有直接给出智能体的最优策略。
贝尔曼实际上发现了一个非常相似的算法来估计最优的状态-行动值,这通常被称为Q值(质量值)。
状态-行动对 (S, a) 的最优Q值 Q*(S, a),是智能体在到达状态 S 并选择行动 a 之后(但在看到该行动的结果之前),假设在此之后采取最优行动,平均可以预期的未来折扣奖励的总和。
Q值迭代与最优策略
计算最优Q值的方法与之前类似。
以下是Q值迭代的步骤:
- 再次将所有Q值初始化为零。
- 然后使用迭代算法更新它们。
一旦你拥有了最优Q值,定义最优策略就变得直接了当。当智能体处于状态 S 时,你只需选择对该状态具有最高Q值的行动。
用公式表示最优策略 π*(S) 为:
π*(S) = argmax_a Q*(S, a)
总结

本节课中我们一起学习了马尔可夫决策过程的核心内容。我们首先了解了马尔可夫链作为无记忆随机过程的特性。接着,我们深入探讨了贝尔曼方程,它通过递归关系定义了状态的最优价值。我们学习了值迭代算法,该算法通过迭代更新可以收敛到最优状态值。最后,我们引入了Q值的概念,并展示了如何通过Q值迭代找到最优策略,即在每个状态下选择具有最高Q值的行动。这些概念构成了许多现代强化学习算法的基础。
013:深度强化学习网络 🧠🤖

在本节课中,我们将学习如何构建一个用于强化学习的神经网络策略。我们将探讨如何将神经网络与马尔可夫决策过程结合,以解决智能体在环境中学习最优行为的问题。课程将涵盖策略表示、探索与利用的权衡、信用分配问题以及策略梯度算法等核心概念。
构建神经网络策略
上一节我们介绍了马尔可夫决策过程的基本概念,本节中我们来看看如何用神经网络来表示策略。
策略网络接收一个观察作为输入,并输出要执行的动作。更准确地说,它会为每个可能的动作估计一个概率,然后根据这个估计的概率分布随机选择一个动作执行。
一个显而易见的问题是:为什么我们要根据神经网络给出的概率随机选择动作,而不是直接选择得分最高的动作?这样做是为了让智能体在探索新动作和利用已知动作之间找到正确的平衡。
以下是一个类比:
- 假设你第一次去一家餐厅,所有菜品看起来都不错。
- 你会随机选择一道菜。
- 如果这道菜味道很好,你下次点它的概率就会增加。
- 但这个增加的概率不应该是100%,因为如果你每次都点同一道菜,就永远无法尝试其他可能更好的菜品。
这里的情况是类似的。
训练策略网络与信用分配问题
现在我们有了一个接收观察并输出动作概率的神经网络策略。问题在于:我们如何训练它?
如果我们知道每一步的最佳动作是什么,我们就可以像往常一样训练这个神经网络,将其视为一个监督学习问题。我们可以最小化估计概率分布与目标概率分布之间的交叉熵损失。
但在强化学习中,智能体获得的唯一指导是奖励本身——那个标量值。奖励通常是稀疏且延迟的。
这就引出了信用分配问题:当智能体获得一个奖励时,它很难知道这个奖励应该归功于(或归咎于)之前的哪个动作。
另一个类比是:想象你训练你的狗“坐下”。狗坐下了,但你30分钟后才奖励它。狗并不知道你奖励它是因为“坐下”这个动作。
为了应对这个问题,一个常见的策略是根据一个动作之后获得的所有奖励之和来评估该动作。计算时通常还会应用一个折扣因子。这种奖励之和被称为该动作的回报。
当然,一个好的动作之后可能跟着几个坏动作。因此,我们想估计一个动作与其他可能动作相比,平均而言是好是坏。这被称为动作优势值。为此,你必须运行许多回合(episodes),并通过减去均值、除以标准差来标准化所有这些动作的回报。
之后,你可以合理地假设具有负优势值的动作是坏的,而具有正优势值的动作是好的。
策略梯度算法
策略梯度算法通过朝着更高奖励的方向调整梯度,来优化策略的参数。
一类流行的PG算法叫做REINFORCE算法,由Ronald Williams提出。其大致流程如下:
以下是REINFORCE算法的关键步骤:
- 让神经网络策略玩游戏多次。
- 在每一步,计算一个梯度,该梯度会使已选择的动作在未来更可能出现,但先不要应用这些梯度。
- 运行多个回合后,计算每个动作的优势值。
- 如果一个动作的优势值为正,说明该动作可能很好,你希望应用之前计算的梯度,使该动作在未来更可能被选择。
- 如果一个动作的优势值为负,说明该动作可能不好,你希望应用相反的梯度,使其在未来更不可能被选择。
解决方案很简单:将每个梯度向量乘以对应的动作优势值。最后,计算所有结果梯度向量的均值,并用它来执行梯度下降步骤。
时序差分学习
具有离散动作的强化学习问题通常可以建模为马尔可夫决策过程。但智能体在开始时并不知道转移概率是什么,它是一个完全“无知”的智能体,对环境一无所知,也不知道会得到什么奖励。
它必须至少体验一次每个状态和每次状态转移,才能了解奖励;并且必须多次体验,才能对转移概率有合理的估计。观看强化学习智能体随着时间学习的视频非常有趣,因为在开始时,它确实在做最愚蠢的事情,比如随机乱跑,它必须先体验一切。
时序差分学习算法与价值迭代非常相似,但进行了调整,以考虑到智能体对MDP只有部分了解这一事实。
通常,我们假设智能体最初只知道可能的状态和动作,对其他一无所知。智能体使用探索策略(例如,完全随机行动)来探索MDP。随着探索的进行,TD学习算法根据实际观察到的转移和奖励来更新对状态价值的估计。
其核心更新公式如下:
V(S) ← V(S) + α [R + γ * V(S') - V(S)]
其中:
α是学习率。R + γ * V(S')被称为 TD目标。[R + γ * V(S') - V(S)]被称为 TD误差。
对于每个状态S,该算法只是持续跟踪一个运行平均值,这个平均值包括:智能体到达该状态时获得的即时奖励,加上它预期在未来(假设以某种最优方式行动)能获得的奖励。
总结

本节课中,我们一起学习了深度强化学习网络的核心思想。我们了解了如何用神经网络表示策略,以及通过随机采样动作来平衡探索与利用。我们探讨了奖励稀疏和延迟带来的信用分配问题,并介绍了通过计算动作回报和优势值来解决此问题的方法。最后,我们学习了REINFORCE策略梯度算法的基本步骤,以及用于在未知环境中在线学习的时序差分算法。这些概念为理解智能体如何通过试错与环境交互并学习最优行为奠定了坚实基础。
014:Q学习与深度Q学习 🧠

在本节课中,我们将学习强化学习中的两种重要算法:Q学习和深度Q学习。我们将了解它们如何帮助智能体在未知环境中通过试错来学习最优策略。
Q学习算法概述
Q学习算法是Q值迭代的一种适应形式,适用于转移概率和奖励最初未知的情况。Q学习通过观察智能体随机行动,逐步改进其对Q值的估计。一旦获得足够准确的Q值估计,最优策略就是选择具有最高Q值的动作,这本质上是一种贪婪策略。
对于每个状态-动作对,该算法会跟踪一个运行平均值,该平均值包括智能体在状态S采取动作A后获得的即时奖励,加上其预期获得的未来折扣奖励总和。
为了估计这个总和,我们取下一状态S‘的所有可能动作的Q值估计中的最大值,因为我们假设目标策略从那时起将采取最优行动。
策略类型:离策略与同策略
Q学习算法被称为离策略算法,因为被训练的策略不一定是要执行的策略。有时,执行的策略(例如探索策略)是完全随机的,而被训练的策略总是选择具有最高Q值的动作。
相反,策略梯度算法是同策略算法,因为它探索世界时使用的策略正是被训练的策略。
令人惊讶的是,Q学习能够仅通过观察(尤其是观察随机行动)来学习最优策略。一个关键问题是:我们能做得更好吗?
探索策略的改进
Q学习只有在探索策略足够彻底地探索所有状态和转移时才能工作。虽然纯随机策略最终会访问每个状态和每次转移,但这可能需要很长时间。
一个更好的选择是使用ε-贪婪策略。在每个步骤中,它以概率ε随机行动,或以概率(1-ε)选择具有最高Q值的动作。
与完全随机相比,ε-贪婪策略的优势在于,随着Q值估计越来越好,你将花更多时间探索有趣且正确的部分,同时仍会花一些时间探索未知区域,这提供了发现新可能性的机会。
通常,开始时设置较高的ε值(例如1),然后逐渐将其降低到0.05左右。
另一种探索方法是鼓励策略尝试之前尝试较少的动作。这可以通过在Q值估计中添加一个探索奖励来实现。
以下是实现探索奖励的公式示例:
Q(S, A) = 估计的Q值 + f(N(S, A))
其中,N(S, A) 是在状态S下选择动作A的次数,f 是一个探索函数,例如 f(n) = k / sqrt(n),k 是一个好奇心超参数,决定了智能体对未知事物的吸引力程度。
Q学习的扩展性问题
Q学习的主要问题是它不能很好地扩展到具有大量状态和动作对的大型甚至中型MDP问题。
例如,假设你想用Q学习训练一个智能体玩《吃豆人小姐》游戏。游戏中有大约150个豆子,每个豆子可能存在也可能不存在,因此可能的状态数大于2的150次方。如果再考虑幽灵和吃豆人小姐的所有可能位置组合,状态数将超过地球上的原子数量。因此,不可能为每个Q值都跟踪一个估计值。
解决方案:近似Q学习
解决方案是找到一个函数 Q_θ,它使用一组可管理的参数θ来近似任何状态-动作对的Q值。这被称为近似Q学习。
多年来,推荐的方法是使用从状态中手工提取的特征组合来估计Q值,例如最近幽灵的距离、方向等。
但在2013年,DeepMind表明,使用深度神经网络可以更好地解决复杂问题,并且完全不需要特征工程。用于估计Q值的深度神经网络被称为深度Q网络,使用DQN进行近似Q学习被称为深度Q学习。
如何训练深度Q网络
考虑DQN为给定状态-动作对计算的近似Q值。我们希望这个近似Q值接近在状态S执行动作A后实际观察到的奖励r,加上从那时起最优地玩游戏所获得的未来折扣奖励总和。
为了估计这个未来折扣奖励总和,我们可以将DNN应用于下一个状态S‘,并计算所有可能动作A’的近似未来Q值。我们选择最高的一个,因为我们假设要最优地玩游戏,然后将其进行折扣。
通过将即时奖励与这个未来折扣价值估计相加,我们得到了状态-动作对的目标Q值 y。
有了这个目标Q值 y,我们就可以使用梯度下降算法运行训练步骤。我们通常尝试优化估计Q值与目标Q值之间的平方误差。也可以使用其他损失函数,如Huber损失,以减少算法对较大误差的敏感性。
总结

本节课我们一起学习了Q学习和深度Q学习。我们了解到Q学习是一种离策略算法,通过观察和试错来学习最优动作价值。为了解决大规模状态空间的问题,我们引入了近似Q学习,并最终借助深度神经网络的力量,发展出了深度Q学习。深度Q学习使用DQN来近似Q值函数,通过梯度下降来最小化预测值与目标值之间的误差,从而能够在复杂环境中(如视频游戏)学习有效的策略。
015:神经网络实践方法论 🛠️

在本节课中,我们将从理论转向实践,探讨训练神经网络模型时的一系列核心方法论。我们将学习如何评估模型、选择基准、调整超参数、防止过拟合与欠拟合,以及如何调试和确保结果的可复现性。
概述
我们已经花费了大量时间学习神经网络的理论知识,这是本课程的预期内容。现在,我们需要暂停一下,开始思考实践方法,即如何训练模型以及相关的一切工作。这里的核心思想是从理论转向实践。

你始终需要考虑性能指标,例如准确率、精确率、召回率和F1分数。这些是评估模型并判断其表现好坏的方法。为你的问题选择合适的指标至关重要。
那么,在哪些情况下这些指标不适用呢?在这种情况下,你会改用哪些指标?这在很大程度上取决于你正在处理的具体问题集。你永远无法绕过该领域的专业知识。
确定基准模型
在构建这类模型时,你需要确定一个基准。建立一个简单的模型进行比较非常重要。你不应该从最复杂的模型开始并试图与之比较,而应该考虑一个线性模型,并以此作为起点进行比较,以明确你的改进方向。这对于建立基准至关重要。
以下是一些基准模型的例子:
- 线性回归:适用于回归问题。
- 逻辑回归:适用于分类问题。
这些模型能提供一个良好的基准。
改进策略
你的目标是从基准模型开始改进。以下是一些改进策略:
- 添加更多数据。
- 采用更好的模型架构。
- 使用更好的优化算法。
你需要了解每种情况的例子并进行比较。
超参数调优
超参数调优是一项艰巨的任务。以下是一些需要调优的超参数示例:
- 学习率。
- 正则化策略。
- 网络层数。
- 层的宽度,等等。
调优这些参数对于模型改进非常重要。常见的调优方法包括网格搜索和随机搜索。
正则化技术
接下来是正则化技术,主要用于处理过拟合和欠拟合问题。
你既不想过拟合,也不想欠拟合。以下是一些常用的正则化技术:
- L1正则化。
- L2正则化。
- Dropout。
你需要使用这些常规技术来应对这些问题。那么,过拟合和欠拟合通常发生在哪些例子中?你能快速分辨它们吗?
优化策略
思考你的优化策略也很重要。很多时候,你不会直接使用标准的梯度下降法,大多数时候你会使用它的变体,例如带动量的梯度下降、RMSProp或Adam等。
那么,为什么这些添加的项(如动量)在这个决策中起作用?它们如何帮助你优化策略?
调试策略
我从未在完成一个非常大的机器学习项目后,不回头调试一些错误。在机器学习工作流中,拥有一个调试策略非常重要。
典型的问题包括:
- 梯度消失。
- 梯度爆炸。
- 权重初始化不佳。
相应的解决方案可以是:
- 梯度裁剪。
- 更好的权重初始化方法。
你能给我一个机器学习工作流程中出现的错误例子,并给出解决方案吗?
可视化与监控工具
拥有可视化与监控工具非常有益。像TensorBoard这类工具非常棒,它们能让你在训练过程中监控系统。
这些工具对于跟踪训练进度和调试至关重要。我们可以使用哪些工具来可视化训练过程?我提到了TensorBoard,它是TensorFlow的一个实现,还有哪些类似的工具?
确保可复现性
确保可复现性这一点我怎么强调都不为过。我对许多机器学习论文的一个不满之处在于,它们声称的很多结果无法被复现。
我们可以通过以下方式来实现可复现性:
- 设置随机种子。
- 对数据和代码进行版本控制。
这对于发表研究等工作非常重要,因为你希望能够复现自己的结果。
迁移学习
只要有可能,你都应该利用预训练模型。它有助于你的模型收敛等。具体做法是,从那个模型开始,使用在该模型上训练好的权重,然后针对你的特定任务进行微调。
那么,你预计迁移学习在何时会表现良好?我给你一个通用的答案:当你的任务相似时,迁移学习效果会好。例如,如果我有关于猫狗的RGB图像,我可能会使用ImageNet作为预训练模型,因为它包含很多猫狗图像。或者,如果我要使用黑白图像,ImageNet的初始层具有良好的边缘检测器等功能,当我的数据与训练数据相似时,这些都是迁移学习可能成功的场景。
模型评估策略
你需要有完善的模型评估策略。只要可能,你都应该拥有训练集、验证集和测试集。
如果无法做到这一点,你需要进行部分评估。回顾一下,问问自己这些数据集之间有何不同,并确定它们,告诉我你的想法。

总结
本节课内容虽然简短,但当你开始为期末项目实现模型时,我希望你能暂停一下,了解这些实用的方法。以上就是本节课的全部内容。如果你有任何问题,可以通过邮件联系我。
016:人工智能伦理 🧠⚖️
在本节课中,我们将探讨人工智能开发与应用中至关重要的伦理考量。我们将学习如何运用数学的严谨性来确保AI系统的公平性、隐私保护、透明度和问责制。
概述
随着我们深入学习各种人工智能和神经网络方法,有必要暂停一下,思考这些技术背后的伦理问题。人工智能伦理研究的是指导AI技术的道德原则和社会影响。数学在其中扮演的角色,是运用其严谨性来确保AI系统的开发是负责任且公正的。
关键伦理领域
人工智能伦理涵盖多个关键领域,以下是其中几个核心方面:
- 公平性:确保所有用户群体获得平等的对待和机会。
- 隐私:保护个人数据在使用过程中的安全。
- 透明度:使AI系统的决策过程清晰可理解。
- 问责制:明确AI系统决策的责任归属。
案例研究与思考
在深入理论之前,让我们通过几个现实场景来思考AI伦理的复杂性。以下是几个值得深思的问题,每个问题都涉及潜在的担忧和缓解策略:
- 预测性警务:我们是否应该使用AI进行预测性警务?请思考其潜在担忧和可能的缓解措施。
- 医疗保健:AI算法应该用于医疗保健吗?其中可能存在哪些偏见?请思考相关担忧和缓解策略。
- 信贷审批:我们是否应该在贷款审批中使用AI算法?请思考其潜在担忧和可能的缓解措施。
公平性与算法
上一节我们提出了几个伦理困境,本节中我们来看看如何用数学框架来定义和实现“公平性”。
“机会均等”模型旨在确保不同群体中的个体获得公平对待,特别是在对其生活有重大影响的决策中。该模型旨在解决和缓解算法决策过程中可能出现的偏见。
该算法基于一个原则:某些敏感特征(如种族、性别、年龄)不应以损害特定群体利益的方式影响算法结果。它侧重于确保真正例率在由这些敏感属性定义的群体之间是相等的。
机会均等模型
考虑一个二元分类任务,算法根据特征 x 预测结果 y。令 A 表示敏感属性,其取值为组别 a 和 b。机会均等模型的目标是通过使两组间的真正例率相等来确保公平性。
机会均等准则可以形式化表述如下:
P(ŷ = 1 | y = 1, A = a) = P(ŷ = 1 | y = 1, A = b)
这个等式断言,对于本应获得积极结果(y=1)的个体,分类器 ŷ 预测出积极结果的概率在所有由敏感属性定义的组别中应该是相同的。
实施与权衡
实施该模型通常涉及数据预处理以消除偏见,或修改算法以在训练期间考虑公平性约束,并对预测结果进行后处理以确保满足公平性标准。
这个过程可能引入一些权衡:
- 准确性与公平性:追求完全公平可能会影响模型的准确性,反之亦然。
- 公平性标准的冲突:不同的公平性标准可能无法同时实现,这需要在特定情境下决定哪个标准最为重要。
隐私保护
除了公平性,隐私是AI应用中的另一个核心伦理关切。保护使用中的个人数据隐私至关重要,它能确保通过已发布数据或统计摘要重新识别个人身份的风险被降至最低。
差分隐私
差分隐私是一个旨在保护个人数据隐私的框架,同时允许从数据库中提取有价值的见解。它提供了一种方法,在最大化统计数据库查询准确性的同时,最小化识别具体条目的可能性。
差分隐私正式定义为个体因参与统计数据库而面临的隐私风险。一个随机化函数 K 提供 ε-差分隐私,如果对于所有最多相差一个元素的数据集 D1 和 D2,以及 K 值域内的所有子集 S,都满足以下条件:
P[K(D1) ∈ S] ≤ e^ε * P[K(D2) ∈ S]
其中,ε 是一个非负实数参数,控制隐私保护的程度。ε 值越小,表示隐私保护越强。P[K(D) ∈ S] 表示将随机化函数 K 应用于数据集 D 的输出落在集合 S 中的概率。
实现机制
以下是两种实现差分隐私的常见机制:
-
拉普拉斯机制:用于数值型查询。它通过向查询的真实答案中添加从拉普拉斯分布中生成的噪声来实现。噪声的规模取决于查询的敏感度
Δf和隐私参数ε。敏感度Δf是任何单个个体数据的改变所能引起的查询结果的最大变化量。所添加的噪声Lap(Δf / ε)从以下拉普拉斯分布中抽取:Lap(x | b) = (1/(2b)) * e^(-|x|/b),其中b = Δf / ε -
指数机制:用于输出非数值型结果的查询。它根据一个效用函数
u以指数概率选择输出答案,坏答案(效用低)被选中的概率呈指数级下降。输出r的概率与exp(ε * u(D, r) / (2Δu))成正比,其中Δu是效用函数的敏感度。
差分隐私的性质
- 组合性:差分隐私允许对多个查询进行组合,总体的隐私损失随查询数量线性累积。
- 群体隐私:如果对单个实体保证了差分隐私,它自然能为群体提供(稍弱的)隐私保护。
- 后处理不变性:对差分隐私的输出进行任何后处理,都不会影响其差分隐私的保证。
透明度与问责制
我们探讨了公平和隐私的数学保障,现在来看看如何让AI的决策过程变得可理解,即透明度和问责制。这指的是关于AI系统如何工作、如何做出决策以及如何开发和部署的开放性和清晰度。
案例研究
透明度在以下场景中至关重要:
- 银行贷款:银行使用AI系统评估贷款申请。缺乏关于决策如何做出的透明度可能导致不信任和关于不公平的指控。透明度意味着解释影响批准或拒绝决定的因素。
- 刑事司法:一些司法管辖区使用AI评估被告的再犯风险。这些系统因不透明和潜在偏见而受到批评。使AI评估透明化对于确保公平、接受审查至关重要。
- 自动驾驶汽车:自动驾驶汽车在复杂环境中做出瞬间决策。当事故发生时,理解其决策过程对于公共安全、监管批准和系统可靠性改进至关重要。
可解释性技术
为了实现透明度,研究人员开发了多种模型可解释性技术:
-
LIME:一种与模型无关的局部解释方法。它通过在待解释实例附近采样,并用一个简单的可解释模型(如线性模型)来局部近似复杂黑盒模型的预测行为。其目标是最小化以下损失函数:
ξ(x) = argmin_{g∈G} L(f, g, π_x) + Ω(g)其中,
f是复杂模型,g是可解释模型,π_x是定义采样点与实例x接近程度的度量,L是损失函数,Ω(g)衡量模型g的复杂度。 -
SHAP:基于博弈论中沙普利值的解释方法。它将模型预测值归因于各个输入特征。特征
i的沙普利值φ_i计算公式如下:φ_i = Σ_{S⊆N\{i\}} [|S|! (|N|-|S|-1)! / |N|!] * [f_x(S∪{i}) - f_x(S)]其中,
N是所有特征的集合,S是N中不包含特征i的一个子集,f_x(S)是仅使用特征子集S时模型的预测值。 -
部分依赖图:显示一个或一对特征对模型预测结果的平均边际效应。对于特征
x_s的PDP计算如下:PDP(x_s) = (1/n) Σ_{i=1}^{n} f(x_s, x_{C}^{(i)})其中,
x_s是关注的特征,x_{C}^{(i)}是第i个样本中其他特征的值,n是样本总数。 -
反事实解释:通过解释需要对输入做哪些最小改变才能获得不同的预测结果,来提供对模型决策的洞察。它寻找距离原始输入
x最近的点x',使得当输入模型时,预测结果发生变化:argmin_{x'} d(x, x'),满足 f(x') ≠ f(x)其中,
d是距离度量(如L2范数),f是模型的预测函数。
总结
本节课中,我们一起学习了人工智能伦理的基础知识。我们探讨了公平性、隐私、透明度和问责制等核心伦理领域,并通过案例研究了它们在实际中的应用。我们了解到,数学在形式化定义公平准则(如机会均等模型)和提供强大的隐私保护工具(如差分隐私)方面发挥着关键作用。同时,像LIME、SHAP这样的技术帮助我们打开AI黑盒,增强其决策的透明度。
需要强调的是,这里所涵盖的内容仅仅是AI伦理领域的冰山一角。随着AI技术的指数级增长,其伦理考量也在飞速发展。作为AI开发者,我们始终有责任以合乎伦理的方式进行工作,而数学将持续为这一领域带来所需的严谨性。
017:深度学习中的结构化概率建模 🧠
在本节课中,我们将学习如何将神经网络应用于实际场景,并探讨如何通过结构化概率模型来系统性地处理预测中的不确定性。我们将介绍概率模型的基本概念、核心方法及其在深度学习中的集成应用。
概述
现实世界的数据和预测充满了不确定性。结构化概率模型为我们提供了一个数学框架,用于表示和推理具有不确定性的系统。通过将概率理论与神经网络结合,我们可以量化不同结果的可能性,并在新信息到来时更新我们的认知。
什么是结构化概率模型?
上一节我们介绍了课程的目标,本节中我们来看看结构化概率模型的核心定义。
结构化概率模型本质上是基于概率理论的数学框架。它们用于表示和推理那些表现出不确定性的系统。神经网络所做的每一个预测都带有某种不确定性,我们需要找到处理这种不确定性的方法。
我们通过编码世界所有可能状态的知识以及每个状态发生的可能性来实现这一点。这些模型提供了一种结构化的方式来管理不确定性。推理过程使我们能够量化各种结果的概率,并对所有不确定性进行推理。
其核心在于,概率模型建立在概率论的基础上,这使我们能够以严谨的方式表示不确定性。我们利用概率分布来描述系统中变量的不确定性,并使用这些分布进行预测、做出推断,并在新信息到来时更新信念。
概率模型的作用与重要性
理解了基本概念后,我们来看看为什么这些模型如此重要。
概率模型在捕捉现实世界现象固有的不确定性方面起着至关重要的作用。它们的重要性源于能够正式地量化和管理不确定性。在处理真实、非学术性的、不“干净”的数据时,我们必须能够处理无处不在的不确定性。
以下是概率模型的主要作用:
- 量化不确定性:对预测中的不确定性进行度量。
- 整合先验知识:将已有的领域知识纳入模型。
- 更新信念:随着新信息的到来,更新模型的认知。
- 在不确定性下做出决策:为关键决策提供依据。
- 进行预测:构建预测模型。
- 理解复杂系统:分析系统内部的风险和不确定性。
- 优化资源分配:基于概率评估进行更高效的资源配置。
与深度学习的关键集成技术
了解了模型的作用,接下来我们看看如何将概率模型与深度学习相结合。

以下是三种关键的集成技术:
- 贝叶斯神经网络:通过引入权重的先验分布来量化模型本身的不确定性。
- 变分自编码器:将神经网络与概率图模型结合,用于生成任务。
- 深度高斯过程:使用深度神经网络学习特征表示,作为高斯过程的输入。
贝叶斯神经网络详解
上一节我们列出了几种集成技术,本节中我们深入探讨第一种:贝叶斯神经网络。
贝叶斯神经网络通过应用贝叶斯统计学来估计网络权重的不确定性,从而扩展了传统的神经网络。在标准神经网络中,权重从数据中学习并固定下来,这暗示了对预测模型有某种程度的置信度。
相比之下,贝叶斯神经网络将权重视为随机变量,并赋予其概率分布。这意味着权重不是固定的。这种方法允许贝叶斯网络表达模型预测中的不确定性,并提供了一个强大的框架,在决策制定至关重要的应用中尤其有用,例如医疗结果预测。
其核心思想是整合关于权重的先验知识,并根据新的观察结果更新这些知识。贝叶斯神经网络学习的是权重的分布,该分布反映了在看到数据之前对权重的先验信念,以及在给定权重下观察到数据的可能性。
其数学公式基于贝叶斯定理:
P(W|D) = [P(D|W) * P(W)] / P(D)
其中,P(W|D) 是给定数据 D 后权重 W 的后验分布,P(D|W) 是似然函数,P(W) 是先验分布,P(D) 是证据(或边缘似然)。
优势:
- 提供预测的不确定性估计,对医疗、自动驾驶、金融等领域至关重要。
- 对过拟合更加鲁棒,尤其是在小数据集上。
- 能够整合先验知识。
挑战:
- 计算成本高昂:计算权重上的后验分布非常耗时。
- 后验分布难以精确计算:由于神经网络参数空间维度极高,精确计算后验分布通常是不可行的。
处理计算挑战的近似方法
由于精确计算后验分布非常困难,我们需要使用近似方法。以下是几种常见的近似技术:
- 变分推断:用一个更简单的分布来近似真实的后验分布,通过最小化两个分布之间的散度来实现。它将问题转化为一个优化问题,计算上更可行。
- 马尔可夫链蒙特卡洛方法:直接从后验分布中采样,而无需显式计算它。虽然强大,但其本身计算量也可能很大。
- 拉普拉斯近似:用一个以最大后验估计为中心的高斯分布来近似后验。计算更简单,但在高维空间中可能无法很好地捕捉后验的真实形状。
- Dropout 近似:在测试时使用Dropout,已被提出作为一种实用的贝叶斯推断近似方法,能以计算高效的方式估计不确定性。
量化不确定性:偶然 vs 认知
贝叶斯神经网络的一个关键优势是能够量化两种不同类型的不确定性。
偶然不确定性(也称为统计不确定性)源于数据固有的随机性。这种不确定性无法通过收集更多数据来减少。它通常与数据中的噪声相关。在模型中,可以通过为输出层假设一个噪声分布(如高斯分布)来直接建模。其数学表示可以为:P(y|x, W) = N(f(x; W), σ²(x; W)),其中 f(x; W) 是均值预测,σ²(x; W) 是噪声方差。
认知不确定性(也称为模型不确定性)源于对底层系统缺乏完整了解。它代表了关于模型本身(如结构、参数)的不确定性。与偶然不确定性不同,认知不确定性可以通过收集更多数据来减少。贝叶斯神经网络通过将权重视为随机变量(具有后验分布 P(W|D))来量化这种不确定性。计算或近似这个分布可以评估我们的信念如何随数据变化。
通过整合所有可能的权重,贝叶斯神经网络可以计算新输入的预测分布,该分布同时包含了偶然和认知不确定性。

马尔可夫链蒙特卡洛方法
另一种重要的近似方法是MCMC。MCMC是一类用于从复杂概率分布中采样的算法。
它们通过构建一个马尔可夫链来生成样本,该链以目标概率分布作为其平稳分布。其思想是从一个任意点开始,迭代地在样本空间中移动到新点,设计的转移概率使得链最终收敛到目标分布。
Metropolis-Hastings算法是其中的关键,它通过基于接受概率来接受或拒绝提议的移动,从而实现从目标分布中采样。
Gibbs采样是MH算法的一个特例,其中移动总是被接受。它通过顺序地采样每个变量(以其他变量的当前值为条件)来工作,在高维但结构化的空间中很实用。
在深度学习中的应用:
- 贝叶斯深度学习:用于近似神经网络权重的后验分布。
- 不确定性估计:通过从后验分布中采样,估计深度学习模型中的预测不确定性,这对自动驾驶、医疗诊断等应用至关重要。
挑战:直接应用于深度学习模型面临高维参数空间和计算成本的挑战。变体如哈密顿蒙特卡洛和随机梯度MCMC已被开发出来以提高效率。
真实世界案例研究
最后,我们通过一些案例来看看结构化概率模型的实际影响力。
结构化概率模型通过整合对不确定性的细致理解,显著增强了深度学习在许多领域的应用。
以下是几个值得注意的案例:
- 图像生成与VAEs:变分自编码器利用结构化概率模型学习数据的潜在表示,在图像生成领域极具影响力。例如,VAE被用于从CelebA等数据集中生成高质量、多样化的人脸图像,捕捉了细微的面部特征和变化。
- 自然语言处理与LDA:潜在狄利克雷分配是一种用于发现文档主题结构的概率模型。与神经网络结合后,LDA可以增强主题发现和文本生成过程。例如,用LDA增强的深度学习模型在文本分类和生成任务中表现出色,产生了更连贯的主题和文本。
- 语音识别与DMMs:深度马尔可夫模型结合了深度学习和隐马尔可夫模型,能更有效地建模序列数据。它们被用于增强语音识别系统,为处理音频中的时间变化和噪声提供了更鲁棒的框架。
- 自动驾驶与贝叶斯网络:贝叶斯神经网络被用于自动驾驶中,预测其他车辆和行人的行为并关联不确定性,从而增强了在不确定环境中的决策过程。
- 药物发现与图神经网络:图卷积神经网络与概率模型结合,已被用于预测分子性质和相互作用,加速了药物发现过程。
总结

在本节课中,我们一起学习了结构化概率建模在深度学习中的核心作用。我们首先了解了概率模型如何为处理不确定性提供框架,然后探讨了贝叶斯神经网络如何通过将权重视为随机变量来量化偶然和认知不确定性。我们还介绍了应对计算挑战的近似方法,如变分推断和MCMC。最后,通过多个领域的实际案例,我们看到了这些技术如何解决复杂的现实世界问题,从图像生成、自然语言处理到自动驾驶和药物发现。掌握这些概念,将帮助你构建更稳健、可解释且能妥善处理不确定性的智能系统。
