概述
不同的应用领域,对"导数"用途的侧重点完全不同。
这就像在世界上有的国家靠左行驶,有的靠右行驶。两者没有绝对的对错,只是为了适应不同的交通(运算)需求。
原因如下:
1. 用途不同:"更新参数" 和 "线性映射"
这是造成分裂的最主要原因。
A. 优化与机器学习派(偏爱分母布局)
-
目标: 我们求导的目的是为了利用梯度下降法(Gradient Descent)来更新参数。
-
痛点: 假设你的神经网络权值矩阵 是一个 的矩阵。计算出损失 后,你需要更新 :
-
需求: 为了能做减法,导数 的形状必须和 完全一样(也是 )。
-
结论: 既然我要形状一样,那就强制规定:分母是什么形状,结果就是什么形状。这就是分母布局。如果不这样规定,每次更新参数前你都要手动转置一次,非常麻烦。
B. 纯数学与控制理论派(偏爱分子布局)
-
目标: 我们求导的目的是为了研究函数局部的线性逼近(Taylor 展开)或者变量之间的变换关系。
-
痛点: 考虑向量函数 。微分的核心思想是用矩阵乘法来模拟函数变化:
-
需求: 根据矩阵乘法规则,如果 是 , 是 ,为了让乘法 成立,中间的导数矩阵 必须是 的。
-
结论: 这种 的形式(行数等于分子维度,列数等于分母维度)就是雅可比矩阵(Jacobian) ,即分子布局。如果你用分母布局,这里的公式就要写成 ,数学家觉得这很不优雅。
2. 链式法则(Chain Rule)的顺滑度
当处理复合函数(层层嵌套)求导时,两种布局在书写公式时的体验完全不同。
- 分子布局的优势:
它让链式法则看起来和标量求导几乎一样,非常符合直觉。
若 ,则:
(矩阵乘法直接相连,中间不需要转置,形式优美)。
- 分母布局的劣势:
由于维度的定义翻转了,链式法则通常需要颠倒顺序或者加转置符号:
这就造成了一个有趣的现象:
在推导复杂的数学理论时(如推导反向传播的公式本身),学者们可能倾向于用分子布局 (或混合布局)来保证推导过程的连贯性;但在编写代码库(如 PyTorch, TensorFlow)时,为了工程实现的便利,结果会强制转为分母布局。
3. 行向量与列向量的历史遗留问题
这涉及到更底层的数学定义习惯。
- 如果习惯把数据看作列向量(Column Vector,工程界主流),那么 对 求导最自然,产生雅可比矩阵(分子布局)。
- 如果习惯把数据看作行向量(Row Vector,部分统计学和早期教材),那么 直接就在分母位置横着放,导数形式自然就变成了分母布局。
由于历史上不同学派的大师(如 Magnus & Neudecker vs. 其它学派)使用了不同的向量定义,导致后世教材一直没能统一。
总结
通过dydx=A⇒dy=Adx\frac{dy}{dx}=A \Rightarrow dy=A dxdxdy=A⇒dy=Adx判断
如果A的形状符合线代的数据习惯,那就是分子布局;如果是转置,那就是分母布局
通常来说,如果在做深度学习 ,默认分母布局 ,因为我们要的是梯度(Gradient)。如果在做纯数学推导或控制理论 ,默认分子布局,因为我们要的是雅可比矩阵(Jacobian)