
本节入门学习AI领域的核心数学基础,包括线性代数、微积分、反向传播和概率理论,将它们类比为大脑的神经信号传递、突触可塑性和不确定性推理,帮助理解最底层的数学逻辑,利于后续学习。
1. 线性代数 - 神经信号传递的法则
所有神经网络的运算本质上都是线性代数运算,就像大脑中神经信号在神经元之间的传递遵循固定的电化学规律。
• 标量(0阶):一个元素的张量,实数空间的一员。
• 向量(1阶):标量值组成的列表,默认列向量。向量的元素个数=向量的维度=向量的长度。x[3]索引第2个元素。
• 张量的维度:张量的轴的个数。向量可以看作某个特定轴。
• 矩阵(2阶):具有2个轴的张量。A的转置为A.T
• 降维:张量可以沿着某个轴求和得到一个标量,使该轴的维数消失。A为torch.Size([5, 4]),通过A.sum(axis=0)得到torch.Size([4])
• 非降维求和:上条也可通过A.sum(axis=1, keepdims=True)保持轴数不变,依然是5*4。此外,A.cumsum(axis=0)可实现在轴-0上计算累积求和
• 点积:按元素。torch.dot(x, y)相当于torch.sum(x * y)
• 矩阵-向量积:torch.mv(A, x)
• 矩阵-矩阵乘法:torch.mm(A, B)
• 范数:L2范数(向量的大小,torch.norm(u))、L1范数(torch.abs(u).sum())、Lp范数(所有元素绝对值的p次方之和再开p次根号)、Frobenius范数(矩阵形向量大小)
2. 微积分 - 突触可塑性的数学原理
反向传播算法的核心是微积分的链式法则,可以快速计算出各个突触的影响力。
• 微分和积分:微积分的两个分支,前者可以应用于深度学习中的优化问题。
• 导数:函数相对于其变量的瞬时变化率,也是函数曲线的切线的斜率。
• 梯度:一个向量,其分量是多变量函数相对于其所有变量的偏导数。
• 链式法则:可以用来微分复合函数。
我们通过计算目标值对模型参数的梯度,量化给定输入信号下,该模型参数的变化对目标值的变化的影响。模型参数为突触(阀门),目标值为输入信号(数据)经过模型参数的作用后输出的信号(数据),梯度代表突触的影响力(拧阀门对出水量的影响,正或负拧多少影响变大或变小多少)。
举例说明,若目标值对突触梯度为0,表示该突触接下来调成多少都不太影响目标值;若为+100,表示该突触接下来稍微正调一点点,目标值就会变大很多,若为-100,表示该突触接下来正调一点点,目标值就会减小特别多。大多数情况目标值为损失,必须减小,所以在调突触时减去梯度,使得突触永远是在减小目标值的方向上调整。至于减少了多少则由梯度绝对值和步长决定。
根据目标值-损失大小更新参数就是调节突触强度,就像大脑会根据经验(目标偏差)调整突触连接强度。(优化器)
3. 反向传播 - 突触影响力的快速计算系统
• 自动微分:所有能算 "变化率 / 影响力" 的方法总称
• 反向传播:专门给神经网络用的、从结果倒着往前算影响力的那一种算法
手动计算非常缓慢。反向传播可加快求导过程,量化突触影响力。通过叶子结点开启计算图,跟踪父节点,并结合反向传播和链式法则,将叶子结点的梯度计算并存储。
深度学习框架可以自动计算导数:我们首先将梯度附加到想要对其计算偏导数的变量上,然后记录目标值(标量)的计算,执行它的反向传播函数,并访问得到的梯度。
• x.requires_grad_(True):等价于x=torch.arange(4.0,requires_grad=True),需要存储梯度。
• 注意:在pytorch计算图中,只有手动创建的张量才会保留梯度(如w.is_leaf为true时),而中间结点z张量的梯度默认释放以节省内存,哪怕写了z.requires_grad_(True)也不会保存,除非使用z.retain_grad()强制保留。只要w叶子结点开启了梯度,所有依赖 w 计算出来的张量(z、o)都会自动开启 requires_grad=True
• y.backward():y对x求导(假设y为x的函数)若y为向量,通常求和转为标量。每个张量都有一个 grad_fn 属性,记录了自己是由谁计算来的。保证反向传播计算各自梯度不迷路。
• 注:避免随意复用张量导致计算图错乱,避免手动修改张量破坏计算图,比如w=w+1,使变量w指向新的中间结点张量,原来的叶子结点w被覆盖丢弃了,要使用w.data.add_(1)直接改底层数值或with torch.no_grad():w.add_(1),w=w+1,不会将这些计算加入梯度计算图。
• x.grad:y对x的导数值,默认值是None
• 梯度累积:在默认情况下,PyTorch会累积梯度,需要清除之前的值用x.grad.zero_()
y = x * x
u = y.detach() #我们希望后续的z只是x 的函数,y不再看作变量,而看作常数u时,通过detach可以避免z对y求导
z = u * x
z.sum().backward()
4. 概率 - 大脑不确定性推理的底层逻辑
深度学习本质是统计学习,就像大脑总是在充满不确定性的世界中进行概率推理和决策。
• 采样:我们可以从概率分布中采样。当采样数量足够大,频率分布会接近概率分布-大数定律
• 概率分析工具:可使用联合分布、条件分布、Bayes定理、边缘化和独立性假设来分析多个随机变量。
• 概率分布特征:期望和方差为概率分布的关键特征的概括提供了实用的度量形式。
• probs与logits:probs表示事件概率,logits表示未归一化的对数概率。total_count为实验次数,当total_count足够大时,通过记录的logits来估计的几率分布接近probs,比如掷骰子。
• 概率论公理:样本空间S中的随机结果在事件A中,则表明A已发生。P(A)非负;P(S)=1;若A,B互斥,则P(A+B)=P(A)+P(B);P(空集)=0.
• 连续型随机变量:某个点的概率为0,但某个区间的概率不为0(概率密度非0)。
• 多个随机变量:
• 联合概率 P(A=a,B=b)<=P(A=a)
• 条件概率 0<= P(B=b|A=a)=P(A=a,B=b)/P(A=a) <=1
• 贝叶斯定律 P(B|A)=P(A|B)P(B)/P(A)
• A,B独立:P(B|A)=P(B);A,B在给定C上条件独立:P(A,B|C)=P(A|C)P(B|C)
• 马尔可夫链的核心性质是 "未来只依赖于现在,不依赖于过去"
• 期望与方差:期望是值*概率,描述平均值。方差是(值-期望)的期望,描述偏离期望的程度。
5. PyTorch工具查找说明
• print(dir(torch.distributions)):查找模块中所有函数和类
• help(torch.ones):查看函数或类的具体说明
留言
数学是AI的基石,掌握这些基础概念能更深刻地理解最底层的实现逻辑。
关注小鱼,一起游历AI世界