最强总结!神经网络中常用的九种优化技术(二)

  • AdaGrad
  • RMSProp
  • Adam
  • 学习率衰减
  • Early Stopping

五、AdaGrad

AdaGrad 是一种基于梯度的优化算法,它对每个参数的学习率进行自适应调整,适用于稀疏数据和高维数据集。

在标准的梯度下降算法中,所有参数共享相同的学习率,这在某些情况下可能并不理想。例如,频繁更新的参数和不常更新的参数可能需要不同的学习率来达到更好的优化效果。AdaGrad 通过引入对历史梯度平方和的累积来调整每个参数的学习率,使得每个参数都拥有自己的学习率。

在这里插入图片描述

优点

自动调节学习率,AdaGrad 自动为每个参数分配合适的学习率,特别适合稀疏特征。

缺点

学习率衰减问题,随着时间推移,学习率会不断减小,可能导致模型训练过早停止或过于缓慢。

六、RMSProp

RMSProp 是对 AdaGrad 的改进,主要解决了 AdaGrad 在后期学习率趋于极小的问题。

RMSProp 的核心思想是使用指数加权移动平均来平滑每个参数的梯度平方,从而缓解学习率衰减过快的问题。

具体来说,RMSProp 采用以下更新规则。

在这里插入图片描述

优点

相比 AdaGrad,RMSProp 不会让学习率过早减小,能够在长时间训练中保持较稳定的学习率。

缺点:

RMSProp 需要对衰减系数和初始学习率进行仔细调整。

import tensorflow as tf  
  
# Example data  
X = np.array([[1], [2], [3], [4]], dtype=np.float32)  
y = np.array([[2], [4], [6], [8]], dtype=np.float32)  
  
# Model and optimizer  
model = tf.keras.Sequential([tf.keras.layers.Dense(units=1)])  
optimizer = tf.keras.optimizers.RMSprop(learning_rate=0.01)  
loss_fn = tf.keras.losses.MeanSquaredError()  
  
# Training loop using RMSProp  
for epoch in range(1000):  
    with tf.GradientTape() as tape:  
        predictions = model(X)  
        loss = loss_fn(y, predictions)  
    gradients = tape.gradient(loss, model.trainable_variables)  
    optimizer.apply_gradients(zip(gradients, model.trainable_variables))  
  
print("Weights:", model.weights)

七、Adam

Adam 是目前最常用的优化算法之一,它结合了 RMSProp 和 动量(Momentum)的优点。

Adam 同时考虑了梯度的一阶矩(动量)和二阶矩(梯度平方的移动平均),通过自适应地调整学习率,使得它在很多深度学习任务中都能表现良好。

具体来说,Adam 的更新规则如下:
在这里插入图片描述

优点

  • Adam 能够根据每个参数的梯度自适应调整学习率,适应各种类型的问题。
  • 结合动量和 RMSProp 优势,Adam 通常能够快速收敛。
  • Adam 特别适合于深度学习中的大规模复杂模型。

缺点

尽管 Adam 默认的超参数(如学习率、动量系数)通常效果不错,但在一些任务中可能需要进行微调。

import tensorflow as tf  
  
# Example data  
X = np.array([[1], [2], [3], [4]], dtype=np.float32)  
y = np.array([[2], [4], [6], [8]], dtype=np.float32)  
  
# Model and optimizer  
model = tf.keras.Sequential([tf.keras.layers.Dense(units=1)])  
optimizer = tf.keras.optimizers.Adam(learning_rate=0.01)  
loss_fn = tf.keras.losses.MeanSquaredError()  
  
# Training loop using Adam  
for epoch in range(1000):  
    with tf.GradientTape() as tape:  
        predictions = model(X)  
        loss = loss_fn(y, predictions)  
    gradients = tape.gradient(loss, model.trainable_variables)  
    optimizer.apply_gradients(zip(gradients, model.trainable_variables))  
  
print("Weights after Adam:", model.weights)

八、学习率衰减

学习率衰减是一种动态调整学习率的技术。

在训练过程中,随着迭代次数的增加,学习率逐渐减小。这使得模型在接近最优解时能够稳定收敛,避免过大的步长导致参数跳过最优解。

常见的衰减策略有

  • 指数衰减,学习率按照指数方式衰减。
  • 分段衰减,在训练的某些时间点,手动减少学习率。
  • 余弦衰减,学习率按照余弦函数的方式逐渐减小,适用于周期性学习任务。

优点

  • 学习率衰减可以在训练初期快速接近最优解,后期减小学习率以便稳定收敛。
  • 当模型接近最优点时,较小的学习率可以减少优化的振荡现象,使得模型更加精细化。

缺点

选择合适的学习率衰减方式和衰减速率需要实验调优,影响模型收敛的速度和效果。

import tensorflow as tf  
  
# Example data  
X = np.array([[1], [2], [3], [4]], dtype=np.float32)  
y = np.array([[2], [4], [6], [8]], dtype=np.float32)  
  
# Model  
model = tf.keras.Sequential([tf.keras.layers.Dense(units=1)])  
  
# Define decaying learning rate  
initial_lr = 0.01  
lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(  
    initial_lr, decay_steps=100, decay_rate=0.96, staircase=True)  
  
# Use decaying learning rate with optimizer  
optimizer = tf.keras.optimizers.SGD(learning_rate=lr_schedule)  
loss_fn = tf.keras.losses.MeanSquaredError()  
  
# Training loop  
for epoch in range(1000):  
    with tf.GradientTape() as tape:  
        predictions = model(X)  
        loss = loss_fn(y, predictions)  
    gradients = tape.gradient(loss, model.trainable_variables)  
    optimizer.apply_gradients(zip(gradients, model.trainable_variables))  
  
print("Weights after learning rate decay:", model.weights)

九、早停(Early Stopping)

早停是一种简单但有效的防止过拟合的技术。

它的核心思想是在训练过程中监控模型在验证集上的性能,当验证集的性能不再提升时(例如损失不再下降或准确率不再提高),提前停止训练,以避免模型继续训练导致过拟合。

在机器学习中,选择正确的优化技术对于高效训练模型和实现高性能至关重要。特征缩放和批量归一化等技术可以稳定和加快训练速度,而 Adam 和 RMSProp 等高级优化器可以自适应地调整学习率以处理复杂的数据集和深度网络。最终,优化方法的选择取决于具体问题和架构,通常需要进行实验才能找到最佳匹配。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