Advertisement

An Overview of Optimizers used in Neural Networks and H

阅读量:

作者:禅与计算机程序设计艺术

1.简介

神经网络(NN)是以误差逆传播(BP)为基本原理的一种无监督学习方法,并且能够提取数据中的潜在规律和特征模式。然而,在处理复杂的非线性数据集、多模态数据以及具有长时记忆的任务等方面时,默认使用的标准优化算法可能会遇到挑战。本文旨在介绍深度学习领域中常用的一些优化算法,并通过分析各算法的优势与适用场景对比研究的基础上给出推荐使用策略

2.基本概念和术语

概念

Optimization:

Optimization 涉及寻找最优解或极小值点的过程,在机器学习领域中一般指最小化损失函数(也被称为目标函数)的方法。

Learning rate:

在每次迭代时, 梯度下降法都会根据步长因子来进行参数更新. 通常情况下, 如果步长因子取值过小, 则算法的收敛速度会变慢; 如果步长因子过大, 算法可能无法收敛到全局最优解, 而是陷入局部最优解. 当步长因子过高时会导致振荡现象, 而当步长因子过低时会导致算法需要过多迭代时间才能收敛. 因此建议在初始阶段设置一个较大的步长因子, 并逐步减小其值以达到更好的优化效果.

Gradient Descent:

The gradient descent (GD) algorithm stands out as one of the simplest optimization methods. Its fundamental principle revolves around navigating towards the minima by moving in the direction of steepest descent. By leveraging gradient vector information within the Hessian space, it identifies the tangent direction at the current position to minimize an objective function effectively. Starting from an initial value x_0, each iteration moves along the negative gradient direction with a step size t, updating to x_{k+1} = x_k - t\nabla f(x_k). The process continues until certain stopping criteria are met or a maximum number of iterations is reached.

Momentum:

动量法属于梯度下降(GD)的一系列变种。其核心思想是通过上一时刻的梯度更新结果作为当前迭代的方向依据,并以此减少历史更新方向对当前迭代效果的影响程度。相较于仅依赖当前时刻的梯度信息而言,动量法则能显著改善优化过程中的收敛效果。特别地,在输入信号变化较为剧烈的情况下,这种机制有助于加快信号在不同状态之间的转移速度,并从而提升了系统的稳定性水平。具体而言,在参数更新过程中加入了一项基于历史累积梯度的产品项;而这一累积过程则是通过将先前的历史累积结果不断叠加来实现的。简而言之,“加速”这一特性使得动量法则在实际应用中展现出更强的表现力和适应性。”

Adagrad:

Adaptive Gradient Optimizer (ADA) 是一种自适应学习率优化算法。该方法通过为每个变量动态管理其适应性学习率,在时间推移中自动调节这一特性。这种设计旨在解决不同变量间爆炸性和激活的一致性或差异性问题。ADA基于小批量随机梯度下降方法,在每次迭代中仅使用部分样本(mini-batch)计算梯度而非全部样本数据。此外,在应用 ADA 更新规则时,默认情况下每个变量的学习步幅由自身的历史偏差决定。为了防止学习步幅过快衰减,默认引入了一个衰减因子来平衡这一趋势

RMSprop:

RMSprop (Root Mean Squared propagation) 是一种自适应学习率优化算法。它与 Adagrad 类似,在实现上基于小批量随机梯度下降的思想。但对学习率进行了调整,并使其实现过程更加平滑。具体来说,则利用多个历史迭代周期内的平均平方误差值来进行参数更新。这一特性使得 RMSprop 成为了 Adagrad 的一种改进型方法。

Adam:

Adam(自适应动量估计)也是一种自适应学习率优化方法。它集成了动量法与RMSprop方法的优势,并能在各个变量及各自的时间段独立设定相应的学习率。具体而言,在每一个时间步长中,Adam通过动量法记录前阶的信息,并利用RMSprop方法得到全局梯度估计。此外,Adam还配备了特殊的机制以缓解梯度爆炸及梯度消失的问题。其特点在于能够动态调节学习速率,在初始阶段较高,在后续阶段逐渐减小,并且在各个不同的时间段有着不同的适应性。基于此优势特征,在深度神经网络及其相关应用领域中(尤其是涉及激活函数的应用场景),Adam表现出显著的竞争优势

