TensorFlow 中的 Adam 优化器


TensorFlow 中的 Adam 优化器是一种用于深度学习模型的算法。优化算法用于深度学习模型中以最小化损失函数并提高性能。Adam 代表自适应矩估计,是一种随机梯度下降算法。它结合了 RMSprop 和 AdaGrad 算法的优点,以获得更好的优化结果。在本文中,我们将了解 TensorFlow 中的 Adam 优化器及其工作原理。

Adam 优化器的工作原理

Adam 优化器是一种迭代优化算法。它使用梯度的二阶矩自适应地调整每个参数的学习率。该算法考虑了梯度的两个移动平均值——过去梯度的指数衰减平均值和另一个梯度是梯度的矩。

参数更新算法

  • 计算损失函数相对于参数的梯度。

  • 计算梯度的一阶矩(均值)和二阶矩(无偏方差)。

  • 使用梯度的一阶矩和二阶矩以及学习率更新参数。

参数的更新方程如下所示:

w(t+1) = w(t) - α * m_t / (sqrt(v_t) + ε)

这里 w(t) 是第 t 次迭代时的参数,α 是学习率,m_t 是梯度的一阶矩(均值),v_t 是梯度的二阶矩,ε 是一个小的常数,以防止除以零。

为了计算一阶矩,使用以下表达式:

m_t = β1 * m_(t-1) + (1- β1) * g_t

这里,m_(t-1) 是前一次迭代时梯度的一阶矩,β1 是第一阶矩的衰减率,g_t 是当前迭代时的梯度。

为了计算二阶矩,使用以下表达式:

v_t = β2 * v_(t-1) + (1- β2) * g_t^2

这里,v_(t-1) 是前一次迭代时梯度的二阶矩,β2 是第二阶矩的衰减率,g_t^2 是当前迭代时的梯度平方。

示例

在下面的示例中,我们使用 TensorFlow 中的 Adam 优化器来训练 MNIST 数据集上的神经网络。首先,我们导入必要的库并加载 MNIST 数据集。接下来,我们定义神经网络模型。然后,我们编译模型并指定 Adam 优化器。最后,我们使用 fit() 方法训练模型。

在训练过程中,Adam 优化器自适应地调整每个参数的学习率,这有助于模型更快地收敛并在验证集上获得更好的性能。history 变量包含每个 epoch 的训练和验证指标,例如损失和准确率。

import tensorflow as tf
from tensorflow.keras.datasets import mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10)
])

model.compile(optimizer='adam',
   loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
   metrics=['accuracy'])

history = model.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test))

输出

上述代码的输出将是每个训练 epoch 的训练和验证指标,例如损失和准确率。

此输出表明模型在每个 epoch 中都在改进,因为训练和验证损失正在减少,训练和验证准确率正在增加。在第五个 epoch 结束时,模型实现了 97.65% 的验证准确率,这表明它能够准确地对 MNIST 数据集中手写数字进行分类。

Epoch 1/5
1875/1875 [==============================] - 21s 9ms/step - loss: 0.2933 - accuracy: 0.9156 - val_loss: 0.1332 - val_accuracy: 0.9612
Epoch 2/5
1875/1875 [==============================] - 10s 5ms/step - loss: 0.1422 - accuracy: 0.9571 - val_loss: 0.0985 - val_accuracy: 0.9693
Epoch 3/5
1875/1875 [==============================] - 9s 5ms/step - loss: 0.1071 - accuracy: 0.9672 - val_loss: 0.0850 - val_accuracy: 0.9725
Epoch 4/5
1875/1875 [==============================] - 9s 5ms/step - loss: 0.0884 - accuracy: 0.9725 - val_loss: 0.0819 - val_accuracy: 0.9750
Epoch 5/5
1875/1875 [==============================] - 10s 5ms/step - loss: 0.0767 - accuracy: 0.9765 - val_loss: 0.0836 - val_accuracy: 0.975

Adam 优化器的优势

  • 自适应学习率 - Adam 优化器自适应地调整每个参数的学习率,这使得它适用于具有稀疏梯度或噪声梯度的问题。

  • 快速收敛 - Adam 优化器使用动量和梯度的二阶矩来加快优化过程的收敛速度。

  • 高效的内存使用 - Adam 优化器仅维护梯度的两个移动平均值,这使得它与其他需要存储大量过去梯度的优化算法相比,内存效率更高。

Adam 优化器的缺点

  • 过拟合 - Adam 优化器容易过拟合,尤其是在数据集较小的情况下。这是因为该算法可以收敛得太快,并且可能过度拟合训练数据。

  • 对学习率敏感 - Adam 优化器对学习率超参数敏感。将学习率设置得太高会导致优化过程发散,而将其设置得太低会降低收敛速度。

Adam 优化器的应用

Adam 优化器的一些用途包括:

  • 计算机视觉 - Adam 优化器已用于各种计算机视觉任务,例如图像分类、目标检测和图像分割。例如,流行的 YOLO(You Only Look Once)目标检测算法使用 Adam 优化器来训练其神经网络。

  • 自然语言处理 - Adam 优化器已用于自然语言处理任务,例如情感分析、语言翻译和文本生成。例如,GPT(生成式预训练变换器)语言模型使用 Adam 优化器来训练其神经网络。

  • 语音识别 - Adam 优化器已用于语音识别任务,例如自动语音识别和说话人识别。例如,DeepSpeech 语音识别系统使用 Adam 优化器来训练其神经网络。

  • 强化学习 - Adam 优化器也已用于强化学习任务,例如玩游戏和控制机器人。例如,OpenAI Gym 工具包使用 Adam 优化器来训练其深度强化学习代理。

  • 医学影像 - Adam 优化器已用于医学影像任务,例如诊断疾病和分析医学图像。例如,DeepLesion 病灶检测系统使用 Adam 优化器来训练其神经网络。

结论

在本文中,我们讨论了 Adam 优化器以及它如何在深度学习模型中使用,因为它具有自适应学习率。我们还讨论了算法中用于计算参数更新值、梯度的一阶矩和二阶矩的表达式。Adam 优化器也具有其自身的优缺点,如本文所述。

更新于: 2023年7月6日

1K+ 阅读量

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告