skip to content
My WorkSpace

01-引言

/ 39 min read

Table of Contents

第 1 章 引言:从“写规则”到“用数据编程”

对应教材:《动手学深度学习(第二版)》第 1 章 引言
官方源码:d2l-ai/d2l-zh:chapter_introduction/index.md
学习定位:第一次系统学习深度学习,重点不是记住模型名,而是建立统一的问题框架。

1. 章节概览

传统程序由人明确写出“输入经过哪些规则得到输出”,但语音识别、图像分类等任务的规则过于复杂,难以手工穷举;机器学习则从数据中自动确定程序的参数,因此可理解为“用数据编程”(programming with data)。一个机器学习问题至少包含四个核心组件:数据(data)、模型(model)、目标函数(objective function)和优化算法(optimization algorithm)。不同任务的本质差异主要来自“可获得什么反馈”和“希望输出什么”,由此形成监督学习、无监督学习和强化学习等范式。深度学习是多层次的表示学习(representation learning),它借助端到端训练,把过去依赖人工设计的特征也纳入统一优化。现代深度学习的兴起并非只源于某一个算法,而是数据、算力、算法和开源系统共同发展的结果。

2. 第一性原理:为什么需要机器学习

2.1 两种“编程”方式

传统编程可以抽象为

规则+输入输出.\text{规则}+\text{输入}\longrightarrow\text{输出}.

例如,商城中“把商品加入购物车”可以写成确定的业务规则。可是对唤醒词识别而言,输入是一段包含数万次振幅采样的音频,人很难写出一组规则,直接判断它是否包含“Hey Siri”。

机器学习改变了规则的来源:

数据+期望输出+学习算法可学习的规则(模型参数).\text{数据}+\text{期望输出}+\text{学习算法} \longrightarrow \text{可学习的规则(模型参数)}.

训练完成后才进行预测:

新输入+训练好的模型预测输出.\text{新输入}+\text{训练好的模型}\longrightarrow\text{预测输出}.

关键变化是:人不再逐条规定输入到输出的映射,而是规定一个可调的模型族和一个什么叫做得好的目标,让算法从经验中寻找参数。

2.2 机器学习、深度学习与人工智能的关系

深度学习(DL)机器学习(ML)人工智能(AI).\text{深度学习(DL)}\subset \text{机器学习(ML)}\subset \text{人工智能(AI)}.
  • 人工智能(artificial intelligence, AI)是更大的目标:让机器表现出与智能有关的能力。
  • 机器学习(machine learning, ML)是实现 AI 的一类方法:系统利用经验改善某项任务的性能。
  • 深度学习(deep learning, DL)是机器学习的一类方法:模型通过多个可学习的变换层获得多层次表示。

“神经网络”不是对大脑的完整复制;它首先是一类可微、可组合、可通过数据优化的函数模型。

3. 核心概念

3.1 数据、样本、特征与标签

通俗解释

数据是模型的“经验”。一条经验称为样本(example/sample),描述样本的已知属性称为特征(feature/covariate),希望模型预测的量称为标签(label/target)。

以房价预测为例:

  • 一个房子是一条样本;
  • 面积、卧室数、距离市中心的时间是特征;
  • 成交价格是标签。

数学定义

监督学习数据集通常写为

D={(xi,yi)}i=1n,\mathcal D=\{(\mathbf x_i,y_i)\}_{i=1}^{n},

其中 xiX\mathbf x_i\in\mathcal X 是第 ii 个样本的特征,yiYy_i\in\mathcal Y 是标签,nn 是样本数。若每个样本有 dd 个数值特征,则

xi=[xi1,xi2,,xid]Rd,\mathbf x_i=[x_{i1},x_{i2},\ldots,x_{id}]^\top\in\mathbb R^d,

dd 称为特征维数(dimensionality)。无监督数据集通常只有

D={xi}i=1n.\mathcal D=\{\mathbf x_i\}_{i=1}^{n}.

教材常假设样本独立同分布(independent and identically distributed, i.i.d.):

(Xi,Yi)i.i.d.PXY.(\mathbf X_i,Y_i)\overset{\text{i.i.d.}}{\sim}P_{XY}.

“同分布”指训练样本来自同一个联合分布 PXYP_{XY};“独立”指知道一个样本不会改变另一个样本的抽样概率。它是便于理论分析的假设,不是现实世界的保证。

为什么需要它

学习算法只能利用数据中存在的信息。数据量大但标签错误、覆盖人群不完整,或特征与任务无关,仍然无法学出可靠模型,即“垃圾进,垃圾出”(garbage in, garbage out)。因此,数据的代表性、正确性和采集机制与模型结构同样重要。


3.2 参数、模型与模型族

通俗解释

可以把参数(parameter)想成模型内部的旋钮。固定一组旋钮值,就得到一个具体模型;所有可能的旋钮设置构成模型族(model family)。训练就是根据数据寻找合适的旋钮位置。

