分享

RMSprop,一个强大的优化算法

 汉无为 2023-11-09 发布于湖北

大家好,我是小寒。

今天给大家介绍一种优化算法,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)慢。
最后


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多