1. 机器学习基本概念 (Basic Concepts)

Video: https://www.youtube.com/watch?v=Ye018rCVvOo

1.1 主要机器学习任务类型 (Major Types of Machine Learning Tasks)

机器学习算法可以根据其学习目标和所处理的数据类型大致分为以下几类:

  1. 监督学习 (Supervised Learning)

    • 目标: 从带标签的训练数据(即每个数据点都有一个已知的“答案”或“目标输出”)中学习一个映射函数,以便对新的、未见过的数据进行预测。
    • 子类型:
      • 回归 (Regression):
        • 目标输出: 连续的数值 (a continuous scalar value)。
        • 例子: 预测房价、股票价格、温度。
          Image/Computer-Science/Machine Learning/1.png
      • 分类 (Classification):
        • 目标输出: 离散的类别标签 (a discrete class label) from a predefined set.
        • 例子: 图像识别(猫/狗)、邮件分类(垃圾/非垃圾)、疾病诊断(有病/无病)。 Image/Computer-Science/Machine Learning/2.png
          3.jpg
  2. 无监督学习 (Unsupervised Learning)

    • 目标: 从未带标签的数据中发现隐藏的模式、结构或关系。算法自行探索数据。
    • 子类型:
      • 聚类 (Clustering):
        • 目标: 将数据点分组成相似的集合(簇),使得同一簇内的数据点相似度高,不同簇之间的数据点相似度低。
        • 例子: 客户分群、异常检测。
      • 降维 (Dimensionality Reduction):
        • 目标: 减少数据特征的数量,同时保留重要信息,以便于可视化、提高效率或减少噪声。
        • 例子: 主成分分析 (PCA)、t-SNE。
      • 关联规则学习 (Association Rule Learning):
        • 目标: 发现数据项之间的有趣关系或关联。
        • 例子: 购物篮分析(“购买面包的人也倾向于购买牛奶”)。
      • **(概率)结构学习 (Probabilistic Structure Learning / Graphical Model Learning)
      • (部分属于此类):
        • 目标: 发现一组随机变量之间的概率依赖关系,并用图结构(如贝叶斯网络、马尔可夫网络)来表示这些关系。
        • 特性: 当没有预先指定变量间的关系,而是从数据中推断这些关系时,这通常被视为一种无监督的发现过程。它可以帮助理解数据的内在结构和生成机制。
        • 例子: 从基因表达数据中推断基因调控网络,从传感器数据中学习变量间的依赖。
  3. 强化学习 (Reinforcement Learning)

    • 目标: 智能体 (agent) 通过与环境 (environment) 交互来学习如何做出决策,以最大化累积奖励 (cumulative reward)。智能体通过试错来学习最优策略。
    • 例子: 训练机器人行走、棋类游戏AI (AlphaGo)、自动驾驶策略。

1.2 机器学习的步骤 (Steps in Machine Learning)

1.2.1 定义一个带有未知参数的函数/模型 (Define a Function/Model with Unknown Parameters)

机器学习的核心任务之一是从数据中学习一个函数(或模型),该函数能够很好地描述输入和输出之间的关系,或者发现数据中的潜在结构。这个函数通常包含一些未知参数 (unknown parameters),这些参数的值需要从训练数据中学习得到。

以一个简单的线性回归模型为例:

y=b+wx1

这里:

1.2.2 定义代价函数/损失函数以评估模型 (Define Cost/Loss Function to Evaluate the Model)

在定义了带有未知参数的模型之后,我们需要一种方法来衡量模型的预测结果与真实目标值之间的差异。这个衡量标准就是代价函数 (Cost Function)损失函数 (Loss Function)

我们可以从一个通用的角度来形式化地定义这个概念:

  1. 给定一个数据集 (Given a dataset D):
    我们的训练数据是一个包含 N 个样本的集合 D:

    D={(x1,y^1),(x2,y^2),,(xN,y^N)}

    其中,xn 是第 n 个样本的输入特征(例如,一张宝可梦的图片),y^n 是该样本对应的真实标签或目标值(例如,“拉达”)。
    (注:在此处以及李宏毅老师的课程中,y^ 常用来表示真实的、作为“帽子”或目标的标签。在其他文献中,y^ 也常用来表示模型的预测值。请根据上下文区分。)

  2. 定义函数的总损失 (Define the Total Loss of a Function):
    对于一个我们想要评估的函数(或模型、假设)h,它在整个数据集 D 上的总损失 L(h,D),通常定义为所有单个样本损失的平均值

    L(h,D)=1Nn=1Nl(h,xn,y^n)

    这里,l(h,xn,y^n) 是函数 h单个样本 (xn,y^n) 上的损失。它衡量了模型在该样本上的预测(即 h(xn))与真实标签 y^n 之间的差距。

现在,我们将这个通用框架应用到我们具体的参数化模型上。我们的“函数” h 是由未知参数(如 wb)定义的。因此,衡量函数好坏的总损失,实际上就成了衡量这组参数好坏的指标。

代价函数是参数的函数 (Loss is a function of parameters):
给定训练数据集,对于一组特定的模型参数(例如 wb),我们可以计算出模型在整个训练集上的总体表现。因此,代价函数 L 可以看作是这些未知参数的函数。例如,对于参数 wb,代价函数可以表示为 L(w,b)

L(w,b)=1Nn=1Nen

