先聊聊这次的话题。机器学习入门绕不开的第一个模型,几乎都是线性回归,它就像编程里的“Hello World”,地位不是因为它简单,而是因为它把“从数据中学习规律”这件事最直观地演示出来了。而PyTorch作为深度学习的主流框架,虽然名字里带着“深度”,但你用它来做线性回归,反而能把框架的核心机制——张量计算、自动求导、梯度下降——一次性摸清楚。这篇博文我按照“原理讲透、代码能跑、坑点说清”的思路,把基于PyTorch的线性回归完整拆解一遍,配套完整的可执行代码,新手照着敲就能跑出结果,后面学逻辑回归、神经网络也会顺很多。
1. 线性回归的核心逻辑:模型、损失与优化
1.1 从“猜数游戏”理解线性回归在干什么
先把线性回归的本质说透。假设你面前有一组数据,比如房屋面积和房价的对应关系。面积是输入,房价是输出。线性回归要做的事情,就是找到一条直线,让这条直线尽可能贴合所有数据点。这条直线在数学上就是 y = wx + b,w是权重,b是偏置。训练模型的过程,本质上是不断调整w和b,让直线离真实数据点的平均距离最小。
PyTorch在这里扮演的角色,是把你从复杂的数学运算中解放出来。你不需要手写求导公式,不需要自己实现梯度下降的迭代逻辑,框架的自动求导机制会帮你算好梯度,你只需要告诉它“怎么评判好坏”和“朝哪个方向调整参数”。这就是我推荐用PyTorch入门线性回归的原因——它把“算法思路”和“工程实现”解耦得非常干净,你能专注理解模型本身,而不是陷入到微积分的计算细节里。
1.2 损失函数和梯度下降:优化问题的两大支柱
有了直线方程,下一个问题就是:怎么判断这条直线“好不好”?答案是用损失函数。线性回归最常用的损失函数是均方误差(MSE),它把每个数据点的预测值和真实值的差平方后取平均。平方的作用有两个:一是消除正负误差抵消的问题,二是放大较大误差的惩罚力度。这个损失值越小,说明直线拟合效果越好。
梯度下降就是寻找最小损失值的工具。你可以把损失函数想象成一座起伏的山丘,模型参数(w和b)就是你在山丘上的位置坐标,损失值就是当前位置的海拔。梯度下降的策略很简单:算出当前位置的梯度(也就是最陡峭的上升方向),然后朝反方向迈一步。步长就是学习率。每迈一步,参数就更新一次,损失值就下降一点,直到收敛到山底。PyTorch中的optim.SGD或optim.Adam,就是这些“迈步策略”的现成实现。
注意:学习率是这个过程中最敏感的超参数之一。学习率太大会导致损失值震荡甚至发散,太小会让训练变得极其缓慢。在后面实操部分,我会专门演示不同学习率的效果差异。
1.3 为什么选PyTorch而不直接用NumPy
很多入门教程会用NumPy手写线性回归,代码量也不大,几十行就能搞定。但我不推荐新手从那种方式入手,原因很实际:手写方式最大的问题是反向传播需要自己推导梯度公式,一旦模型结构变得复杂(比如加多层、加非线性激活函数),手推梯度的难度会指数级上升,这在深度学习中完全不现实。而PyTorch的autograd机制能自动计算所有参数的梯度,你只管设计模型结构和损失函数,梯度计算交给框架。
另外,PyTorch的代码结构跟深度学习模型的通用开发流程高度一致:定义模型类、定义损失函数、选择优化器、写训练循环。这套流程你在以后学习CNN、RNN、Transformer时依然适用。所以,用PyTorch入门线性回归不是“大材小用”,而是“一举多得”——你学的是框架的核心用法,而不只是一个孤立算法。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与数据构造:把跑通代码的坑提前踩平
2.1 PyTorch环境搭建的两种方案对比
在写代码之前,先把环境搞定。很多初学者在环境配置这一步就被劝退了,其实问题不大,只要选对安装方式。我推荐两个方案,任选其一即可。
第一个方案是使用Anaconda创建虚拟环境再安装PyTorch。这适合需要在不同项目间切换依赖的情况,比如有的项目要PyTorch 1.x,有的要2.x,虚拟环境可以隔离互不干扰。命令如下:
bash复制conda create -n ml_linear python=3.9
conda activate ml_linear
pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu
第二个方案是直接用pip安装。如果你已经装了Python 3.8以上版本,并且只想快速跑通这个教程,直接pip安装就够了:
bash复制pip install torch
pip install matplotlib
没有GPU的机器完全不用担心,线性回归这种规模的模型,CPU跑起来毫无压力。在PyTorch官网安装页面选择对应操作系统和CUDA版本时,如果没有NVIDIA显卡,直接选CPU版本就行。这里有个很多人会犯的迷糊点:选了CUDA版本的PyTorch,但电脑上没装对应版本的显卡驱动,或者显卡太老不支持,运行时会直接报错说CUDA不可用。所以,只是入门学习的话,先装CPU版本是最省心的。
2.2 构造带噪声的线性数据:让“学习”有据可循
环境准备好之后,我们需要一批“有规律可循”的数据。真实的机器学习是从真实数据集开始的,但作为教学演示,用人工构造数据更可控——我们知道真实的w和b是多少,就能直观检验模型学得准不准。
这里我用一个简单的做法:设定真实的权重w_true = 2.0,偏置b_true = 1.0,然后随机生成100个x值,带入y = 2x + 1之后,再给每个y加上一些随机噪声。这样生成的数据既有明确的线性规律,又不会太“完美”——真实世界的数据总是带噪声的,模型要学的就是在噪声中找到规律。代码如下:
python复制import torch
import matplotlib.pyplot as plt
# 设置随机种子,保证结果可复现
torch.manual_seed(42)
# 生成100个在[-1, 1]区间
