题目
使用PyTorch实现简单线性回归的梯度下降
信息
- 类型:问答
- 难度:⭐
考点
张量创建,自动求导机制,优化器使用
快速回答
实现步骤:
- 创建输入特征张量
x和标签张量y - 初始化权重
w和偏置b为可训练张量 - 定义前向传播函数
forward() - 计算均方误差损失
MSE - 调用
backward()自动计算梯度 - 使用优化器更新参数
原理说明
线性回归通过最小化预测值与真实值的均方误差来拟合直线。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.tensor与torch.Tensor的默认类型 - 在训练循环外调用
backward()
扩展知识
- 自动求导原理:PyTorch构建动态计算图,
backward()从损失开始反向传播计算梯度 - 优化器对比:SGD适合简单模型,Adam适合大多数场景
- 张量类型:32位浮点(
dtype=torch.float32)是默认训练类型 - 设备转移:使用
.to('cuda')将张量移至GPU加速