常用优化方法(optimizer):SGD、momentum、Adam、AdaGard等


机器学习几乎所有算法都要利用损失函数loss function来检验算法模型的优劣,同时利用损失函数来提升算法模型的。
这个提升的过程就是优化的过程

关于深度学习优化器 optimizer 的选择,你需要了解这些

SGD 和 BGD 和 Mini-BGD

SGD 随机梯度下降

算法在每读入一个数据都会立刻计算loss function的梯度来update参数。假设loss function为w
在这里插入图片描述
所以SGD的batchsize为1,收敛的速度快,但是不容易跳出局部最优解

BGD(batch gradient descent):批量梯度下降

算法在读取整个数据集后才去计算损失函数的梯度,batchsize为n
在这里插入图片描述
数据处理量加大,梯度下降较慢;训练过程中占内存

Mini - BGD(mini-batch gradient descent):批量梯度下降

选择小批量来进行梯度下降,这是一种折中的方法,采用训练子集的方法来计算loss
在这里插入图片描述
上面的方法都存在一个问题,就是update更新的方向完全依赖于计算出来的梯度.很容易陷入局部最优的马鞍点.能不能改变其走向,又保证原来的梯度方向.就像向量变换一样,我们模拟物理中物体流动的动量概念(惯性).

Momentum

Momentum参考了物理中动量的概念,前几次的梯度也会参与到当前的计算中,但是前几轮的梯度叠加在当前计算中会有一定的衰减
若当前梯度的方向与历史梯度一致(表明当前样本不太可能为异常点),则会增强这个方向的梯度,若当前梯度与历史梯方向不一致,则梯度会衰减。一种形象的解释是:我们把一个球推下山,球在下坡时积聚动量,在途中变得越来越快,若球的方向发生变化,则动量会衰减。
提高收敛速度,增加稳定性而且还有摆脱局部最优的能力
在这里插入图片描述
第一个式子有两项。第一项是上一次迭代的梯度,乘上一个被称为「Momentum 系数」的值,可以理解为取上次梯度的比例。
我们设 v 的初始为 0,动量系数为 0.9,那么迭代过程如下:
在这里插入图片描述
我们可以看到之前的梯度会一直存在后面的迭代过程中,只是越靠前的梯度其权重越小。

Adagrad:(adaptive gradient)自适应梯度算法

Adagard在训练的过程中可以自动变更学习的速率,设置一个全局的学习率,而实际的学习率与以往的参数模和的开方成反比。
一种改进的随机梯度下降算法.以前的算法中,每一个参数都是用相同的学习率,而深度学习模型中往往涉及大量的参数,不同参数的更新频率往往有区别,对于更新不频繁的参数,希望单次步长大些,多学习一些知识;对于更新频发到的参数,希望步长小一些,使得学习的参数更稳定。
Adagrad算法能够在训练中自动对learning_rate进行调整,出现频率较低参数采用较大的𝛼更新,出现频率较高的参数采用较小的𝛼更新

RMSprop(root mean square propagation) 均方根传播

也是一种自适应学习率方法. 不同之处在于,Adagrad会累加之前所有的梯度平方,RMProp仅仅是计算对应的平均值.可以缓解Adagrad算法学习率下降较快的问题

Adam (adaptive moment estimation) 自适应矩估计

是对RMSProp优化器的更新.利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率.
每一次迭代学习率都有一个明确的范围,使得参数变化很平稳.
在这里插入图片描述
计算了每个梯度分量的指数平均和梯度平方指数平均(方程 1、方程 2)。为了确定迭代步长我们在方程 3 中用梯度的指数平均乘学习率(如 Momentum 的情况)并除以根号下的平方指数平均(如 Momentum 的情况),然后方程 4 执行更新步骤
超参数 beta1 一般取 0.9 左右,beta_2 取 0.99。Epsilon 一般取1e-10。

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我会为您展示如何使用不同的优化器来训练MNIST数据集中的神经网络,并绘制相应的精度图。 首先,我们需要加载MNIST数据集,并将其分为训练集和测试集。这一步可以通过以下代码实现: ```python import tensorflow as tf from tensorflow.keras.datasets import mnist # 加载MNIST数据集 (x_train, y_train), (x_test, y_test) = mnist.load_data() # 将像素值缩放到0到1之间 x_train, x_test = x_train / 255.0, x_test / 255.0 ``` 接下来,我们需要定义一个简单的卷积神经网络模型。这里我们使用两个卷积层和两个池化层,并将输出展平为一维向量,最后连接两个全连接层。这一步可以通过以下代码实现: ```python from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense # 定义卷积神经网络模型 model = Sequential([ Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)), MaxPooling2D((2, 2)), Conv2D(64, (3, 3), activation='relu'), MaxPooling2D((2, 2)), Flatten(), Dense(128, activation='relu'), Dense(10, activation='softmax') ]) ``` 接下来,我们需要使用不同的优化器来训练模型,并记录每个优化器的精度。这一步可以通过以下代码实现: ```python # 定义不同的优化optimizers = [ tf.keras.optimizers.SGD(), tf.keras.optimizers.SGD(momentum=0.9), tf.keras.optimizers.Adagrad(), tf.keras.optimizers.Adam() ] # 记录每个优化器的精度 histories = [] # 训练模型并记录精度 for optimizer in optimizers: model.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy', metrics=['accuracy']) history = model.fit(x_train.reshape(-1, 28, 28, 1), y_train, validation_data=(x_test.reshape(-1, 28, 28, 1), y_test), epochs=10, batch_size=64) histories.append(history) ``` 最后,我们可以使用Matplotlib库绘制每个优化器的精度图。这一步可以通过以下代码实现: ```python import matplotlib.pyplot as plt # 绘制精度图 plt.figure(figsize=(10, 8)) for history in histories: plt.plot(history.history['val_accuracy']) plt.title('Model Accuracy') plt.ylabel('Accuracy') plt.xlabel('Epoch') plt.legend(['SGD', 'Momentum', 'AdaGrad', 'Adam'], loc='lower right') plt.show() ``` 运行完整代码,即可得到四个优化器在MNIST数据集上的精度图。从图中可以看出,Adam优化器在前几个epochs中的表现较好,但随着训练的进行,Momentum优化器的表现开始超过Adam优化器。而SGD和AdaGrad优化器的表现则相对较差。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值