大家好,我是小寒。
今天给大家介绍一种优化算法,RMSprop
RMSprop 是一种自适应学习率优化算法。
事实上,它是梯度下降和流行的AdaGrad 算法的扩展,旨在显着减少训练神经网络时使用的计算量。
在普通梯度下降中,我们体验到了这种随意的运动。为什么?这是由于高维数导致存在大量局部最优(因为成本函数取决于许多增加维数的权重)。
正如我们将看到的,在 RMSprop 中使用均方根有助于避免学习率太小或太大的问题。如果梯度较小,则提高学习率以加快收敛速度;如果梯度较大,则降低学习率以避免超过损失函数的最小值。
我们都知道梯度下降更新可以封装在以下两个方程中:
在 RMSprop 中,更新状态的方程修改如下:
其中 S_dW 定义为:
S_db 定义为:
由于我们取参数平方的平方根,因此该算法适当地称为均方根传播。
但我们忽略了一件事。为了避免被零除,我们添加标准化值 ε = 10^-8。
最后,我们得到:
B 通常设置为 0.999。
下面一起来看看如何使用 Keras 和 TensorFlow 对 MNIST 数据集上的分类问题实施 RMSprop 优化。
我们还将它与普通梯度下降进行比较。
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
(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'))
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))
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])
—
联系客服