第 2 章 深度学习预备知识线性代数

预备知识:数据、代数、微积分与概率

本章来源:本文整理自《动手学深度学习》(zh.d2l.ai)第 2 章《预备知识》,原书作者 Aston Zhang、李沐、Zachary C. Lipton、Alexander J. Smola。

本章讲什么

动手学深度学习之前,需要一点基础工具。原书预备知识章包含:数据操作(张量)、数据预处理、线性代数、微积分、自动微分、概率和查阅文档。本书是理论入门,我们聚焦这些工具"是什么、解决什么问题",不展开数学推导和代码实现。

数据操作:张量

深度学习处理的数据,本质上都是张量(tensor)——也就是 n 维数组。它是深度学习框架存储和操作数据的核心数据结构。

  • 标量(scalar):单个数值,比如温度 52 度。它是零阶张量。
  • 向量(vector):标量组成的列表,比如一个贷款申请人可以用向量表示,分量是收入、工作年限、过往违约次数。向量是一阶张量。
  • 矩阵(matrix):二阶数组,可以想象成一张表格——行是样本,列是属性。比如行对应不同的房子,列对应面积、卧室数、价格。
  • 张量:任意数量轴的数组。比如一张彩色图片是三维张量(高、宽、通道,通道对应红绿蓝)。

张量有两个关键能力是普通数组没有的:支持 GPU 加速计算,以及支持自动微分(后面会讲)。这两点让张量特别适合深度学习。

关于张量的操作,有几个概念值得理解:

  • 按元素运算:把加减乘除等标量运算作用到每个元素上。
  • 广播机制:当两个张量形状不同时,框架会自动把较小的张量"复制扩展"成相同形状再做运算。比如一个向量加上一个标量,标量会被加到每个元素上。
  • 索引和切片:像数组一样按位置访问、修改元素。
  • 节省内存:反复赋值会不断分配新内存。训练时参数更新很频繁,用原地操作(就地更新)能显著省内存,也避免其他引用指向旧参数。

数据预处理

现实世界的原始数据往往是 CSV 之类的表格文件,而且常常有缺失值、类别值。深度学习的标准做法是先用工具(如 pandas)把数据清洗成张量格式,流程分三步:

  1. 读取:把表格读成"每行一个样本、每列一个属性"的结构。
  2. 处理缺失值:一是插值法,用同列均值等替代值填补;二是删除法,直接忽略有缺失的样本。类别型的缺失值可以被当作一个新类别。
  3. 转换:把所有条目变成数值,转成张量。类别值常用独热编码(把类别列拆成多个 0/1 指示列)。

一句话概括:原始数据 → 清洗 → 张量化,这是深度学习中不可或缺的数据流水线。

线性代数

线性代数是描述深度学习模型的"语言"。

基本对象:标量(一个数)、向量(数组成的列表,分量对应样本特征)、矩阵(表格,行是样本列是属性)、张量(任意轴的数组)。

核心运算

  • 点积:两个向量对应位置乘积之和。当权重非负且和为 1 时,点积就是加权平均。两个向量归一化后,点积还能表示它们夹角的余弦(相似度)。
  • 矩阵-向量积:结果向量的每个元素是矩阵某一行与向量的点积。可以把矩阵乘法看成一个线性变换。神经网络每一层的计算,本质上就是矩阵运算。
  • 矩阵乘法:A 的行与 B 的列逐对做点积。注意区分矩阵乘法Hadamard 积(按元素乘法,两个矩阵对应位置直接相乘)。

其他常用操作

  • 转置:交换矩阵的行和列。对称矩阵等于其转置。
  • 降维求和 / 平均值:沿指定轴把数据压缩。比如对矩阵按行求和(axis=0)、按列求和(axis=1)。

范数(norm):度量向量"有多大"(分量的大小,不是维度)。常用三种:

  • L2 范数:元素平方和的平方根,也就是欧几里得距离。
  • L1 范数:元素绝对值之和,受异常值影响较小。
  • Frobenius 范数:矩阵版的 L2 范数。

深度学习的目标函数(比如距离、概率)常常表达为范数——我们想让"预测和真实"的距离最小,就是在最小化某种范数。

微积分

深度学习的训练本质是优化——最小化损失函数。而要知道"往哪个方向调参数、调多大步",就需要导数:函数在某一点的瞬时变化率,几何上就是曲线切线的斜率。

