打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
RMSprop,一个强大的优化算法

大家好,我是小寒。

今天给大家介绍一种优化算法,RMSprop

RMSprop 是一种自适应学习率优化算法。

事实上,它是梯度下降和流行的AdaGrad 算法的扩展,旨在显着减少训练神经网络时使用的计算量。

该算法的工作原理是每当梯度平方小于某个阈值时,学习率就会呈指数衰减。
       

RMSprop 的动机

在我们的模型训练开始时,成本会相当高。从那里开始,我们有一个锯齿形图案,在垂直方向上有较大的运动,在水平方向上有相对较小的运动,直到达到全局最小值(中心的红点)。

在普通梯度下降中,我们体验到了这种随意的运动。为什么?这是由于高维数导致存在大量局部最优(因为成本函数取决于许多增加维数的权重)。

当尝试在多维情况下优化参数时,普通或小批量梯度下降算法将陷入许多局部最小值、高原和其他收敛到真正的全局最小值的障碍。

正如我们将看到的,在 RMSprop 中使用均方根有助于避免学习率太小或太大的问题。如果梯度较小,则提高学习率以加快收敛速度;如果梯度较大,则降低学习率以避免超过损失函数的最小值。


RMSprop 的工作原理

我们都知道梯度下降更新可以封装在以下两个方程中:


在 RMSprop 中,更新状态的方程修改如下:


其中 S_dW 定义为:

S_db 定义为:

由于我们取参数平方的平方根,因此该算法适当地称为均方根传播。

但我们忽略了一件事。为了避免被零除,我们添加标准化值 ε = 10^-8。

最后,我们得到:


B 通常设置为 0.999。

       

使用 Keras 和 TensorFlow 实现

下面一起来看看如何使用 Keras 和 TensorFlow 对 MNIST 数据集上的分类问题实施 RMSprop 优化。

我们还将它与普通梯度下降进行比较。

导入必要的库

首先,我们需要导入必要的库,包括 TensorFlow 和 Keras。
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import RMSprop, SGD

加载并预处理 MNIST 数据集

接下来,我们将加载 MNIST 数据集并对其进行预处理。
(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = x_train.reshape(-1, 28*28) / 255.0
x_test = x_test.reshape(-1, 28*28) / 255.0

y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)

定义模型架构

我们将定义一个带有两个隐藏层的简单前馈神经网络模型。
model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(28*28,)))
model.add(Dense(512, activation='relu'))
model.add(Dense(10, activation='softmax'))

训练模型

现在,我们将使用 RMSprop 优化器编译模型。
model.compile(loss='categorical_crossentropy',
              optimizer=RMSprop(),
              metrics=['accuracy'])
              
history = model.fit(x_train, y_train,
                    batch_size=128,
                    epochs=10,
                    verbose=1,
                    validation_data=(x_test, y_test))
与普通梯度下降法进行比较
最后,我们可以通过使用 SGD 优化器创建另一个模型来将结果与它进行比较。
model_sgd = Sequential()
model_sgd.add(Dense(512, activation='relu', input_shape=(28*28,)))
model_sgd.add(Dense(512, activation='relu'))
model_sgd.add(Dense(10, activation='softmax'))

model_sgd.compile(loss='categorical_crossentropy',
                  optimizer=SGD(),
                  metrics=['accuracy'])

history_sgd = model_sgd.fit(x_train, y_train,
                            batch_size=128,
                            epochs=10,
                            verbose=1,
                            validation_data=(x_test, y_test))

比较结果

最后,我们将比较两个模型的结果。
print('RMSprop:')
print('Test loss:', history.history['val_loss'][-1])
print('Test accuracy:', history.history['val_accuracy'][-1])

print('\nVanilla Gradient Descent:')
print('Test loss:', history_sgd.history['val_loss'][-1])
print('Test accuracy:', history_sgd.history['val_accuracy'][-1])
RMSProp(均方根传播)是一种机器学习优化算法,通过不同的自适应学习率来训练人工神经网络 (ANN)。
它源自梯度下降和 RProp 的概念。结合小批量的平均、效率以及连续小批量的梯度,RMSProp 可以以比原始优化器更快的速度达到收敛,但比更高级的优化器(例如 Adam)慢。
最后


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
基于keras的深度学习基本概念讲解——深度学习之从小白到入门
梯度下降优化算法综述
将Keras作为tensorflow的精简接口
tensorflow2.0保存和恢复模型
资源 | 博士生开源深度学习C 库DLL:快速构建卷积受限玻尔兹曼机
盘一盘 Python 系列 10 - Keras (上)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服