简介:《人工智能的基础数学》是一份系统梳理人工智能数学基础的电子书PDF,面向数据、商业和工程领域读者,尤其适合已有一定编程或数据分析经验、但数学底子薄弱,希望看懂各类算法原理、摆脱只会调用现成模型的从业者与学习者。资源为单个便携式文档格式文件,容量约14.87MB,适合在电脑或平板上离线阅读、检索,也便于反复查阅。目前已有629人浏览学习。本书没有站在“公式满天飞”或“零数学”两个极端,而是面向没有高等数学学位的读者,把人工智能所需的数学基础与机器学习流程串接起来,解释模型为什么有效、何时失灵;多位数据科学从业者的推荐语也指出,书中同时兼顾对人工智能社会影响的思考,能帮助读者建立更完整的判断力。
1. 人工智能基础数学PDF,先看清它是一张路线图
“人工智能的基础数学.pdf”这个标题,很容易让人误判成一本线性代数教材:翻开就要从行列式、特征值开始一页页啃。实际这类文档的价值不在顺序通读,而在于它把 AI 从业者真正用得上的数学压缩成一条可自学的路径——线性代数、微积分、概率统计、信息论与最优化,每一块都对应模型里一个具体动作。它适合两类人:一类是调参能跑通、看论文却被公式卡住的工程师,另一类是准备从“调包”转向改模型结构的开发者。读它的正确姿势是带着目标跳着读,把每个章节当成解决一个问题的工具,而不是按顺序背完的教材。
2. 四块数学基石与它们锁死的 AI 场景:从张量到概率再到优化
一份面向 AI 的数学基础资料,最忌贪多求全。如果按数学系的培养方案来选内容,线性代数要讲向量空间、线性变换、Jordan 标准型,概率论要讲测度论和大数定律的完整证明——这些对日常写模型帮助有限。AI 真正反复用到的数学概念,集中在四个模块里:线性代数负责数据怎么表示和变换,微积分负责模型怎么学习,概率统计负责不确定性怎么描述,信息论与最优化负责损失函数怎么设计、训练怎么收敛。把这四块和具体模型动作对应上,后面读到任何公式都不至于孤立无援。
2.1 线性代数:AI 里真正在跑的基本都是矩阵运算
一条文本、一张图、一个特征表,进入模型之后统变成多维数组,也就是代码里常说的张量。张量的 shape 对应线性代数里的维度:一个形状为 (batch, seq_len, hidden) 的张量,可以理解成 batch 个 seq_len 行、hidden 列的矩阵叠在一起。这个习惯一旦建立,看公式和看代码就成了同一件事。比如全连接层做的就是 y = Wx + b,W 是权重矩阵,x 是输入向量,b 是偏置;自注意力里的 Q、K、V 三个矩阵,都是对同一个输入做不同线性变换后得到的,再用矩阵乘法把 Q 和 K 的转置乘起来得到注意力分数。矩阵乘法不过关的人,遇到维度对不上的报错时,根本分不清是代码写错还是公式里转置标错。
这块内容里另一个容易被跳过、但工程中高频出现的工具是矩阵分解。奇异值分解 SVD 在推荐系统的矩阵分解、特征降维、向量索引压缩里反复出现;特征值和奇异值本身描述的是一个矩阵在变换过程中沿着哪些方向拉伸、拉伸了多少倍。理解到这一步,PCA 降维的原理就自然通了:把数据协方差矩阵做特征分解,保留特征值大的方向,丢掉特征值小的方向。至于特征值如何证明存在性这类纯数学问题,在这类基础 PDF 里往往只是提一句,实用中也不需要手推。
我的一般做法是:读线性代数章节时拿一张纸,把每个矩阵的形状都标成 shape 形式。A 是 2×3,B 是 3×2,那么 AB 一定是 2×2;代码里就写成A.shape和B.shape。形状对不上,公式就一定是错的,不用再看第二步。这套直觉比背任何定理都更挡得住工程现场的问题。矩阵乘法程序化之后,再去看注意力机制里的softmax(QK^T / √d)V,每一步的维度变化都能在心里跟着走一遍。
2.2 微积分与矩阵求导:梯度下降和反向传播的引擎
深度学习模型的训练,表面上是调用某个框架的自动求导,本质上跑的还是链式法则。反向传播并不是一个独立发明的算法,它就是链式法则在多层函数复合上的工程化实现。理解这一点,框架里的backward()就不再是黑匣子:前向传播算出一堆中间变量,反向传播按相反顺序把这些变量的偏导数乘起来。一个简单的例子是f(x) = g(h(x)),对 x 求导等于先求 g 对 h 的导数、再乘 h 对 x 的导数,反向传播就是把这个乘法链条从后往前依次做完。
矩阵求导是这章最容易让人头晕的部分,因为同一公式在不同资料里可能差一个转置。这通常不是谁写错了,而是分子布局和分母布局两种约定不同。常见做法是固定用其中一种布局:我个人习惯用分母布局,遇到外部资料的公式时先判断它用哪种布局,再转换成自己的记法。另一个实用技巧是,矩阵求导的结果可以用数值差分来验证,具体操作在第 5 章会展开,这里先记住结论:如果一个矩阵偏导结果能被一个小步长的差分在误差范围内复现,那它基本就是对的。
微积分章节里还有一个和模型训练强相关的点:梯度消失的数学来源。以 sigmoid 函数为例,它的导数在零点取最大值也只有 0.25,多层网络反向传播时每经过一层就要乘一个小于 0.25 的数,层数一深梯度就指数级衰减到接近零。这也是 ReLU 一类激活函数流行的原因:它在正半轴导数为 1,连乘不会让梯度快速消失。能把这个链条从公式讲到代码再到网络结构设计,微积分部分才算真正读完。
2.3 概率与统计:模型的不确定性到底从哪里冒出来
很多开发者的概率论只停留在“事件发生的可能性”这个层面,但 AI 里用到概率的地方要具体得多。分类模型最后一层经过 softmax 得到的一组数值,经常被误读成“概率”,实际上它只是归一化后的得分。真正要把它当作概率,还需要校准,这在医学、风控等对置信度敏感的场景里尤其重要。理解这层差别,就不会再对 softmax 输出里的 0.7 和 0.8 做过于绝对的解读。
概率章节里最值得吃透的是极大似然估计的思想:模型参数要选得让已观测到的训练样本出现的概率尽量大。分类模型的交叉熵损失,本质上就是在做极大似然估计;回归模型常用均方误差,也对应着高斯噪声假设下的极大似然解。换句话说,多数常见损失函数不是拍脑袋定的,背后都有概率假设。读 PDF 时如果能把“损失函数”和“概率分布假设”这两个词绑定,后续看新模型的损失设计会快很多。
贝叶斯视角在工程里也有直接用处。L2 正则化可以被解释成给权重加了高斯先验,Dropout 也有近似贝叶斯推断的解释。这些观点在基础资料里可能只是几行字,但在讨论模型泛化、过拟合、不确定性估计时,它们是反复出现的底层语言。即使不打算做贝叶斯深度学习,理解“先验”“后验”“似然”三个词的差别,也能让你在阅读技术方案时少走很多弯路。
2.4 信息论与最优化:损失函数和收敛性背后的推手
信息论在 AI 基础数学里通常不会单独占很多篇幅,但交叉熵、KL 散度、熵这几个概念一旦漏掉,后面看生成模型、知识蒸馏、对比学习都会吃力。交叉熵衡量两个分布之间的匹配程度,KL 散度则是在交叉熵基础上减掉一个熵项,描述“用分布 Q 去近似分布 P 时额外付出的编码代价”。很多蒸馏模型的损失函数,拆开看就是让教师模型和学生模型的输出分布在 KL 散度意义上靠近。基础 PDF 里这几个公式往往就一两页,却是连接损失函数设计和模型行为的关键桥段。
为什么分类任务普遍用交叉熵而不用均方误差,这个问题最优化部分能给出解释:softmax 与交叉熵组合后,梯度形式简洁,不会因为输出接近 0 或 1 就陷入饱和;而 softmax 配均方误差,误差大时梯度反而小,训练容易被卡住。回归任务里噪声常被假设成高斯分布,所以均方误差才是自然选择。这样的“损失函数选择理由”在工程中比死记公式更有价值。
最优化这一小块,基础部分讲的是梯度下降、凸函数、约束优化。对深度学习工程师来说,凸优化的完整理论未必用得上,但几个直觉必须建立:凸函数的局部最优就是全局最优,可深度学习目标函数天然非凸,所以训练收敛只能靠经验和技巧,不能靠理论保证;梯度为零的点不一定是最小值,还可能是鞍点,高维空间中鞍点比极值点常见得多,这是训练卡住的重要嫌疑。这些认知能让排查训练不收敛时多一条思路,而不是只想到调学习率。
| 模块 | 必须吃透的概念 | 对应 AI 场景 | 没读懂时的典型表现 |
|---|---|---|---|
| 线性代数 | 矩阵乘法、张量形状、SVD、特征值 | 注意力机制、推荐系统、降维 | 维度对不上,报错看不懂 |
| 微积分 | 链式法则、偏导、矩阵求导 | 反向传播、梯度消失 | 不知道梯度为什么变 0 或爆炸 |
| 概率统计 | MLE、先验后验、分布假设 | 分类损失、正则化、不确定性 | 把 softmax 输出当置信度 |
| 信息论与最优化 | 交叉熵、KL 散度、凸性、鞍点 | 损失设计、蒸馏、训练收敛 | 只知道调学习率,没有排查方向 |
3. 别按顺序啃:把人工智能基础数学 PDF 读成可用资产的三个习惯
拿到这类 PDF,多数人的第一反应是从第 1 页开始读,但这不是最好选择。面向 AI 的数学基础资料通常仍按学科章节编排,线性代数在前,概率统计在后,可真实项目里遇到的问题很少按这个顺序出现。我见过不少开发者卡在特征值证明这一节两星期,后面梯度下降完全没看,实际上后者的工程价值远高于前者。正确的读法是把文档当成索引库:先确定眼下要解决的问题,再从文档里找到对应的公式、概念和练习,读完立刻回到问题里验证。
3.1 先做目录映射:把章节目录改造成问题清单
用 20 分钟把 PDF 目录完整翻一遍,在目录旁边标注两类标记:一类是“必须会算”,另一类是“知道结论即可”。比如目标是理解推荐系统里的矩阵分解,那线性代数里的矩阵乘法、矩阵分解就是“必须会算”,内积空间和正交基可以降级为“知道结论即可”;概率统计里的高斯分布、极大似然需要“必须会算”,大数定律的证明则直接跳过。这一步的目的是让读书顺序服从项目顺序,而不是服从教材顺序。
做完标记后,再把你的目标拆成问题清单。一个问题对应一组章节,比如“SVD 如何压缩用户行为矩阵”对应矩阵分解和特征值;“为什么交叉熵比 MSE 更适合分类”对应信息论与最优化。当日阅读只解决一到两个问题,合上文档时明确知道自己新增了什么可操作的知识。这个习惯坚持下来,PDF 就不再是需要从头啃完的大部头,而是一本经常翻的工具手册。
3.2 一个公式配三个问题:看懂符号、知道作用、会删参数
阅读公式时,我会在空白处写下三个问题:这个符号在表达什么,它的输入和输出分别是什么维度;这个变换对数据做了什么,哪个参数影响最大;如果把公式里某一项删掉,结果会发生什么变化。以 attention 里常见的softmax(QK^T / √d)为例:第一个问题让 Q、K、V 的维度,第二个问题让缩放因子√d的作用是防止内积过大把 softmax 推入饱和区,第三个问题想想去掉缩放后训练是否会变得不稳。三个问题回答完,这个公式就不再只是字符组合。
第三问尤其有用,它逼着你建立“每个组件有存在的理由”的工程直觉。softmax 里的分母求和删掉就变成逐元素指数,数值可能爆炸;交叉熵里的对数项去掉,梯度形态就完全不同。很多论文里的改进模型,本质就是把某个公式的其中一项换成另一种形式,你只有知道原公式每一项的作用,才能看懂改动理由。这套方法也适用于 PDF 之外的所有技术文档。
3.3 最小代码对照:把公式翻译成 NumPy
数学公式和代码是对同一件事的两种描述。读到一个公式,顺手用 NumPy 翻译一遍,能发现很多“以为自己懂了、实际没懂”的细节。比如下面这段代码,把矩阵乘法和 softmax 都做了一次最小实现:
import numpy as np # 用随机矩阵模拟一次线性变换,抄一遍 y = Wx + b np.random.seed(42) x = np.random.randn(3) # 输入向量,维度 3 W = np.random.randn(4, 3) # 权重矩阵:输出维度 4,输入维度 3 b = np.zeros(4) # 偏置 y = W @ x + b # @ 是矩阵乘法,和公式 y = Wx 对齐 print("y shape:", y.shape) # 输出 (4,),和 W 的行数一致 # 再抄一遍 softmax,注意减最大值防止指数溢出 def softmax(z): e = np.exp(z - np.max(z)) # 平移不改变数值,但能避免 exp 溢出 return e / np.sum(e) s = softmax(y) print("softmax 结果:", s)这段代码的要点有三个:第一,矩阵乘法用@运算符,和公式里的乘法记号一一对应,写代码前先确认两个矩阵的 shape 是否满足(m, n) @ (n, p) = (m, p);第二,softmax 里减去最大值是数值稳定的常规操作,函数在数学上等价于原始定义,但不会在z很大时算出无穷大;第三,这种翻译练习的意义不在产出可用的业务代码,而在逼着你去处理公式里没有写明的细节,比如求和到底沿哪个轴、广播如何发生。把这些细节踩一遍,再看论文伪代码会顺畅得多。
4. 自学这份数学基础最容易翻车的 5 个地方:现象、原因与解法
读这份 PDF 的人,一半不是被难度劝退的,是被自己的读法坑的。以下几个问题是社群提问里出现频率比较高的,我按“现象到原因再到解法”的顺序整理出来,你可以提前避开。
4.1 按顺序逐页啃,结果三周还停在第一章
现象:从第一页开始读,每天读三页,做笔记做到第九页,一个月后发现自己还在线性代数最前面,而项目里要用到的概率知识完全没进展。 原因:把这份 PDF 当成了教材,默认必须从头读到尾,但它是为解决问题服务的工具文档,不是有考试跟着的课程。 解决:先做目录映射,把当前项目或学习目标拆成具体问题,只读与问题相关的章节。读到证明细节卡住时,先记一个“证明以后再看”的标记,跳到公式结论处继续走。每天结束时问自己的不是“今天读了几页”,而是“今天解决了一个什么问题”。
4.2 公式看着都懂,一写代码维度就乱套
现象:矩阵公式抄得下来,但一到代码里写reshape就报错,或者模型里维度对不上,不知道该转置谁。 原因:数学记号没有和代码的数据形状建立关联。公式里的向量默认是列向量,代码里的数组却可能是(batch, seq, hidden)的三维结构,缺少形状感知。 解决:读公式时给每个符号标上 shape,例如x ∈ R^3记作x.shape = (3,),W ∈ R^{4×3}记作W.shape = (4, 3)。写代码时在关键运算前加上形状注释,或者直接用assert x.shape == (3,)这类断言拦住错误。至少两次后,公式和代码之间的翻译会变成本能。
4.3 试图手推所有证明,进度慢到怀疑人生
现象:看到特征值定理就拿起纸笔从头证一遍,证完又看下一个定理,两周过去还在线性代数,概率一章没碰。 原因:混淆了“理解”“会算”和“能证明”三个层次。做 AI 工程需要的是前两者,多数证明只是保证结论成立,不参与日常推导。 解决:把证明分成两类。一类是核心推演逻辑,比如链式法则、极大似然估计的导出,值得手推一遍;另一类是存在性、唯一性之类,直接接受结论即可。遇到繁琐推导,可以用符号计算库代劳,省下的时间留给能真正提升工程判断力的内容。
4.4 觉得梯度都被框架包了,学微积分没什么用
现象:写代码时所有导数都由反向传播自动计算,于是认为链式法则、偏导、矩阵求导这些内容可以跳过。 原因:还没有把框架 API 和数学概念对应上。自动求导只是一个计算器,它能算值,但不能告诉你梯度为什么消失、学习率为什么需要按层调整、损失函数为什么选这一种。 解决:用 NumPy 手写一个两层全连接网络的反向传播,样本数量取 5 个,隐藏层取 4 个,不引入任何深度学习框架。当你自己实现前向传播,再手动实现每一层的梯度并和数值梯度对比,框架里的backward()黑匣子就被拆开了。做完这一遍,微积分章节里的链式法则就不是抽象符号,而是代码里的循环。
4.5 同一公式在不同资料里符号不一样,于是怀疑自己
现象:在某篇论文里看到权重矩阵是W,另一份教程里同样位置的矩阵写成θ,求导结果还差一个转置,于是认为是自己基础太差。 原因:数学记号本就没有统一标准,矩阵求导存在分子布局和分母布局两套约定,向量的行与列写法也未统一。这是资料差异,不是你的理解问题。 解决:固定使用一套自己的记号。我习惯标量用小写字母,向量用粗体小写,矩阵用粗体大写;遇到外部资料先判断它的布局,再和自己习惯的表达式做一次换算。这个换算动作做多了,反而能更快看出公式背后真正的结构。
5. 读完一章就动手验证:搭一个最小数学推导环境并复算关键公式
读数学基础只输入不输出,遗忘会让你觉得时间白费了。我建议在本地搭一套最小的验证环境:不需要 GPU,不需要深度学习框架,只需要 Python、NumPy、SymPy 和交互式笔记本。这个环境有两个用途:一是符号层面验证自己手推的导数,二是数值层面给公式正确性上保险。两者配合使用,很多自学时的“不知道推得对不对”就变成了可确认的事实。
5.1 最小环境:Python、NumPy、SymPy 和交互式笔记本就够
安装这套环境只需一条命令,以下是我常用的顺序:
pip install numpy sympy notebook装完在终端启动交互式笔记本,新建一个文件当作草稿纸。NumPy 提供数值计算能力,适合做矩阵运算和数值梯度;SymPy 提供符号计算能力,适合做因式分解、求导、化简;Notebook 则把每一步推导过程和结果存在同一个页面里,方便回头检查。这套环境覆盖了这份基础 PDF 里绝大多数需要动手验证的内容。
| 验证场景 | 用哪个库 | 常用入口 |
|---|---|---|
| 矩阵乘法、求逆、特征值 | NumPy | np.linalg.inv、np.linalg.eig |
| 符号化简 | SymPy | sp.simplify、sp.factor |
| 求导、偏导、链式法则 | SymPy | sp.diff |
| 不定积分与定积分 | SymPy | sp.integrate |
| 数值梯度对比 | NumPy | 中心差分公式 |
| 极限与级数 | SymPy | sp.limit、sp.series |
5.2 用 SymPy 验证 softmax 的偏导数推导
softmax 的导数在反向传播里反复出现,很多资料直接给出结论,但自己推一遍后再验证一遍,记忆会更牢。下面这段代码完成的是两变量 softmax 对其中一个输入的偏导:
import sympy as sp # 定义两个实数变量,避免复数分支影响化简 x1, x2 = sp.symbols('x1 x2', real=True) # softmax 的第一个输出分量,分母是两个变量的指数和 s1 = sp.exp(x1) / (sp.exp(x1) + sp.exp(x2)) # 对 x1 求偏导,SymPy 会自动完成商法则和链式法则 ds1_dx1 = sp.diff(s1, x1) print(sp.simplify(ds1_dx1)) # 结果应为 s1 * (1 - s1) # 对 x2 求偏导,验证交叉项导数是 -s1 * s2 ds1_dx2 = sp.diff(s1, x2) print(sp.simplify(ds1_dx2)) # 结果应为 -s1 * s2symbols(..., real=True)的作用是告诉 SymPy 变量在实数域,避免出现复数相关分支让化简结果不够直观;diff是符号求导入口;simplify把商法则展开后的复杂表达式压回简洁形式。运行后能看到第一行结果与s1 * (1 - s1)等价,第二行与-s1 * s2等价。这两个结论是 softmax 反向传播的基础,亲手验证后再看框架源码里的梯度实现,会明显更有把握。
5.3 数值梯度对比:给自己的手推结果上一道保险
符号推导适合验证形式,数值梯度适合验证数值。中心差分公式用两侧扰动计算导数,精度比单侧差分高一个量级。下面的代码把 softmax 第一个分量的解析梯度与数值梯度做对比:
import numpy as np eps = 1e-6 z = np.array([1.0, 2.0, 3.0]) def softmax(z): e = np.exp(z - z.max()) # 减最大值保证数值稳定 return e / e.sum() def f0(z): return softmax(z)[0] # 只观察第 0 个输出分量 # 中心差分:分别在左右两侧加一个小扰动,取差值除以 2*eps num_grad = (f0(z + np.array([eps, 0, 0])) - f0(z - np.array([eps, 0, 0]))) / (2 * eps) # 解析梯度:softmax 第 0 个分量对第 0 个输入的偏导是 s0 * (1 - s0) s = softmax(z) ana_grad = s[0] * (1 - s[0]) print("数值梯度:", num_grad) print("解析梯度:", ana_grad) print("误差:", abs(num_grad - ana_grad))eps的取值需要平衡两种误差:太大则差分结果偏离真实导数,太小则浮点舍入误差变大,1e-6是个常用默认值。中心差分之所以用两侧扰动而不是单侧,是因为它的截断误差从 O(eps) 降到 O(eps²),同样步长下明显更准。每次手推完一个导数,就用这个方法验一下;误差在 1e-6 以内基本可以认为解析式正确。这个习惯能把“我觉得公式对”变成“我确定公式对”,省掉后面排错的几个小时。
6. 进阶:把公式里的每个符号在工程代码里反查到落地
读完这份 PDF 之后,下一步不是找更多数学书,而是把公式和工程实现真正接起来。我这两年最受用的技巧是反向索引:从论文里的公式出发,到开源模型代码里反查每个符号到底对应哪个张量、哪一次运算。这个过程不需要读懂所有代码,只用三步。
第一步,把公式里的每个符号列出来,标上数学类型和维度。比如注意力分数的公式softmax(QK^T / √d),列出Q的维度是(seq_len, d),K的维度是(seq_len, d),转置后相乘得到(seq_len, seq_len),√d是一个标量。第二步,在模型代码里搜索这些符号名或者相近的名字,通常能看到query、key、value三个张量的形状刚好和公式对应。第三步,用一组假数据把这段代码跑起来,打印每一步的张量 shape,再和公式标注的维度一一比对。三个步骤走完,公式和实现的关系就清楚了。
再举一个例子:KL 散度在代码里通常不叫kl_div。知识蒸馏的损失里,教师模型和学生模型的输出分布对齐,表面写的是蒸馏损失,拆开往往就是交叉熵减去熵项。如果你在代码里只看到一个交叉熵计算,对照之前数学部分关于 KL 散度和交叉熵的推导,就能识别出真正在起作用的是哪一个数学对象。这种“公式、代码、数据形状”三面对齐的练习,能让你在新的模型结构面前不至于两眼一抹黑。
我自己曾经跳过了这一步,直接从一个公开模型实现里挑公式看,结果花了三周才把注意力机制和矩阵乘法上的运算完全对应上。后来养成的习惯是:任何新公式,先标注形状,再找代码实现,最后跑一组小数据验证。这套流程成了我读论文的固定起手式,回头再看这份 PDF,很多东西已经内化成了日常排查的直觉。希望帮到你。
本文还有配套的精品资源,点击获取