这里:

常见的单个样本损失计算方式 (en):

损失函数的作用 (The Role of the Loss Function):
损失函数告诉我们当前这组参数 (w,b) 的表现有多好 (how good a set of values is)。我们的目标是找到一组参数,使得这个损失函数的值最小。

误差平面 (Error Surface):
我们可以将损失函数 L(w,b) 想象成一个多维空间中的曲面,其中参数(如 wb)是坐标轴,损失函数的值是高度。这个曲面被称为误差平面 (Error Surface) 或损失平面。
Image/Computer-Science/Machine Learning/4.png (图示:损失值如何随着参数变化而变化,目标是找到曲面的最低点)

1.2.3 学习的目标:泛化 (The Goal of Learning: Generalization)

一旦我们定义了模型和损失函数 L(w,b),接下来的目标就是找到一组最优的参数 wb,使得损失函数的值最小。这个过程称为优化 (Optimization)

但在我们深入探讨如何进行优化(例如使用梯度下降)之前,一个根本性的问题值得思考:我们为什么相信,在一个有限的训练数据集上最小化损失,能帮助我们找到一个在所有未见过的真实数据上都表现良好的模型呢? 毕竟,我们真正关心的是模型在未来遇到新数据时的表现,而不是它在已经看过的训练数据上的表现。

这个问题引出了机器学习的核心目标:泛化 (Generalization)

20.png

这张图片从理论上解释了我们想要达成的目标以及如何实现它。让我们来分解一下其中的符号:

我们真正想要什么?(What do we want?)

我们最终的目标是:

L(htrain,Dall)L(hall,Dall)δ

这整个公式的含义是:我们希望,我们训练出的模型 (htrain) 的真实表现,与理论上最好的模型 (hall) 的表现之间的差距(即泛化差距, Generalization Gap)能够尽可能小(小于一个很小的数 δ)。

如何才能实现这个目标?

我们无法直接计算 L(h,Dall)。那么,我们需要对我们的训练集 Dtrain 提出什么样的要求,才能间接地保证上述目标呢?

答案是:我们的训练集 Dtrain 必须对 Dall 有足够的代表性。

数学上,这个“代表性”可以表示为一个更强的条件:

hH,|L(h,Dtrain)L(h,Dall)|δ/2

这个条件的意思是:对于我们考虑的任何一个可能的模型 h,它在训练集上的损失 L(h,Dtrain) 都应该非常接近它在所有数据上的真实损失 L(h,Dall)。换句话说,训练损失是真实损失的一个很好的估计

推导过程:

如果上述“代表性”条件成立,我们就可以推导出我们想要的目标:

  1. L(htrain,Dall)

    • 我们从我们模型的真实损失开始。
  2. L(htrain,Dtrain)+δ/2

    • 根据“代表性”条件,对于 htrain 而言,它的真实损失不会比它的训练损失大太多。
  3. L(hall,Dtrain)+δ/2

    • 这是关键一步。根据 htrain 的定义,它是在训练集 Dtrain 上使得损失最小的模型。因此,它的训练损失 L(htrain,Dtrain) 必然小于或等于任何其他模型在训练集上的损失,当然也包括 hall 的训练损失 L(hall,Dtrain)
  4. L(hall,Dall)+δ/2+δ/2

    • 再次使用“代表性”条件,这次是对于 hall。它的训练损失不会比它的真实损失大太多。
  5. =L(hall,Dall)+δ

    • 整理一下,我们就得到了最终的不等式。

结论:
这个推导告诉我们一个深刻的道理:只要我们的训练数据能够很好地代表整体数据分布,那么通过最小化训练集上的损失(这个过程也叫经验风险最小化, Empirical Risk Minimization, ERM),我们就有理论保证能找到一个泛化能力接近理论最优的模型。

但这引出了下一个关键问题:我们如何保证我们拿到的训练集 Dtrain 就是有代表性的,而不是一个“坏”的、有偏见的数据集呢?这就涉及到对失败概率的分析。

1.2.4 失败的概率 (Probability of Failure)

让我们更深入地探讨“坏”数据集的概念。一个训练集 Dtrain 被认为是“坏”的,如果它不满足我们之前提到的“代表性”条件。也就是说,存在至少一个我们可能考虑的模型 h,使得这个模型在 Dtrain 上的表现与它在真实世界 Dall 上的表现差异巨大。

21.png

这张图和公式从数学上分解了“坏”的概率。

1. 将“坏”分解 (Decomposing "Bad")

2. 使用联合界进行放缩 (Using the Union Bound)

