哈喽,我是小白~
今儿和大家要聊的是关于优化算法中最最重要,且基础的一个算法模型,梯度下降法。
首先来说,优化算法 是用来解决一个问题的方法,目标是找到最佳解,也就是某个函数的最大值或最小值。比如,你想找到一条最省时间的上班路线,这是一个优化问题。数学上,这通常可以用一个函数表示,优化算法会调整输入,找到让这个函数输出最优结果的参数。
如果需要本文PDF版本的同学,文末获取~
另外,文末有总结性的干货~
一起来看下具体梯度下降细化内容~
梯度下降法是什么?
梯度下降法 是一种常用的优化算法,主要用于找到函数的最小值(或最大值,稍作变形即可)。它通过不断地调整参数,沿着函数下降最快的方向,逐步逼近最小值点。
梯度下降的核心步骤:
计算当前位置的梯度(即函数斜率,表示变化的方向和速率)。 沿着梯度的反方向移动一小步(因为梯度表示增长最快的方向,反方向就是下降最快的方向)。 重复以上步骤,直到找到最优解或达到停止条件。
通俗案例:寻找山谷最低点
假设你在一个大山谷中,天黑了,你什么也看不见,只能靠摸索来找到山谷最低点。
你可以用一个简单的策略:
感觉一下脚下的坡度(斜率)。 沿着坡度往下走一小步(反方向)。 不断重复,直到感觉不到坡度为止(平地)。
这个过程就类似梯度下降法:
坡度是函数的梯度。 往坡下走是沿着梯度的反方向移动。 找到平地是达到了最小值点。
数学例子
用梯度下降法找到函数 的最小值
1. 目标函数:
,我们希望找到 使得 最小。
2. 函数梯度(导数):
梯度是函数的变化率。对 求导:
。
梯度告诉我们,在某点 上,函数增长或减少的速率。
3. 初始值:
假设从 开始(随机选一个点)。
4. 学习率(步长):
假设学习率 ,表示每次移动的步长。
5. 迭代步骤:
按梯度下降公式更新 :
。
具体计算如下:
逐步计算:
第 1 次迭代:
当前 ,梯度 。
更新:
。
第 2 次迭代:
当前 ,梯度 。
更新:
。
第 3 次迭代:
当前 ,梯度 。
更新:
。
...
继续多次迭代, 会越来越接近 0,最终 也会趋近最小值 0。
梯度下降法是一种基于微分的优化算法,其数学推导过程建立在函数分析和线性代数的基础上。
下面,咱们详细推导梯度下降法的数学公式,并说明其推导过程~
深入原理
1. 问题定义
给定一个目标函数 ,希望找到其最小值(或近似最小值)点:
其中 是变量。
2. 梯度的定义
梯度 是一个向量,包含了函数 对所有变量的偏导数:
梯度的几何意义是函数在点 处的最大增长方向。
3. 梯度下降法基本思想
梯度下降法的核心思想是沿着负梯度方向(即函数下降最快的方向)更新参数,使得函数值逐步减小,直到接近最小值。
更新公式:
其中:
是当前迭代的点, 是学习率(步长),控制每次更新的幅度, 是当前点的梯度。
4. 梯度下降法的数学推导
(1)泰勒展开
目标是最小化 。假设 是当前点,对 在 点进行泰勒展开(忽略高阶项):
在局部,函数值的变化由梯度主导。
为了减小 ,希望选择新的点 满足:
即沿着负梯度方向移动。
(2)下降性质的验证
在梯度下降法中,我们更新后的函数值 应小于当前函数值 。验证这个性质:
假设 ,则:
代入 :
因为 且 ,所以:
梯度下降法确保了函数值在每次迭代中单调减小(如果学习率选择合理)。
(3)收敛条件
梯度下降法收敛到最小值的条件主要依赖于:
是凸函数,即满足:
学习率 足够小,使得每次更新不会越过最优点。
若 是凸函数,并且满足 Lipschitz 梯度条件:
则梯度下降法的收敛速度可以被数学证明。
5. 二次函数的特殊情况
以二次函数 为例,推导梯度下降法的行为:
(1)梯度
(2)更新公式
(3)收敛条件
若 是正定矩阵,函数是凸的,梯度下降法会收敛到唯一最小值。
6. 学习率的选择
学习率 的选择直接影响算法的效果:
若 太大,可能导致算法发散; 若 太小,算法收敛速度会很慢。
对于凸函数 ,最佳学习率通常与 Hessian 矩阵的特征值有关,可以通过理论分析确定。
7. 梯度下降法的总结公式
梯度下降法的完整更新公式为:
其中:
是第 次迭代的位置; 是梯度; 是学习率。
梯度下降法是一种逐步逼近最小值点的优化算法,广泛应用于机器学习、深度学习和工程优化问题中。
优缺点和适用场景
优点
1. 简单易实现
梯度下降法的计算规则简单,只需目标函数的梯度信息,无需更复杂的计算。
2. 计算效率高
适用于高维问题(尤其是机器学习中),每次迭代的计算复杂度低,能够快速更新参数。
3. 适合连续优化问题
对于目标函数是连续的、可微的情况,梯度下降法表现优秀。
4. 广泛适用性
梯度下降是很多复杂优化算法(如随机梯度下降、动量法、Adam)的基础。
缺点
1. 依赖学习率的选择
学习率 太小:收敛速度慢。
学习率 太大:可能越过最优点甚至发散。
手动调试学习率可能耗时,且不同问题的最佳学习率可能不同。
2. 易陷入局部最优
对于非凸函数(如深度学习中的损失函数),梯度下降法可能收敛到局部最优解,而非全局最优。
3. 对初始点敏感
初始点的选择会影响收敛速度,甚至最终结果。
4. 可能收敛缓慢
当目标函数的曲率变化剧烈时(如Hessian矩阵的特征值差异大),梯度下降法可能在优化路径中表现震荡,导致收敛速度慢。
5. 不适合离散优化问题
梯度下降法需要目标函数是连续可微的,对于离散问题(如组合优化)无效。
适用场景
1. 凸优化问题
梯度下降法特别适合目标函数为凸函数的问题。此时,算法能够保证收敛到全局最优解。例如:
最小二乘回归问题。 -正则化的线性模型优化。
2. 机器学习模型训练
梯度下降法在机器学习中用于优化模型的损失函数。例如:
线性回归:优化均方误差(MSE)。 逻辑回归:优化对数损失函数。 神经网络:优化交叉熵或均方误差损失函数。
3. 深度学习权重优化
深度学习中,梯度下降法是最常用的权重更新方法。通过变体(如随机梯度下降、Adam等),可以在大规模数据上有效训练深度神经网络。
完整案例
我们使用梯度下降法优化一个具有多维特征的数据集,拟合目标函数 。
最后在可视化中:
绘制损失值随迭代次数变化的动态 3D 曲面图。 展示最终模型在数据点上的拟合效果,用 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(2, 1) # 权重 (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[0, 0]:.4f}, w2 = {w[1, 0]:.4f}, b = {b[0]:.4f}")
# 图形绘制
fig = plt.figure(figsize=(20, 10))
# 图1:损失值动态变化曲面图
ax1 = fig.add_subplot(1, 2, 1, projection='3d')
iterations = np.arange(n_iterations)
weights = np.linspace(-2, 4, 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(1, 2, 2, projection='3d')
ax2.scatter(x1, x2, y, c='blue', label='Data Points')
x1_grid, x2_grid = np.meshgrid(np.linspace(0, 2, 50), np.linspace(0, 3, 50))
y_grid = w[0, 0] * x1_grid + w[1, 0] * 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 散点图显示数据点分布。
最后