最强优化算法,梯度下降!!

文摘   2024-11-21 11:16   北京  

哈喽,我是小白~

今儿和大家要聊的是关于优化算法中最最重要,且基础的一个算法模型,梯度下降法。

首先来说,优化算法 是用来解决一个问题的方法,目标是找到最佳解,也就是某个函数的最大值或最小值。比如,你想找到一条最省时间的上班路线,这是一个优化问题。数学上,这通常可以用一个函数表示,优化算法会调整输入,找到让这个函数输出最优结果的参数。

如果需要本文PDF版本的同学,文末获取~

另外,文末有总结性的干货~

一起来看下具体梯度下降细化内容~

梯度下降法是什么?

梯度下降法 是一种常用的优化算法,主要用于找到函数的最小值(或最大值,稍作变形即可)。它通过不断地调整参数,沿着函数下降最快的方向,逐步逼近最小值点。

梯度下降的核心步骤:

  1. 计算当前位置的梯度(即函数斜率,表示变化的方向和速率)。
  2. 沿着梯度的反方向移动一小步(因为梯度表示增长最快的方向,反方向就是下降最快的方向)。
  3. 重复以上步骤,直到找到最优解或达到停止条件。

通俗案例:寻找山谷最低点

假设你在一个大山谷中,天黑了,你什么也看不见,只能靠摸索来找到山谷最低点。

你可以用一个简单的策略:

  1. 感觉一下脚下的坡度(斜率)。
  2. 沿着坡度往下走一小步(反方向)。
  3. 不断重复,直到感觉不到坡度为止(平地)。

这个过程就类似梯度下降法:

  • 坡度是函数的梯度。
  • 往坡下走是沿着梯度的反方向移动。
  • 找到平地是达到了最小值点。

数学例子

用梯度下降法找到函数  的最小值

1. 目标函数

,我们希望找到  使得  最小。

2. 函数梯度(导数)

梯度是函数的变化率。对  求导:

梯度告诉我们,在某点  上,函数增长或减少的速率。

3. 初始值

假设从  开始(随机选一个点)。

4. 学习率(步长)

假设学习率 ,表示每次移动的步长。

5. 迭代步骤

按梯度下降公式更新 

具体计算如下:

逐步计算:

第 1 次迭代

当前 ,梯度 

更新:

第 2 次迭代

当前 ,梯度 

更新:

第 3 次迭代

当前 ,梯度 

更新:

...

继续多次迭代, 会越来越接近 0,最终  也会趋近最小值 0。

梯度下降法是一种基于微分的优化算法,其数学推导过程建立在函数分析和线性代数的基础上。

下面,咱们详细推导梯度下降法的数学公式,并说明其推导过程~

深入原理

1. 问题定义

给定一个目标函数 ,希望找到其最小值(或近似最小值)点:

其中  是变量。

2. 梯度的定义

梯度  是一个向量,包含了函数  对所有变量的偏导数:

梯度的几何意义是函数在点  处的最大增长方向。

3. 梯度下降法基本思想

梯度下降法的核心思想是沿着负梯度方向(即函数下降最快的方向)更新参数,使得函数值逐步减小,直到接近最小值。

更新公式:

其中:

  •  是当前迭代的点,
  •  是学习率(步长),控制每次更新的幅度,
  •  是当前点的梯度。

4. 梯度下降法的数学推导

(1)泰勒展开

目标是最小化 。假设  是当前点,对  在  点进行泰勒展开(忽略高阶项):

在局部,函数值的变化由梯度主导。

为了减小 ,希望选择新的点  满足:

即沿着负梯度方向移动。

(2)下降性质的验证

在梯度下降法中,我们更新后的函数值  应小于当前函数值 。验证这个性质:

假设 ,则:

代入 

因为  且 ,所以:

梯度下降法确保了函数值在每次迭代中单调减小(如果学习率选择合理)。

(3)收敛条件

梯度下降法收敛到最小值的条件主要依赖于:

  1.  是凸函数,即满足:
  1. 学习率  足够小,使得每次更新不会越过最优点。

若  是凸函数,并且满足 Lipschitz 梯度条件:

则梯度下降法的收敛速度可以被数学证明。

5. 二次函数的特殊情况

以二次函数  为例,推导梯度下降法的行为:

(1)梯度

(2)更新公式

(3)收敛条件

若  是正定矩阵,函数是凸的,梯度下降法会收敛到唯一最小值。

6. 学习率的选择

学习率  的选择直接影响算法的效果:

  1. 若  太大,可能导致算法发散;
  2. 若  太小,算法收敛速度会很慢。

对于凸函数 ,最佳学习率通常与 Hessian 矩阵的特征值有关,可以通过理论分析确定。

7. 梯度下降法的总结公式

梯度下降法的完整更新公式为:

其中:

  •  是第  次迭代的位置;
  •  是梯度;
  •  是学习率。

梯度下降法是一种逐步逼近最小值点的优化算法,广泛应用于机器学习、深度学习和工程优化问题中。

优缺点和适用场景

优点

1. 简单易实现

梯度下降法的计算规则简单,只需目标函数的梯度信息,无需更复杂的计算。

2. 计算效率高

适用于高维问题(尤其是机器学习中),每次迭代的计算复杂度低,能够快速更新参数。

3. 适合连续优化问题

对于目标函数是连续的、可微的情况,梯度下降法表现优秀。

4. 广泛适用性

梯度下降是很多复杂优化算法(如随机梯度下降、动量法、Adam)的基础。

缺点

