向量与矩阵微分
最基本的微分是建立在一元函数上的。对于函数 ,我们有导数的定义:
对于一元函数,我们可以将 看作是一个标量,但这种处理绝非平凡的。处理多元函数时,更恰当的理解方式应当是将微分视作一个描述函数误差项的线性映射。例如,对于 ,我们有
这里面的 是一个线性映射,称为 在 处的微分。根据 Riesz 表示定理,任何从 到 的线性映射都可以表示为内积的形式,因此在标准的内积定义下,我们可以找到一个向量 ,使得对于任意 ,都有
这里面的 定义为该多元函数的梯度。在这种定义下,梯度的每个分量都对应着函数对该分量的偏导数。 这也被称为一阶微分的形式不变性
这种思路可以推广到向量值函数 。在这种情况下,微分 仍然是一个线性映射,因此可以表示为一个矩阵的形式。我们定义雅可比矩阵 ,使得对于任意 ,都有
那么根据以上的推导我们可以得出 Jacobian 矩阵的组成为
这里面的 是 的第 个分量函数。以上这些应当都是多元微积分中应当熟悉的部分,并不构成理解上的难度。但是神经网络的处理中往往需要遇到矩阵函数,即输入/输出或者二者均为矩阵的函数。对于矩阵函数,机器学习领域中的一个惯例时对矩阵微分采用所谓分母布局(denominator layout),也就是分母决定列向量形式,分子决定行向量形式。11 比如先前提到的梯度则为分母布局、其转置(Jacobian)可以视作分子布局例如,对于矩阵函数 ,可以定义其梯度 满足
,使得对于任意矩阵 ,都有
这里面的 是 Frobenius 内积,定义为矩阵对应元素乘积之和。而更广义地,对于矩阵函数 ,可以定义其微分满足
根据先前定义,对应的 Jacobian 矩阵 应当是一个三维张量22 这里切换回了分子布局,主要是张量采用什么布局其实无所谓,其关于矩阵 的线性映射定义为
常见矩阵函数的微分
在理解了矩阵微分的定义后,我们可以推导一些常见矩阵函数的微分形式,这些形式在神经网络的反向传播中会频繁使用。以下微分如果没有特殊说明,我们考虑的都是标准的数学定义上的微分,也就是 Jacobi 矩阵(分子布局)。
我们想求得 。这是一个 的函数,则其 Jacobian 矩阵形状为 。根据定义,我们有
因此
这里 都是行向量。我们想求得 。这是一个 的函数,则其 Jacobian 矩阵形状为 。类似的推导我们可以得到这里也可以注意到 进而转化为前一种情况
- 逐元素函数
这里 是一个标量函数,逐元素作用在向量 上。我们想求得 。这是一个 的函数,则其 Jacobian 矩阵形状为 。根据定义,我们有
因此有
这里 是一个标量函数,我们想求得 的分母布局形式利用分母布局可以直接得到梯度形式,在进行梯度下降时更加方便。由链式法则有
这里 与 无关,我们可以先求得 ,这是一个 的函数,因此根据定义令其梯度为 这里用梯度是因为我们约定了分母布局。我们随即分别考虑 ,每个分量是一个 的函数,因此其微分应当是一个简单的向量。根据定义我们有
也就是
因此根据链式法则我们有
因此我们可以得到最终的结果
交叉熵损失
这里 是真实标签, 是预测标签, 是模型的线性输出。我们想求得 。根据链式法则有
因此我们最终得到