侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

使用PyTorch实现简单线性回归的梯度下降

2025-12-11 / 0 评论 / 3 阅读

题目

使用PyTorch实现简单线性回归的梯度下降

信息

  • 类型:问答
  • 难度:⭐

考点

张量创建,自动求导机制,优化器使用

快速回答

实现步骤:

  1. 创建输入特征张量 x 和标签张量 y
  2. 初始化权重 w 和偏置 b 为可训练张量
  3. 定义前向传播函数 forward()
  4. 计算均方误差损失 MSE
  5. 调用 backward() 自动计算梯度
  6. 使用优化器更新参数
## 解析

原理说明

线性回归通过最小化预测值与真实值的均方误差来拟合直线。PyTorch利用计算图跟踪张量操作,通过backward()自动计算梯度,优化器根据梯度更新参数。

代码示例

import torch
import torch.optim as optim

# 1. 创建数据张量 (requires_grad=False)
x = torch.tensor([1.0, 2.0, 3.0])
y = torch.tensor([2.0, 4.0, 6.0])

# 2. 初始化参数 (requires_grad=True)
w = torch.tensor(0.0, requires_grad=True)
b = torch.tensor(0.0, requires_grad=True)

# 3. 定义优化器
optimizer = optim.SGD([w, b], lr=0.01)

# 训练循环
for epoch in range(100):
    # 前向传播
    y_pred = w * x + b

    # 计算损失
    loss = torch.mean((y_pred - y) ** 2)

    # 反向传播
    loss.backward()

    # 更新参数
    optimizer.step()

    # 清零梯度
    optimizer.zero_grad()

    # 打印进度
    if epoch % 10 == 0:
        print(f'Epoch {epoch}, Loss {loss.item()}')

print(f'Final params: w={w.item()}, b={b.item()}')

最佳实践

  • 使用torch.tensor()而非torch.Tensor()明确数据类型
  • 训练前调用optimizer.zero_grad()防止梯度累积
  • 学习率(lr)通常设置在0.001-0.1之间
  • 使用.item()获取标量值进行打印

常见错误

  • 忘记设置requires_grad=True导致参数无法更新
  • 未调用zero_grad()造成梯度累加
  • 混淆torch.tensortorch.Tensor的默认类型
  • 在训练循环外调用backward()

扩展知识

  • 自动求导原理:PyTorch构建动态计算图,backward()从损失开始反向传播计算梯度
  • 优化器对比:SGD适合简单模型,Adam适合大多数场景
  • 张量类型:32位浮点(dtype=torch.float32)是默认训练类型
  • 设备转移:使用.to('cuda')将张量移至GPU加速