🤖 线性回归模型从零实现

基于PyTorch的梯度下降法训练与动态可视化

📖 课程简介

本教程将带你从零实现一个简单的线性回归模型,使用PyTorch框架, 通过梯度下降法进行训练。整个训练过程将以动态GIF动画的形式可视化展示, 让你直观理解机器学习的核心概念。

📌 线性回归是什么?

线性回归是一种最基本的监督学习算法,用于预测连续值输出。其核心是找到一条"最佳拟合直线",使得预测值与真实值之间的误差最小。

📌 梯度下降法

梯度下降是优化算法的一种,通过计算损失函数的梯度,朝着使损失最小化的方向逐步更新参数。

📌 损失函数

均方误差(MSE)损失函数计算预测值与真实值之间差异的平方的平均值,是回归问题的常用损失函数。

1 数据加载与预处理

# 导入所需库
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     # 学习率

🔍 什么是张量(Tensor)?

张量是PyTorch中的基本数据结构,可以看作是多维数组。标量(0维)、向量(1维)、矩阵(2维)都是张量的特例。

🔍 requires_grad=True

设置此参数后,PyTorch会自动跟踪该张量的所有操作,以便后续计算梯度。这是实现自动微分的关键。

2 定义模型与损失函数

# 线性模型: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
计算所有样本预测误差平方的平均值。损失越小,模型越好。

3 训练模型

训练过程包含以下四个核心步骤,循环执行直到损失收敛:

1️⃣

前向传播 (Forward Propagation)

将输入数据传入模型,计算预测值 y_pred = W × X + b

2️⃣

计算损失 (Compute Loss)

使用损失函数计算预测值与真实值之间的误差 loss = MSE(y_pred, y)

3️⃣

反向传播 (Backward Propagation)

调用 loss.backward() 自动计算W和b的梯度

4️⃣

更新参数 (Update Parameters)

使用梯度下降法更新参数: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

4 动态可视化

下面展示训练过程的动态GIF动画,直观呈现:

🎯 观察要点

  • 左图(模型拟合):红色预测线如何逐步逼近蓝色数据点
  • 右图(损失曲线):损失值如何快速下降并趋于稳定
  • 参数变化:W从-10逐步趋近2.5,b从7逐步趋近4
线性回归训练过程动画

🏆 最终训练结果

y = 2.498149 × x + 4.000922
0.000000
最终损失值
200
训练轮数
0.35
学习率

📝 核心概念总结

🔢 梯度下降原理

想象你站在山坡上,想找到最低点。梯度下降就像蒙着眼睛,每次往坡度最陡的方向迈一步,最终到达谷底。

🔢 学习率的影响

学习率过大可能导致"overshoot"(越过最低点),过小则收敛太慢。调参是机器学习的重要技能。

🔢 过拟合与欠拟合

如果模型太简单(欠拟合),无法捕捉数据规律;如果太复杂(过拟合),会记住噪声而非真实模式。

🔢 自动微分

PyTorch的autograd模块能自动计算复杂函数的梯度,大大简化了深度学习模型的开发。

💡 本节要点回顾

  • 线性回归寻找一条"最佳拟合直线" y = Wx + b
  • 损失函数衡量预测值与真实值的差距,均方误差(MSE)是最常用的回归损失
  • 梯度下降通过迭代优化,逐步找到最优参数
  • PyTorch的张量(tensor)和自动微分(autograd)是实现神经网络的基础
  • 参数初始值、学习率、迭代次数都是重要的超参数

🎉 恭喜完成本节学习!
下一步可以尝试:调整学习率观察收敛速度变化,或使用更多数据进行训练。