文章目录
- 从现实中的例子理解什么是梯度
- 梯度的数学定义
- 梯度的严格的数学定义
- 为什么梯度向量指向函数增长最快的方向?
- 为什么梯度是深度学习优化的最基础概念
- 在python中实现梯度求导的简单案例
- 一元线性回归
- 多元线性回归
- 结合示例深度学习中的梯度求导的一般过程
- 数学原理推导
- 对应到代码中的梯度计算
从现实中的例子理解什么是梯度
想象你在一座被浓雾笼罩的山上,想找到山谷的最低点。但由于能见度低,你无法看到全貌,只能感觉到脚下的坡度。这种坡度感告诉你哪个方向是向下的,哪边更陡峭。这个“坡度”就是梯度的直观表现,它指示了函数在当前点变化最快的方向和速率。此时,真想吟诗一首:
雾锁高山觅谷深,
脚踏迷途辨缓峻。
坡度指引下山路,
梯度犹似暗中灯。
梯度的数学定义
梯度的严格的数学定义
在多元微积分中,梯度(Gradient)是标量函数在某一点的方向导数取得最大值的方向。具体来说,对于一个实值的可微函数 f ( x 1 , x 2 , . . . , x n ) f(x_1, x_2, ..., x_n) f(x1,x2,...,xn),其梯度是由函数对各个变量的偏导数组成的向量:
∇ f = ( ∂ f ∂ x 1 , ∂ f ∂ x 2 , . . . , ∂ f ∂ x n ) \nabla f = \left( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, ..., \frac{\partial f}{\partial x_n} \right) ∇f=(∂x1∂f,∂x2∂f,...,∂xn∂f)
为什么梯度向量指向函数增长最快的方向?
首先,我们需要引入方向导数的概念。方向导数描述了函数在某个特定方向上的变化率。对于单位向量 u \mathbf{u} u,函数 f f f在点 x \mathbf{x} x沿方向 u \mathbf{u} u的方向导数定义为:
D u f ( x ) = ∇ f ( x ) ⋅ u = ∥ ∇ f ( x ) ∥ ⋅ ∥ u ∥ cos θ = ∥ ∇ f ( x ) ∥ cos θ D_{\mathbf{u}} f(\mathbf{x}) = \nabla f(\mathbf{x}) \cdot \mathbf{u} = \| \nabla f(\mathbf{x}) \| \cdot \| \mathbf{u} \| \cos \theta = \| \nabla f(\mathbf{x}) \| \cos \theta Duf(x)=∇f(x)⋅u=∥∇f(x)∥⋅∥u∥cosθ=∥∇f(x)∥cosθ
其中, θ \theta θ是 ∇ f ( x ) \nabla f(\mathbf{x}) ∇f(x)与 u \mathbf{u} u之间的夹角, ∥ ⋅ ∥ \| \cdot \| ∥⋅∥表示向量的模。
从上式可以看出,方向导数 D u f ( x ) D_{\mathbf{u}} f(\mathbf{x}) Duf(x)的值取决于 cos θ \cos \theta cosθ。当 θ = 0 \theta = 0 θ=0时, cos θ \cos \theta cosθ取得最大值1,此时方向导数也达到最大值,即:
D u f ( x ) max = ∥ ∇ f ( x ) ∥ D_{\mathbf{u}} f(\mathbf{x})_{\text{max}} = \| \nabla f(\mathbf{x}) \| Duf(x)max=∥∇f(x)∥
这意味着,函数 f f f在点 x \mathbf{x} x沿着梯度方向 ∇ f ( x ) \nabla f(\mathbf{x}) ∇f(x),具有最大的增长率。
为什么梯度是深度学习优化的最基础概念
梯度在深度学习中扮演着核心角色,几乎贯穿了整个模型训练和优化的过程。要理解梯度为何如此重要,需要从深度学习模型的构建、训练以及优化方法等多个角度来探讨。
1. 深度学习的目标:最小化损失函数
深度学习的核心目标是通过调整模型参数,使得模型在给定数据集上的损失函数达到最小值。损失函数(Loss Function)衡量了模型预测输出与真实标签之间的差距,是一个关于模型参数的多元函数。优化损失函数的过程本质上是一个在高维参数空间中寻找全局或局部最小值的问题。
2. 梯度提供了最陡下降的方向
在高维参数空间中,直接找到损失函数的最小值是极其困难的。然而,梯度为我们提供了一条捷径。梯度向量指示了损失函数在当前参数点处增长最快的方向。根据梯度的性质,沿着梯度的反方向,即是函数下降最快的路径。因此,梯度为我们提供了在参数空间中如何调整参数以最快速地降低损失函数值的指导。
3. 梯度下降法是深度学习的基础优化算法
梯度下降法(Gradient Descent)利用了梯度信息,通过迭代更新模型参数,使得每一步都朝着损失函数减小的方向前进。其基本更新公式为:
θ n e w = θ o l d − η ∇ θ L ( θ o l d ) \theta_{new} = \theta_{old} - \eta \nabla_{\theta} L(\theta_{old}) θnew=θold−η∇θL(θold)
其中, θ \theta θ表示模型参数, η \eta η是学习率, L ( θ ) L(\theta) L(θ)是损失函数, ∇ θ L ( θ ) \nabla_{\theta} L(\theta) ∇θL(θ)是损失函数对参数的梯度。
4. 反向传播算法依赖梯度计算
反向传播(Backpropagation)是训练神经网络的关键算法,用于高效地计算损失函数对每个参数的梯度。通过链式法则,反向传播将输出层的误差逐层传递回前面的网络层,计算出每个参数对损失的影响。这个过程的核心就是梯度的计算和传递,没有梯度,反向传播无法进行。
在python中实现梯度求导的简单案例
一元线性回归
下面示例展示了普通线性一元回归的梯度求导以及反向误差传播,并动态可视化其结果:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation# 生成数据集
np.random.seed(0)
X = np.linspace(0, 10, 50)
y = 2 * X + 1 + np.random.randn(50) * 4 # 增加噪声强度# 参数初始化
w, b = -10.0, -10.0 # 将初始参数设置为远离最优值
lr = 0.02 # 学习率
epochs = 300 # 训练次数# 存储参数和损失以便绘图
ws, bs = [], []
losses = []# 创建图形
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
scatter = ax1.scatter(X, y, color='blue', label='data scatter')
line, = ax1.plot([], [], 'r-', linewidth=2, label='fitted curve')
text_loss = ax1.text(0.05, 0.85, '', transform=ax1.transAxes, fontsize=12, verticalalignment='top')
ax1.set_xlabel('X')
ax1.set_ylabel('y')
ax1.set_title('simple Linear Regression')
ax1.legend()ax2.set_xlim(0, epochs)
ax2.set_ylim(0, max((y - y.mean()) ** 2) * 1.2)
loss_line, = ax2.plot([], [], 'b-')
ax2.set_xlabel('epoch')
ax2.set_ylabel('loss')
ax2.set_title('loss curve')def animate(i):global w, by_pred = w * X + bloss = ((y_pred - y) ** 2).mean()# 计算梯度grad_w =