Skip to content

从零开始实现线性回归

学习如何使用 TensorPlay 的低级 API 和自动微分引擎实现线性回归模型。

1. 准备合成数据

我们生成 100 个点,这些点遵循 y=3x+2 的直线分布,并带有一些高斯噪声。

python
import tensorplay as tp

# 生成随机 X 数据
X = tp.randn(100, 1)

# 生成带噪声的 y 数据
y = 3 * X + 2 + tp.randn(100, 1) * 0.1

2. 初始化参数

我们需要定义权重 w 和偏置 b。我们设置 requires_grad=True,以便 TensorPlay 能够追踪对它们的操作以进行反向传播。

python
w = tp.randn(1, 1, requires_grad=True)
b = tp.zeros(1, requires_grad=True)

3. 定义训练循环

我们将使用手动梯度下降来更新参数。

python
learning_rate = 0.01

for i in range(100):
    # 1. 前向传播:计算预测值 y
    y_pred = X @ w + b
    
    # 2. 计算损失(均方误差)
    loss = ((y_pred - y)**2).mean()
    
    # 3. 反向传播:计算梯度
    loss.backward()
    
    # 4. 更新参数
    # 我们使用 tp.no_grad() 来执行更新,避免在图中追踪这些操作
    with tp.no_grad():
        w -= learning_rate * w.grad
        b -= learning_rate * b.grad
        
        # 更新后手动清零梯度
        w.grad.zero_()
        b.grad.zero_()
    
    if i % 10 == 0:
        print(f"Iteration {i}, Loss: {loss.item():.4f}")

print(f"Result -> w: {w.item():.2f}, b: {b.item():.2f}")

总结

在本教程中,你学习了:

  • 如何创建带有 requires_grad=True 的张量。
  • 如何执行前向传播并计算损失。
  • 如何使用 loss.backward() 触发反向传播。
  • 如何使用 tp.no_grad() 手动更新权重并清空梯度。

基于 Apache 2.0 许可发布。

📚DeepWiki