从单变量导数推广到多元函数:

  • 偏导数:固定其他变量、只对一个变量求导。
  • 梯度:把所有偏导数连成一个向量,它指向函数增长最快的方向。优化时我们往梯度的反方向走,就能让损失下降。

深度学习里的函数几乎都是复合函数,直接求导很难。链式法则解决了这个问题:复合函数对某个输入的偏导,等于各中间变量偏导的乘积/求和。链式法则是后面"反向传播"算法的数学根源——理解了链式法则,就理解了神经网络是怎么学习的。

自动微分

求导是所有深度学习优化算法的关键步骤,但复杂模型手工求导又痛苦又易错。深度学习框架提供了自动微分(autograd),自动帮你算梯度。

原理是这样的:框架为每个需要梯度的变量分配梯度存储空间;前向计算时构建一张计算图,记录"数据经过哪些操作组合成了输出";调用反向传播时,沿计算图反向填充每个参数的偏导数。

几个值得了解的细节:

  • 标量函数关于向量的梯度,是形状与向量相同的向量。
  • 对非标量变量求导时,默认等价于先对所有元素求和再求梯度。
  • 可以用"分离"操作把某段计算从计算图中摘出来(它的值被当作常数,梯度不再流经)。
  • 最妙的是:即使计算过程包含 if/while 这样的控制流,只要记录了计算图,梯度依然能正确算出来。

一句话理解:计算图像是"计算过程的事后账单"——前向是花钱(算值),反向是追溯每笔钱(梯度)分别来自哪个参数。

概率

机器学习就是做预测,而预测天然带有不确定性。概率是表达"我们有多确定"的正式语言。

基本概念:样本空间(所有可能结果)、事件(结果的子集)、随机变量(从随机实验中取值的量,分离散和连续)、分布(对事件概率的分配)。频率派视角下,用多次试验的频率估计概率,大数定律保证估计会随样本增多而收敛到真实概率。

处理多个随机变量时,需要一组工具:

  • 联合概率:两个事件同时发生的概率。
  • 条件概率:已知一件事发生时,另一件事发生的概率。
  • 贝叶斯定理:用先验和似然反推后验——这是很多机器学习方法的基础。
  • 边际化:对某个变量所有可能取值求和,得到另一个变量的概率。
  • 独立性:两个事件独立,意味着一个的发生不影响另一个。

书中用 HIV 检测的例子说明概率结果常常反直觉:即便检测很准,当患病率极低时,检测呈阳性后真实患病的概率可能只有约 13%——"测试准"不等于"患病概率高"。

最后是两个概括分布特征的量:

  • 期望:随机变量取值的加权平均(按概率加权),衡量"平均会怎样"。
  • 方差:度量取值偏离期望的程度,标准差是方差的平方根,衡量"波动有多大"。

小结

  • 张量是深度学习的核心数据结构,支持 GPU 加速和自动微分。
  • 原始数据要经过"读取 → 处理缺失值 → 张量化"的预处理流程。
  • 线性代数提供描述模型的语言:向量、矩阵、点积、矩阵乘法、范数。
  • 导数告诉我们损失往哪个方向下降,梯度是优化的方向,链式法则是反向传播的数学基础。
  • 自动微分由框架自动计算梯度,不用手工求导。
  • 概率是表达不确定性的语言,期望和方差概括了分布的"平均"和"波动"。

关键术语

术语 一句话解释
张量 n 维数组,深度学习存储和操作数据的核心结构
标量 / 向量 / 矩阵 零阶 / 一阶 / 二阶张量,分别是单个数值、数值列表、数值表格
广播机制 形状不同的张量自动扩展成相同形状再运算
独热编码 把类别变成 0/1 指示向量
点积 对应位置乘积之和,可表示加权平均或相似度
范数 度量向量大小,L1、L2、Frobenius 是常用变体
导数 / 梯度 瞬时变化率 / 指向增长最快方向的偏导向量
链式法则 复合函数求导规则,反向传播的数学基础
自动微分 框架自动计算梯度的机制
计算图 记录数据如何组合成输出的图,反向传播的载体
条件概率 / 贝叶斯定理 已知一事时另一事的概率 / 由先验和似然反推后验
期望 / 方差 分布的"平均取值" / "波动程度"