直接计算并集的概率通常很复杂。因此,我们使用一个在概率论中常用的技巧——联合界 (Union Bound) 或布尔不等式 (Boole's Inequality)——来放缩它。

P(Dtrain is bad)hHP(Dtrain is bad due to h)

这个不等式告诉我们,总的失败概率不会超过所有单个失败事件概率的总和 (Sum, Σ)。如果我们能证明这个总和很小,那么总的失败概率就一定更小。

3. 霍夫丁不等式 (Hoeffding's Inequality)

现在,我们需要一个工具来计算单个失败事件的概率 P(Dtrain is bad due to h)霍夫丁不等式正是完成这个任务的强大工具。

它告诉我们,对于任何一个固定的模型 h,其在训练集上的损失与在真实世界上的损失之差大于某个值 ϵ 的概率,有一个指数级的上界:

P(|L(h,Dtrain)L(h,Dall)|>ϵ)2exp(2ϵ2N)

4. 综合结论

将联合界和霍夫丁不等式结合起来,我们就得到了一个关于总失败概率的上界:

P(Dtrain is bad)hH2exp(2ϵ2N)

如果我们的模型库 H 是有限的(包含 M 个模型),那么:

P(Dtrain is bad)M2exp(2ϵ2N)

这个最终的公式为我们的信念提供了坚实的数学支撑:只要我们的训练集 N 足够大,即使考虑到所有可能的模型,我们不幸抽到一个“坏”的、不具代表性的训练集的概率也会趋近于零。

为什么使用了验证集后,模型依然可能过拟合? (Why may the model still overfit after using the validation set)

(注:对于神经网络这种模型库 H 包含无限个函数的情况,需要更高级的理论如 VC 维 (VC Dimension) 来处理,但其核心思想与此类似。)

但是,这个结论中隐藏着一个微妙的矛盾,这引出了关于模型选择的核心问题。

1.2.5 模型复杂度的权衡 (Tradeoff of Model Complexity)

22.png

让我们再回顾一下泛化差距的保证:我们希望 L(htrain,Dall)L(hall,Dall)δ
根据之前的推导,为了让这个差距 δ 变小,我们需要:

两个相互冲突的目标

  1. 目标一:小的泛化差距 (Small Generalization Gap)

    • 为了让 L(htrain,Dall) 接近 L(hall,Dall),即我们训练出的模型接近理论最优模型,我们需要一个更小的模型库 |H|
    • 原因:模型库越小(模型越简单),过拟合的风险就越小,从有限数据中学到的规律就越可能适用于真实世界。
  2. 目标二:小的理论最低损失 (Small Theoretical Minimum Loss)

    • 我们不仅希望 htrain 接近 hall,我们还希望 hall 本身就很强,即 L(hall,Dall) 这个值本身要很小。
    • 要实现这一点,我们需要一个更大的模型库 |H|
    • 原因:一个更大的模型库(比如一个更深、更宽的神经网络)意味着我们的模型表达能力更强,能够拟合更复杂的数据关系。一个简单的线性模型库可能永远无法很好地解决复杂的图像识别问题,它的 L(hall,Dall) 本身就会很大。

图解权衡 (Interpreting the Diagram)

这张图非常直观地展示了这个矛盾:

鱼与熊掌可以兼得吗?(Can we have the fish and the bear's paw?)

这个问题的答案是“不可以”,这就是机器学习中的“没有免费的午餐”定理的一个体现。我们必须在两者之间做出选择和权衡。

实际操作中的意义:
我们的目标是找到一个复杂度适中的模型,使得 L(htrain,Dall) 这个最终的、我们真正关心的损失值达到最小。这通常意味着:

  1. 选择一个足够强大的模型库(比如一个深度神经网络),以确保 L(hall,Dall) 足够小。
  2. 同时使用大量的训练数据 (N) 和各种正则化 (Regularization) 技术(如权重衰减、Dropout等),来有效地减小泛化差距,防止过拟合。

理解这个权衡是设计和调试机器学习模型的关键。它指导我们如何根据问题的复杂度和可用数据量来选择合适的模型架构和训练策略。

1.2.6 参数优化 (Optimization)

霍夫丁不等式和上面的公式从理论上保证了,我们接下来要做的“参数优化”——在训练集上寻找最优模型——是一件有意义且大概率会成功的事情。

数学上,我们可以表示为:

w,b=argminw,bL(w,b)

这意味着我们要寻找使损失函数 L 达到最小值的参数 wb

主要方法:梯度下降 (Ways: Gradient Descent)
梯度下降是一种广泛应用于机器学习和深度学习中的迭代优化算法,用于寻找函数的最小值。其基本思想是沿着损失函数梯度下降最快的方向逐步调整参数。

梯度下降的步骤:

  1. 初始化参数 (Pick an initial value):
    随机选择或根据某种策略设定参数的初始值,例如 w0,b0

  2. 计算梯度 (Compute Gradient):
    计算损失函数 L 在当前参数点(例如 wt,bt)关于每个参数的偏导数(即梯度)。

    • 对于参数 w: Lw|w=wt,b=bt
    • 对于参数 b: Lb|w=wt,b=bt
      梯度指明了在该点函数值增长最快的方向。
  3. 确定更新量 (Determine Update Amount):

    • η (eta) 代表学习率 (Learning Rate),它是一个超参数 (Hyperparameters),控制每次参数更新的步长。
    • 参数更新的量由学习率乘以梯度的负值决定(因为我们要向梯度反方向,即下降方向移动):
      • w 的更新量: ηLw|w=wt,b=bt
      • b 的更新量: ηLb|w=wt,b=bt
  4. 更新参数 (Update Parameters):
    将当前参数值减去上一步计算的更新量,得到新的参数值:

    wt+1=wtηLw|w=wt,b=btbt+1=btηLb|w=wt,b=bt
  5. 迭代 (Update iteratively):
    重复步骤 2 到 4,直到损失函数收敛到足够小的值,或者达到预设的最大迭代次数,或者满足其他停止条件。

梯度下降的直观理解: 想象你在一个山上(误差平面),目标是走到山谷的最低点。在每一步,你都会观察当前位置哪个方向坡度最陡峭向下(梯度的反方向),然后朝着那个方向走一小步(步长由学习率控制)。


1.2.7 机器学习核心步骤与深度学习的关系 (Relationship of Core Machine Learning Steps to Deep Learning)

上述三个核心步骤——1. 定义一个带有未知参数的模型2. 定义一个损失函数来评估模型,以及 3. 通过优化算法寻找最优参数——构成了监督式机器学习的完整流程,并且这一框架在深度学习中得到了直接的应用和显著的扩展:

  1. 参数化模型的核心思想一致 (Consistent Core Idea of Parameterized Models):

    • 无论是简单的线性回归还是复杂的深度神经网络,其本质都是参数化的函数/模型,包含大量需要从数据中学习的未知参数(权重和偏置)。
    • 深度学习模型(如神经网络)通过多层非线性变换构建出表达能力极强的参数化函数。
  2. 损失函数作为统一的评估和优化目标 (Loss Function as a Unified Goal for Evaluation and Optimization):

    • 对于任何参数化模型,都需要一个损失函数来量化其预测与真实目标之间的差距。
    • 在深度学习中,训练的目标同样是找到一组使损失函数最小化的参数。
  3. 优化算法作为学习的驱动力 (Optimization Algorithms as the Engine of Learning):

    • 梯度下降及其变体是深度学习中最核心的优化工具。由于深度神经网络参数众多,损失函数的“误差平面”异常复杂,包含许多局部最小值、鞍点等。
    • 深度学习领域发展了许多先进的梯度下降变体,如:
      • 随机梯度下降 (Stochastic Gradient Descent, SGD): 每次使用单个样本计算梯度并更新,速度快但波动大。
      • Mini-batch 梯度下降: 每次使用一小批样本计算梯度,是 Batch GD 和 SGD 的折衷,也是目前最常用的方法。
      • 带动量的优化器 (Optimizers with Momentum): 如 Momentum, Nesterov Accelerated Gradient (NAG),通过引入动量项加速收敛并帮助越过小的局部极值点。
      • 自适应学习率优化器 (Adaptive Learning Rate Optimizers): 如 AdaGrad, RMSProp, Adam, AdamW,它们能为每个参数自动调整学习率,通常能更快收敛且对初始学习率不那么敏感。
    • 反向传播 (Backpropagation): 对于深度神经网络这样复杂的复合函数,高效计算梯度至关重要。反向传播算法利用链式法则,系统地计算损失函数关于网络中所有参数的梯度,为梯度下降提供“方向盘”。
  4. 深度学习的扩展与深化 (Extensions and Deepening in Deep Learning):

    • 模型复杂度与层级结构: 深度学习通过构建深层网络结构极大地扩展了模型的复杂度,使其能够学习从低级到高级的层次化特征表示。
    • 非线性能力: 深度学习模型广泛使用非线性激活函数,使其能够学习高度非线性的映射关系。
    • 特定任务的损失与模型: 针对各种复杂任务(图像识别、自然语言处理等),深度学习发展了特定的网络架构(如CNNs, RNNs, Transformers)和相应的损失函数。
    • 端到端学习 (End-to-End Learning): 深度学习常常实现“端到端”学习,即从原始输入直接学习到最终输出,整个过程由参数通过最小化损失函数自动学习得到。

总结来说,"定义模型"、"定义损失函数" 和 "优化参数" 这三个步骤是机器学习(尤其是监督学习)的基本骨架。深度学习在这个骨架的基础上,通过构建更复杂强大的模型(神经网络)、采用合适的损失函数,并利用高效的优化算法(如基于反向传播的梯度下降及其变体),来解决更具挑战性的问题并取得了巨大成功。理解这三个基本步骤及其在深度学习中的具体实现,是掌握深度学习原理的关键。


2. 深度学习基本概念 (Basic Concepts of Deep Learning)

Video: https://www.youtube.com/watch?v=bHcJCp2Fyxs

2.1 步骤一:定义带有未知参数的函数/模型 (Step 1: Define a Function/Model with Unknown Parameters)

2.1.1 动机:线性模型的局限性 (Model Bias of Linear Models)

线性模型,如 y=b+wx1y=b+jwjxj,在许多情况下非常有用且易于解释。然而,它们具有固有的模型偏差 (Model Bias),这意味着它们只能表示输入和输出之间的线性关系。

2.1.2 构建更灵活的模型:分段线性函数 (Building More Flexible Models: Piecewise Linear Functions)

为了克服线性模型的局限性,我们需要能够表示非线性关系的更灵活的模型。一种方法是使用分段线性函数 (Piecewise Linear Curves)

2.1.3 推广到多特征输入:构建神经网络模型 (Generalizing to Multiple Features: Building a Neural Network Model)

上面的讨论是基于单个输入特征 x1。现在,我们将这个思想推广到具有多个输入特征 xj 的情况。

2.1.4 模型的未知参数集 (θ) (The Set of Unknown Parameters in the Model, θ)

在我们定义的神经网络模型中,例如单隐藏层网络:

y=f(x;W,bhidden,cT,boutput)=cTσ(Wx+bhidden)+boutput

存在一系列需要通过从数据中学习来确定的未知参数 (Unknown parameters)

这些参数具体包括:

  1. 输入层到隐藏层的权重矩阵 (W):

    • 这是一个矩阵,其维度通常是 (隐藏层神经元数量 N1) × (输入特征数量 N0)。
    • 它包含了连接每个输入特征到每个隐藏层神经元的所有权重。
  2. 隐藏层的偏置向量 (bhidden):

    • 这是一个列向量,其维度是 (隐藏层神经元数量 N1) ×1
    • 8.png 中用绿色的 b 表示(为了区分,我们这里用 bhidden)。
    • 它包含了每个隐藏层神经元的偏置项。
  3. 隐藏层到输出层的权重向量 (cTc):

    • 如果输出 y 是一个标量(如回归或二分类的logit),那么 cT 是一个行向量,维度是 1× (隐藏层神经元数量 N1)。或者其转置 c 是一个列向量,维度是 (N1×1)。
    • 8.png 中用橙色的 c^T 表示。
    • 它包含了连接每个隐藏层神经元到输出单元的权重。
  4. 输出层的偏置 (boutput):

    • 这是一个标量值。
    • 8.png 中用灰色的 b 表示(为了区分,我们这里用 boutput)。
    • 它是输出单元的偏置项。

将所有参数集合为单一向量 θ:

Image/Computer-Science/Machine Learning/8.png

为了在后续的优化过程中(例如使用梯度下降)更方便地处理这些不同形状和类型的参数,通常会将它们全部 “展平 (flattened)” 并按特定顺序串联起来,形成一个单一的、非常长的参数向量 θ**。

如图 8.png 所示,这个参数向量 θ 可以这样构成:

所以,这个参数向量 θ 可以表示为:

θ=(θ1θ2θ3θK)

其中 K 是模型中所有独立参数的总数量。例如,如果 WN1×N0bhiddenN1×1cT1×N1boutput 是标量,则 K=N1N0+N1+N1+1

模型函数以 θ 为参数:
通过这种方式,我们可以将整个神经网络模型函数 f 视为以输入 x 和这个单一的参数向量 θ 为参数的函数:

y=f(x;θ)

下一步:
在明确了模型的函数形式 f(x;θ) 并识别出所有未知参数 θ 之后,机器学习的下一步骤将是定义一个代价函数来评估使用特定 θ 时模型的表现,然后使用优化算法来找到使代价函数最小化的最优 θ

2.1.5 模型的扩展:从回归到多分类 (Extending the Model: From Regression to Multi-class Classification)

到目前为止,我们讨论的模型(例如 y=b+iciai)主要用于回归任务,即预测一个连续的数值。但是,许多现实世界的问题是分类任务,特别是多分类 (Multi-class Classification),例如将图像识别为“猫”、“狗”或“鸟”。

为了让我们的神经网络能够处理多分类问题,我们需要对模型的输出层进行修改。

  1. 修改输出层结构:

    • 在回归任务中,输出层通常只有一个神经元,输出一个标量值。
    • 在一个有 K 个类别的多分类任务中,输出层需要有 K 个神经元,每个神经元对应一个类别。
    • 网络最后一层在激活函数之前的输出,我们称之为 logits。对于一个输入样本 x,模型会输出一个包含 K 个分数的向量 z=[z1,z2,,zK]。其中,zi 可以被看作是模型认为输入样本属于第 i 类的原始置信度分数。
  2. 转换输出为概率分布:

    • 这些原始的 logits 分数(zi)可以是任意实数(正数、负数或零),并且它们的和不一定为 1。这不符合我们对“概率”的直观理解。
    • 我们需要一个函数,能将这个 logits 向量 z 转换成一个有效的概率分布向量 y^,其中每个元素 y^i 表示样本属于第 i 类的概率。这个概率分布需要满足两个条件:
      1. 所有概率值都在 0 和 1 之间 (0y^i1)。
      2. 所有概率值之和为 1 (i=1Ky^i=1)。
    • 这个转换函数就是 Softmax 函数

2.1.6 输出层激活函数:Softmax (Output Layer Activation: Softmax)

Softmax 函数通常用作多分类神经网络输出层的激活函数。它接收一个包含 K 个实数值的向量(logits),并将其转换为一个 K 维的概率分布。

定义与计算 (Definition and Calculation):

如上图所示,假设神经网络的输出层在应用 Softmax 之前的原始输出(logits)为向量 yraw=[y1,y2,,yK] (注意:此处的 yi 对应我们之前提到的 logits zi)。Softmax 函数计算得到最终的概率输出 y=[y1,y2,,yK] (此处的 yi 对应我们最终的预测概率 y^i)。

对于第 i 个类别的概率 yi,其计算公式为:

yi=exp(yi)j=1Kexp(yj)

计算步骤:

  1. 取指数 (Exponentiate): 对每一个原始输出分数 yi 应用指数函数 exp()。这有两个作用:
    • 将所有值(包括负数和零)映射到正数。
    • 放大不同分数之间的差异,使得较大的分数在指数化后变得更大。
  2. 求和 (Sum): 将所有指数化后的值 exp(yj) 相加,得到一个归一化常数。
  3. 归一化 (Normalize): 将每个指数化后的值 exp(yi) 除以这个总和。

经过 Softmax 处理后,输出向量 y 的每个元素 yi 都在 [0, 1] 区间内,并且所有元素的总和为 1,因此可以被完美地解释为模型预测的概率分布。yi 就代表了模型预测输入样本属于类别 i 的概率。

2.2 步骤二:定义代价函数/损失函数以评估模型 (Step 2: Define Cost/Loss Function to Evaluate the Model)

步骤一 (2.1) 中,我们定义了一个带有未知参数 θ 的模型函数 y=f(x;θ)。现在,我们需要一种方法来衡量这个模型在使用特定参数集 θ 时,其预测结果与真实目标值之间的差异有多大。这个衡量标准就是代价函数 (Cost Function)损失函数 (Loss Function)

2.2.1 代价函数/损失函数 (Cost Function / Loss Function)

2.2.2 分类问题的损失函数:交叉熵 (Loss Function for Classification: Cross-Entropy)

现在我们有了模型的概率输出 y^(即 Softmax 的输出 y),我们需要一个损失函数来衡量这个预测的概率分布与真实的类别标签之间的差距。对于分类问题,最常用的损失函数是交叉熵损失 (Cross-Entropy Loss)

真实标签的表示:One-Hot 编码

首先,我们需要将真实的类别标签表示成和模型输出相同维度的概率分布。这通常通过 One-Hot 编码实现。如果一个样本的真实类别是第 k 类(在一个共 K 个类别的任务中),那么它的 One-Hot 编码向量 ytrue 就是一个长度为 K 的向量,其中第 k 个元素为 1,其余所有元素都为 0。

交叉熵损失的计算

交叉熵损失衡量了两个概率分布之间的“距离”。给定真实标签的 One-Hot 向量 ytrue 和模型预测的概率向量 y^,交叉熵损失 L 的计算公式为:

L(θ)=k=1Kytrue,klog(y^k)

这样,通过使用 Softmax 输出层和交叉熵损失函数,我们可以构建和训练用于解决多分类问题的深度神经网络,并通过梯度下降等优化算法来调整参数 θ,使得模型对正确类别的预测概率越来越高。

19.png

2.3 步骤三:参数优化 (Step 3: Optimization)

一旦我们定义了模型 f(x;θ) 和损失函数 L(θ),我们的目标就是找到一组最优的参数 θ,使得损失函数 L(θ) 的值最小。这个寻找最优参数的过程称为优化 (Optimization)

数学上,我们可以表示为:

θ=argminθL(θ)

这意味着我们要寻找使损失函数 L 达到最小值的参数向量 θ

2.3.1 核心优化算法:梯度下降及其变体

2.3.1.1 梯度下降 (Gradient Descent)

梯度下降是一种广泛应用于机器学习和深度学习中的迭代优化算法,用于寻找函数的最小值。其基本思想是沿着损失函数梯度下降最快的方向逐步调整参数。

梯度下降的步骤:

  1. 初始化参数 (Initialize Parameters):

    • 随机选择或根据某种策略设定参数向量 θ 的初始值,记为 θ0。(Randomly) Pick initial values θ0.
  2. 迭代更新 (Iteratively Update): 重复以下操作直到满足停止条件:

    • a. 计算梯度 (Compute Gradient):

      • 计算损失函数 L(θ) 在当前参数点 θt (其中 t 是迭代次数) 关于参数向量 θ 中每一个分量 θk 的偏导数。这些偏导数共同构成了损失函数在 θt 处的梯度向量 (gradient vector) g (或 L(θt))。g=L(θt)=(Lθ1Lθ2LθK)θ=θt
      • 在神经网络中,这个梯度通常通过反向传播 (Backpropagation) 算法高效计算。
      • 当使用 mini-batch 时,计算的是 Lbatch(θ) 的梯度。
        Image/Computer-Science/Machine Learning/9.png
      • (图示:梯度指向函数增加最快的方向)
    • b. 更新参数 (Update Parameters):

      • 根据梯度信息,沿着梯度的反方向更新参数,以减小损失函数的值。θt+1θtηg或者写成:θt+1θtηL(θt)
      • 其中:
        • θt+1 是更新后的参数向量。
        • θt 是当前迭代的参数向量。
        • η (eta) 是学习率 (Learning Rate),它是一个正的小值(超参数),控制每次参数更新的“步长”或幅度。学习率的选择对训练过程至关重要。
        • g (或 L(θt)) 是在 θt 处计算得到的梯度向量。
  3. 停止条件 (Stopping Condition):

    • 可以设定最大迭代次数 (或最大 epoch 数)。
    • 可以监控损失函数的值,当其变化很小或不再下降时停止。
    • 可以监控在验证集上的性能,当验证集性能不再提升(甚至开始下降,表明过拟合)时停止(早停法 Early Stopping)。

Image/Computer-Science/Machine Learning/10.png

2.3.1.2 批量大小的选择 (The Choice of Batch Size)

在实践中,我们很少一次性使用整个训练集来计算梯度并更新参数。相反,我们会根据每次更新所使用的样本数量,将梯度下降分为三种主要类型。批量大小 (Batch Size) 的选择是一个重要的超参数,它在计算效率模型性能之间做出了权衡。

特性 批量梯度下降 (Batch GD) 随机梯度下降 (SGD) 小批量梯度下降 (Mini-batch GD)
批量大小 整个数据集 (N) 1 介于 1 和 N 之间 (e.g., 32, 64)
更新速度 非常慢 非常快
收敛路径 平滑、直接 噪声大、曲折 相对平滑,有小幅波动
内存占用 非常高 非常低 中等
优点 梯度准确,稳定 更新快,能跳出局部最优 综合了两者的优点,是实践首选
缺点 速度慢,易陷于尖锐极值 噪声大,收敛不稳定 需要额外设定 batch size 超参数

但是由于GPU的并行运算,在数据集较小的时候,Mini-batch GD不一定比Batch GD快

2.3.1.3 动量法 (Momentum)

为了解决梯度下降在狭窄山谷中震荡和在平坦区域停滞的问题,可以引入动量 (Momentum)


2.3.2 优化中的泛化与几何视角

2.3.2.1 批量大小对模型泛化能力的影响

除了影响训练速度和稳定性,批量大小还会对模型的泛化能力 (Generalization Performance) 产生显著影响。泛化能力指的是模型在未见过的测试数据上的表现,通常用验证集准确率 (validation accuracy) 来衡量。

Image/Computer-Science/Machine Learning/13.png

上图展示了在两个不同的数据集(MNIST 和 CIFAR-10)上,最终达到的训练准确率(train acc)和验证准确率(validation acc)与批量大小(batch size)的关系。

关键观察 (Key Observations):

  1. 大批量 (Large Batch) 倾向于损害泛化能力:

    • 在这两个实验中,当批量大小变得非常大时(例如,超过1000),验证集准确率(橙色线) 明显下降。
    • 这意味着虽然模型在训练集上可能表现尚可(虽然训练准确率也在下降),但它在新数据上的表现变差了。我们称之为泛化差距 (Generalization Gap) 变大。
  2. 小批量 (Small Batch) 通常能获得更好的泛化能力:

    • 使用较小的批量大小(例如,1到几百之间)时,模型在验证集上取得了更高的准确率。
    • 这表明小批量训练出的模型具有更好的泛化能力。

为什么会出现这种现象?—— 损失曲面的“平坦度”

一个被广泛接受的解释是,小批量梯度下降所引入的噪声有助于优化过程找到更“平坦”的局部最小值,而大批量梯度下降倾向于收敛到更“尖锐”的局部最小值

论文实证:《On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima》

这篇著名的论文 (https://arxiv.org/abs/1609.04836) 通过大量实验系统地验证了这一现象。

14.jpg

为什么“带噪声”的更新更好?

Image/Computer-Science/Machine Learning/15.jpg

这张示意图从另一个角度解释了为什么小批量的噪声更新是有益的。

总结:

因此,在实践中,选择一个合适的(不大也不太小)的 mini-batch size(如32, 64, 128, 256等)是在训练效率和模型最终性能之间取得平衡的关键策略。

2.3.2.2 优化进阶:泰勒展开与损失曲面近似 (Advanced Optimization: Taylor Expansion & Loss Surface Approximation)

在梯度下降中,我们利用损失函数的一阶导数(梯度)来确定下降方向。为了更深入地理解优化过程,特别是更高级的优化算法(如牛顿法),我们可以使用泰勒级数 (Taylor Series) 来近似损失函数。

泰勒展开的核心思想是,在任意一个参数点 θ 附近,我们可以用一个更简单的多项式函数来近似复杂的损失函数 L(θ)。对于优化而言,通常使用到二阶的泰勒展开就足够了。

Image/Computer-Science/Machine Learning/11.png

如上图所示,在点 θ 附近的二阶泰勒展开为:

L(θ)L(θ)+(θθ)Tg+12(θθ)TH(θθ)

临界点分析 (Analysis at Critical Points)

当梯度下降进行到某一步时,如果梯度 g=L(θ)=0,我们称 θ 为一个临界点 (Critical Point)。在临界点,梯度下降会停止更新,因为它找不到下降的方向。此时,泰勒展开的一阶项为零,损失函数的行为完全由二阶项决定:

L(θ)L(θ)+12(θθ)TH(θθ)

v=(θθ),我们可以通过海森矩阵 H 的性质来判断这个临界点的类型:

如何逃离鞍点 (Don't be afraid of Saddle Point!)

Image/Computer-Science/Machine Learning/12.png

在高维空间中(例如深度神经网络的参数空间),鞍点远比局部最小值点更常见。那么,当梯度下降卡在鞍点时(因为梯度为零),我们该怎么办呢?海森矩阵 H 告诉了我们逃离的方向!
鞍点的最速逃离方向 (The fastest escape direction for the stationed point)

实际应用中的意义:

虽然在大型神经网络中显式地计算整个海森矩阵及其特征向量的成本极高,但这个理论非常重要:

  1. 它解释了为什么鞍点在理论上不是一个根本性的障碍。总有“下山”的路可走。
  2. 许多先进的优化算法,如带动量的SGD、Adam等,虽然没有直接计算海森矩阵,但它们引入的机制(如动量)在实践中能帮助模型“冲过”平坦区域和鞍点。
  3. 一些二阶优化算法的变体(如Hessian-Free优化)会尝试用更高效的方法来近似海森矩阵与某个向量的乘积(即 Hv),从而利用曲率信息来逃离鞍点和加速收敛。

与优化的关系:

  1. 梯度下降 (Gradient Descent): 只考虑一阶信息(梯度 g),可以看作是在一个线性的近似下寻找下降方向。它简单高效,但不知道“走多远”最合适(需要手动设置学习率 η),也无法很好地处理不同方向上曲率差异很大的情况(例如狭长的山谷)。

  2. 牛顿法 (Newton's Method): 同时考虑一阶(梯度 g)和二阶信息(海森矩阵 H)。它通过找到上述二次近似函数的最小值点来确定下一步的更新方向和步长。更新规则为 θt+1=θtH1g

    • 优点: 收敛速度通常比梯度下降快得多,因为它利用了曲率信息,能够更直接地跳向最小值点。
    • 缺点: 计算和存储海森矩阵 H 以及其逆矩阵 H1 的开销巨大。对于有数百万参数的深度神经网络来说,这是不现实的。

因此,在深度学习中,虽然我们不直接使用标准的牛ton法,但许多先进的优化器(如 Adam、RMSProp 等)都受到了“利用曲率信息来调整步长”这一思想的启发,它们通过各种方式来近似海森矩阵的信息,以实现比朴素梯度下降更快的收敛。泰勒展开为理解这些高级优化算法提供了坚实的理论基础。

“最小比率”:一个用于分析损失曲面几何的指标 (The "Minimum Ratio": A Metric for Analyzing Loss Surface Geometry)

重要澄清: 此处讨论的 "Minimum ratio" 是一个用于分析海森矩阵特性的指标,与线性规划单纯形法 (Simplex Method) 中的 "Minimum Ratio Test" 完全无关

在深度学习的优化研究中,研究者们有时会使用一个比率来量化损失函数在某个特定点 θ 附近的几何形状,特别是判断它有多像一个真正的“谷底”(局部最小值)。你提供的图片中就定义了这样一个比率:

Minimum ratio=Number of Positive EigenvaluesTotal Number of Eigenvalues

这个指标的意义是什么?

这个比率衡量了在当前点,损失曲面在所有主轴方向中,有多少个方向是“向上弯曲”的(即具有正曲率)。

如何解读这个比率的值?

  1. 当 Ratio ≈ 1.0 时:

    • 这意味着几乎所有的特征值都是正的。
    • 海森矩阵 H 近似于一个正定矩阵
    • 当前点 θ 的几何形状非常像一个真正的局部最小值,即一个在所有方向上都向上弯曲的“碗”或“盆地”。在优化过程中,我们希望找到的就是这样的点。
  2. 当 Ratio ≈ 0.5 时:

    • 这意味着大约一半的特征值是正的,另一半是负的。
    • 这是鞍点 (Saddle Point) 的一个典型特征。损失曲面在很多方向上向上弯,但在同样多的方向上向下弯。
  3. 当 Ratio ≈ 0.0 时:

    • 这意味着几乎所有的特征值都是负的。
    • 海森矩阵 H 近似于一个负定矩阵
    • 当前点 θ 的几何形状非常像一个局部最大值,即一个在所有方向上都向下弯曲的“山峰”。

为什么叫 "Minimum ratio"?

这个名字可能有些令人困惑。一个可能的解释是,这个比率是用来分析和表征损失函数的最小值点 (loss minimum) 的。一个“好的”最小值点,其“Minimum ratio”应该接近1。因此,这个比率可以看作是衡量一个临界点“有多好”或者“有多像一个真正的最小值”的指标。在文献中,你可能也会看到它被称为正特征值比率 (Positive Eigenvalue Ratio)局部凸性比率 (Local Convexity Ratio),这些名字可能更具描述性。

在训练过程中,模型参数从一个随机初始点开始,可能会经过许多“Minimum ratio”较低的区域(鞍点),最终收敛到一个“Minimum ratio”接近1的区域(一个好的局部最小值)。


注:

拓展:
1. 为什么我们要的是 "Deep" 的 network 而不是 "Fat" 的?
Deep 而非 Fat 的 Neural Network
2. 为什么我们不 "Deeper" ?
不一直 Deeper 的神经网络

2.3.2.3 优化再进阶:自适应学习率 (Adaptive Learning Rate)

在标准的梯度下降法中,所有参数共享同一个固定的学习率 η。然而,这往往不是最优的策略。

核心思想:不同的参数需要不同的学习率。
Image/Computer-Science/Machine Learning/17.png

观察上图的损失曲面等高线图。这是一个狭长的“山谷”形状,是优化中非常典型的情况。

这个矛盾揭示了固定学习率的局限性。一个理想的优化器应该能够自动地为每个参数调整学习率,即实现自适应学习率

自适应学习率的数学形式

  1. 标准梯度下降更新规则:

    • 对于第 i 个参数 θi,其在第 t 次迭代的更新规则是:θit+1θitηgit
    • 其中,git=Lθi|θ=θt 是当前时刻的梯度。
    • 这里的学习率 η 是一个全局的、固定的超参数 (hyperparameter)
  2. 引入参数依赖的学习率:

    • 为了让学习率对每个参数“自适应”,我们可以将全局学习率 η 除以一个与该参数相关的项 σitθit+1θitησitgit
    • 这里的 ησit 就是第 i 个参数在第 t 时刻的有效学习率 (effective learning rate)
    • 关键问题: 如何设计这个参数依赖 (Parameter dependent) 的项 σit

如何设计 σit

我们的目标是让陡峭方向的有效学习率变小,平缓方向的有效学习率变大。

一个自然的想法就是,让 σit 累积该参数过去所有梯度的大小

这正是许多先进优化算法的核心思想: