《深度学习》(6-8章)读书笔记

发布于 2025-02-27  385 次阅读


以下内容基于llm以及人工编辑较正

深度前馈网络

基于梯度的学习

前言

  1. 线性模型的优化:凸优化问题
  • 线性回归、逻辑回归和支持向量机(SVM)等模型的代价函数是凸函数,意味着:

    • 存在唯一的全局最优解
    • 采用梯度下降或者直接求解线性方程组(如线性回归)都可以保证收敛
    • 无论从何种初始参数开始,理论上都能找到最优解(尽管数值计算上可能存在一些问题)。

2. 神经网络的优化:非凸优化问题

  • 神经网络由于包含非线性激活函数(如 ReLU、sigmoid、tanh),导致代价函数通常是非凸的:

    • 代价函数可能存在多个局部极小值、鞍点甚至平坦区域,不像凸函数那样有唯一的最优解。
    • 训练神经网络时,使用基于梯度的优化算法(如随机梯度下降 SGD)只能找到一个较优解,但不保证是全局最优解。
    • 由于代价函数复杂,神经网络训练时可能会卡在局部最小值或鞍点,甚至可能在某些区域收敛极慢。

3. 训练神经网络的挑战

  • 参数初始化至关重要

    • 权重应初始化为小的随机数,否则所有神经元可能学习到相同的特征,导致网络学习能力受限。
    • 偏置可以初始化为零或者小的正值。
  • 迭代优化方式

    • 由于无法直接求解全局最优解,神经网络通常使用梯度下降及其变种(如 Adam、RMSprop)来优化参数。
    • 这些方法的目标是尽可能降低损失函数的值,但不能保证找到真正的全局最优解。

4. 关键结论

  • 线性模型的训练是一个凸优化问题,可以保证收敛到全局最优解。
  • 神经网络的训练是一个非凸优化问题,只能通过梯度下降找到一个局部最优解,且受参数初始化影响较大。
  • 神经网络的优化通常需要更复杂的技巧,如合适的初始化策略、优化算法调整(如学习率衰减)、批归一化等,以提升训练稳定性和效果。

代价函数

神经网络的代价函数与线性模型的代价函数基本一致。大多数情况下,模型通过最大似然估计定义条件分布 ,并以交叉熵作为代价函数。

1. 最大似然与交叉熵

  • 现代神经网络普遍采用 最大似然估计 进行训练,对应的代价函数是 负对数似然,等价于交叉熵:
  • 对于高斯分布模型,最大似然推导出的代价函数为 均方误差(MSE)
  • 负对数似然的使用可以避免梯度消失问题,特别是对于包含指数函数的输出单元。

2. 学习条件统计量

  • 有时,我们仅需学习 的某个条件统计量,而非完整的分布

    • 均方误差(MSE) 最小化时,预测的值是 的均值:
    • 平均绝对误差(MAE) 最小化时,预测的值是 的中位数:
  • 但 MSE 和 MAE 在基于梯度的方法中效果较差,容易出现梯度消失,因此交叉熵更受青睐。

3. 输出单元的选择

  • 线性单元:适用于建模 高斯分布,主要用于回归任务:
  • Softmax 单元:用于建模 多项分布,适合分类任务,输出概率分布。
  • Sigmoid 单元:用于二分类任务,但可能导致梯度消失问题。

输出单元

这段文字主要讨论了神经网络中代价函数的选择与输出单元的选择之间的关系,并深入探讨了几种常见的输出单元:线性单元(用于高斯分布)、sigmoid单元(用于Bernoulli分布)、以及softmax单元(用于Multinoulli分布)。它们在神经网络中的作用和使用方式是不同的,每种输出单元的选择直接影响代价函数的形式以及网络的优化过程。

  1. 线性单元用于高斯输出分布

    • 高斯分布:当神经网络的输出层使用线性单元时,它会生成一个向量,这通常用于表示条件高斯分布的均值。使用最大似然方法训练时,代价函数变成最小化均方误差。
    • 挑战:线性单元难以处理协方差矩阵的正定性限制,因此在处理协方差矩阵时常常需要采用其他的输出单元。
  2. Sigmoid单元用于Bernoulli输出分布

    • Sigmoid单元:当任务需要预测一个二值型变量(例如二分类问题)时,sigmoid函数常用来输出。该函数通过将线性输出映射到(0, 1)区间,确保预测值是有效的概率。
    • 最大似然学习:通过最大化对数似然来训练sigmoid输出单元,使得网络能够高效地更新参数,避免梯度消失的问题。
  3. Softmax单元用于Multinoulli输出分布

    • Softmax单元:当问题涉及多个类别(例如多分类问题)时,softmax函数用于表示一个具有多个取值的离散型随机变量的概率分布。它通过对每个类别的对数输出进行指数化和归一化,确保每个输出值处于(0, 1)区间且总和为1。
    • 最大似然训练:Softmax函数也可以通过最大化对数似然来训练,避免了数值不稳定和梯度消失的问题。
4. 其他输出类型
  • 除了上述常见的输出单元,神经网络还可以扩展到几乎任何类型的输出层,最大似然原则为这些输出层设计了合适的代价函数。例如,可以学习一个条件高斯分布的方差(或者精度)来扩展到异方差模型,或者通过某种方式对高斯分布的协方差矩阵进行建模。

隐藏单元

  1. 隐藏单元的选择问题

    • 隐藏单元的设计是神经网络的核心问题之一,且至今没有很多明确的理论指导。选择适当的隐藏单元通常是试验和错误的过程,依赖于对训练结果的评估。
  2. 整流线性单元(ReLU)

    • 整流线性单元(ReLU)定义为 ,是默认的隐藏单元激活函数,易于优化,且与线性单元相似。
    • ReLU的梯度在激活状态下大而一致,通常能够加速神经网络的训练。
    • ReLU的缺点是它对某些输入可能无法激活,从而无法学习这些样本,导致“死神经元”问题。其扩展形式,如Leaky ReLU、PReLU和Maxout等,提供了解决方案。
  3. ReLU的扩展

    • Leaky ReLU:在负值区域使用一个小的非零斜率,避免“死神经元”问题。
    • PReLU:通过学习一个参数来决定负值区域的斜率。
    • Maxout:通过选择多个值中的最大值来扩展ReLU,能够表示多段线性函数,能够更灵活地拟合复杂的激活函数。
  4. Sigmoid与双曲正切(tanh)函数

    • Sigmoid函数 在其定义域的大部分范围内会出现饱和现象,导致梯度消失问题,不适合作为隐藏层激活函数。
    • 双曲正切函数(tanh)与Sigmoid类似,但在0处更接近单位函数,通常比Sigmoid效果更好。
  5. 其他隐藏单元

    • 线性单元:当神经网络仅由线性变换组成时,输出依然是线性的,但在某些情况下,线性单元能有效减少参数数量。
    • Softmax:通常用于多类分类的输出层,但也可用于某些高级结构的隐藏层。
    • 径向基函数(RBF):用于某些特定任务,但因为其对大部分输入值都为零,优化较为困难。
    • Softplus:ReLU的平滑版本,但在实践中效果不如ReLU。
    • 硬双曲正切(hard tanh):类似于tanh和ReLU,具有边界限制。
  6. 总结

    • 整体来说,ReLU及其扩展(如Leaky ReLU、PReLU和Maxout)是当前最为常用的隐藏单元,且它们表现出了优秀的训练效果和易于优化的特性。
    • 其他类型的隐藏单元,如Sigmoid和tanh,仍在一些特定情况下使用,但在深度网络中常常面临饱和性和梯度消失的问题。

架构设计

神经网络架构设计的关键要点包括以下几个方面:

  1. 网络架构的定义

    • 神经网络的架构指的是网络的整体结构,具体包括层的数量(网络深度)和每一层单元的数量(宽度),以及这些单元如何连接。

    • 神经网络通常由多个层组成,并且这些层以链式结构组织。每一层的输出是上一层的输入。比如:

      • 第一层:h(1)=g(1)(W(1)⊤x+b(1))h^{(1)} = g{(1)}(W{(1)}\top x + b^{(1)})
      • 第二层:h(2)=g(2)(W(2)⊤h(1)+b(2))h^{(2)} = g{(2)}(W{(2)}\top h^{(1)} + b^{(2)})
      • 以此类推。
  2. 架构设计的考虑

    • 选择网络的深度和每一层的宽度非常重要。更深的网络能减少每层需要的单元数量,从而减少参数,并通常能更好地泛化。但它也可能更难以优化。
  3. 万能近似定理

    • 万能近似定理(universal approximation theorem)指出,如果一个前馈神经网络有至少一个隐藏层且激活函数具有“挤压”性质(如logistic sigmoid),并且隐藏层有足够数量的单元,它可以近似任何连续的函数。
    • 对于一个特定任务,理想的架构通常需要通过实验验证,尤其是验证集上的误差。
  4. 网络深度与优化难度

    • 尽管单层网络可以表示任何函数,但它可能需要一个非常大的网络,这在实际应用中难以实现且难以优化。深度网络(多层)通常能够更有效地表达复杂函数,并且提高了泛化能力。
  5. 深度学习的优势

    • 更深的网络通常能更好地拟合数据,因为它们能学习更复杂的特征,并在不同层中组合这些特征。这种层次化的表示学习是深度神经网络的一个核心优势。
    • 从统计角度看,选择深度网络可以看作是隐含了函数应该是多个简单函数组合的假设。
  6. 其他架构设计考虑

    • 神经网络不一定需要简单的链式结构,层之间的连接可以更加复杂,例如通过跳跃连接(skip connections)使梯度更容易流动。
    • 除了标准的全连接网络,还有许多针对特定任务的架构,例如卷积神经网络(CNN)适用于图像任务,循环神经网络(RNN)适用于序列数据。
  7. 反向传播与梯度计算

    • 反向传播(backpropagation)是神经网络训练中的一个关键算法,它通过计算代价函数关于网络参数的梯度,指导参数更新以最小化损失。
    • 反向传播并不仅仅限于多层神经网络,也可以应用于其他类型的函数或任务中。

反向传播和其他的微分算法

  1. 前向传播(Forward Propagation)

    • 输入 通过神经网络向前流动,经过每一层的计算后,最终输出
    • 前向传播的目标是计算出一个标量代价函数 ,它衡量了输出与实际目标之间的误差。
  2. 反向传播(Back Propagation)

    • 反向传播算法用于计算代价函数 关于神经网络参数 的梯度。
    • 反向传播基于链式法则,通过计算图中的梯度信息,逐层向后传播梯度。
    • 反向传播并不是一种完整的学习算法,它仅仅是计算梯度的一个方法,通常与其他优化算法(如随机梯度下降)结合使用。
  3. 计算图(Computational Graph)

    • 计算图用于表示计算过程,其中每个节点表示一个变量,操作(如加法、乘法等)连接变量。
    • 操作是指输入变量的简单函数,计算图通过这些操作描述函数的计算流程。
  4. 链式法则(Chain Rule)

    • 微积分中的链式法则用于计算复合函数的导数,反向传播算法就是一种高效应用链式法则来计算梯度的方法。
    • 对于复合函数 ,链式法则可以表示为:
    • 这种思想可以扩展到多维情况,使用雅可比矩阵(Jacobian)进行梯度的计算。
  5. 递归计算反向传播

    • 反向传播在计算时会递归地应用链式法则,计算每个节点的梯度。
    • 在计算过程中,一些子表达式可能会重复计算。为避免重复计算,反向传播算法会选择是存储这些子表达式的结果,还是重新计算它们。
  6. 全连接多层感知机(MLP)中的反向传播

    • 全连接的多层感知机(MLP)在进行反向传播时,首先通过前向传播计算出输出和代价函数。
    • 然后反向传播算法逐层计算代价函数相对于每个参数的梯度,最后通过优化算法更新参数。
  7. 符号微分与数值微分

    • 符号微分:在计算图中,利用符号表达式来描述梯度,最终求得梯度的符号表示。
    • 数值微分:则是通过计算图的数值输入,得到在这些输入值处的梯度数值。
  8. 符号到符号的微分(Symbolic Differentiation)

    • 反向传播也可以通过符号微分得到梯度,方法是通过计算图的符号表示来计算导数,而不是直接计算数值。

 

深度学习中的正则化

机器学习的目标是设计能够在训练数据和新输入数据上都表现良好的模型。

过拟合和欠拟合是常见问题:

  • 欠拟合:模型过于简单,无法捕捉数据的真实规律。
  • 过拟合:模型过于复杂,过度拟合训练数据,泛化能力下降。

正则化(Regularization) 旨在减少泛化误差,即使得模型能更好地适应新数据。

深度学习的背景下,大多数正则化策略都会对估计进行正则化。估计的正则化以偏差的增加换取方差的减少。

  • 偏差(Bias):描述模型预测值与真实值的偏离程度。偏差高的模型通常是欠拟合的,无法很好地捕捉数据中的模式。
  • 方差(Variance):描述模型对数据的敏感程度。方差高的模型容易过拟合训练数据,在测试集上表现不佳。

假设我们有一个目标变量 和输入变量 ,真实的关系为:

其中:

  • 是数据的真实映射关系(但通常未知)。
  • 是噪声项,表示随机误差,满足 ,方差为

我们的模型 试图逼近 ,但由于数据有限、算法选择等因素,预测值 存在误差。

考虑均方误差(MSE):

将其展开:

由于噪声 与模型无关,且 ,可以分解为:

其中:

  • 第一项 反映模型学习的误差,可进一步拆解:

    其中:

    • 偏差(Bias) 衡量模型预测均值与真实值的偏离程度。
    • 方差(Variance) 衡量模型在不同训练集上的预测波动程度。
  • 第二项 是数据本身的噪声,无法消除。

最终得到误差分解:

其中:

  • 是模型的期望误差(均方误差,MSE)。
  • 偏差(Bias):预测的期望值与真实值的偏离程度。
  • 方差(Variance):模型对训练数据的敏感程度,即当训练数据发生微小变化时,模型预测结果的波动大小。
  • 是不可避免的噪声(irreducible error),与模型无关。

方差可以表示为:

它描述了预测值 围绕其均值的波动程度。如果方差大,则表明模型的预测结果在不同的训练数据集上变化较大,说明它对数据的敏感性很高。

参数范数惩罚

  • 参数范数惩罚 是最常见的正则化方法之一,它通过对参数值施加约束来控制模型复杂度。

  • 目标函数通常被修改为:

    其中:

    • 是原始目标函数(如损失函数)。
    • 是参数范数惩罚项。
    • 控制正则化强度。

L2 正则化(权重衰减)

  • L2 正则化(岭(Ridge)回归或 Tikhonov 正则)(Weight Decay)是最常见的正则化方法之一,惩罚项为:

  • 作用:

    • 促使权重趋向于零,但不会完全归零。

    • 在梯度下降过程中,参数更新规则变为:

      这表明在执行梯度更新前,会先对权重进行收缩(缩放因子为 )。

    • L2 正则化的梯度是 连续变化的(因为 的导数是 ),所以它只会逐渐减小权重,而不会直接设为 0。

    • 在 Hessian 分解下

      • 具有较大特征值的方向受正则化影响较小。
      • 具有较小特征值的方向会被更强地收缩。

L1 正则化

  • L1 正则化(Lasso)采用 L1 范数 作为惩罚项:

  • 作用:

    • 通过施加 绝对值惩罚,促使部分权重变为零,实现 特征选择

    • 梯度更新规则:

    • L1 正则化的梯度是 不连续的(因为 的导数在 0 处发生突变),这导致它能直接把某些权重压缩为 0。

    • 区别于 L2 正则化

      • L2 会让所有权重收缩但不会变为零;
      • L1 促使部分权重变为零,从而实现稀疏性。

作为约束的范数惩罚

正则化和欠约束问题

数据集增强

  • 定义:通过生成假数据或对现有数据进行变换来扩充训练集,从而提高模型的泛化能力。
  • 适用场景:特别适用于分类任务,尤其是图像分类(如对象识别),因为图像可以通过平移、旋转、缩放等操作进行变换。
  • 注意事项:变换操作不能改变数据的类别标签(如光学字符识别中不能翻转“b”和“d”)。
  • 其他任务:对于密度估计等任务,生成假数据较为困难。

噪声鲁棒性

噪声注入

  • 输入噪声:在输入层添加噪声(如高斯噪声)可以看作一种数据增强方式,有助于提高模型的鲁棒性。
  • 隐藏层噪声:向隐藏单元添加噪声也是一种有效的正则化方法,能够增强模型的泛化能力。
  • 权重噪声:在权重上添加噪声,特别是在循环神经网络中,可以解释为贝叶斯推断的随机实现,鼓励模型对权重的小变化不敏感。

标签平滑

  • 定义:通过将硬标签(0或1)替换为软标签(如ϵ/(k-1)和1-ϵ),防止模型过度拟合确切概率。
  • 优点:防止模型追求极端概率,同时不影响正确分类的学习。

半监督学习

  • 定义:利用未标记数据和标记数据共同训练模型,通常通过学习一个表示h=f(x),使得同类样本在表示空间中聚集。
  • 方法:生成模型和判别模型可以共享参数,通过权衡监督和无监督准则来获得更好的泛化性能。

多任务学习

  • 定义:通过共享多个任务之间的参数来提高泛化能力,假设不同任务之间存在某些统计关系。
  • 结构:模型通常分为任务特定参数和共享参数,共享参数从所有任务的数据中获益,统计强度更高。
  • 优点:当不同任务之间存在合理的关系时,共享参数可以显著改善泛化能力。

提前终止

在训练过程中,当验证集误差不再改善时,提前终止训练,并返回验证集误差最低时的模型参数。通过监控验证集误差,当误差在指定次数内没有改善时,终止训练。

参数绑定和参数共享

Dropout

  • 定义:Dropout 是一种正则化技术,通过在训练过程中随机丢弃(置零)神经网络中的部分单元(输入或隐藏单元)来防止过拟合。

  • 作用:Dropout 可以被视为一种 Bagging 的近似方法,它通过训练指数级数量的子网络(子模型)来实现集成学习的效果。

  • 优势

    • 计算高效:相比显式训练多个模型,Dropout 只需训练一个模型,通过随机掩码实现子网络的训练。
    • 功能强大:Dropout 能够显著提升模型的泛化能力。
  • 训练过程

    • 每次训练时,随机生成一个二值掩码(0 或 1),掩码值为 1 的概率由超参数决定(如输入单元 0.8,隐藏单元 0.5)。
    • 将掩码与网络单元的输出相乘,丢弃部分单元,然后进行前向传播和反向传播。
    • 掩码独立采样,每次训练时更新不同的子网络。
  • 目标:最小化所有可能掩码下的期望损失 ,其中 是掩码, 是模型参数。

  • Dropout 与 Bagging 的对比

    • Bagging

      • 训练多个独立的模型,并在测试时对多个模型的预测结果进行平均。
      • 对于大型神经网络,训练和评估多个模型的计算成本很高。
    • Dropout

      • 通过参数共享训练指数级数量的子网络,每个子网络继承父网络参数的不同子集。
      • 在测试时,通过权重比例推断规则(weight scaling inference rule)近似集成结果。
  • 权重比例推断规则

    • 原理:在测试时,将所有单元的权重乘以训练时该单元被包含的概率(如隐藏单元乘以 0.5)。
    • 目的:确保测试时单元的期望输入与训练时一致。
    • 优势:只需一次前向传播即可近似集成结果,计算效率高。
  • Dropout 的理论解释

    • Bagging 近似:Dropout 通过随机掩码训练多个子网络,近似 Bagging 的集成效果。
    • 特征冗余:Dropout 迫使每个隐藏单元在缺少其他单元的情况下也能表现良好,增强了特征的鲁棒性。
    • 生物学启发:Dropout 类似于生物进化中的基因交换,要求特征在不同模型中都能发挥作用。
  • Dropout 的适用性与局限性

    • 适用场景

      • 适用于使用随机梯度下降训练的模型,如前馈神经网络、循环神经网络和概率模型。
      • 在数据量较大时,Dropout 的正则化效果显著。
    • 局限性

      • 在小数据集上效果有限,其他方法(如贝叶斯神经网络)可能更优。

        • 需要增大模型规模以抵消 Dropout 减少的有效容量,可能增加计算成本。
  • Dropout 的变体与扩展

    • DropConnect:随机丢弃权重而非单元状态。
    • 随机池化:在卷积神经网络中随机化池化操作。
    • 快速 Dropout:通过解析近似减少随机性,加速训练和推断。
  • Dropout 与其他正则化方法的对比

    • 权重衰减:Dropout 与权重衰减不等价,前者通过随机掩码实现正则化,后者通过限制权重大小。
    • 批标准化:批标准化引入的噪声也有正则化效果,有时可以替代 Dropout。

深度模型中的优化

学习和纯优化有什么不同

间接优化:在机器学习中,通常通过优化代价函数 来间接优化性能度量 ,而不是直接优化

  • 目标函数:代价函数通常是训练集上的平均损失,如 ,其中 是每个样本的损失函数, 是输入为时模型的输出,是经验分布

  • 泛化误差:机器学习的目标是最小化期望泛化误差 ,但由于真实分布 未知,通常通过经验风险最小化来近似。

  • 经验风险:通过最小化训练集上的平均损失来近似最小化泛化误差,即 表示训练样本的数目

    • 过拟合:经验风险最小化容易导致过拟合,尤其是高容量模型可能会记住训练集。
  • 代理损失函数:当直接优化目标损失函数(如 0-1 损失)不可行时,使用代理损失函数(如负对数似然)来替代。

    • 0-1 损失:如果分类正确,损失为 0;如果分类错误,损失为 1。这种函数是离散的、非凸的,并且不连续。非凸性意味着损失函数可能存在多个局部极小值,而全局极小值难以找到;不连续性使得传统的基于梯度的优化方法(如梯度下降)无法直接应用,因为梯度在大多数地方为零或不存在。
  • 提前终止:在验证集上监控真实损失函数,并在过拟合发生前停止训练,以避免过拟合。

  • 批量梯度下降:使用整个训练集计算梯度,计算代价高但梯度估计准确。

  • 小批量梯度下降:使用小批量样本估计梯度,计算效率高且能利用数据冗余,通常使用 2 的幂数作为批量大小。

    • 更大的批量会计算更精确的梯度估计,但是回报却是小于线性的。
    • 极小批量通常难以充分利用多核架构。
    • 尤其是在使用 GPU 时,通常使用 2 的幂数作为批量大小可以获得更少的运行时间。
    • 可能是由于小批量在学习过程中加入了噪声,它们会有一些正则化效果。泛化误差通常在批量大小为 1 时最好。因为梯度估计的高方差,小批量训练需要较小的学习率以保持稳定性。
  • 随机梯度下降(SGD):每次使用单个样本更新参数,梯度估计方差大,但能快速收敛。

神经网络优化中的挑战

训练神经网络时,我们肯定会遇到一般的非凸情况。即使是凸优化,也并非没有任何问题。

  • 病态

    • 病态问题在神经网络训练中普遍存在,尤其是 Hessian 矩阵的病态会导致梯度下降效率低下。
    • 病态问题表现为梯度范数不显著缩小,但曲率增长迅速,导致学习率必须收缩,学习速度变慢。
  • 局部极小值

    • 非凸函数(如神经网络)可能存在多个局部极小值,但由于模型可辨识性问题,这些局部极小值通常具有相同的代价函数值。
    • 局部极小值并非主要问题,尤其是在大网络中,大部分局部极小值的代价都很小。
  • 高原、鞍点和其他平坦区域

    • 在高维空间中,鞍点比局部极小值更为常见,且鞍点附近的梯度通常很小。
    • 鞍点对一阶优化算法(如梯度下降)的影响尚不明确,但实验表明梯度下降通常能逃离鞍点。
    • 牛顿法等二阶方法在处理鞍点时可能会遇到困难。
  • 悬崖和梯度爆炸

    • 多层神经网络中可能存在斜率极大的悬崖结构,导致梯度更新不稳定。
    • 梯度截断技术可以有效应对梯度爆炸问题。
    • 悬崖结构在循环神经网络的代价函数中很常见,因为这类模型会涉及到多个因子的相乘,其中每个因子对应一个时间步。因此,长期时间序列会产生大量相乘。
  • 长期依赖问题

    • 深层网络(尤其是循环网络,由于其参数共享,某个计算图中包含一条反复与矩阵,那么 步后,相当于乘以)中,梯度消失和梯度爆炸问题会导致优化困难。
    • 梯度消失使得参数更新方向不明确,梯度爆炸则导致学习不稳定。
  • 非精确梯度

    • 大多数优化算法依赖于对梯度的估计,但这些估计通常是噪声或偏差的。
    • 代理损失函数的使用可以缓解梯度估计不精确的问题。

基本算法

1. 随机梯度下降(SGD)

  • 核心思想:SGD通过随机抽取小批量数据(mini-batch)计算梯度,而不是使用整个训练集,从而加速训练过程。

  • 算法流程

    1. 从训练集中随机抽取包含 个样本的小批量数据。
    2. 计算梯度估计:
    3. 更新参数:,其中 是第 步的学习率。
  • 学习率调整

    • 学习率 通常随时间逐渐降低,以保证收敛。

    • 常用策略是线性衰减学习率:,其中

      通常被设为需要反复遍历训练集几百次的迭代次数。通常 应设为大约 的 1%。主要问题是如何设置。若​ 太大,学习曲线将会剧烈振荡,代价函数值通常会明显增加。

    • 学习率的选择需要权衡:过大会导致振荡,过小会导致训练缓慢。如果初始学习率太低,那么学习可能会卡在一个相当高的代价值。

  • 收敛性

    • SGD的额外误差(excess error)在凸问题下为 ,在强凸问题下为
    • 对于大数据集,SGD可能在处理整个训练集之前就收敛。

2. 动量方法

  • 核心思想:动量方法通过累积之前梯度的指数衰减平均,加速学习过程,特别适用于高曲率或噪声梯度的情况。

  • 算法流程

    1. 初始化速度 和参数
    2. 计算梯度估计:
    3. 更新速度:,其中 是动量参数。
    4. 更新参数:
  • 物理类比

    • 动量类比于物理中的粒子运动,梯度相当于力,速度相当于动量。
    • 粘性阻力(正比于 )帮助粒子最终收敛到局部极小点。
  • 超参数

    • 控制之前梯度的衰减速度,通常取值在 0.5 到 0.99 之间。
    • 对应最大速度为梯度下降的 10 倍。

3. Nesterov 动量

  • 核心思想:Nesterov 动量是动量方法的改进版本,梯度计算在施加当前速度之后进行,添加了一个校正因子。

  • 算法流程

    1. 初始化速度 和参数
    2. 应用临时更新:
    3. 计算梯度(在临时点):
    4. 更新速度:
    5. 更新参数:
  • 优势

    • 在凸批量梯度情况下,Nesterov 动量将额外误差的收敛率从 改进到
    • 在随机梯度情况下,Nesterov 动量未改进收敛率,但在实践中仍能加速训练。

4. 学习率调整策略

  • 线性衰减:学习率从初始值 线性衰减到最终值 ,公式为 ,其中

  • 选择初始学习率

    • 初始学习率 的选择至关重要:过大会导致振荡,过小会导致训练缓慢。
    • 通常通过试验和误差选择,初始学习率应略高于迭代 100 次后表现最佳的学习率。
  • 监测学习曲线:通过观察目标函数值随时间的变化,调整学习率。

5. 收敛性分析

  • SGD 的收敛率

    • 在凸问题下,额外误差为
    • 在强凸问题下,额外误差为
  • 批量梯度下降 vs. SGD

    • 批量梯度下降在理论上比 SGD 有更好的收敛率,但 SGD 在大数据集上表现更优。
    • Cramér-Rao 界限指出,泛化误差的下降速度不会快于

6. 小批量大小的权衡

  • 小批量大小 的选择影响训练速度和梯度估计的方差。
  • 较大的小批量可以降低梯度估计的方差,但会增加计算成本。
  • 实践中,可以通过逐渐增大小批量大小,权衡批量梯度下降和 SGD 的优点。

参数初始化策略

深度学习的训练算法通常是迭代的,因此初始点的选择对算法的收敛性、收敛速度以及泛化性能有重要影响。现代初始化策略虽然简单且启发式,但尚未被完全理解。

1. 初始化的核心挑战

  • 迭代性:深度学习训练算法是迭代的,初始点的选择至关重要。

  • 影响

    • 初始点决定算法是否收敛、收敛速度以及最终解的质量。
    • 初始点还可能影响模型的泛化性能,即使代价相似的点也可能具有显著不同的泛化误差。
  • 对称性破坏:初始参数需要在不同单元间“破坏对称性”,即具有相同激活函数的单元必须有不同的初始参数,否则它们会以相同的方式更新。

2. 初始化方法

  • 随机初始化

    • 通常使用高斯分布或均匀分布随机初始化权重。

    • 初始分布的大小对优化和泛化有重要影响:

      • 较大的初始权重有助于破坏对称性,避免冗余单元,但可能导致梯度爆炸或激活函数饱和。
      • 较小的初始权重可能导致信号丢失或训练缓慢。
  • 启发式初始化

    • 全连接层:从分布 中采样权重,其中 是输入维度。
    • 标准初始化(Glorot & Bengio):从分布 中采样权重,其中 分别是输入和输出维度。
    • 正交初始化(Saxe et al.):初始化权重为随机正交矩阵,并调整非线性缩放因子
  • 稀疏初始化(Martens):每个单元初始化为恰好有 个非零权重,保持输入总数独立于输入维度。

3. 初始化的目标

  • 优化与正则化的权衡

    • 优化视角:权重应足够大以成功传播信息。
    • 正则化视角:权重应较小以避免过拟合。
  • 先验类比:初始化参数 接近 0 类似于强置均值为 的高斯先验,表明单元间不交互更有可能。

4. 偏置的初始化

  • 通常策略:偏置通常初始化为 0,但某些情况下需要非零初始化:

    • 输出单元:初始化偏置以匹配输出边缘统计。
    • 避免饱和:例如,将 ReLU 的偏置初始化为 0.1 以避免初始化时饱和。
    • 门控单元:例如,将 LSTM 遗忘门的偏置初始化为 1,以确保门在初始化时保持开启。

5. 方差或精确度参数的初始化

  • 通常策略:方差或精确度参数通常初始化为 1。
  • 边缘统计匹配:假设初始权重接近 0,设置偏置以匹配输出的边缘均值,并将方差参数设置为训练集输出的边缘方差。

6. 机器学习初始化

  • 无监督预训练:使用无监督模型训练的参数初始化监督模型。
  • 相关任务迁移:在相关任务上运行监督训练,以获得比随机初始化更快的收敛率。

7. 初始化的实践建议

  • 超参数搜索:将每层权重的初始数值范围设为超参数,使用随机搜索等方法优化。
  • 激活与梯度监测:通过观察小批量数据上的激活或梯度幅度,调整初始权重范围。
  • 自动调整:基于初始模型在单批数据上的行为反馈,自动调整初始权重。

8. 初始化的局限性

  • 理论不足:初始化策略的理论基础尚未完全建立,某些启发式方法可能不适用于所有情况。
  • 优化与泛化的冲突:某些初始化策略可能提高优化速度,但意外地增大泛化误差。

自适应学习率算法

在深度学习中,学习率是一个难以设置但对模型性能有显著影响的超参数。为了解决学习率设置的难题,研究者提出了多种自适应学习率优化算法。

  • 学习率的挑战:损失函数对参数空间中的某些方向高度敏感,而对其他方向不敏感,这使得学习率的选择非常困难。
  • 自适应学习率的动机:如果方向敏感性是轴对齐的,那么为每个参数设置不同的学习率,并在训练过程中自动调整这些学习率,是一种合理的策略。

2. Delta-bar-delta 算法

  • 核心思想:如果损失对某个参数的偏导保持相同符号,则增加该参数的学习率;如果偏导符号变化,则减小学习率。
  • 局限性:仅适用于全批量优化,不适用于小批量或增量优化。

3. AdaGrad 算法

  • 核心思想:独立调整每个参数的学习率,缩放因子为该参数梯度历史平方和的平方根。

    • 公式:,其中 是梯度平方累积变量。
  • 优点:在凸优化问题中具有良好的理论性质。

  • 缺点:梯度平方累积会导致学习率过早和过量减小,在深度学习中效果有限。

4. RMSProp 算法

  • 核心思想:改进 AdaGrad,使用指数加权移动平均来累积梯度平方,从而避免学习率过早减小。

    • 公式:
  • 优点:在非凸优化问题中表现良好,是深度学习中常用的优化算法之一。

  • 超参数:衰减速率 控制移动平均的范围。

5. Adam 算法

  • 核心思想:结合 RMSProp 和动量,使用梯度的一阶矩(动量)和二阶矩(梯度平方)的指数加权移动平均,并引入偏差修正。

    • 公式:

      • 一阶矩:
      • 二阶矩:
      • 偏差修正:
      • 参数更新:
  • 优点:对超参数选择鲁棒,广泛应用于深度学习。

  • 超参数:一阶矩衰减速率 ,二阶矩衰减速率

6. 算法选择

  • 常用算法:SGD、带动量的 SGD、RMSProp、带动量的 RMSProp、AdaDelta 和 Adam。

  • 选择依据

    • 目前没有绝对最优的算法,选择通常基于使用者对算法的熟悉程度和超参数调节经验。
    • 自适应学习率算法(如 RMSProp 和 Adam)通常表现鲁棒,适合大多数任务。

优化策略和元算法

批标准化(Batch Normalization)

背景与动机

在深度神经网络中,随着网络层数的增加,每一层的输入分布会发生变化(称为内部协变量偏移),导致训练过程变得不稳定。这通常需要非常小的学习率和仔细的参数初始化。批标准化通过标准化每一层的输入分布,缓解了这一问题。

原理

批标准化在每个小批量(mini-batch)中对激活值进行标准化,使其均值为 0,方差为 1。具体步骤如下:

  1. 计算小批量的均值 和方差

  2. 标准化激活值:

    其中 是一个很小的常数,用于避免除以零。

  3. 引入可学习的缩放参数 和偏移参数 ,使网络可以恢复原始表达能力:

实现细节
  • 在训练阶段,均值和方差通过小批量计算,并在反向传播中更新。
  • 在测试阶段,使用训练阶段累积的运行均值(running mean)和运行方差(running variance)进行标准化。
优点
  • 稳定训练过程,允许使用更大的学习率。
  • 减少对参数初始化的依赖。
  • 具有轻微的正则化效果,可以减少过拟合。
应用场景
  • 广泛应用于深度卷积神经网络(CNN)和循环神经网络(RNN)。
  • 在非常深的网络(如 ResNet)中尤为重要。

8.7.2 坐标下降(Coordinate Descent)

背景与动机

坐标下降是一种迭代优化方法,适用于目标函数可以分解为多个变量的情况。它通过依次优化每个变量或一组变量来简化问题。

原理
  1. 选择一个变量(或一组变量)进行优化,固定其他变量。
  2. 对该变量进行最小化,更新其值。
  3. 重复上述过程,直到收敛。
实现细节
  • 可以用于凸优化问题,尤其是在变量之间相对独立时。
  • 对于非凸问题,可能陷入局部最优。
优点
  • 计算简单,适用于大规模问题。
  • 在某些问题中(如稀疏编码),可以高效地求解。
应用场景
  • 稀疏编码、矩阵分解等分解问题。
  • 线性回归、逻辑回归等机器学习模型。

8.7.3 Polyak 平均(Polyak Averaging)

背景与动机

在优化过程中,参数可能会在最优值附近振荡。Polyak 平均通过平均优化轨迹中的参数值,获得更稳定的解。

原理
  1. 记录优化过程中的参数值

  2. 计算平均值:

  3. 在非凸问题中,通常使用指数衰减平均:

优点
  • 提高解的稳定性。
  • 在凸优化问题中具有理论收敛保证。
应用场景
  • 深度学习中的随机梯度下降(SGD)优化。
  • 强化学习中的策略优化。

8.7.4 监督预训练(Supervised Pretraining)

背景与动机

直接训练复杂的深度模型可能非常困难。监督预训练通过先训练一个简单的模型,再逐步训练更复杂的模型,简化了优化过程。

原理
  1. 训练一个浅层模型,解决简化的问题。
  2. 逐步添加层,使用先前训练的参数初始化新层。
  3. 对完整模型进行微调(fine-tuning)。
优点
  • 提供更好的初始参数,加速训练。
  • 有助于避免陷入局部最优。
应用场景
  • 深度神经网络(如 MLP、CNN、RNN)的初始化。
  • 迁移学习中预训练模型的应用。

8.7.5 设计有助于优化的模型

背景与动机

优化算法的性能很大程度上取决于模型的设计。通过设计易于优化的模型,可以显著提高训练效率。

设计策略
  • 使用线性变换和简单的激活函数(如 ReLU)。
  • 引入跳跃连接(skip connections),缓解梯度消失问题。
  • 添加辅助输出(auxiliary heads),提供额外的梯度信号。
优点
  • 简化优化过程,加速收敛。
  • 提高模型的表达能力。
应用场景
  • 深度残差网络(ResNet)。
  • GoogLeNet 等复杂架构。

8.7.6 延拓法和课程学习(Continuation Methods and Curriculum Learning)

背景与动机

延拓法通过构造一系列逐步变难的目标函数,简化优化问题。课程学习是一种延拓法,通过先学习简单的样本,再逐步学习复杂的样本,提高学习效率。

原理
  1. 构造一系列目标函数 ,难度逐步增加。
  2. 先优化简单的目标函数,再逐步优化更复杂的目标函数。
优点
  • 避免陷入局部最优。
  • 提高优化效率和模型性能。
应用场景
  • 自然语言处理(NLP)中的语言模型。
  • 计算机视觉中的目标检测和分类。

 

 

 

 

 

 

 


面向ACG编程