d2l-v2(PyTorch)预备知识|CORE(考研强化版)

覆盖:数据操作、数据预处理、线性代数、微积分、自动微分、概率。

使用方式:

  • 复习时按“定义→性质/公式→典型题型/易错点→最小代码模板”走。
  • 做题/写实验时直接抄“代码模板”。

0. 总体地图:深度学习里这些预备知识分别解决什么

  • 数据操作:把数据表示成张量并高效变换(形状/广播/索引)。
  • 数据预处理:把原始表格/文本变成“可喂给模型”的数值张量(缺失值、标准化、划分)。
  • 线性代数:网络=大量矩阵运算;理解维度、范数、特征值等。
  • 微积分:损失函数最小化;梯度/链式法则。
  • 自动微分:让框架替你算梯度(反向传播的工程实现)。
  • 概率:不确定性与泛化;极大似然、交叉熵、期望与方差。

1. 数据操作(Tensor 基础|高频易错点:shape/broadcast/view)

1.1 Tensor 与形状(shape)

  • 张量:标量(0D)、向量(1D)、矩阵(2D)、高阶张量(≥3D)。
  • 形状决定运算是否合法:
    • 向量
    • 矩阵
    • 批量数据常写

易错点

  • 不要把“元素个数”和“维度”混。
  • 线性层 nn.Linear(in_features, out_features) 吃的是最后一维。

1.2 广播(broadcasting)规则(必须会判断结果形状)

  • 对齐右端维度;每一维要么相等,要么其中一个为 1;缺失维度视为 1。
  • 输出形状是逐维 max

典型判断

  • (3,1,5) + (4,5) → 先视为 (3,1,5) + (1,4,5)(3,4,5)

1.3 索引/切片(view vs copy 思维)

  • 切片/索引用于取子张量:X[1:3, :]
  • reshape/view:改变形状(一般不改元素总数)。

易错点

  • view 需要内存连续;不连续先 contiguous()
  • reshape 可能返回拷贝;但语义更稳。

1.4 梯度与 in-place 操作(非常关键)

  • 带梯度跟踪时,尽量避免 in-place(如 x += 1relu_()),可能破坏计算图。

1.5 最小代码模板(PyTorch)

import torch
 
X = torch.arange(12).reshape(3, 4)      # (3,4)
y = torch.ones(4)                       # (4,)
Z = X + y                                # broadcasting -> (3,4)
 
# 常用:维度变换
X_T = X.T
X2 = X.reshape(-1, 2)                    # 自动推断
 
# 拼接
A = torch.cat([X, X], dim=0)             # dim=0 行拼接
 
# 统计
mean = X.float().mean(dim=0)             # 按列均值

2. 数据预处理(从表格到张量|缺失值/标准化/划分)

2.1 常见流程(考研式“写步骤”)

  1. 读取数据(CSV/表格)
  2. 处理缺失值(删除/填充)
  3. 类别特征编码(one-hot)
  4. 数值特征标准化/归一化
  5. 划分训练/验证/测试集
  6. 转为张量,送入 DataLoader

2.2 缺失值处理(会比较优缺点)

  • 删除:简单但损失信息。
  • 填充:均值/中位数/众数/常数;更稳健。

2.3 标准化(最常用)

  • Z-score:
  • 作用:让不同量纲特征可比,改善优化收敛。

2.4 最小代码模板(pandas + one-hot + tensor)

import pandas as pd
import torch
 
df = pd.read_csv('data.csv')
 
# 缺失值:数值列用均值填充
num_cols = df.select_dtypes(include='number').columns
df[num_cols] = df[num_cols].fillna(df[num_cols].mean())
 
# 类别列 one-hot
df = pd.get_dummies(df, dummy_na=True)
 
X = torch.tensor(df.values, dtype=torch.float32)

3. 线性代数(矩阵运算是深度学习的“语法”)

3.1 基本运算与维度匹配(必会)

  • 矩阵乘法:
  • 点积:
  • 范数:

易错点

  • Hadamard 积(逐元素乘)与矩阵乘法不同:A * B vs A @ B

3.2 线性变换视角(考研常考“解释题”)

  • 矩阵乘法 表示线性变换(旋转/缩放/投影的组合)。
  • 线性层本质:

3.3 特征值/特征向量(理解意义即可)

  • 在优化/二次型/稳定性分析中常出现。

3.4 最小代码模板(矩阵与范数)

import torch
A = torch.randn(3, 4)
B = torch.randn(4, 2)
C = A @ B                # (3,2)
 
x = torch.randn(5)
l2 = torch.norm(x, p=2)
linf = torch.norm(x, p=float('inf'))

4. 微积分(优化的数学底座|导数/梯度/链式法则)

4.1 导数与梯度

  • 单变量:
  • 多变量:梯度 指向函数增长最快方向。

最关键结论

  • 沿负梯度方向小步走:函数值下降最快(局部)。

4.2 链式法则(反向传播的数学本质)

  • 多层复合:层层相乘(计算图)。

4.3 常用导数(建议背)

  • (sigmoid)

4.4 最优化的最小表达

  • 梯度下降:

5. 自动微分(Autograd|计算图/反向传播/梯度清零)

5.1 计算图与反向传播(会解释)

  • 前向:记录运算,构建计算图。
  • 反向:从标量损失出发,用链式法则把梯度传回每个叶子张量。

5.2 PyTorch 必会操作(易错点集中)

  • requires_grad=True:开启梯度跟踪。
  • y.backward():对标量 y 求梯度。
  • x.grad:梯度累加在这里。
  • 梯度会累加:每次迭代要 grad.zero_()optimizer.zero_grad()

易错点

  • backward() 默认只能对标量;向量要指定 gradient= 或先 sum()
  • 不要对参与求导的变量做危险的 in-place 修改。

5.3 最小代码模板(autograd)

import torch
x = torch.arange(4.0, requires_grad=True)
 
y = (x * x).sum()        # 标量
 
y.backward()
print(x.grad)             # 2x
 
x.grad.zero_()

6. 概率(深度学习里的“统计语言”)

6.1 随机变量与分布(概念)

  • 随机变量 X:把随机结果映射到数值。
  • 分布:描述 X 取值的概率规律(PMF/PDF)。

6.2 期望与方差(必会公式 + 常用性质)

  • 期望:
  • 方差:

常用性质

  • 线性:
  • 方差缩放:

6.3 常见分布(会写参数含义)

  • 伯努利 Bernoulli(p):
  • 二项 Bin(n,p):n 次独立伯努利之和
  • 正态 :中心极限定理背景

6.4 与损失函数的联系(考研级“连接题”)

  • 许多损失函数可视为极大似然或其等价形式:
    • 高斯噪声假设 → 最小二乘(MSE)
    • 伯努利/多项分布 → 交叉熵(CE)

(只需要抓住“分布假设 ↔ 似然 ↔ 损失”这条线即可。)


7. 高频易错点清单(考研强度必看)

  1. B/s vs b/s、shape vs numel(类比到张量)。
  2. 广播:先右对齐;不满足“相等或为 1”就报错。
  3. A * B(逐元素)≠ A @ B(矩阵乘)。
  4. view 需要 contiguous;不稳就用 reshape
  5. autograd:梯度默认累加,迭代前必须清零。
  6. 期望线性、方差不线性(别把 Var(A+B) 写成 Var(A)+Var(B) 但忘了协方差)。

8. 典型题型(考研强化|带答案要点)

用法:先遮住“答案要点”自己做一遍,再对照纠错。

8.1 数据操作:broadcasting/shape 判断

题 1:设 A.shape=(3,1,5)B.shape=(4,5),问 A+B 是否可广播?结果形状是什么?

  • 答案要点:右对齐;把 B 看成 (1,4,5);逐维满足“相等或为1”;结果 (3,4,5)

题 2X.shape=(2,3)y.shape=(2,),问 X+y 是否可行?

  • 答案要点:右对齐后为 (2,3)(1,2),第二维 3 与 2 冲突 → 不可广播(常见修复:让 y 变成 (2,1)(1,3) 视需求)。

8.2 线性代数:维度/运算区分

题 3:给定 。写出 的维度,并说明 的含义。

  • 答案要点:A*B 是逐元素乘(要求同形状或可广播),与矩阵乘不同。

题 4 各自几何意义是什么?

  • 答案要点:L2 表示“欧氏长度”;L1 表示“曼哈顿距离/稀疏相关的度量”(常用于稀疏正则)。