数学定义

参数为 θΘ\boldsymbol\theta\in\Theta,模型写成

y^=fθ(x).\hat y=f_{\boldsymbol\theta}(\mathbf x).

模型族为

F={fθ:θΘ}.\mathcal F=\{f_{\boldsymbol\theta}:\boldsymbol\theta\in\Theta\}.

例如线性模型

fw,b(x)=wx+bf_{\mathbf w,b}(\mathbf x)=\mathbf w^\top\mathbf x+b

的参数为 θ=(w,b)\boldsymbol\theta=(\mathbf w,b)

为什么需要它

若模型族太弱,即使找到其中最好的参数也无法表达真实规律;若模型族过于灵活而数据不足,则可能记住训练样本却不能推广。学习问题不只是“找参数”,还包括选择恰当的函数空间。

参数与超参数不同:参数由训练数据直接学习,如权重 w\mathbf w;超参数(hyperparameter)由研究者或外层搜索设定,如学习率、网络层数和批量大小。


3.3 目标函数、损失函数与评价指标

通俗解释

模型不会天然知道“好”是什么意思。目标函数像评分规则,把模型表现变成一个数。只有先定义目标,学习算法才知道应该把参数往哪个方向调整。

数学定义

单个样本的损失为

(fθ(xi),yi).\ell(f_{\boldsymbol\theta}(\mathbf x_i),y_i).

在训练集上的平均损失称为经验风险(empirical risk):

R^n(θ)=1ni=1n(fθ(xi),yi).\hat R_n(\boldsymbol\theta) =\frac{1}{n}\sum_{i=1}^{n} \ell(f_{\boldsymbol\theta}(\mathbf x_i),y_i).

我们真正关心的是未知数据分布上的期望风险(expected risk):

R(θ)=E(X,Y)PXY[(fθ(X),Y)].R(\boldsymbol\theta) =\mathbb E_{(\mathbf X,Y)\sim P_{XY}} \left[\ell(f_{\boldsymbol\theta}(\mathbf X),Y)\right].

由于真实分布 PXYP_{XY} 通常未知,只能先最小化可计算的经验风险:

θ=argminθΘR^n(θ).\boldsymbol\theta^\ast =\arg\min_{\boldsymbol\theta\in\Theta} \hat R_n(\boldsymbol\theta).

常见损失包括:

  • 回归的平方误差:(y^,y)=12(y^y)2\ell(\hat y,y)=\frac12(\hat y-y)^2
  • 分类的交叉熵:(p,y)=logpy\ell(\mathbf p,y)=-\log p_y
  • 多标签分类的二元交叉熵:对各标签的 Bernoulli 负对数似然求和。

为什么需要它

目标函数把任务要求转化为可优化的问题。但要区分:

  • 损失(loss):训练时用于求梯度;
  • 目标(objective):可能还包含正则化等额外项;
  • 评价指标(metric):用于报告最终表现,如准确率、F1、BLEU,不一定可微。

0-1 错误率很符合分类直觉,但预测类别发生跳变时它才改变,几乎处处梯度为零,难以直接用梯度法优化,因此需要交叉熵这样的替代损失(surrogate loss)。


3.4 优化算法与梯度下降

通俗解释

目标函数给出了“当前位置有多差”,优化算法负责寻找更好的参数。梯度指向函数局部增长最快的方向,因此沿负梯度方向走一小步,通常会让损失下降。

数学定义

批量梯度下降(gradient descent)的更新为

θt+1=θtηθR^n(θt),\boldsymbol\theta_{t+1} =\boldsymbol\theta_t -\eta\nabla_{\boldsymbol\theta}\hat R_n(\boldsymbol\theta_t),

其中 η>0\eta>0 为学习率(learning rate)。

实际深度学习常用小批量随机梯度下降(mini-batch stochastic gradient descent, mini-batch SGD):

gt=1BtiBtθ(fθt(xi),yi),\mathbf g_t =\frac{1}{|\mathcal B_t|} \sum_{i\in\mathcal B_t} \nabla_{\boldsymbol\theta} \ell(f_{\boldsymbol\theta_t}(\mathbf x_i),y_i), θt+1=θtηgt.\boldsymbol\theta_{t+1} =\boldsymbol\theta_t-\eta\mathbf g_t.

若小批量 Bt\mathcal B_t 是均匀抽样,则 gt\mathbf g_t 是全数据梯度的无偏估计:

E[gt]=θR^n(θt).\mathbb E[\mathbf g_t] =\nabla_{\boldsymbol\theta}\hat R_n(\boldsymbol\theta_t).

为什么需要它

现代神经网络可能有数百万甚至数十亿参数,无法枚举所有参数组合。梯度把“每个参数的微小变化如何影响目标”压缩成一个向量,使大规模连续优化成为可能。


3.5 训练、测试、泛化与过拟合

