梯度下降法

1,414 阅读7分钟

1.梯度下降法

  • 梯度下降法 梯度下降法(Gradient Descent)是一种用于优化目标函数的迭代算法。它通过计算目标函数的梯度(即导数)来找到函数的最小值。梯度下降法的基本思想是:沿着梯度的反方向逐步调整参数,使得目标函数的值逐渐减小,直到收敛到最小值。

梯度下降法的步骤如下:

  1. 初始化参数:选择一个初始点(参数值)。
  2. 计算梯度:计算目标函数在当前参数值处的梯度。
  3. 更新参数:沿着梯度的反方向更新参数,步长由学习率(learning rate)控制。
  4. 重复迭代:重复步骤2和3,直到满足停止条件(如梯度接近零、达到最大迭代次数等)。

梯度下降法有三种常见变体:

  • 批量梯度下降(Batch Gradient Descent) :每次迭代使用全部训练数据计算梯度。
  • 随机梯度下降(Stochastic Gradient Descent, SGD) :每次迭代随机选择一个样本计算梯度。
  • 小批量梯度下降(Mini-batch Gradient Descent) :每次迭代使用一小部分样本计算梯度。

梯度下降法 Python Demo

下面是一个使用梯度下降法优化简单二次函数的Python示例,并绘制优化过程的图表。

import numpy as np
import matplotlib.pyplot as plt

# 定义目标函数
def objective_function(x):
    return x**2 + 5*x + 6

# 定义目标函数的梯度
def gradient(x):
    return 2*x + 5

# 梯度下降法
def gradient_descent(starting_point, learning_rate, num_iterations):
    x = starting_point
    history = [x]  # 记录每次迭代的参数值
    for _ in range(num_iterations):
        grad = gradient(x)  # 计算梯度
        x = x - learning_rate * grad  # 更新参数
        history.append(x)
    return x, history

# 参数设置
starting_point = 10  # 初始点
learning_rate = 0.1  # 学习率
num_iterations = 50  # 迭代次数

# 运行梯度下降
optimal_x, history = gradient_descent(starting_point, learning_rate, num_iterations)

# 打印结果
print(f"最优解: x = {optimal_x}, f(x) = {objective_function(optimal_x)}")

# 绘制优化过程
x_values = np.linspace(-15, 15, 400)
y_values = objective_function(x_values)

plt.plot(x_values, y_values, label="f(x) = x^2 + 5x + 6")
plt.scatter(history, [objective_function(x) for x in history], color='red', label="Gradient Descent Steps")
plt.xlabel("x")
plt.ylabel("f(x)")
plt.title("Gradient Descent Optimization")
plt.legend()
plt.grid(True)
plt.show()

执行结果 最优解: x = -2.499821594038412, f(x) = -0.24999996817131276

image.png

代码解释

  1. 目标函数objective_function(x) 是一个简单的二次函数 f(x) = x^2 + 5x + 6
  2. 梯度函数gradient(x) 是目标函数的导数 f'(x) = 2x + 5
  3. 梯度下降法gradient_descent 函数实现了梯度下降算法,记录每次迭代的参数值。
  4. 参数设置:初始点 starting_point = 10,学习率 learning_rate = 0.1,迭代次数 num_iterations = 50
  5. 绘制图表:使用 matplotlib 绘制目标函数和梯度下降的优化过程。

运行结果

运行代码后,你将看到一个图表,显示目标函数的曲线以及梯度下降法在优化过程中每一步的位置。最终,算法会收敛到函数的最小值附近。

总结

梯度下降法是一种强大的优化算法,广泛应用于机器学习和深度学习中。通过调整学习率和迭代次数,可以控制算法的收敛速度和精度。

示例:一元函数的梯度下降

假设目标函数为: f(x)=x2+5x+6f(x)=x^2+5x+6

1.梯度计算
目标函数的导数为:

f(x)=2x+5f′(x)=2x+5

2.更新规则
梯度下降的更新公式为: xnew=xoldηf(xold)x_{new} =x_{old} −η⋅f′(x_{old})

xnew=xoldη(2xold+5) x_{new}=x_{old}−η⋅(2x_{old}+5)

3.迭代过程
从初始点 x0x_0 开始,反复应用更新规则,直到收敛。

Python代码中的公式对应

在之前的Python代码中:

  • 目标函数f(x)=x2+5x+6f(x)=x^2+5x+6 对应:
def objective_function(x):
    return x**2 + 5*x + 6
  • 梯度 f(x)=2x+5f′(x)=2x+5
def gradient(x):
    return 2*x + 5
  • 更新规则xnew=xoldηf(xold)x_{new} =x_{old} −η⋅f′(x_{old}) 对应:
