深度学习中的矩阵求导基础
本文根据合集·深度学习中的数学by齐宪标系列视频整理。
在本文中,用小写字母表示标量,用粗体小写字母表示向量,用粗体大写字母表示矩阵。
导数的定义
在高等数学和数学分析的课程中,我们知道一元函数 的导数定义为
而对于多元函数,则会引入方向导数和梯度的概念。
梯度与方向导数
给定一个多元函数
其梯度为 定义为
简单来说,梯度即为以单位正交向量为基底, 对 各分量的导数的线性组合。对于多元函数而言,其梯度是一个和 同样维度的向量。
而方向导数是指函数在某一点处,在某一给定方向上的变化率,是一个标量。它定义为
Jacobian 矩阵
对于一簇多元函数(也称为向量函数,即定义域和值域都是向量的集合的函数)
其各个函数的梯度组合成一个矩阵,称为 Jacobian 矩阵,记为 。它定义为
是一个 的矩阵,其中 是输出的维度, 是输入的维度。
注意
Jacobian 矩阵的维度是 ,而不是 。这意味着,Jacobian 矩阵不能用来直接表示向量函数的导数和梯度——Jacobian 矩阵的转置才能表示向量函数的导数和梯度。
实际上,向量函数的求导运算是一种从函数到函数的映射。用形式化的语言表达就是
Hessian 矩阵
给定一个多元函数
其 Hessian 矩阵定义为
导数的链式求导法则
对于复合函数
其链式求导法则为
不过,如果自变量是一个向量或者矩阵,那么由于矩阵乘法不满足交换律,于是就存在分母表达式和分子表达式两种形式。
分母表达式和分子表达式
这里的分子和分母指的是原微商式中的分子和分母,即 和 。顾名思义,分母/分子表达式的含义就是先求含分母/分子的那一项,即
其中, 式是分子表达式, 是分母表达式。由此可见,分子表达式是先求外层函数,然后逐层深入求导;分母表达式是先求内层函数,然后逐层向外求导。
在深度学习中,为了方便,一般采用分母表达式来表示导数。稍后我们就会看到这种表达方式的方便之处。
多项式向量函数的导数
多项式向量函数是指,每个因变量 都是关于自变量 和常数的线性函数的函数。本小节主要讨论一次多项式和二次多项式向量函数的导数计算,只需要理解齐次式的导数计算即可。
一次齐次式
注意到, 是一个将向量从 维映射到 维的向量函数。所以,这里的 ,恰好是其 Jacobian 矩阵的转置。
常用线性函数求导公式
二次齐次式(二次型)
常见神经网络层的导数计算
全连接层
一层全连接层的函数表达式为
它是一个典型的一次多项式向量函数,其导数为
一般地,全连接层的参数矩阵 是可学习的参数,需要通过梯度下降法来更新,就不可避免地需要对其求导数。显然
激活函数
以 ReLU 为例,其函数表达式为
其导函数为
对于一簇多元函数 ,其 Jacobian 矩阵为
它是一个对角线上的元素可能为 0 或 1,而其他元素均为 0 的矩阵。
对角矩阵
卷积层
待补充。
自注意力层
待补充。
归一化层
不论是 BatchNorm 还是 LayerNorm,其函数形式都相同,都是将任何特征分布转化为均值为 0,方差为 1 的特征分布。
其中, 是可学习的参数,都是
分子是用线性代数表示为
其中, 是单位矩阵, 是元素全为 1 的列向量。
分母的被开方数用线性代数表示为
其结果其实是一个标量。
由 两式的结果可知,原函数解析式可化为
因此,其 Jacobian 矩阵为
深度神经网络的导数计算
我们以 Feed Forward 网络为例,其网络结构为
用解析式表示就是
反向传播算法是从后向前计算导数的。我们可以很容易算出 对参数矩阵 的导数为
在 DNN 训练过程中,中间状态是需要存储在显存中的。可以认为,这里的 都是已知的。参数矩阵从后向前通过梯度下降算法进行更新,即先更新 ,再更新 。
现在计算 对参数矩阵 的导数。由求导链式法则的分母表达式,有
对偏置 的求导是类似的,本文不再赘述。
小结
深度学习中的矩阵求导,主要是利用导数的链式法则,让输出对深度神经网络中的参数矩阵进行求导。在求导过程中,主要涉及两种情况:一是直接对参数矩阵求导,二是对输入中间状态进行求导。采用分母表达式进行求导,可以按照神经网络的顺序进行,较为方便和直观。