通俗解释

训练集像练习题,测试集像没有见过的考试题。真正目标不是背熟练习题,而是学到能迁移到新样本的规律。

数学定义

给定独立的训练集 Dtrain\mathcal D_{\mathrm{train}} 和测试集 Dtest\mathcal D_{\mathrm{test}},泛化差距(generalization gap)可写为

gap=R^test(θ)R^train(θ).\operatorname{gap} =\hat R_{\mathrm{test}}(\boldsymbol\theta) -\hat R_{\mathrm{train}}(\boldsymbol\theta).

当训练误差很小而测试误差明显更大时,称为过拟合(overfitting)。反之,模型连训练数据中的主要规律都没有学到,通常称为欠拟合(underfitting)。

为什么需要它

部署时遇到的是未来数据,而不是训练数据本身。若反复根据测试集修改模型,测试集也会被间接用于训练,评价便失去可信度;实践中通常再划分验证集(validation set)用于选择超参数,把测试集留到最后。


3.6 监督学习:从输入预测标签

通俗解释

监督学习(supervised learning)像带答案练习:训练时每个输入都有目标答案,模型学习从 x\mathbf xyy 的映射。

数学定义

可从函数角度写为

fθ:XY,f_{\boldsymbol\theta}:\mathcal X\to\mathcal Y,

也可从概率角度学习条件分布

pθ(yx).p_{\boldsymbol\theta}(y\mid\mathbf x).

预测时可取

y^=argmaxcpθ(Y=cx).\hat y=\arg\max_{c}p_{\boldsymbol\theta}(Y=c\mid\mathbf x).

若不同错误的代价不同,更一般的决策是最小化条件风险:

a^=argminayL(a,y)pθ(yx),\hat a =\arg\min_{a} \sum_y L(a,y)\, p_{\boldsymbol\theta}(y\mid\mathbf x),

其中 L(a,y)L(a,y) 表示真实类别为 yy 时采取决策 aa 的代价。这解释了为什么“概率最高的类别”不一定等于“最合理的行动”。

为什么需要它

大量实际问题都有成对的输入和标签,例如图像—类别、病历—风险、语音—文字。明确标签使学习信号直接,因此监督学习是最成熟、应用最广泛的范式之一。

常见监督学习任务

任务 输出空间 数学形式 例子
回归(regression) 连续值 y^R\hat y\in\mathbb R 房价、降雨量
多类分类(multiclass classification) 互斥类别之一 c=1Cpc=1\sum_{c=1}^C p_c=1 手写数字 0–9
多标签分类(multi-label classification) 多个标签可同时成立 y^{0,1}C\hat{\mathbf y}\in\{0,1\}^C 图片同时含猫、狗、树
排序(ranking) 有序项目列表 argsortjsθ(q,dj)\operatorname{argsort}_j\,s_\theta(q,d_j) 搜索结果
推荐(recommendation) 用户—物品匹配分数 r^ui=fθ(u,i)\hat r_{ui}=f_\theta(u,i) 电影推荐
序列学习(sequence learning) 可变长序列 p(yx)p(\mathbf y\mid\mathbf x) 翻译、语音识别

多标签分类不是多类分类。多类分类通常假设类别互斥;多标签分类中每个标签可视为一个 Bernoulli 变量:

p(yx)c=1Cpcyc(1pc)1yc.p(\mathbf y\mid\mathbf x) \approx\prod_{c=1}^{C} p_c^{y_c}(1-p_c)^{1-y_c}.

序列模型还需要描述输出之间的依赖。由概率链式法则,

p(yx)=t=1Tp(yty<t,x).p(\mathbf y\mid\mathbf x) =\prod_{t=1}^{T} p(y_t\mid y_{<t},\mathbf x).

这说明生成第 tt 个词时,不能只看输入,还可能需要利用已经生成的 y<ty_{<t}


3.7 无监督学习:没有人工标签时发现结构

通俗解释

无监督学习(unsupervised learning)没有现成答案,但不是“什么目标都没有”。研究者仍要指定希望发现的结构,例如相似样本应归为一组、用更少变量保留主要信息,或学习数据的生成分布。

数学定义

输入只有 {xi}i=1n\{\mathbf x_i\}_{i=1}^n。典型目标包括:

  • 聚类:学习簇指派 zi{1,,K}z_i\in\{1,\ldots,K\}
  • 降维/表示学习:学习 gθ:RdRkg_\theta:\mathbb R^d\to\mathbb R^k,通常 k<dk<d
  • 密度估计/生成建模:学习 pθ(x)pdata(x)p_\theta(\mathbf x)\approx p_{\mathrm{data}}(\mathbf x)

例如 KK 均值聚类最小化簇内平方距离:

min{μk},{zi}i=1nxiμzi22.\min_{\{\boldsymbol\mu_k\},\{z_i\}} \sum_{i=1}^{n} \|\mathbf x_i-\boldsymbol\mu_{z_i}\|_2^2.

