必要的数学准备
读 AI 公式最容易产生两种错觉。一种是“看不懂符号,所以完全无法理解模型”;另一种是“认得每个符号,所以已经理解模型”。前者低估了直觉,后者忽略了数据怎样流动。
本附录不是一门压缩后的高等数学课,而是一套随查随用的阅读工具。遇到公式时,先回答四个问题:
- 输入是什么?
- 输出是什么?
- 形状是否匹配?
- 这个运算改变了什么?
只读主线的读者,掌握直觉、输入输出和符号含义就够了。希望检查模型实现的读者,再继续追踪矩阵形状、链式法则、优化与数值稳定性。
先学会读符号
数学符号的作用是压缩重复叙述。它们不是暗号,同一个字母也没有永恒不变的含义;含义来自当前上下文。
设一条样本有三个特征:
\[ x=(x_1,x_2,x_3) \]
这里 \(x\) 表示整组输入,\(x_i\) 表示其中第 \(i\) 个分量。若有 \(n\) 条样本,\(x^{(i)}\) 常表示第 \(i\) 条样本。上标括号用于编号,不是乘方:
\[ x^{(2)}\neq x^2 \]
帽子通常表示估计或预测,例如真实标签为 \(y\),模型预测为 \(\hat y\)。星号常表示最优解,例如 \(\theta^\ast\) 是使目标函数最小的参数。粗体有时表示向量或矩阵,但本书为了减少视觉负担,常由上下文判断。
函数是输入到输出的规则
\[ y=f(x) \]
表示把 \(x\) 交给规则 \(f\),得到 \(y\)。函数可以是简单直线,也可以是一整个神经网络。带参数的模型常写成:
\[ \hat y=f_\theta(x) \]
\(\theta\) 代表模型中所有可调整参数。训练改变 \(\theta\),模型推理时则在固定 \(\theta\) 下处理新输入。
函数套函数表示数据依次通过多步变换:
\[ y=f(g(x)) \]
阅读顺序从内向外:先算 \(g(x)\),再把结果交给 \(f\)。深度网络的“深”,在数学上首先就是许多函数的复合。
求和号只是把加法缩短
\[ \sum_{i=1}^{n}x_i=x_1+x_2+\cdots+x_n \]
下方给起点,上方给终点。样本平均损失常写成:
\[ \bar L=\frac{1}{n}\sum_{i=1}^{n}L\left(\hat y^{(i)},y^{(i)}\right) \]
它的意思只是:分别计算每条样本的损失,再求平均。乘积号 \(\prod\) 同理,只是把一连串乘法缩短。
常见关系符号
- \(=\):两边相等;
- \(\approx\):在规定条件下近似相等;
- \(\propto\):成比例,省略了与当前比较无关的常数;
- \(\in\):属于,例如 \(x\in\mathbb{R}^d\) 表示 \(x\) 是 \(d\) 维实数向量;
- \(\forall\) 与 \(\exists\):分别表示“对所有”和“存在”;
- \(\arg\min_\theta L(\theta)\):使 \(L\) 最小的参数 \(\theta\);
- \(\mathbb{E}[X]\):随机变量 \(X\) 的期望;
- \(P(A\mid B)\):已知 \(B\) 发生时,\(A\) 发生的条件概率。
公式不是从左到右逐字翻译的句子。先找等号左边的输出,再看右边用了哪些输入和运算,往往比先辨认所有希腊字母更有效。
向量:把一组数当作一个对象
一张图片有许多像素,一个词可以用许多维嵌入表示,一位乘客也可以有年龄、行程和票价等特征。向量(vector)就是有顺序的一组数:
\[ x= \begin{bmatrix} x_1\\ x_2\\ \vdots\\ x_d \end{bmatrix} \in\mathbb{R}^{d} \]
\(d\) 是维数。二维向量可以画成平面上的箭头;几千维向量虽然画不出来,代数规则仍然相同。
点积:加权求和与方向比较
两个同维向量的点积是:
\[ w^\mathsf{T}x = \sum_{j=1}^{d}w_jx_j \]
它把两个向量变成一个数。若 \(x\) 是特征,\(w\) 是权重,点积就是“每项特征乘以对应权重,再相加”。感知机、逻辑回归和神经网络的线性层都反复使用这个结构。
点积也能反映方向关系。两个方向越一致,点积通常越大;方向相反时可能为负。不过点积还受向量长度影响,因此比较文本嵌入时常使用余弦相似度。
范数:向量有多长
最常见的欧几里得范数,也叫 \(L_2\) 范数:
\[ \lVert x\rVert_2 = \sqrt{\sum_{j=1}^{d}x_j^2} \]
\(L_1\) 范数则把绝对值相加:
\[ \lVert x\rVert_1 = \sum_{j=1}^{d}|x_j| \]
范数可以衡量表示大小、参数大小或两个向量之差。不同范数表达的偏好不同:\(L_2\) 正则化倾向于整体压小权重,\(L_1\) 正则化更容易把部分权重推到恰好为零。
余弦相似度:先消除长度影响
\[ \operatorname{cos}(x,y) = \frac{x^\mathsf{T}y} {\lVert x\rVert_2\lVert y\rVert_2} \]
若 \(x,y\) 都非零,它的值位于 \([-1,1]\)。接近 \(1\) 表示方向接近,接近 \(0\) 表示近似正交,接近 \(-1\) 表示方向相反。
这只是几何相似度,不自动等于人类意义上的“语义相同”。嵌入怎样训练、数据来自哪里、比较对象是否在同一分布中,都会影响结果。
矩阵、张量与形状
矩阵(matrix)是按行列排列的数表:
\[ W\in\mathbb{R}^{m\times d} \]
表示 \(W\) 有 \(m\) 行、\(d\) 列。若 \(x\in\mathbb{R}^d\),那么:
\[ Wx\in\mathbb{R}^{m} \]
可以把 \(W\) 的每一行看作一组权重,它与 \(x\) 做一次点积,最终得到 \(m\) 个输出。
矩阵乘法先看中间维
若:
\[ A\in\mathbb{R}^{r\times s}, \qquad B\in\mathbb{R}^{s\times t} \]
那么:
\[ AB\in\mathbb{R}^{r\times t} \]
中间两个 \(s\) 必须相同,结果留下外侧的 \(r\times t\)。可把形状规则记成:
[r, s] @ [s, t] -> [r, t]
矩阵乘法通常不可交换:即使 \(AB\) 和 \(BA\) 都有定义,它们也往往不相等。转置 \(A^\mathsf{T}\) 会交换行列:
\[ A\in\mathbb{R}^{r\times s} \quad\Longrightarrow\quad A^\mathsf{T}\in\mathbb{R}^{s\times r} \]
张量只是更多维的数表
在机器学习语境中,张量(tensor)通常泛指多维数组。一个批次的彩色图片可能具有形状:
[批次, 通道, 高度, 宽度] = [B, C, H, W]
一批 Token 表示可能是:
[批次, 序列长度, 隐藏维度] = [B, T, d_model]
“三阶张量”说的是轴的数量,不表示它比矩阵神秘。检查一段模型代码时,给每个中间量标上形状,通常能比盯着变量名更快发现错误。
逐元素运算不等于矩阵乘法
若两个矩阵形状相同,逐元素乘法把对应位置相乘;矩阵乘法则沿共享维度求和。代码中常分别写成 * 和 @:
逐元素乘法:[r, s] * [r, s] -> [r, s]
矩阵乘法: [r, s] @ [s, t] -> [r, t]
公式里的 \(\odot\) 常专门表示逐元素乘法。
广播:省略重复复制
线性层写成:
\[ Z=XW+b \]
若 \(XW\) 的形状为 \([B,m]\),而 \(b\) 的形状为 \([m]\),实际计算会把同一个 \(b\) 加到每条样本上。这叫广播(broadcasting)。
广播方便,但也是常见错误来源。两个形状不一致的数组有时不会报错,而会按某种规则自动扩展,得到一个形式合法、含义却错误的结果。读实现时要问:被复制的是哪条轴?这种共享是否符合模型含义?
概率:在不确定性下表达信念
概率不是一句“我觉得可能”。它是在明确事件、条件和样本空间下,对不确定性的数值表达。
事件 \(A\) 的概率满足:
\[ 0\le P(A)\le 1 \]
互补事件的概率为:
\[ P(\neg A)=1-P(A) \]
条件概率:条件改变后重新计算
\[ P(A\mid B) = \frac{P(A\cap B)}{P(B)} \qquad P(B)>0 \]
\(P(A\mid B)\) 读作“已知 \(B\) 时 \(A\) 的概率”。它一般不等于 \(P(B\mid A)\)。
例如“患病者中检测阳性的比例”是 \(P(+\mid D)\);“检测阳性者中真正患病的比例”是 \(P(D\mid +)\)。两者方向相反,后者还会受到疾病基础发生率影响。
贝叶斯公式:把证据方向翻过来
\[ P(H\mid E) = \frac{P(E\mid H)P(H)}{P(E)} \]
- \(H\):假设;
- \(E\):证据;
- \(P(H)\):看到证据前的先验概率;
- \(P(E\mid H)\):假设成立时出现该证据的可能性;
- \(P(H\mid E)\):看到证据后的后验概率。
若 \(P(E)\) 不容易直接求,可以对互斥且完备的假设求和:
\[ P(E)=\sum_h P(E\mid H=h)P(H=h) \]
贝叶斯公式本身不会替人选择合理先验、可靠数据或正确模型。它只说明:一旦这些量被定义,证据应怎样一致地更新信念。
独立与条件独立
若:
\[ P(A,B)=P(A)P(B) \]
则称 \(A\) 与 \(B\) 独立。独立不是“看起来无关”,而是知道一个事件不会改变另一个事件的概率。
条件独立写作:
\[ A\perp B\mid C \]
表示给定 \(C\) 后,\(A\) 与 \(B\) 不再提供关于彼此的额外信息。两个变量可能总体相关,却在控制共同原因后条件独立;也可能总体独立,却在加入某个条件后变得相关。概率图模型的许多结构,正是在表达这些假设。
期望与方差
离散随机变量 \(X\) 的期望为:
\[ \mathbb{E}[X] = \sum_x xP(X=x) \]
期望是长期平均或概率加权平均,不保证是一次观测中真正出现的值。
方差衡量围绕均值的波动:
\[ \operatorname{Var}(X) = \mathbb{E}\left[(X-\mathbb{E}[X])^2\right] \]
标准差是方差的平方根,与原变量单位相同。只报告均值可能隐藏巨大波动,因此实验结果通常还应给出标准差、置信区间或多次运行分布。
对数、指数与概率分数
指数函数 \(e^x\) 会快速增长,对数 \(\log x\) 是它的逆运算:
\[ \log(e^x)=x \]
机器学习频繁使用自然对数,即以 \(e\) 为底的对数。它有两个重要性质:
\[ \log(ab)=\log a+\log b \]
\[ \log\left(\frac{a}{b}\right)=\log a-\log b \]
一长串很小的概率相乘容易产生数值下溢;取对数后,乘积变成求和,既更稳定也更容易求导。因为对数严格单调,最大化似然与最大化对数似然得到同一最优参数。
Sigmoid:把任意实数压到 0 和 1 之间
\[ \sigma(z) = \frac{1}{1+e^{-z}} \]
当 \(z\) 很大时,\(\sigma(z)\) 接近 \(1\);当 \(z\) 很小时接近 \(0\);当 \(z=0\) 时等于 \(0.5\)。逻辑回归用它把线性分数转成二分类概率。
Softmax:把多个分数变成概率分布
给定 \(K\) 个分数 \(z_1,\ldots,z_K\):
\[ p_i = \frac{e^{z_i}} {\sum_{j=1}^{K}e^{z_j}} \]
每个 \(p_i>0\),且:
\[ \sum_{i=1}^{K}p_i=1 \]
Softmax 保留分数的相对次序,却不是独立地处理每一项:提高一个分数,会通过分母压低其他项的概率。
若把所有分数同时加上常数 \(c\),结果不变:
\[ \operatorname{softmax}(z) = \operatorname{softmax}(z+c) \]
因此实际计算通常先减去最大分数:
\[ p_i = \frac{e^{z_i-z_{\max}}} {\sum_j e^{z_j-z_{\max}}} \]
这不是近似,而是代数上完全相等,可以避免 \(e^{z_i}\) 溢出。
交叉熵:正确答案得到了多少概率
若真实类别是 one-hot 分布 \(y\),模型预测分布为 \(p\),多分类交叉熵为:
\[ H(y,p) = -\sum_{i=1}^{K}y_i\log p_i \]
只有正确类别的 \(y_i=1\),因此可简化为:
\[ H(y,p)=-\log p_{\text{正确类别}} \]
模型给正确类别的概率越高,损失越小;若给出接近零的概率,惩罚会很大。
熵、交叉熵与 KL 散度
这三个量形式相近,回答的问题不同。
熵:分布本身有多不确定
\[ H(p) = -\sum_i p_i\log p_i \]
分布越均匀,熵通常越高;概率越集中,熵越低。熵不是“混乱”的万能度量,它依赖随机变量怎样定义以及对数底数。
交叉熵:用分布 q 编码来自 p 的结果
\[ H(p,q) = -\sum_i p_i\log q_i \]
监督分类中,\(p\) 往往是真实目标分布,\(q\) 是模型预测。交叉熵同时包含数据本身的不确定性和模型与数据的不匹配。
KL 散度:两个分布相差多少
\[ D_{\mathrm{KL}}(p\lVert q) = \sum_i p_i\log\frac{p_i}{q_i} \]
三者满足:
\[ H(p,q) = H(p)+D_{\mathrm{KL}}(p\lVert q) \]
当真实分布 \(p\) 固定时,最小化交叉熵等价于最小化 \(D_{\mathrm{KL}}(p\lVert q)\)。
KL 散度非负,并在两个分布几乎处处相同时为零,但它通常不对称:
\[ D_{\mathrm{KL}}(p\lVert q) \neq D_{\mathrm{KL}}(q\lVert p) \]
所以它不是通常意义上的距离。方向不同,会对“漏掉 \(p\) 中有概率的区域”和“把概率放到 \(p\) 很小的区域”产生不同惩罚。
导数:局部变化率
设输出 \(y=f(x)\)。导数描述 \(x\) 发生很小变化时,\(y\) 大约改变多少:
\[ f'(x) = \lim_{\Delta x\to 0} \frac{f(x+\Delta x)-f(x)}{\Delta x} \]
在局部范围内:
\[ f(x+\Delta x) \approx f(x)+f'(x)\Delta x \]
导数为正表示局部上升,为负表示局部下降,绝对值越大表示越敏感。导数等于零只说明局部斜率为零,不保证那里是全局最小值。
常见导数包括:
\[ \frac{d}{dx}x^n=nx^{n-1} \]
\[ \frac{d}{dx}e^x=e^x \]
\[ \frac{d}{dx}\log x=\frac{1}{x} \]
\[ \sigma'(x)=\sigma(x)\left(1-\sigma(x)\right) \]
偏导数与梯度
若函数有多个输入,例如:
\[ L(w_1,w_2) \]
偏导数 \(\frac{\partial L}{\partial w_1}\) 表示暂时固定其他变量,只看 \(w_1\) 的局部变化率。把所有偏导数组合起来,就得到梯度:
\[ \nabla_w L = \begin{bmatrix} \frac{\partial L}{\partial w_1}\\ \frac{\partial L}{\partial w_2}\\ \vdots\\ \frac{\partial L}{\partial w_d} \end{bmatrix} \]
梯度指向函数局部上升最快的方向,因此负梯度指向局部下降最快的方向。这里的“最快”基于欧几里得几何和足够小的步长,不等于一步就能到达全局最优点。
链式法则:影响沿计算路径相乘
若:
\[ y=f(u), \qquad u=g(x) \]
那么:
\[ \frac{dy}{dx} = \frac{dy}{du} \frac{du}{dx} \]
直觉是:\(x\) 改变多少 \(u\),再乘以 \(u\) 改变多少 \(y\)。多层网络不过是把这条规则沿很长的计算图反复应用。
若一条变量通过多条路径影响最终损失,各路径贡献还要相加。反向传播正是系统地完成这些“沿路径相乘、在汇合处相加”的计算。
反向传播负责计算梯度;梯度下降或 Adam 负责读取梯度并更新参数。 前者是求导算法,后者是优化算法。
梯度下降:用局部信息调整参数
设模型参数为 \(\theta\),损失为 \(L(\theta)\)。最基本的梯度下降更新是:
\[ \theta_{t+1} = \theta_t-\eta\nabla_\theta L(\theta_t) \]
\(\eta\) 是学习率。太小会使训练缓慢;太大可能越过低点、剧烈震荡甚至发散。
为什么使用批次
整个训练集的平均梯度是:
\[ \nabla_\theta L = \frac{1}{N} \sum_{i=1}^{N} \nabla_\theta \ell^{(i)} \]
每次都遍历全部 \(N\) 条样本代价很高。小批次训练只抽取 \(B\) 条样本估计梯度:
\[ g_B = \frac{1}{B} \sum_{i\in\mathcal{B}} \nabla_\theta \ell^{(i)} \]
批次梯度带有噪声,却能更频繁地更新,并适合现代硬件并行。批次大小还会影响显存、吞吐、梯度方差和优化行为,不只是一个性能开关。
正则化:训练目标不只追求贴合样本
加入 \(L_2\) 参数惩罚的目标可以写成:
\[ J(\theta) = L(\theta)+\lambda\lVert\theta\rVert_2^2 \]
\(\lambda\) 控制正则化强度。它表达一种偏好:若两个模型同样贴合训练数据,更倾向于参数较小的那个。Dropout、数据增强、早停和权重衰减也能起到正则化作用,但机制并不完全相同。
正则化不能替代独立验证集。是否改善泛化,仍要在未参与参数更新和超参数选择的数据上检查。
一个完整例子:逻辑回归怎样训练
现在把前面的向量、概率、对数和梯度串起来。假设要判断一封邮件是否为垃圾邮件。
第一步:线性打分
输入特征为 \(x\in\mathbb{R}^d\),参数为 \(w\in\mathbb{R}^d\) 和标量偏置 \(b\):
\[ z=w^\mathsf{T}x+b \]
形状检查:
w^T: [1,d]
x: [d,1]
z: 标量
\(z\) 是任意实数,还不是概率。
第二步:转成概率
\[ p=\sigma(z)=\frac{1}{1+e^{-z}} \]
把 \(p\) 解释为模型估计的 \(P(y=1\mid x)\)。若 \(p\ge 0.5\) 就预测为正类,这只是一个可调整的决策阈值,不是概率模型本身的一部分。
第三步:计算二元交叉熵
真实标签 \(y\in\{0,1\}\),单条样本损失为:
\[ \ell = -y\log p-(1-y)\log(1-p) \]
当 \(y=1\) 时只剩 \(-\log p\);当 \(y=0\) 时只剩 \(-\log(1-p)\)。模型越自信地答错,损失越大。
第四步:沿计算图求梯度
先对 \(p\) 求导:
\[ \frac{\partial\ell}{\partial p} = -\frac{y}{p} +\frac{1-y}{1-p} \]
Sigmoid 的导数为:
\[ \frac{\partial p}{\partial z} = p(1-p) \]
由链式法则:
\[ \frac{\partial\ell}{\partial z} = \frac{\partial\ell}{\partial p} \frac{\partial p}{\partial z} = p-y \]
复杂的中间项抵消后只剩“预测减真实值”。继续传到参数:
\[ \frac{\partial\ell}{\partial w} =(p-y)x, \qquad \frac{\partial\ell}{\partial b} =p-y \]
梯度 \(\frac{\partial\ell}{\partial w}\) 与 \(w\) 形状相同,都是 \([d]\)。这是实现中的重要自检条件。
第五步:更新参数
\[ w\leftarrow w-\eta(p-y)x \]
\[ b\leftarrow b-\eta(p-y) \]
若真实标签为 \(1\) 而预测概率太低,则 \(p-y<0\),更新会沿着 \(x\) 的方向增加相应权重;若真实标签为 \(0\) 而预测太高,则更新方向相反。
实际训练会对一个批次的损失求平均,再用向量化计算一次更新。验证集用于选择学习率、正则化强度和停止时机;测试集只用于最终估计泛化表现。
这条完整链可以概括为:
特征 x
-> 线性分数 z
-> 概率 p
-> 损失 ell
-> 反向传播得到梯度
-> 优化器更新 w 和 b
注意力公式:逐步追踪形状
缩放点积注意力常被压缩成一行:
\[ \operatorname{Attention}(Q,K,V) = \operatorname{softmax} \left( \frac{QK^\mathsf{T}}{\sqrt{d_k}}+M \right)V \]
不要一次吞下整行。设单个序列长度为 \(T\):
\[ Q\in\mathbb{R}^{T\times d_k}, \quad K\in\mathbb{R}^{T\times d_k}, \quad V\in\mathbb{R}^{T\times d_v} \]
第一步:查询与键两两打分
\[ S=QK^\mathsf{T} \]
形状为:
QK^T: [T,d_k] @ [d_k,T] -> [T,T]
\(S_{ij}\) 表示第 \(i\) 个查询与第 \(j\) 个键的匹配分数。结果是 \(T\times T\),因为序列中每个位置都要和每个候选位置比较。
第二步:缩放并加入掩码
\[ \widetilde S = \frac{S}{\sqrt{d_k}}+M \]
当 \(d_k\) 较大时,未缩放点积的幅度容易变大,使 Softmax 过早进入非常尖锐、梯度很小的区域。除以 \(\sqrt{d_k}\) 用来控制典型分数尺度。
因果掩码 \(M\) 把未来位置对应的分数设为一个极大的负数,在 Softmax 后近似得到零概率。掩码改变哪些位置可以被读取,不改变矩阵形状。
第三步:按行归一化
\[ A=\operatorname{softmax}(\widetilde S) \]
\(A\in\mathbb{R}^{T\times T}\)。Softmax 沿每一行进行,所以:
\[ \sum_{j=1}^{T}A_{ij}=1 \]
每一行表示一个查询在所有可见键上的权重分布。
第四步:加权汇总内容
\[ O=AV \]
形状为:
AV: [T,T] @ [T,d_v] -> [T,d_v]
输出仍有 \(T\) 个位置,每个位置得到一个 \(d_v\) 维向量。权重由 \(Q\) 和 \(K\) 的匹配决定,真正被汇总的内容来自 \(V\)。
完整形状链是:
Q: [T,d_k]
K: [T,d_k]
V: [T,d_v]
S: [T,T]
A: [T,T]
O: [T,d_v]
加入批次和多头后,常见实现形状变为:
[B, H, T, d_head]
每个头独立完成相同逻辑,再拼接回模型隐藏维度。不同框架可能交换轴顺序,但“查询与键形成位置对位置的分数,权重再汇总值”这一数据流不变。
\(A_{ij}\) 能显示当前计算中信息如何被加权汇总,但它不自动构成完整的因果解释。残差路径、后续层、多个头和非线性变换都可能改变最终输出。
数值稳定性:数学相等不等于计算同样可靠
计算机使用有限精度浮点数。非常大的数可能溢出为无穷,非常小的非零数可能下溢为零;两个几乎相等的大数相减,还可能丢失大量有效数字。
Softmax 先减最大值
直接计算 \(e^{1000}\) 会溢出,但先减去最大分数后,最大的指数变为 \(e^0=1\)。前面已经看到,这种改写不改变结果。
对数概率使用稳定组合公式
直接先算很小的概率再取 \(\log\),可能先下溢为零,随后得到 \(-\infty\)。实际库通常提供 log_softmax、cross_entropy 和 logsumexp 等组合操作:
\[ \operatorname{LSE}(z) = \log\sum_i e^{z_i} \]
稳定实现会写成:
\[ \operatorname{LSE}(z) = m+\log\sum_i e^{z_i-m}, \qquad m=\max_i z_i \]
除法与对数要检查定义域
归一化时分母不能为零,取对数时输入必须为正,开平方时在实数范围内输入不能为负。实践中常加入很小的 \(\varepsilon\):
\[ \frac{x}{\sqrt{v+\varepsilon}} \]
\(\varepsilon\) 不是随意装饰,它防止分母为零并控制极端情况下的数值行为,但取值过大也会改变原运算。
梯度也会消失或爆炸
链式法则会把许多局部导数相乘。若它们长期小于 \(1\),梯度可能趋近于零;若长期大于 \(1\),梯度可能急剧放大。残差连接、归一化、合适初始化、激活函数和梯度裁剪,都在不同层面缓解这些问题。
数值稳定性不是把数学公式“实现得更漂亮”,而是决定理论上的运算能否在有限精度机器上可靠发生。
按章节选择数学路线
不必先读完本附录再开始正文。遇到需要时回来查,通常效率更高。
路线一:只读全书主线
优先掌握:
- 函数是输入到输出的变换;
- 向量是一组有序数字;
- 概率表达带条件的不确定性;
- 损失衡量预测与目标的差异;
- 梯度给出局部调整方向;
- 矩阵形状说明数据能否合法流动。
这足以跟随大多数章节的核心论证。技术深潜中的推导可以先跳过。
路线二:理解经典机器学习
- 点积与线性打分;
- 条件概率、贝叶斯公式、期望和方差;
- Sigmoid、对数似然与交叉熵;
- 导数、梯度和正则化;
- 本附录的完整逻辑回归例子。
路线三:理解神经网络训练
- 函数复合和链式法则;
- 向量、矩阵、张量与广播;
- 批次梯度和参数更新;
- 梯度消失、梯度爆炸与数值稳定性;
- 期望在损失和强化学习目标中的含义。
路线四:深入注意力与 Transformer
- 矩阵乘法的中间维规则;
- 转置、点积和余弦相似度;
- Softmax 的归一化方向;
- 掩码不改变形状、只改变可见关系;
- 本附录的完整注意力形状链。
路线五:检查论文或实现
除上述内容外,还应继续学习线性代数中的特征值与奇异值分解、概率统计中的估计与假设检验、多元微积分中的雅可比矩阵,以及优化中的动量、自适应学习率和约束优化。本附录只提供读懂全书所需的共同起点。
公式阅读检查表
以后看到一条陌生公式,可以依次检查:
- 目标:这条公式在定义分数、概率、损失、更新规则,还是评测指标?
- 对象:每个符号是标量、向量、矩阵、张量,还是随机变量?
- 形状:矩阵乘法的中间维是否相同?加法是否依赖广播?
- 范围:求和对哪些下标进行?Softmax 沿哪条轴归一化?
- 条件:分母是否非零?对数输入是否为正?独立性等假设是否成立?
- 训练或使用:这一步在计算梯度、更新参数,还是用固定参数产生输出?
- 近似:等号是真正相等,还是省略常数、采样估计或数值近似?
- 边界:公式在哪些分布、数据和实现条件下才支持正文结论?
能够回答这些问题,就不必害怕公式很长。大多数 AI 公式都能拆回少数基本动作:加权、求和、归一化、比较误差,以及沿计算路径传递变化。