Batch Normalization:

Batch normalization, abbreviated as BN, is a widely used regularization technique in neural networks. Within each batch, BN normalizes the features to follow a standard normal distribution, thus effectively preventing overfitting—a phenomenon where models perform well on training data but poorly on unseen data. Through scaling and shifting each intermediate output, BN ensures the outputs are more stable across different layers. The result is that the layer outputs become more consistent and reliable across the network.

Dropout:

Dropout(丢弃法)是一种广泛应用的正则化技术,在深度学习中发挥着重要作用。通过设定特定的概率(dropout rate),随机使部分神经元输出置零以防止过拟合现象的发生。这些被置零的神经元虽然其输出值恒定为零但并不参与损失函数计算从而降低了模型对于噪声数据敏感度的影响然而在某些情况下可能会导致模型不可靠可能导致某些神经元长期处于静止状态影响其在面对新数据时的学习能力 Dropout 技术有助于解决梯度消失与梯度爆炸的问题通过调节合适的 dropout rate 可以实现对网络训练过程的有效平衡

术语

Loss Function:

Loss 函数用于衡量损失的程度如何,并可被视为损失指标。它是一个单值计算工具,在接收模型预测结果和真实标签的基础上完成数值计算任务。该函数用于评估预测准确性。

Gradient:

梯度(gradient)可被视为导数的一种特殊情况,在几何意义上相当于该向量在空间某一点处的一个切线方向。这一概念不仅适用于平滑连续的空间分析,在多元微积分领域中更是用于描述曲面在其某一点处相对于法向量方向的变化率。对于函数空间中的优化问题而言,则主要关注其一阶偏导数值所构成的方向信息。特别地,在神经网络模型训练过程中,计算权重参数所处的空间中的变化趋势对于优化算法至关重要。

Backpropagation:

反向传播(backpropagation)被称作神经网络训练的关键环节。该方法基于链式求导法则推导出各层节点的误差,并通过更新权重使模型在训练数据集上的损失最小化。

Hyperparameter:

超参数(hyperparameter)是在模型的学习过程中起到关键作用的因素之一,在包括但不限于学习率、激活函数和学习策略等因素的情况下,在模型选择和训练优化的过程中起到关键作用。

Regularization:

该技术通过引入惩罚项来限制模型复杂度,并旨在提升其泛化能力。其主要目标在于约束模型复杂度的同时防止过拟合现象的发生。常见的实施手段主要包括L1范数惩罚、L2范数惩罚以及最大范数裁剪等技术手段。

3.核心算法原理和具体操作步骤

Stochastic Gradient Descent (SGD):

随机梯度下降法(全称:Stochastic Gradient Descent, SGD)是一种经典的优化方法。该算法在每次迭代过程中仅采用单个训练样本,并通过应用梯度下降技术来减少损失函数的值。其核心理念在于从数据集中抽取小批量样本计算其梯度,并据此对模型参数执行一次更新。

算法流程如下:

  1. 初始化参数 W\theta

在每一个 epoch 迭代中执行如下步骤:
a. 从训练数据集中选取一个批量大小为 batch_size 的子集 X 和其对应的标签向量 y。
b. 首先利用当前批次的数据 X 和真实标签 y 计算损失值 L(W,X,y;θ),随后求出关于参数 θ 的梯度 ∇θL(W,X,y;θ)。
c. 通过应用梯度下降算法来更新模型参数:

复制代码
     - 参数 $\theta$ = $\theta-\eta\nabla_{\theta}\mathcal{L}(W, X, y;\theta)$ 。

     - 参数 $W$ = $W-\eta\frac{\partial}{\partial W}\mathcal{L}(W, X, y;\theta)$ 。
     - $\eta$ 表示学习率。
    
         
         
    代码解读

在训练完一个 epoch 后,通过验证集评估模型的表现。若验证集损失函数未见减少,则继续进行训练。

  1. 最后,选用最佳模型。

Adagrad:

Adagrad (Adaptive Gradient algorithm for Deep Learning) 是一种自适应学习率的优化算法,在深度学习领域中具有重要的应用价值。该算法通过给每个变量分配一个动态调整的学习速率,在训练过程中能够根据历史数据自动调节学习速率的变化趋势。其核心思想在于解决不同参数在更新过程中可能出现同时爆炸或各自不同的问题。基于小批量随机梯度下降的方法论基础下,Adagrad 对每一个参数都独立地应用了 AdaGrad 的更新规则,并通过积累每个参数的历史偏差信息来决定当前更新步幅的变化方向和大小。值得注意的是,在这一过程中引入了一个衰减因子来抵消由于自然递减趋势所带来的潜在影响

算法流程如下:

  1. 初始化参数 W\theta

在每一个 epoch 阶段中依次执行以下步骤:
a. 从训练数据集中批量提取大小为 batch_size 的数据批次,并获取相应的标签信息 Xy
b. 基于提取的批次数据计算当前模型的损失值 \mathcal{L}(W, X, y;\theta) 并求取其对模型参数 \theta 的梯度 \nabla_{\theta}\mathcal{L}(W, X, y;\theta)
c. 根据预设的学习率参数衰减机制更新权重向量 v = \gamma v + \nabla_{\theta} \mathcal{L}(W, X, y;\theta)^2(其中 \gamma 表示学习率衰减因子)。
d. 按照上述计算出的梯度信息对模型参数进行更新

复制代码
     - 参数 $\theta$ = $\theta-\frac{\eta}{\sqrt{v}}\nabla_{\theta}\mathcal{L}(W, X, y;\theta)$ 。

     - $\eta$ 表示学习率。
    
         
    代码解读

经过一个 epoch 的训练后, 通过验证集评估模型的表现. 当验证集损失函数未减少时, 则继续进行训练.

  1. 最后,选用最佳模型。

RMSprop:

RMSprop(Root Mean Square propagation)是一种自适应学习率优化算法。它基于小批量随机梯度下降的思想与Adagrad相似,并对学习率进行了相应的调整使其随着时间平滑地衰减。其具体做法是利用多个迭代周期内平均计算的平方梯度对学习率进行调节而非全部历史梯度。因此可以认为RMSprop是Adagrad的一个改进型算法。

算法流程如下:

  1. 初始化参数 W\theta

依次在每一个 epoch 进行如下步骤:
a. 按批量大小 batch_size 从训练集中抽取一批训练样本集 X 并对应获取其标签 y
b. 基于训练样本集计算损失函数值 \mathcal{L}(W,X,y;\theta) 并求取其梯度 \nabla_{\theta}\mathcal{L}
c. 根据动量因子 \beta 更新动量项 v = \beta v + (1 - \beta)(\nabla_{\theta}\mathcal{L})^2(其中 \beta 是超参数)。
d. 按照前述参数更新规则完成参数优化调整:

复制代码
     - 参数 $\theta$ = $\theta-\frac{\eta}{\sqrt{v+\epsilon}}\nabla_{\theta}\mathcal{L}(W, X, y;\theta)$ 。

     - $\eta$ 表示学习率。
    
         
    代码解读

在每一个 epoch 的训练完成后,请通过验证集评估模型的表现。当验证集的损失函数未能减少时,则执行下一步骤。

  1. 最后,选用最佳模型。

Adam:

Adam(自适应矩估计法)也是一种适应性学习率优化算法。它通过融合动量法与RMSprop技术实现性能提升,并能在不同维度上动态调节参数更新幅度。具体而言,在每一次迭代过程中,算法会利用动量法累积历史梯度信息,并结合RMSprop方法估计当前梯度的整体尺度特征。此外,Adam还配备了机制来应对梯度爆炸及消失的问题。由于其动态特性,在初始阶段能够维持较大的学习速率,在后续迭代过程中则逐渐降低并根据训练进程自动调节各个时刻的学习步长差异性。因此,在处理深度神经网络(特别是涉及激活函数的情况)时,Adam表现出色。

算法流程如下:

  1. 初始化参数 W\theta

对于每一个 epoch 来说,请依次执行如下操作:
首先,在训练集中选取一批具有 batch_size 大小的样本组 X 和其对应的标签向量 y
接着,在当前批次的数据上计算相应的损失函数值及其梯度信息。
随后,请根据所获得的梯度信息分别更新动量项 m 和方差项 v
其中,
m = \beta_1 m + (1 - \beta_1) \cdot \nabla_{\theta}\mathcal{L}(W, X, y;\theta)
这里 \beta_1 被定义为动量相关的超参数设置;
同样,
v = \beta_2 v + (1 - \beta_2) \cdot (\nabla_{\theta}\mathcal{L}(W, X, y;\theta))^2
其中 \beta_2 被设定为与 RMSprop 相关的关键超参数;
最后,请按照前述的动量和 RMSprop 更新规则调整模型参数。

复制代码
     - 参数 $m_{t}=\frac{m_{t-1}}{1-\beta_1^t}$ 。

     - 参数 $v_{t}=\frac{v_{t-1}}{1-\beta_2^t}$ 。
     - 参数 $\theta$ = $\theta-\frac{\eta}{\sqrt{v_{t}}+\epsilon}(\alpha m_{t}+\beta \frac{\sqrt{1-\beta^t}}{(1-\beta^{t-1})\sqrt{v_{t-1}}} \nabla_{\theta}\mathcal{L}(W, X, y;\theta))$ 。
     - $\eta$ 表示学习率。
     - $\alpha$ 为动量超参数。
     - $\beta$ 为 RMSprop 超参数。
     - $\epsilon$ 为一个很小的常数。
    
         
         
         
         
         
         
    代码解读

在训练过程中每完成一个 epoch 后,通过验证集评估模型的表现。若验证集损失函数未能减少,则需继续进行训练。

  1. 最后,选用最佳模型。

Batch Normalization:

Batch normalization (BN) 专为神经网络中的正则化技术设计,在每一批样本中对每个特征执行标准化处理。这种技术通过将每个特征的分布转化为标准正态分布来防止模型过拟合现象的发生。具体而言,在每一层的中间输出数据经过缩放和偏移使其中心化后,并进一步实现规范化处理以增强稳定性

算法流程如下:

  1. 初始化参数 W\theta

  2. 在每个 epoch 这个操作被重复执行:
    a. 从训练集中抽取一批大小为batch_size的训练样本 X 和对应的标签 y
    b. 计算损失函数值 \mathcal{L}(W, X, y;\theta) 并同时计算对应的梯度值 \nabla_{\theta}\mathcal{L}(W, X, y;\theta)
    c. 通过BN归一化公式将每一批数据进行归一化处理。

复制代码
     - 计算每批数据的均值和标准差,并保存到记忆单元。

     - 利用前一批数据计算的均值和标准差对这一批数据进行归一化处理,得到标准化后的特征矩阵 $Z^{(i)}$ 。
     - 用标准化后的特征矩阵 $Z^{(i)}$ 代替原始特征矩阵 $X^{(i)}$ 。
    
         
         
    代码解读

d. 用标准化后的特征矩阵 Z^{(i)} 来更新模型参数。

在每一轮 epoch 结束后,通过验证集评估模型性能。若验证集损失函数维持不变或出现上升趋势,则需持续进行模型优化工作。

  1. 最后,选用最佳模型。

Dropout:

Dropout(丢弃机制)是一种常用的正则化技术,在深度学习模型中发挥着重要作用。具体而言,在神经网络层中随机选择一定比例(即dropout rate)的神经元节点并将其输出设为零值以防止过拟合问题的发生。由于这些被设为零值的节点不会对损失函数产生任何贡献,因此能够有效降低模型对于噪声数据或者过拟合现象的敏感度。然而,在某些情况下这种做法可能会导致模型的整体可靠性下降,因为可能会出现某些节点持续处于非激活状态而无法参与学习过程的情况出现进而影响模型对新数据分布的学习能力。此外,在时间序列数据处理过程中 Dropout 方法会使得不同时间步长上的神经元输出之间存在一定的相关性从而在一定程度上缓解了梯度消失和梯度爆炸的问题因此在实际应用中可以通过调节 dropout rate 参数来找到一个平衡点以适应不同的训练需求

算法流程如下:

  1. 初始化参数 W\theta

在每个 epoch 迭代时,依次执行下述步骤:首先,在每次迭代中从训练集中抽取一批大小为 batch_size 的训练样本 X 和对应的标签 y;其次,在上述过程中使用这些输入数据来计算损失函数 \mathcal{L}(W, X, y;\theta) 并求出相应的梯度值 \nabla_{\theta}\mathcal{L}(W, X, y;\theta);最后,在每完成一个迭代周期后应用 dropout 方法以随机关闭部分神经元的输出。

复制代码
     - 以 1-$p$ 的概率将某些节点的输出置零。

     - 利用 Dropout 的伪激活函数来实现网络的训练过程。
    
         
    代码解读

d. 用 Dropout 后的特征矩阵 X^{(i)} 来更新模型参数。

经过一个 epoch 的训练后,通过验证集评估模型性能。若验证集损失函数未能减少,则需持续进行训练。

  1. 最后,选用最佳模型。

4.具体代码实例和解释说明

以下是 Keras 中常用的优化器及其对应 API 接口:

复制代码
    model.compile(loss='categorical_crossentropy',
              optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True),
              metrics=['accuracy'])
    
      
      
    
    代码解读

在该代码中采用 SGD 作为优化器,并设定学习率值为 0.01。此外,在此配置中采用动量超参数设为 0.9,并应用Nesterov动量法以加速收敛过程。通过 loss 参数指定模型所使用的损失函数,在此处我们采用了分类交叉熵损失函数来评估模型性能;同时通过 metrics 参数选择评估指标时,则以准确率为基准进行度量和分析。

复制代码
    model.fit(x_train, y_train,
          epochs=10,
          batch_size=32,
          validation_data=(x_test, y_test),
          callbacks=[EarlyStopping(monitor='val_loss', patience=3)])
    
      
      
      
      
    
    代码解读

以上代码调用 fit() 方法执行模型训练任务;共计迭代 10 轮;批量大小设置为 32。配置 validation_data 配置项;每次迭代后计算并展示验证数据集上的损失值和准确率。如果验证数据集上的损失值连续三次不再下降,则终止训练过程。

复制代码
    model.compile(loss='binary_crossentropy',
              optimizer=keras.optimizers.Adagrad(),
              metrics=['accuracy'])
    
      
      
    
    代码解读

以上代码使用 Adagrad 优化器,并设置模型的损失函数和评估指标。

复制代码
    model.fit(x_train, y_train,
          epochs=10,
          batch_size=32,
          validation_split=0.2, # use 20% data as validation set
          callbacks=[EarlyStopping(monitor='val_loss', patience=3)])
    
      
      
      
      
    
    代码解读

该代码通过调用 fit() 方法对模型进行训练,并设置批量大小为32经过10个完整的训练周期后完成一次完整的训练过程此处通过 validation_split 参数设置了验证数据占总数据量的20%无需人工手动划分验证集其中采用的是早停法策略并通过 callbacks 参数指定了一系列回调函数集合具体而言当监测指标显示在验证集上连续三次出现非下降趋势时算法会自动触发提前终止机制从而有效防止过拟合现象的发生

复制代码
    model.compile(loss='mean_squared_error',
              optimizer=keras.optimizers.RMSprop(),
              metrics=['mae'])
    
      
      
    
    代码解读

以上代码使用 RMSprop 优化器,并设置模型的损失函数和评估指标。

复制代码
    model.fit(x_train, y_train,
          epochs=10,
          batch_size=32,
          validation_data=(x_test, y_test),
          callbacks=[TensorBoard(log_dir='/path/to/logs')])
    
      
      
      
      
    
    代码解读

该代码通过 fit() 方法进行模型训练,并经过 10 个 epoch 的持续学习过程;其中每个批次的数据大小设置为 32;在每个 epoch 结束时会计算并展示验证集的损失值及其平均绝对误差(MAE);通过 callbacks 参数配置回调函数列表,在此场景中采用 TensorBoard 实现日志记录

复制代码
    model.compile(loss='categorical_crossentropy',
              optimizer=keras.optimizers.Adamax(),
              metrics=['accuracy'])
    
      
      
    
    代码解读

以上代码使用 Adamax 优化器,并设置模型的损失函数和评估指标。

复制代码
    model.fit(x_train, y_train,
          epochs=10,
          batch_size=32,
          validation_split=0.2, # use 20% data as validation set
          callbacks=[ModelCheckpoint(filepath='/path/to/best_model.h5', save_best_only=True)])
    
      
      
      
      
    
    代码解读

该代码采用 fit() 方法对模型进行训练,并经过 10 个 epoch 的持续学习过程。其中批次大小设置为 32,请注意此处通过 validation_split 参数设置了验证集占总数据比例仅为 20%,无需手动划分验证集范围即可实现有效评估。此外本代码还指定了一系列回调函数作为监控指标,请注意通过 ModelCheckpoint 模型保存器实现了最优模型的实时保留功能:当检测到验证集损失函数出现下降时,则保留当前最优模型作为最终输出结果

复制代码
    model.compile(loss='binary_crossentropy',
              optimizer=keras.optimizers.Nadam(),
              metrics=['accuracy'])
    
      
      
    
    代码解读

以上代码使用 Nadam 优化器,并设置模型的损失函数和评估指标。

5.未来发展趋势与挑战

当前,在神经网络训练过程中主要采用的优化算法包括随机梯度下降法、Adagrad、RMSprop、Adam以及Adamax和Nadam等多种类型。伴随深度学习技术的快速进步,越来越多的新颖优化算法不断涌现出来,并且这些新型算法的发展方向各有特色。

  • 1、基于样本优化方法:近年来涌现出了大量新型优化方法以应对深度学习中的训练挑战。其中一种方法是通过加权平均的方式实现梯度同步更新(Asynchronous Stochastic Gradient Descent with Weight-sharing),这种方法相较于传统优化方法,在模型收敛速度、计算精度等方面表现出明显优势。此外还有一种改进型的方法即通过加权平均的方式计算梯度估计值(Gradient Weighted Moving Average),这种方法能够有效缓解模型训练过程中的方差问题。另外一种创新思路则是采用样例划分策略进行聚类分析(Sample-based Clustering),这种方法能够显著提升分类效率的同时还能有效降低计算复杂度。再者还有一种称为分片学习策略的方法(Sample-based Stochastic Gradient Descent),这种方法通过将数据集划分为多个子集并在每个子集上分别进行训练从而实现了并行化处理的目的,在提升训练效率的同时也降低了内存占用需求。然而这些新方法在实际应用中会面临模型复杂度高、硬件资源受限以及通信开销大的挑战,在这种情况下如何平衡性能与资源消耗仍是一个待解决的关键问题。

  • 2、以模型为核心的优化方案:在神经网络架构设计中发展出多种优化方法。其中包含基于动量(momentum-based)与退火(annealing-based)策略的具体实现方式。
    其中,

  • 动量法通过累积梯度信息引导搜索方向朝向全局最优区域,
    其优势体现在能够快速收敛,
    但此方法存在明显的局限性即易陷入局部最优解。
    相比之下,
    退火法采用了动态调整学习速率的方式,
    这不仅有助于跳出局部最优陷阱,
    但也可能使训练过程受随机因素干扰。
    进一步研究表明,
    受限于动量因子的影响,
    单纯依赖于动量加速的方法难以达到理想的效果,
    因此这一领域仍需持续深入研究。
  • 3、联邦学习:该技术目标在于构建一个高效的协作平台,在此平台上多个参与者能够共享资源并协同工作以达到共同目标。通过这一机制可以有效平衡各方资源的利用问题。值得注意的是,在实际操作中可能会遇到资源分配不均的问题,在这种情况下如何实现利益的均衡发展是一个关键课题。尽管如此,在应用过程中仍需面对一系列技术难题包括复杂的算法设计以及高效的通信协议开发等。

总结而言,在神经网络训练过程中所采用的优化算法目前仍存在诸多改进空间,在实际应用中仍需进一步探索和完善。新型优化方法不断涌现中,在未来研究重点仍需探索

全部评论 (0)

还没有任何评论哟~