8.3 微积分:梯度/链式法则

题 5:设 ,写出 的形式(只写结果,不要求推导细节)。

  • 答案要点:,梯度

题 6:解释“为什么反向传播本质是链式法则”。

  • 答案要点:神经网络是复合函数;梯度从输出到输入按链式法则逐层相乘/累积;计算图实现了这种依赖关系的系统化计算。

8.4 自动微分:梯度累加与清零

题 7:为什么训练循环里每步都要 optimizer.zero_grad()

  • 答案要点:PyTorch 默认把梯度累加到 .grad;不清零会把多步梯度叠加,导致更新错误。

8.5 概率:期望/方差与损失的统计解释

题 8:证明

  • 答案要点:从定义 ,展开平方:,再用

题 9(连接题):为什么“最小化 MSE”可视为“高斯噪声假设下的极大似然”?

  • 答案要点:若观测 满足 ,且 ,则负对数似然与 只差常数因子/常数项,故最小化 MSE 等价于最大化似然。

9. 计算题/证明题(更强一步|含完整推导)

9.1 线性代数计算题:矩阵微分的经典结果

题 1:设 ,其中 。求

: [ \begin{aligned} f(x) &= (Ax-b)^T(Ax-b)\ &= x^T A^T A x - 2 b^T A x + b^T b. \end{aligned} ] 对 求梯度(记住:,当 对称时为 ;且 ): [ \nabla_x f(x) = 2A^T(Ax-b). ]

备注:这是线性回归/最小二乘的核心梯度公式。

9.2 微积分证明题:链式法则(多维版本的直觉)

题 2:设 (标量)。写出 、Jacobian 的关系。

解(要点)

  • 由于 是标量,对 的梯度是 维向量。
  • 多维链式法则: [ \nabla_x z = J^T,\nabla_y z, ] 其中

解释:反向传播就是在计算图上不断应用这一形式:把“上游梯度”左乘(或等价右乘)局部 Jacobian 的转置,把梯度传回去。

9.3 概率计算题:期望/方差的基本计算

题 3:若 ,求

  • 取值:。 [ \mathbb{E}[X]=1\cdot p + 0\cdot (1-p)=p. ] 又 ,所以 [ \mathrm{Var}(X)=\mathbb{E}[X^2]-(\mathbb{E}[X])^2 = p - p^2 = p(1-p). ]

9.4 概率证明题:期望线性(非常常用)

题 4:证明对任意随机变量 与常数 ,有

  • 离散情形: [ \mathbb{E}[aX+bY]=\sum_{x,y}(ax+by)P(X=x,Y=y) = a\sum_{x,y}xP(\cdot)+b\sum_{x,y}yP(\cdot)=a\mathbb{E}[X]+b\mathbb{E}[Y]. ]
  • 连续情形同理,用积分替代求和。

关键点:线性不需要独立性。

9.5 统计连接题:交叉熵与极大似然(分类必会)

题 5:二分类中,令标签 ,模型输出 。写出负对数似然(NLL),并说明它为什么等价于二元交叉熵损失。

  • 伯努利似然:
  • 负对数似然: [ \mathcal{L}(\hat p,y) = -\log P(y\mid x) = -\big(y\log \hat p + (1-y)\log(1-\hat p)\big). ] 这正是二元交叉熵(Binary Cross Entropy)的标准形式。

9.6 Autograd 实操题:向量 backward 的正确姿势

题 6:令 (逐元素平方)。为什么直接 y.backward() 会报错?如何修正并得到

  • backward() 默认从标量出发。
  • 修正:先把 y 变成标量,如 y.sum().backward()
  • 得到梯度:

10. 速刷自检题(无答案版)

  1. 写出 broadcasting 的判定规则,并举一个可广播与不可广播的例子。
  2. 给定 ,写出 的形状。
  3. 写出梯度下降更新式,并解释学习率过大/过小的后果。
  4. 为什么需要链式法则?它与反向传播的关系是什么?
  5. 证明
  6. 为什么 MSE 可以看作高斯噪声假设下的极大似然?(一句话说明即可)

tag:deep-learning/d2l-v2 tag:chapter/01-preliminaries tag:exam/grad tag:group:Learn