基于PyTorch的梯度下降法训练与动态可视化
本教程将带你从零实现一个简单的线性回归模型,使用PyTorch框架, 通过梯度下降法进行训练。整个训练过程将以动态GIF动画的形式可视化展示, 让你直观理解机器学习的核心概念。
线性回归是一种最基本的监督学习算法,用于预测连续值输出。其核心是找到一条"最佳拟合直线",使得预测值与真实值之间的误差最小。
梯度下降是优化算法的一种,通过计算损失函数的梯度,朝着使损失最小化的方向逐步更新参数。
均方误差(MSE)损失函数计算预测值与真实值之间差异的平方的平均值,是回归问题的常用损失函数。
# 导入所需库 import pandas as pd import torch import matplotlib.pyplot as plt import matplotlib.animation as animation
# 读取CSV数据文件,将数据转换为数组形式 data = pd.read_csv('line_fit_data.csv').values # 提取自变量X(第一列)和目标变量y(第二列),转换为PyTorch张量 X = torch.tensor(data[:, 0], dtype=torch.float32) # 样本自变量 y = torch.tensor(data[:, 1], dtype=torch.float32) # 样本目标变量 # 初始化模型参数(需要计算梯度) W = torch.tensor(-10.0, requires_grad=True) # 初始权重 b = torch.tensor(7.0, requires_grad=True) # 初始偏置(阈值) learning_rate = 0.35 # 学习率
张量是PyTorch中的基本数据结构,可以看作是多维数组。标量(0维)、向量(1维)、矩阵(2维)都是张量的特例。
设置此参数后,PyTorch会自动跟踪该张量的所有操作,以便后续计算梯度。这是实现自动微分的关键。
# 线性模型:y = W * X + b def linear_model(W, X, b): return W * X + b # 均方误差损失函数 def loss_fn(y_pred, y_true): return ((y_pred - y_true) ** 2).mean()
y = W × X + b
W是权重(weight),b是偏置(bias)。目标是找到最佳的W和b使得模型预测最准确。
MSE = Σ(预测值 - 真实值)² / n
计算所有样本预测误差平方的平均值。损失越小,模型越好。
训练过程包含以下四个核心步骤,循环执行直到损失收敛:
将输入数据传入模型,计算预测值 y_pred = W × X + b
使用损失函数计算预测值与真实值之间的误差 loss = MSE(y_pred, y)
调用 loss.backward() 自动计算W和b的梯度
使用梯度下降法更新参数:W = W - learning_rate × ∂loss/∂W
# 训练循环(200轮迭代) for epoch in range(200): # 1. 前向传播:计算预测值 y_pred = linear_model(W, X, b) # 2. 计算损失 loss = loss_fn(y_pred, y) # 3. 反向传播:计算梯度 loss.backward() # 4. 梯度下降法更新参数 with torch.no_grad(): W.data -= W.grad * learning_rate b.data -= b.grad * learning_rate # 5. 梯度清零(避免累积) W.grad.zero_() b.grad.zero_()
Epoch: 0 | Loss: 19.839161 | W: -8.410545 | b: 8.993589 Epoch: 20 | Loss: 1.673407 | W: -1.993041 | b: 6.238269 Epoch: 40 | Loss: 0.293182 | W: 0.619350 | b: 4.936872 Epoch: 60 | Loss: 0.051366 | W: 1.712817 | b: 4.392146 Epoch: 80 | Loss: 0.008999 | W: 2.170510 | b: 4.164140 Epoch: 100 | Loss: 0.001577 | W: 2.362085 | b: 4.068704 Epoch: 120 | Loss: 0.000276 | W: 2.442273 | b: 4.028758 Epoch: 140 | Loss: 0.000048 | W: 2.475837 | b: 4.012037 Epoch: 160 | Loss: 0.000008 | W: 2.489887 | b: 4.005038 Epoch: 180 | Loss: 0.000001 | W: 2.495767 | b: 4.002109 训练完成!最终权重 W = 2.498149, 偏置 b = 4.000922
下面展示训练过程的动态GIF动画,直观呈现:
想象你站在山坡上,想找到最低点。梯度下降就像蒙着眼睛,每次往坡度最陡的方向迈一步,最终到达谷底。
学习率过大可能导致"overshoot"(越过最低点),过小则收敛太慢。调参是机器学习的重要技能。
如果模型太简单(欠拟合),无法捕捉数据规律;如果太复杂(过拟合),会记住噪声而非真实模式。
PyTorch的autograd模块能自动计算复杂函数的梯度,大大简化了深度学习模型的开发。
🎉 恭喜完成本节学习!
下一步可以尝试:调整学习率观察收敛速度变化,或使用更多数据进行训练。