1. 依赖学习率的选择

  • 学习率  太小:收敛速度慢。

  • 学习率  太大:可能越过最优点甚至发散。

手动调试学习率可能耗时,且不同问题的最佳学习率可能不同。

2. 易陷入局部最优

对于非凸函数(如深度学习中的损失函数),梯度下降法可能收敛到局部最优解,而非全局最优。

3. 对初始点敏感

初始点的选择会影响收敛速度,甚至最终结果。

4. 可能收敛缓慢

当目标函数的曲率变化剧烈时(如Hessian矩阵的特征值差异大),梯度下降法可能在优化路径中表现震荡,导致收敛速度慢。

5. 不适合离散优化问题

梯度下降法需要目标函数是连续可微的,对于离散问题(如组合优化)无效。

适用场景

1. 凸优化问题

梯度下降法特别适合目标函数为凸函数的问题。此时,算法能够保证收敛到全局最优解。例如:

  • 最小二乘回归问题。
  • -正则化的线性模型优化。

2. 机器学习模型训练

梯度下降法在机器学习中用于优化模型的损失函数。例如:

  • 线性回归:优化均方误差(MSE)。
  • 逻辑回归:优化对数损失函数。
  • 神经网络:优化交叉熵或均方误差损失函数。

3. 深度学习权重优化

深度学习中,梯度下降法是最常用的权重更新方法。通过变体(如随机梯度下降、Adam等),可以在大规模数据上有效训练深度神经网络。

完整案例

我们使用梯度下降法优化一个具有多维特征的数据集,拟合目标函数 

最后在可视化中:

  1. 绘制损失值随迭代次数变化的动态 3D 曲面图。
  2. 展示最终模型在数据点上的拟合效果,用 3D 散点图和拟合平面展示。

Python代码

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 数据生成
np.random.seed(42)
n_samples = 200
x1 = 2 * np.random.rand(n_samples, 1)  # 特征1
x2 = 3 * np.random.rand(n_samples, 1)  # 特征2
noise = np.random.randn(n_samples, 1) * 0.5  # 噪声
y = 5 + 2 * x1 + 3 * x2 + noise  # 目标值

# 将特征合并
X = np.hstack([x1, x2])

# 初始化参数
w = np.random.randn(21)  # 权重 (w1, w2)
b = np.random.randn(1)  # 偏置
learning_rate = 0.01
n_iterations = 500

# 梯度下降存储损失
loss_history = []

# 梯度下降迭代
for iteration in range(n_iterations):
    # 预测
    y_pred = X @ w + b
    # 损失函数 (MSE)
    loss = (1 / (2 * n_samples)) * np.sum((y_pred - y) ** 2)
    loss_history.append(loss)
    # 梯度计算
    dw = (1 / n_samples) * (X.T @ (y_pred - y))
    db = (1 / n_samples) * np.sum(y_pred - y)
    # 参数更新
    w -= learning_rate * dw
    b -= learning_rate * db

# 打印最终参数
print(f"Optimized Parameters: w1 = {w[00]:.4f}, w2 = {w[10]:.4f}, b = {b[0]:.4f}")

# 图形绘制
fig = plt.figure(figsize=(2010))

# 图1:损失值动态变化曲面图
ax1 = fig.add_subplot(121, projection='3d')
iterations = np.arange(n_iterations)
weights = np.linspace(-24, n_iterations)
loss_surface = np.array([loss_history for _ in range(n_iterations)])  # 动态变化模拟
X_weights, Y_weights = np.meshgrid(weights, iterations)
ax1.plot_surface(X_weights, Y_weights, loss_surface, cmap='coolwarm', alpha=0.9)
ax1.set_title("Loss Surface Dynamics", fontsize=16)
ax1.set_xlabel("Iterations", fontsize=14)
ax1.set_ylabel("Parameter Update (Steps)", fontsize=14)
ax1.set_zlabel("Loss (MSE)", fontsize=14)

# 图2:3D拟合效果展示
ax2 = fig.add_subplot(122, projection='3d')
ax2.scatter(x1, x2, y, c='blue', label='Data Points')
x1_grid, x2_grid = np.meshgrid(np.linspace(0250), np.linspace(0350))
y_grid = w[00] * x1_grid + w[10] * x2_grid + b[0]
ax2.plot_surface(x1_grid, x2_grid, y_grid, cmap='viridis', alpha=0.7)
ax2.set_title("3D Data Fitting with Gradient Descent", fontsize=16)
ax2.set_xlabel("Feature x1", fontsize=14)
ax2.set_ylabel("Feature x2", fontsize=14)
ax2.set_zlabel("Target y", fontsize=14)
ax2.legend(fontsize=12)

plt.tight_layout()
plt.show()

1. 数据生成

  • 构造二维特征 ,目标值 
  • 合成数据集 ,这是典型的多维线性回归问题。

2. 梯度下降

  • 通过均方误差 (MSE) 作为损失函数,计算损失及其梯度,更新参数 
  • 学习率为 0.01,迭代 500 次。

数据分析效果图:一个 3D 曲面展示了损失值的变化,模拟优化过程中的动态收敛趋势。以及一个 3D 散点图显示数据点分布。

最后

以上就是今天所有的内容了。
获取本文PDF,点击名片回复「基础算法模型」即可~
 
另外, 我们整理了机器学习算法册子,总共16大块的内容,124个问题的总结点击领取!
如果对你来说比较有用,记得点赞、转发,收藏起来慢慢学习~
下期会有更多干货等着你!~

Python和机器学习初学者
Python和机器学习分享,只写干货,一起学习~
 最新文章