x = x - learning_rate * grad

梯度下降法的变体

1.批量梯度下降(Batch Gradient Descent)
每次迭代使用全部训练数据计算梯度:

f(x)=1Ni=1Nfi(x)∇f(x)=\frac{1}{N} \sum_{i=1}^{N} ∇{f_i(x)} 其中 N 是训练数据的数量。

  1. 随机梯度下降(Stochastic Gradient Descent, SGD)
    每次迭代随机选择一个样本计算梯度: f(x)=fi(x)∇f(x)= ∇{f_i(x)} 其中 ii 是随机选择的样本索引。

  2. 小批量梯度下降(Mini-batch Gradient Descent)
    每次迭代使用一小部分样本计算梯度: f(x)=1mi=1mfi(x)∇f(x)=\frac{1}{m} \sum_{i=1}^{m} ∇{f_i(x)}

其中 mm 是小批量的大小。

总结

梯度下降法的核心公式是:

xnew=xoldηf(xold)x_{new}=x_{old}−η⋅∇f(x_{old})

通过不断迭代更新参数,梯度下降法可以找到目标函数的最小值。学习率 ηη 是一个关键参数,过大会导致震荡,过小会导致收敛速度慢。

1. 优化问题

梯度下降法的核心目标是找到目标函数的最小值(或最大值,如果是梯度上升法)。具体来说,它可以解决以下优化问题:

  • 无约束优化问题:找到目标函数 f(x)f(x) 的最小值,其中 xx 是参数向量。
  • 约束优化问题:在某些约束条件下找到目标函数的最小值(通常需要结合其他方法,如拉格朗日乘数法)。

2. 机器学习中的模型训练

在机器学习中,梯度下降法主要用于训练模型,即通过调整模型参数来最小化损失函数(Loss Function)。常见的应用包括:

  • 线性回归:最小化均方误差(MSE)。
  • 逻辑回归:最小化对数损失(Log Loss)。
  • 神经网络:最小化交叉熵损失(Cross-Entropy Loss)或均方误差。
  • 支持向量机(SVM) :最小化 hinge loss。

3. 深度学习中的参数优化

在深度学习中,梯度下降法及其变体(如随机梯度下降、Adam 等)是训练神经网络的核心算法。它用于优化神经网络的权重和偏置,以最小化损失函数。


4. 特征学习

梯度下降法可以用于学习数据的特征表示,例如:

  • 主成分分析(PCA) :通过梯度下降法优化投影方向。
  • 自编码器(Autoencoder) :通过梯度下降法学习数据的低维表示。

5. 推荐系统

在推荐系统中,梯度下降法用于优化用户和物品的嵌入向量(Embedding),以最小化预测误差(如矩阵分解问题)。


6. 图像处理

梯度下降法可以用于图像处理任务,例如:

  • 图像去噪:通过优化能量函数去除噪声。
  • 图像生成:通过优化生成对抗网络(GAN)的损失函数生成图像。

7. 自然语言处理(NLP)

在 NLP 中,梯度下降法用于训练语言模型、词嵌入(如 Word2Vec)和序列模型(如 RNN、LSTM、Transformer)。


8. 强化学习

在强化学习中,梯度下降法用于优化策略函数或值函数,以最大化累积奖励。


梯度下降法解决的问题特点

梯度下降法特别适合解决以下特点的问题:

  1. 目标函数可微:梯度下降法需要计算目标函数的梯度,因此目标函数必须是可微的。
  2. 高维参数空间:梯度下降法可以高效地处理高维参数空间(如神经网络的权重)。
  3. 非凸函数:即使目标函数是非凸的(存在多个局部最小值),梯度下降法仍然可以找到一个较好的解。

梯度下降法的局限性

尽管梯度下降法非常强大,但它也有一些局限性:

  1. 局部最小值:对于非凸函数,梯度下降法可能会陷入局部最小值。
  2. 学习率选择:学习率的选择对算法的性能影响很大,过大会导致震荡,过小会导致收敛速度慢。
  3. 鞍点问题:在高维空间中,梯度下降法可能会被困在鞍点(Saddle Point)。
  4. 计算成本:对于大规模数据集,计算梯度可能会非常耗时。

总结

梯度下降法主要用于解决优化问题,特别是在机器学习和深度学习中,用于最小化损失函数和训练模型。它的应用领域非常广泛,包括线性回归、逻辑回归、神经网络、推荐系统、图像处理、自然语言处理等。尽管它有一些局限性,但通过改进(如随机梯度下降、Adam 等),梯度下降法仍然是机器学习和深度学习中最重要的优化算法之一。