阶段1:基础知识储备
第三课:微积分基础
学习目标
- 理解导数与偏导数的定义及其几何意义。
- 掌握链式法则在神经网络反向传播中的应用。
- 学会梯度下降法的原理与实现。
- 实战:用梯度下降法优化线性回归模型。
1. 导数与偏导数
(1) 导数(Derivative)
- 定义:函数在某一点的瞬时变化率
f'(x) = \lim_{h \to 0} \frac{f(x+h) - f(x)}{h}
- 几何意义:曲线在该点的切线斜率。
示例:f(x) = x^2 的导数为 f'(x) = 2x。
(2) 偏导数(Partial Derivative)
- 定义:多元函数对某一变量的导数(其他变量视为常数)。
\frac{\partial f}{\partial x_i} = \lim_{h \to 0} \frac{f(x_1, \dots, x_i + h, \dots, x_n) - f(x_1, \dots, x_n)}{h}
- 示例:f(x, y) = x^2 + 3xy 的偏导数:
\frac{\partial f}{\partial x} = 2x + 3y, \quad \frac{\partial f}{\partial y} = 3x
2. 链式法则与反向传播
(1) 链式法则(Chain Rule)
- 单变量函数:若 y = f(g(x)),则
\frac{dy}{dx} = f'(g(x)) \cdot g'(x)
- 多变量函数:若 z = f(x, y), x = u(t), y = v(t),则
\frac{dz}{dt} = \frac{\partial z}{\partial x} \frac{dx}{dt} + \frac{\partial z}{\partial y} \frac{dy}{dt}
(2) 反向传播(Backpropagation)
- 核心思想:通过链式法则从输出层向输入层逐层计算梯度。
神经网络示例:
设损失函数 L = (y_{\text{pred}} - y_{\text{true}})^2,权重 w 的梯度:\frac{\partial L}{\partial w} = 2(y_{\text{pred}} - y_{\text{true}}) \cdot \frac{\partial y_{\text{pred}}}{\partial w}
(3) 参考
https://log.new2wen.com/archives/lianshifaze-fanxiangchuanbo
https://log.new2wen.com/archives/JD-SJWL-ZD%20LSFZ-FXCB
3. 梯度下降法
(1) 梯度(Gradient)
- 定义:多元函数所有偏导数组成的向量,指向函数增长最快的方向。
\nabla f = \left( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \dots, \frac{\partial f}{\partial x_n} \right)
(2) 梯度下降更新规则
-
公式:沿负梯度方向更新参数以最小化损失函数。
w_{t+1} = w_t - \eta \nabla f(w_t)- \eta:学习率(learning rate)。
示例:优化 f(w) = w^2,初始 w=3,\eta=0.1:
w_1 = 3 - 0.1 \times 6 = 2.4, \quad w_2 = 2.4 - 0.1 \times 4.8 = 1.92, \quad \dots - \eta:学习率(learning rate)。
4. 实战:用梯度下降优化线性回归
(1) 问题定义
- 模型:y = wx + b
- 损失函数:均方误差(MSE)
L = \frac{1}{N} \sum_{i=1}^N (y_i - (wx_i + b))^2
(2) Python实现
import numpy as np
import matplotlib.pyplot as plt
# 生成数据
np.random.seed(42)
X = np.linspace(0, 10, 100)
y = 2 * X + 3 + np.random.randn(100) * 2 # 真实关系:y = 2x + 3 + 噪声
# 初始化参数
w, b = 0.0, 0.0
lr = 0.01
epochs = 100
# 梯度下降
loss_history = []
for epoch in range(epochs):
# 前向计算
y_pred = w * X + b
loss = ((y_pred - y) ** 2).mean()
loss_history.append(loss)
# 反向传播(计算梯度)
dw = 2 * (y_pred - y).dot(X) / len(X)
db = 2 * (y_pred - y).mean()
# 参数更新
w -= lr * dw
b -= lr * db
# 可视化结果
plt.figure(figsize=(12, 4))
# 损失曲线
plt.subplot(121)
plt.plot(loss_history)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Loss Convergence')
# 回归拟合
plt.subplot(122)
plt.scatter(X, y, label='Data')
plt.plot(X, w * X + b, color='red', label=f'Fit: y = {w:.2f}x + {b:.2f}')
plt.legend()
plt.show()
(3) 输出结果
- 损失下降曲线:随着迭代次数增加,损失逐渐收敛。
- 拟合直线:最终参数接近真实值 w=2,b=3。
5. 练习题目
- 导数计算:求 f(x)=3x3+2ex 的导数 f′(x)。
- 偏导数计算:对 f(x,y)=x2y+sin(y),求 ∂x∂f 和 ∂y∂f。
- 梯度下降调参:修改学习率
lr=0.1
和lr=0.001
,观察损失曲线变化并解释原因。
6. 扩展思考
- 局部最小值问题:梯度下降可能陷入局部最优,如何改进?(提示:随机梯度下降、动量法)
- 学习率选择:学习率过大会导致震荡,过小收敛慢,有哪些自适应学习率算法?(如Adam、RMSProp)
下一课预告:第四课将讲解信息论基础(熵、交叉熵、KL散度)及其在损失函数中的应用。
评论区