为什么需要它

现实中的无标签数据远多于人工标注数据。无监督学习可用于探索数据结构、压缩、异常检测、生成数据,也可以先学习通用表示,再以少量标签完成下游任务。

仅凭观察数据发现相关结构,不等于已经识别因果关系;因果推断通常需要额外假设、干预或实验设计。


3.8 离线学习、环境交互与分布偏移

通俗解释

离线学习(offline learning)先收集固定数据,再训练模型;模型的预测不会改变训练数据的来源。交互式系统则不同:推荐什么会影响用户点击什么,模型今天的行为会改变明天看到的数据。

数学定义

经典监督学习常隐含

Ptrain(X,Y)=Ptest(X,Y).P_{\mathrm{train}}(\mathbf X,Y) =P_{\mathrm{test}}(\mathbf X,Y).

若二者不相等,

Ptrain(X,Y)Ptest(X,Y),P_{\mathrm{train}}(\mathbf X,Y) \neq P_{\mathrm{test}}(\mathbf X,Y),

则出现分布偏移(distribution shift)。在交互系统中,未来数据分布还依赖模型采取的动作:

P(Xt+1Xt,At).P(\mathbf X_{t+1}\mid \mathbf X_t,A_t).

为什么需要它

训练集准确率高并不能保证部署后可靠。人群变化、传感器变化、用户对推荐的响应以及对手的策略变化都会使过去数据失效。推荐系统还可能形成反馈循环:被推荐的内容获得更多曝光,又因为更多点击而被进一步推荐。


3.9 强化学习:通过奖励学习行动策略

通俗解释

强化学习(reinforcement learning, RL)不是每一步都有标准答案。智能体(agent)观察环境、选择动作、收到奖励,再从长期后果中判断哪些行为值得重复。

数学定义

完全可观测情形通常建模为马尔可夫决策过程(Markov decision process, MDP):

M=(S,A,P,R,γ),\mathcal M=(\mathcal S,\mathcal A,P,R,\gamma),

