3-2 梯度与反向传播
主目录点这里
梯度的含义
可以看到红色区域的变化率较大,梯度较大;绿色区域的变化率较小,梯度较小。
在二维情况下,梯度向量的方向指向函数增长最快的方向,而其大小表示增长的速率。
梯度的计算
当然我们不必学太深的纯运算,来看看python是怎么解决的
import numpy as np
import matplotlib.pyplot as plt
import sympy as sp
def gradient(f, variables, point):
gradients = [sp.diff(f, var) for var in variables]
gradient_at_point = [grad.evalf(subs=dict(zip(variables, point))) for grad in gradients]
return gradient_at_point
# 定义变量
x, y = sp.symbols('x y')
# 定义函数 f(x, y)
f = x**2 + y**2
# 定义点
point = (3, 4)
# 计算梯度
grad = gradient(f, [x, y], point)
# 函数表达式转换为可计算的 lambda 函数
f_lambda = sp.lambdify((x, y), f, 'numpy')
# 创建 x, y 数据
X = np.linspace(-5, 5, 400)
Y = np.linspace(-5, 5, 400)
X, Y = np.meshgrid(X, Y)
# 计算 z 数据
Z = f_lambda(X, Y)
# 创建图形
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
# 绘制表面图
ax.plot_surface(X, Y, Z, cmap='viridis', alpha=0.7)
# 绘制梯度向量
# 在 point 点绘制梯度
ax.quiver(point[0], point[1], f_lambda(point[0], point[1]),
grad[0], grad[1], 0, color='r', length=1.5, arrow_length_ratio=0.2)
# 标记点
ax.scatter(point[0], point[1], f_lambda(point[0], point[1]), color='r', s=100)
# 设置标签
ax.set_xlabel('X axis')
ax.set_ylabel('Y axis')
ax.set_zlabel('Z axis')
# 标题
ax.set_title('Surface plot of f(x, y) = x^2 + y^2 with gradient vector at (3, 4)')
plt.show()
反向传播