1. 为什么深度学习的第一课永远从linear开始
李哥这个深度学习班第二节课讲linear代码,我本来以为内容会很基础,毕竟线性回归嘛,搞过机器学习的人谁没见过。但真听他讲完再自己动手复现一遍,才发现这块内容承载的东西比表面看起来多得多:它是你理解神经网络如何做决策、如何学习、如何反馈的第一块基石。说句实在话,后面你接触的任何模型,从卷积神经网络到Transformer,本质上的计算单元都还是"线性变换加激活函数",只不过规模更大、堆叠更深。所以你现在把linear代码吃透,后面就是在同一个骨架上来回换皮。
这节课的内容主线其实很清晰:用Python写一个完整的线性回归训练流程,包含数据准备、模型定义、损失计算、梯度回传、参数更新、结果可视化。代码本身不复杂,二三十行就能跑通,难点在于把每一行的存在理由讲清楚。李哥在课上反复强调一句话:先别管模型多高级,你自己能把一条直线拟合明白,神经网络的原理就懂了一半。我觉得这句话是这节课的灵魂。
对于目标读者,我的建议是:如果你是第一次接触深度学习,或者之前只看了理论视频但没亲手敲过训练代码,这节课的小项目就是最好的切入点。不过动手之前,你至少需要会基础的Python语法,知道什么是numpy数组,这些前置要求不过分。另外,你需要一个能跑PyTorch的环境,CPU就能跑,完全用不着显卡。
我自己的复现环境如下:
| 项目 | 版本/方案 |
|---|---|
| 操作系统 | Windows 11 |
| Python | 3.9.18 |
| 深度学习框架 | PyTorch 2.1.2(CPU版) |
| 数值计算 | numpy 1.24.3 |
| 可视化 | matplotlib 3.7.2 |
如果你的环境还没装好,建议直接用Anaconda创建虚拟环境,然后执行pip install torch torchvision matplotlib numpy。选CPU版就行,这个项目的数据量规模用不上CUDA。李哥课上也顺嘴提了:CPU版安装包小,不折腾驱动,对入门期最友好。我认同,先把流程跑通,再考虑性能问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 准备一份"看起来真实"的合成数据:为什么要自己造数据而不是用现成的
2.1 合成数据集的价值与随机种子细节
正式写模型之前,得先解决吃饭的家伙:数据。这节课用的数据不是从网上下载的公开数据集,而是李哥带着大家手写代码模拟出来的一组带噪声的线性数据。你可能会问:为什么不直接用现成的波士顿房价、糖尿病数据集之类的?原因其实很务实——真实数据集有太多跟当前学习目标无关的干扰因素,比如特征维度不统一、缺失值、量纲差异、数据分布不理想。这些干扰放到后面处理起来当然有意义,但作为第一次接触训练循环的学员,你需要的是一条只有明确线性关系、叠加可控噪声的数据,这样你能一眼判断模型是否学会了,而不是被数据预处理拖着走。
造数据的逻辑很简单:先确定真实权重和真实偏置,然后生成一批横坐标值,算出一批纵坐标,最后加上高斯噪声。这样我们就"预知"了正确答案,这是验证模型学习效果的前提。这里有个细节值得专门说一下:生成随机数时一定要设置随机种子。没有种子的话,每次运行代码拿到的噪声都不一样,你今天训练的基线和明天完全无法对比,出了bug都很难复现。设置随机种子是个职业习惯,几乎所有深度学习项目的第一行都会做这件事,为的就是结果可复现。
2.2 数据生成代码与张量形状
下面这组代码就是李哥课上带着大家写的完整数据生成段,我在复现时加了一些形状打印和可视化,方便确认数据结构。
python复制import torch
import numpy as np
import matplotlib.pyplot as plt
torch.manual_seed(42)
np.random.seed(42)
# 设定真实的线性关系:y = 2.5x + 1.3
true_w = 2.5
true_b = 1.3
num_samples = 200
# 生成均匀分布的横坐标,范围[-2.0, 2.0]
x = torch.linspace(-2.0, 2.0, num_samples).reshape(-1, 1)
# 加入标准正态分布的噪声,模拟真实世界的随机干扰
noise = torch.randn(x.shape) * 0.3
y = true_w * x + true_b + noise
print("x shape:", x.shape)
print("y shape:", y.shape)
print("前5个样本的x值:", x[:5].flatten())
print("前5个样本的y值:", y[:5].flatten())
# 可视化合成数据
plt.scatter(x.numpy(), y.numpy(), alpha=0.6)
plt.xlabel("x")
plt.ylabel("y")
plt.title("Synthetic Linear Data with Noise")
plt.show()
这里面的每一步都值得你花时间弄明白。`torch.linspace(-2.0, 2.0
