16 深度学习与神经网络之梯度下降与优化算法

在上一篇中,我们详细探讨了前向传播反向传播的过程,了解了如何通过这些步骤来计算神经网络的输出及其误差,以及如何根据误差调整网络的权重。接下来,我们将深入了解梯度下降及其各种优化算法,这些技术对于训练神经网络至关重要。

梯度下降

梯度下降是一种用于优化的迭代算法,目标是通过最小化损失函数来寻找最佳的模型参数。在神经网络中,损失函数通常用于衡量模型预测与实际标签之间的差距。

基本原理

给定一个可微损失函数$L(w)$,其中$w$是网络中需要优化的参数,我们的目标是找到参数$w$使得$L(w)$最小化。梯度下降的核心思想是沿着损失函数的负梯度方向更新参数:

$$
w := w - \eta \nabla L(w)
$$

其中,$\eta$是学习率(通常是一个小正数),$\nabla L(w)$是损失函数$L(w)$关于参数$w$的梯度。

学习率的选择

学习率的选择对训练过程至关重要。如果学习率过大,可能会导致损失函数震荡甚至发散;如果学习率过小,则收敛速度会变得非常缓慢。因此,选择合适的学习率至关重要,通常需要通过实验来确定。

优化算法

在基本的梯度下降算法之后,许多更高级的优化算法被提出,这些算法在不同情况下提供了更好的收敛性能。接下来,我们将介绍几种常见的优化算法。

1. 随机梯度下降(SGD)

随机梯度下降(SGD)是梯度下降的一种变体,它每次只使用一个样本来计算梯度。这使得参数更新更加频繁,从而增加了收敛的速度。

更新公式为:

$$
w := w - \eta \nabla L(w; x_i, y_i)
$$

其中$(x_i, y_i)$是单个训练样本。

2. 小批量梯度下降(Mini-batch SGD)

小批量梯度下降结合了批量梯度下降随机梯度下降的优点。它每次使用一小批样本计算梯度。这种方法有效地平衡了计算效率和梯度估计的准确性。

$$
w := w - \eta \nabla L(w; {(x_i, y_i)}_{i=1}^{m})
$$

其中$m$是小批量样本的大小。

3. 动量法(Momentum)

为了解决SGD的震荡问题,动量法加入了过去梯度的影响,类似于物体在物理中的动量:

$$
v := \beta v + (1 - \beta) \nabla L(w)
$$
$$
w := w - \eta v
$$

这里,$v$是更新的“动量”,$\beta$是动量项的衰减率,通常设置为$0.9$。

4. 自适应学习率算法(如 AdaGrad、RMSProp 和 Adam)

这些优化算法采用自适应学习率的方法。这意味着每个参数都有自己的学习率,并且这些学习率根据参数的历史梯度调整:

  • AdaGrad通过增加每个参数的平方梯度的累积和来调整学习率,适合稀疏数据的情况。

$$
w_i := w_i - \frac{\eta}{\sqrt{G_{ii} + \epsilon}} \nabla L(w)
$$

  • RMSProp对AdaGrad进行了改进,使用指数加权平均来衰减过往梯度的影响。

$$
v := \beta v + (1 - \beta) (\nabla L(w))^2 $$
$$
w := w - \frac{\eta}{\sqrt{v + \epsilon}} \nabla L(w)
$$

  • Adam结合了动量法RMSProp的优点,适用于各种情况,具有很好的性能。

$$
m := \beta_1 m + (1 - \beta_1) \nabla L(w) $$
$$
v := \beta_2 v + (1 - \beta_2) (\nabla L(w))^2 $$
$$
w := w - \frac{\eta}{\sqrt{v} + \epsilon} \frac{m}{\sqrt{1 - \beta_1^t}} $$

其中,$m$是梯度的移动平均,$v$是梯度平方的移动平均,$\beta_1$和$\beta_2$是控制平均影响的参数。

案例代码

以下是一个简单的代码示例,展示了如何在Python中实现普通的SGD和Adam优化器。在这个示例中,我们将使用TensorFlow库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import tensorflow as tf
import numpy as np

# 生成模拟数据
x_train = np.random.rand(100, 1)
y_train = 3 * x_train + 2 + np.random.normal(0, 0.1, (100, 1))

# 创建模型
model = tf.keras.Sequential([
tf.keras.layers.Dense(1, input_dim=1)
])

# 使用SGD优化器
model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.01), loss='mean_squared_error')

# 训练模型
model.fit(x_train, y_train, epochs=100)

# 使用Adam优化器
model.compile(optimizer='adam', loss='mean_squared_error')

# 重新训练模型
model.fit(x_train, y_train, epochs=100)

在这个代码示例中,我们创建了一个简单的线性模型来拟合数据,并使用SGDAdam分别训练模型。通过观察训练过程中的损失变化,我们可以直观地理解不同优化算法的性能差异。

小结

在本篇中,我们详细探讨了梯度下降及其多种优化算法,这些方法是训练神经网络的核心。通过选择合适的优化算法,我们可以有效提高模型的训练效果和收敛速度。在下一篇中,我们将开始介绍卷积神经网络(CNN)中的卷积与池化操作,继续深入计算机视觉领域。

16 深度学习与神经网络之梯度下降与优化算法

https://zglg.work/cv-network-tutorial/16/

作者

AI免费学习网(郭震)

发布于

2024-08-10

更新于

2024-08-11

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论