其中 S\mathcal S 为状态空间,A\mathcal A 为动作空间,P(ss,a)P(s'|s,a) 为状态转移概率,RR 为奖励,γ[0,1)\gamma\in[0,1) 为折扣因子。策略(policy)为

πθ(as)=P(At=aSt=s).\pi_\theta(a\mid s)=P(A_t=a\mid S_t=s).

从时刻 tt 开始的折扣回报为

Gt=k=0γkRt+k+1,G_t=\sum_{k=0}^{\infty}\gamma^k R_{t+k+1},

学习目标是

maxθJ(θ)=Eπθ[G0].\max_\theta J(\theta) =\mathbb E_{\pi_\theta}[G_0].

为什么需要它

在机器人、游戏和在线决策中,动作会改变后续状态,奖励可能延迟出现,也没有人告诉智能体“这一步的正确动作”。强化学习专门处理序贯决策、探索—利用(exploration–exploitation)和信用分配(credit assignment)问题。


3.10 表示学习、深度与端到端训练

通俗解释

传统流水线常由专家先手工提取特征,再训练一个较浅的模型。深度学习让模型自己学习一连串表示:图像的早期层可能表示边缘,后续层组合出纹理、部件和对象概念。

数学定义

一个 LL 层深度模型可写为函数复合:

fθ(x)=fθL(L)fθL1(L1)fθ1(1)(x).f_\theta(\mathbf x) =f_{\theta_L}^{(L)} \circ f_{\theta_{L-1}}^{(L-1)} \circ\cdots\circ f_{\theta_1}^{(1)}(\mathbf x).

h(0)=x,h(l)=σl(W(l)h(l1)+b(l)),\mathbf h^{(0)}=\mathbf x,\qquad \mathbf h^{(l)} =\sigma_l\left( \mathbf W^{(l)}\mathbf h^{(l-1)} +\mathbf b^{(l)} \right),

则每个 h(l)\mathbf h^{(l)} 都是第 ll 级表示。端到端训练(end-to-end training)指所有层共同针对最终任务优化:

minθ1,,θL1ni=1n(fθ(xi),yi).\min_{\theta_1,\ldots,\theta_L} \frac1n\sum_{i=1}^{n} \ell(f_\theta(\mathbf x_i),y_i).

为什么需要它

手工特征可能丢失任务所需信息,而且每个领域都要重新设计。联合训练让最终误差信号反向指导每一级表示,减少人工特征工程,并为图像、语音和文本提供较统一的工具。

端到端并不意味着“不需要数据清洗、架构设计、安全约束和系统工程”;它只说明多个可微组件可以围绕同一个最终目标联合调整。


3.11 深度学习为什么在近年成功

教材强调的原因可以概括成四个相互增强的条件:

  1. 数据:互联网应用、数字化与廉价传感器产生了大规模训练数据;
  2. 算力:GPU、并行计算和分布式训练使大模型优化成为可能;
  3. 算法:更好的激活、初始化、正则化、注意力和优化方法提高了可训练性;
  4. 系统与开源生态:PyTorch 等框架把自动微分、硬件加速和模型组件封装成可复用工具。

深度学习不是“数据越多就必然成功”。数据质量、模型归纳偏置、目标是否与真实需求一致、优化能否稳定进行,以及部署分布是否变化,都会决定最终结果。

4. 关键公式推导

4.1 为什么负梯度方向能让损失下降

设目标函数为 J(θ)J(\boldsymbol\theta),在当前位置做一个小改变量 Δθ\Delta\boldsymbol\theta。一阶泰勒展开为

J(θ+Δθ)J(θ)+J(θ)Δθ.J(\boldsymbol\theta+\Delta\boldsymbol\theta) \approx J(\boldsymbol\theta) +\nabla J(\boldsymbol\theta)^\top \Delta\boldsymbol\theta.

选择

Δθ=ηJ(θ),η>0,\Delta\boldsymbol\theta =-\eta\nabla J(\boldsymbol\theta),\qquad \eta>0,

代入得到

J(θ+Δθ)J(θ)ηJ(θ)22.J(\boldsymbol\theta+\Delta\boldsymbol\theta) \approx J(\boldsymbol\theta) -\eta\|\nabla J(\boldsymbol\theta)\|_2^2.

只要梯度非零且步长足够小,右侧第二项为负,因此目标下降。这只是局部的一阶结论:

  • η\eta 太大时,高阶项不能忽略,可能越过低点甚至发散;
  • 深度网络目标通常非凸,梯度下降不保证找到全局最优;
  • 但它能利用局部方向信息,在高维空间中高效搜索可用解。

4.2 线性回归的平方损失与梯度

设批量数据矩阵为 XRn×d\mathbf X\in\mathbb R^{n\times d},标签为 yRn\mathbf y\in\mathbb R^n,模型为

y^=Xw+b1.\hat{\mathbf y}=\mathbf X\mathbf w+b\mathbf 1.

定义平均平方损失

J(w,b)=12nXw+b1y22.J(\mathbf w,b) =\frac{1}{2n} \|\mathbf X\mathbf w+b\mathbf 1-\mathbf y\|_2^2.

令残差

e=Xw+b1y,\mathbf e=\mathbf X\mathbf w+b\mathbf 1-\mathbf y,

J=12nee.J=\frac{1}{2n}\mathbf e^\top\mathbf e.

利用链式法则:

Je=1ne,ew=X,\frac{\partial J}{\partial\mathbf e} =\frac1n\mathbf e,\qquad \frac{\partial\mathbf e}{\partial\mathbf w} =\mathbf X,

所以

wJ=1nXe=1nX(Xw+b1y).\nabla_{\mathbf w}J =\frac1n\mathbf X^\top\mathbf e =\frac1n\mathbf X^\top (\mathbf X\mathbf w+b\mathbf 1-\mathbf y).

同理,

Jb=1n1e.\frac{\partial J}{\partial b} =\frac1n\mathbf 1^\top\mathbf e.

梯度下降更新为

wwηwJ,bbηJb.\mathbf w\leftarrow \mathbf w-\eta\nabla_{\mathbf w}J, \qquad b\leftarrow b-\eta\frac{\partial J}{\partial b}.

平方损失前放 12\frac12 只是为了求导时抵消平方产生的系数 22,不改变最优解。

4.3 交叉熵为什么来自最大似然

CC 类分类,模型输出类别概率

pi=(pi1,,piC),c=1Cpic=1.\mathbf p_i=(p_{i1},\ldots,p_{iC}),\qquad \sum_{c=1}^{C}p_{ic}=1.

若样本相互独立,整个数据集标签的条件似然为

L(θ)=i=1npθ(yixi).\mathcal L(\theta) =\prod_{i=1}^{n} p_\theta(y_i\mid\mathbf x_i).

最大化许多小概率的乘积数值上不稳定,也不方便求导。对数函数单调递增,因此最大化似然等价于最大化对数似然:

maxθlogL(θ)=maxθi=1nlogpθ(yixi).\max_\theta\log\mathcal L(\theta) =\max_\theta \sum_{i=1}^{n} \log p_\theta(y_i\mid\mathbf x_i).

再乘以负号,就转成最小化:

minθ1ni=1nlogpθ(yixi).\min_\theta -\frac1n\sum_{i=1}^{n} \log p_\theta(y_i\mid\mathbf x_i).

若用 one-hot 标签 yic{0,1}y_{ic}\in\{0,1\} 表示真实类别,则

logpθ(yixi)=c=1Cyiclogpic,-\log p_\theta(y_i\mid\mathbf x_i) =-\sum_{c=1}^{C} y_{ic}\log p_{ic},

这正是多类交叉熵。它不仅关心分类对错,还连续地惩罚“给真实类别分配很低概率”的行为,因此比 0-1 错误率更适合梯度优化。

4.4 经验风险为什么只能近似真实风险

训练目标

R^n(θ)=1ni=1ni\hat R_n(\theta) =\frac1n\sum_{i=1}^{n}\ell_i

是对总体期望

R(θ)=E[]R(\theta)=\mathbb E[\ell]

的样本平均估计。对一个固定的 θ\theta,在 i.i.d. 且损失期望存在时,大数定律说明

R^n(θ)nR(θ).\hat R_n(\theta)\xrightarrow[n\to\infty]{}R(\theta).

但训练后的 θ^\hat\theta 恰好是依据这批样本选出的,并非预先固定;一个容量很大的模型可能利用有限样本中的偶然噪声。因此,“样本平均趋近期望”并不能单独排除过拟合,还需要独立测试数据、容量控制或正则化等手段。

5. 代码解析(PyTorch)

5.1 先说明教材代码情况

本章官方页面与官方 chapter_introduction/index.md 均为概念讲解和示意图,没有可执行的 PyTorch 核心代码单元。下面给出一个教学补充:用最小线性回归例子把本章的“数据—模型—目标函数—优化算法—评估”五个环节对应到 PyTorch。它不是冒充教材原代码,而是为理解本章训练闭环服务。

5.2 完整可运行示例

import torch
from torch import nn
from torch.utils.data import DataLoader, TensorDataset
# 固定随机数种子,便于复现实验
torch.manual_seed(42)
# 1) 数据:y = 2*x1 - 3*x2 + 0.5 + 噪声
n, d = 1000, 2
X = torch.randn(n, d)
true_w = torch.tensor([[2.0], [-3.0]])
true_b = 0.5
y = X @ true_w + true_b + 0.1 * torch.randn(n, 1)
# 留出独立测试集;训练集用于学习参数,测试集只用于评估
X_train, X_test = X[:800], X[800:]
y_train, y_test = y[:800], y[800:]
# DataLoader 每次提供一个随机小批量
train_loader = DataLoader(
TensorDataset(X_train, y_train),
batch_size=32,
shuffle=True,
)
# 2) 模型族:所有从 R^2 到 R 的仿射函数 x @ w + b
model = nn.Linear(in_features=2, out_features=1)
# 3) 目标函数:小批量上的平均平方误差
loss_fn = nn.MSELoss()
# 4) 优化算法:随机梯度下降;model.parameters() 是待学习的 w 和 b
optimizer = torch.optim.SGD(model.parameters(), lr=0.05)
# 5) 训练:重复“前向计算 -> 计算损失 -> 反向传播 -> 更新参数”
for epoch in range(20):
model.train()
for X_batch, y_batch in train_loader:
y_hat = model(X_batch) # 前向传播:得到预测
loss = loss_fn(y_hat, y_batch) # 衡量预测与标签的差异
optimizer.zero_grad() # 清除上一次迭代累积的梯度
loss.backward() # 自动微分:计算每个参数的梯度
optimizer.step() # 按 SGD 规则更新参数
if (epoch + 1) % 5 == 0:
print(f"epoch={epoch + 1:02d}, last_batch_loss={loss.item():.6f}")
# 6) 测试:不更新参数,只估计模型对未见数据的泛化表现
model.eval()
with torch.no_grad():
test_pred = model(X_test)
test_loss = loss_fn(test_pred, y_test)
print("learned weight:", model.weight.detach())
print("learned bias:", model.bias.detach())
print("test MSE:", test_loss.item())

5.3 逐段理解

数据与形状

X.shape == (1000, 2),表示 1000 个样本、每个样本 2 个特征;true_w.shape == (2, 1),所以

X @ true_w

的形状为 (1000, 1)。加上标量偏置 true_b 时,PyTorch 使用广播(broadcasting)把它加到每个样本上。

这里人为生成数据,是因为我们知道真实参数 (2,3,0.5)(2,-3,0.5),可以检查模型是否真的学回这些值。噪声项模拟现实中无法解释的波动,因此测试损失不应期望严格为零。

小批量加载

TensorDataset 把同一索引的 X_train[i]y_train[i] 绑定为一个样本。DataLoader 每次返回 32 个样本,shuffle=True 在每轮训练前打乱顺序,减弱固定顺序造成的系统性影响。

模型

model = nn.Linear(2, 1)

实现

y^=Xw+b.\hat{\mathbf y}=\mathbf X\mathbf w+b.

PyTorch 内部权重 model.weight 的形状是 (out_features, in_features) = (1, 2),前向计算实际采用 xW+b\mathbf x\mathbf W^\top+\mathbf b。这与数学中把 w\mathbf w 写成 (2, 1) 列向量只是存储约定不同。

损失

nn.MSELoss() 默认对批量中所有元素求均值:

LB=1BiB(y^iyi)2.L_{\mathcal B} =\frac1{|\mathcal B|} \sum_{i\in\mathcal B}(\hat y_i-y_i)^2.

它没有前面推导中的 12\frac12,因此梯度多一个常数因子 22;这不会改变最优点,只会影响合适的学习率尺度。

梯度与参数更新

optimizer.zero_grad()
loss.backward()
optimizer.step()
  • zero_grad():PyTorch 默认把新梯度累加到 .grad,不清零就会把多个批量的梯度意外相加;
  • backward():沿动态计算图应用链式法则,把梯度写入各参数的 .grad
  • step():根据优化器规则修改参数。对普通 SGD,近似执行 θθηθL\theta\leftarrow\theta-\eta\nabla_\theta L

“前向传播”计算数值,“反向传播”计算梯度,“优化器”使用梯度更新参数,三者不要混为一谈。

训练模式与测试模式

model.train()model.eval() 控制 Dropout、批量归一化等层的行为。当前只有 nn.Linear,两种模式结果相同,但保留正确习惯有利于以后扩展。

torch.no_grad() 关闭梯度记录,减少测试时的显存和计算开销。它与 model.eval() 作用不同,实际评估时通常两者都用。

6. 知识点结构

第 1 章 引言
├─ 1. 为什么需要机器学习
│ ├─ 规则可明确:传统编程
│ └─ 规则难穷举:用数据编程
├─ 2. 机器学习统一框架
│ ├─ 数据:样本、特征、标签、i.i.d.
│ ├─ 模型:参数、模型族、表达能力
│ ├─ 目标:损失、经验风险、评价指标
│ └─ 算法:梯度、SGD、参数更新
├─ 3. 学习问题类型
│ ├─ 监督学习
│ │ ├─ 回归
│ │ ├─ 分类 / 多标签分类
│ │ ├─ 搜索与排序
│ │ ├─ 推荐系统
│ │ └─ 序列学习
│ ├─ 无监督学习
│ │ ├─ 聚类
│ │ ├─ 降维与表示学习
│ │ └─ 密度估计与生成建模
│ └─ 强化学习
│ ├─ 智能体—环境交互
│ ├─ 状态、动作、奖励、策略
│ └─ 长期回报、探索、信用分配
├─ 4. 从训练到部署
│ ├─ 训练集 / 验证集 / 测试集
│ ├─ 泛化、欠拟合、过拟合
│ ├─ 分布偏移
│ └─ 反馈循环与公平性
└─ 5. 深度学习
├─ 多层函数复合
├─ 多级表示学习
├─ 端到端联合优化
└─ 成功条件:数据 + 算力 + 算法 + 系统

把整章压缩成一个训练闭环:

数据输入模型预测损失梯度优化器更新参数模型.\boxed{\text{数据}} \xrightarrow{\text{输入}} \boxed{\text{模型}} \xrightarrow{\text{预测}} \boxed{\text{损失}} \xrightarrow{\text{梯度}} \boxed{\text{优化器}} \xrightarrow{\text{更新参数}} \boxed{\text{模型}}.

训练闭环之外还有一个更重要的外环:

训练数据拟合未见数据评估部署与监测分布变化.\text{训练数据} \longrightarrow \text{拟合} \longrightarrow \text{未见数据评估} \longrightarrow \text{部署与监测分布变化}.

7. 常见误区与易错点

  1. 把 AI、ML、DL 当作同义词。深度学习只是机器学习的一部分,机器学习也只是实现人工智能的一类方法。
  2. 认为模型是在“存储答案”。模型学习的是带参数的映射;是否学到可迁移规律要看未见数据。
  3. 把参数和超参数混淆。权重、偏置由反向传播学习;学习率、层数、批量大小通常由人或外层算法选择。
  4. 把损失和指标混为一谈。训练优化交叉熵,不等于最终只能看交叉熵;准确率等指标也不一定适合直接求梯度。
  5. 认为训练损失越小,模型一定越好。训练损失持续下降而测试损失上升,正是典型过拟合信号。
  6. 在测试集上反复调参。这会泄漏测试信息,使测试成绩变得乐观;应使用验证集调参。
  7. 把 i.i.d. 当成现实定律。时间序列、同一用户的多条记录、推荐反馈等数据通常有关联,部署分布也可能变化。
  8. 认为数据越多越好。更多有偏、有毒或错误的数据可能强化偏差;覆盖性与采集机制比单纯规模更重要。
  9. 把多类分类和多标签分类混淆。“猫/狗二选一”是多类分类;“图中同时有猫和狗”是多标签分类。
  10. 把类别概率直接当成可信度。神经网络输出 0.9 不保证真实事件在长期统计上恰有 90% 发生率,还涉及概率校准。
  11. 认为无监督学习没有目标函数。它没有人工标签,但仍有聚类、重构、对比或似然等学习目标。
  12. 从相关性直接推出因果性。预测模型可以利用相关性获得高准确率,但“改变某特征会导致结果变化”需要因果假设或干预证据。
  13. 把即时奖励等同于强化学习目标。强化学习优化长期累积回报,短期最优动作可能损害长期收益。
  14. 忘记 PyTorch 梯度会累积。常规训练循环中若不调用 optimizer.zero_grad(),梯度会跨批量相加。
  15. 认为 model.eval() 等于 torch.no_grad()。前者切换层的行为,后者关闭梯度记录,两者功能不同。
  16. 把“端到端”理解为不需要人工工作。数据定义、目标选择、约束、评估、安全和部署仍然依赖系统设计。
  17. 认为深度学习成功只因为“网络更深”。大规模数据、GPU、优化技术和软件系统缺一不可。

8. 与前后章节的联系

8.1 本章依赖的已有知识

本章是全书第一章,没有正式的前置章节,但默认读者能理解:

  • Python 程序的输入、输出与函数;
  • 向量、矩阵和函数复合;
  • 概率分布、条件概率与期望;
  • 导数、梯度和链式法则的基本直觉。

若这些概念不熟,不必在本章一次补齐;第 2 章会系统复习。

8.2 为后续章节铺垫

本章概念 后续落点
张量、样本与特征 第 2 章数据操作、线性代数
梯度与优化 第 2 章微积分、自动微分;第 11 章优化算法
回归与平方损失 第 3 章线性回归
分类、概率与交叉熵 第 3 章 softmax 回归
过拟合与泛化 第 4 章模型选择、权重衰减、Dropout
多层表示与端到端训练 第 4 章多层感知机;第 6–7 章卷积网络
序列学习 第 8–9 章循环神经网络
注意力与可变长序列 第 10 章注意力机制与 Transformer
模型参数与计算框架 第 5 章深度学习计算
分布偏移 第 4 章环境和分布偏移
大规模计算与 GPU 第 5、12 章 GPU、并行与多 GPU
计算机视觉与自然语言处理应用 第 13–15 章

建议把本章的四元组反复用于后续每个模型:

数据是什么?模型是什么?目标是什么?如何优化?\boxed{\text{数据是什么?模型是什么?目标是什么?如何优化?}}

只要能回答这四个问题,就不会在繁杂的网络结构中失去主线。

9. 自测思考题

  1. 唤醒词识别为什么难以用传统规则编程?请分别写出它的数据 x\mathbf x、标签 yy、模型 fθf_\theta、损失 \ell 和最终评价指标,并解释损失与指标为何可以不同。
  2. 训练误差为零是否意味着模型已经学会任务?请从经验风险、期望风险、模型容量和分布偏移四个角度回答,并举一个训练集泄漏的例子。
  3. 为什么交叉熵比分类错误率更适合梯度下降?尝试从“最大似然”和“可微替代目标”两条路线各解释一次。
  4. 推荐系统为什么不只是一个普通的监督学习问题?请说明曝光偏差、隐式反馈和反馈循环如何破坏静态 i.i.d. 假设。
  5. 端到端学习取代了什么,又没有取代什么?请以图像分类或语音识别为例,区分可由模型自动学习的表示与仍需人工决定的数据、目标、安全约束和评价流程。

10. 延伸阅读

  1. LeCun, Bengio & Hinton, “Deep learning”, Nature, 2015:经典综述,重点理解“多层表示”和反向传播为何构成统一方法。
  2. Bengio, Courville & Vincent, “Representation Learning: A Review and New Perspectives”, IEEE TPAMI, 2013:表示学习的系统综述,适合在学完多层感知机后重读。
  3. Goodfellow, Bengio & Courville, Deep Learning, 2016:可作为 D2L 的理论补充,建议先读第 1、5、6 章。
  4. Mnih et al., “Human-level control through deep reinforcement learning”, Nature, 2015:理解深度表示如何与强化学习结合,以及“像素—动作”的端到端学习。
  5. Vaswani et al., “Attention Is All You Need”, 2017:本章提到注意力和序列学习;学完第 10 章后回看,可理解 Transformer 如何改变序列建模。

11. 一页复习结论

  • 机器学习的本质不是“写出答案”,而是定义可学习的函数族和评价标准,再从经验中选择参数。
  • 所有训练过程都可追问四件事:数据、模型、目标、优化
  • 训练损失只是对真实部署风险的有限样本近似;泛化能力才是最终目的。
  • 监督学习学习 p(yx)p(y\mid x) 或输入到标签的映射;无监督学习发现 xx 的结构;强化学习学习在交互中最大化长期回报的策略。
  • 深度学习通过多层函数复合自动学习表示,并用端到端训练联合调整各层。
  • 现代深度学习的能力来自数据、算力、算法与系统的共同作用,也受到数据偏差、目标错配和分布变化的共同约束。