矩阵求导
矩阵作为数学和工程学科中常见的工具,广泛应用于各种领域中。在这些应用中,我们有时需要对矩阵中的某个元素或整个矩阵、向量进行求导。本文将介绍矩阵求导的基本原理、运算和一些常见公式及其应用。
矩阵求导的引入#
矩阵求导(Matrix Derivative)也称作矩阵微分(Matrix Differential),在机器学习、图像处理、最优化等领域的公式推导中经常用到。矩阵求导实际上是多元变量的微积分问题,只是应用在矩阵空间上而已,即为标量求导的一个推广,他的定义为将自变量中的每一个数与因变量中的每一个数求导。
在本文中,我们在表示向量和矩阵时,通过用单个变量来表示许多变量的方式,把矩阵记法的效用发挥到最大。接下来我们用不同字体来区分标量、向量和矩阵。我们使用M(n,m)来表示包含n行m列的n×m实矩阵的空间。该空间中的一般矩阵用粗体大写字母表示,例如\(\mathbf A\),\(\mathbf X\),\(\mathbf Y\)等。而若该矩阵属于M(n,1),即列向量,则用粗体小写字母表示,如\(\mathbf a\),\(\mathbf x\),\(\mathbf y\)等。\(\mathbf{X^T}\)表示矩阵转置,tr(\(\mathbf X\))表示矩阵的迹,而 det(\(\mathbf X\))或|\(\mathbf X\)|表示行列式[1]。
函数、标量、向量、矩阵之间的关系#
考虑一个函数 \(function(input)\),针对 \(function\) 的类型、 \(input\) 的类型,我们可以将这个函数 \(funcion\) 分为不同的种类[2]。
-
\(function\)是标量
-
input是标量\(x\),\(f(x) = x ^ 2\)
-
input是向量\(\mathbf{x} = [x_1, x_2]^T\),\(f(\mathbf{x}) = x_1^2 + x_2\)
-
input是矩阵\(\mathbf{X} = \left[ \begin{matrix} x_{11} & x_{12} \\ x_{21} & x_{22} \end{matrix} \right]\),\(f(\mathbf{X}) = a_1x_{11} + a_2x_{12} + a_3x_{21} + a_4x_{22}\)
-
-
\(function\)是向量
-
input是标量\(x\),\(\mathbf{f}(x) = [x, x^2]^T\)
-
input是向量\(\mathbf{x} = [x_1, x_2]^T\),\(\mathbf{f}(\mathbf{x}) = [x_1+x_2, x_1^2 + x_2^2]^T\)
-
input是矩阵\(\mathbf{X} = \left[ \begin{matrix} x_{11} & x_{12} \\ x_{21} & x_{22} \end{matrix} \right]\),\(\mathbf{f}(\mathbf{X}) = [x_{11} + x_{12} + x_{21} + x_{22}, x_{11}^2 + x_{12}^2 + x_{21}^2 + x_{22}^2]^T\)
-
-
\(function\)是矩阵
-
input是标量\(x\),\(\mathbf{F}(x) = \left[ \begin{matrix} x & x^2 \\ x+x^2 & x^3 \end{matrix} \right]\)
-
input是向量\(\mathbf{x} = [x_1, x_2]^T\),\(\mathbf{F}(\mathbf{x}) = \left[ \begin{matrix} x_1+x_2 & x_2^2 \\ x_1^2+x_2 & x_1 \end{matrix} \right]\)
-
input是矩阵\(\mathbf{X} = \left[ \begin{matrix} x_{11} & x_{12} \\ x_{21} & x_{22} \end{matrix} \right]\),\(\mathbf{F}(\mathbf{X}) = \left[ \begin{matrix} a_{11}x_{11}+a_{12}x_{12} & a_{21}x_{21}^2 \\ a_{22}x_{22}^2+x_{12} & x_{12} + x_{21} \end{matrix} \right]\)
-
矩阵求导结果的布局#
我们求导的本质只是把标量求导的结果排列起来,至于是按行排列还是按列排列都是可以的。但是这样也有问题,在我们机器学习算法法优化过程中,如果行向量或者列向量随便写,那么结果就不唯一。为了解决矩阵向量求导的结果不唯一,我们引入求导布局。
对于分子布局来说,我们求导结果的维度以分子为主,对于分母布局来说,我们求导结果的维度以分母为主。
对于向量对标量求导,对于一个向量\(\mathbf{y} = [y_1, y_2, ..., y_n]^T\),由于每个元素都可以被视为一个独立的变量,因此对其求导时,我们需要计算每个元素的偏导数。矩阵求导的分子布局为\(\frac{\partial \mathbf{y}}{\partial x} = [\frac{\partial y_1}{\partial x}, \frac{\partial y_2}{\partial x}, ..., \frac{\partial y_n}{\partial x}]^T\),矩阵求导的分母布局为\(\frac{\partial \mathbf{y}}{\partial x} = [\frac{\partial y_1}{\partial x}, \frac{\partial y_2}{\partial x}, ..., \frac{\partial y_n}{\partial x}]\)。
对于标量对向量求导,对于一个向量\(\mathbf{x} = [x_1, x_2, ..., x_n]^T\),矩阵求导的分子布局为\(\frac{\partial y}{\partial \mathbf{x}} = [\frac{\partial y_1}{\partial x}, \frac{\partial y_2}{\partial x}, ..., \frac{\partial y_n}{\partial x}]\),矩阵求导的分母布局为\(\frac{\partial \mathbf{y}}{\partial x} = [\frac{\partial y_1}{\partial x}, \frac{\partial y_2}{\partial x}, ..., \frac{\partial y_n}{\partial x}]^T\)。
从以上结果可以看出,分子布局和分母布局呈互相转置的关系。在机器学习算法原理的推导里,我们并没有看到说正在使用什么布局,也就是说布局被隐含了,这就需要自己去推演,比较麻烦。但是一般来说我们会使用一种叫混合布局的思路,即如果是向量或者矩阵对标量求导,则使用分子布局为准,如果是标量对向量或者矩阵求导,则以分母布局为准。下文如果没有特殊说明,出现矩阵求导均以分子布局呈现。
标量、向量、矩阵之间的求导运算#
标量对标量求导#
最基本的求导案例是标量对标量。例如,我们试图计算 \(f(x)=x^2\) 的导数,那么这个导数就是 \(2x\)。这个计算比较简单,但它是矩阵求导案例的基础。
标量对向量求导#
接下来,我们将考虑标量对向量的求导。例如,假设我们有一个函数 \(f(\mathbf{x}) = \mathbf{x}^T\mathbf{x}\), 其中\(\mathbf{x} = [x_1, x_2]^T\) 。然后,我们可以针对 \(\mathbf{x}\) 的每个元素计算导数。结果是\(2\mathbf{x}^T\)。
在向量微积分中,标量\(y\)在的空间\(Rn\)(其独立坐标是\(x\)的分量)中的梯度是标量\(y\)对向量\(\mathbf{x}\)的导数的转置。
标量对矩阵求导#
我们定义\(m \times n\)矩阵\(\mathbf{X}\)上的标量函数\(f\)对\(\mathbf{X}\)的导数可以写作\(\frac{\partial f}{\partial \mathbf{X}} = \left[ \begin{matrix} \frac{\partial f}{\partial x_{11}} & \frac{\partial f}{\partial x_{21}} & \cdots & \frac{\partial f}{\partial x_{m1}}\\ \frac{\partial f}{\partial x_{12}} & \frac{\partial f}{\partial x_{22}} & \cdots & \frac{\partial f}{\partial x_{m2}}\\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial f}{\partial x_{1n}} & \frac{\partial f}{\partial x_{2n}} & \cdots & \frac{\partial f}{\partial x_{mn}} \end{matrix} \right]\)
矩阵上的重要的标量函数包括矩阵的迹和行列式行列式。
向量对标量求导#
考虑向量对标量的求导。假设我们有一个函数\(\mathbf{f}(x)=[a_1x, a_2x^2]^T\),对于向量的各个元素,我们可以简单地应用标量对标量求导的知识,得到它对应的导数值。因此,我们得到这个函数的导数是:\(\dfrac{\partial \mathbf{f}}{\partial x} = [a_1, 2a_2x]^T\)。
在向量微积分中,向量\(\mathbf {y}\)关于标量x的导数也被称为向量\(\mathbf {y}\)的切向量。
向量对向量求导#
向量函数(分量为函数的向量)\(\mathbf{f}(y) = [y_1, y_2,...,y_n]^T\)对输入向量\(\mathbf{x} = [x_1, x_2, ..., x_n]^T\)的导数\(\frac{\partial \mathbf{y}}{\partial \mathbf{x}} = \left[ \begin{matrix} \frac{\partial y_1}{\partial x_1} & \frac{\partial y_1}{\partial x_2} & \cdots & \frac{\partial y_1}{\partial x_n}\\ \frac{\partial y_2}{\partial x_1} & \frac{\partial y_2}{\partial x_2} & \cdots & \frac{\partial y_2}{\partial x_n}\\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial y_n}{\partial x_1} & \frac{\partial y_n}{\partial x_2} & \cdots & \frac{\partial y_n}{\partial x_n} \end{matrix} \right]\)。
在向量微积分中,向量函数\(\mathbf{y}\)对分量表示一个空间的向量的\(\mathbf{x}\)导数也被称为前推(微分),或雅可比矩阵。
矩阵对标量求导#
矩阵函数\(\mathbf{F}\)对标量x的导数被称为切矩阵,可写成\(\frac{\partial \mathbf{F}}{\partial x} = \left[ \begin{matrix} \frac{\partial y_{11}}{\partial x} & \frac{\partial y_{12}}{\partial x} & \cdots & \frac{\partial y_{1n}}{\partial x}\\ \frac{\partial y_{21}}{\partial x} & \frac{\partial y_{22}}{\partial x} & \cdots & \frac{\partial y_{2n}}{\partial x}\\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial y_{n1}}{\partial x} & \frac{\partial y_{n2}}{\partial x} & \cdots & \frac{\partial y_{nn}}{\partial x} \end{matrix} \right]\)
矩阵求导的常见公式[3]#
给定两个矩阵 \((\mathbf A=(a_{i,j}) \in \mathbb R^{m\times n},\mathbf B=(b_{i,j}) \in \mathbb R^{m\times n})\) ,定义:
- 阿达马积
Hadamard product
(又称作逐元素积):\[\mathbf A \circ \mathbf B =\begin{bmatrix} a_{11}b_{11}&a_{12}b_{12}&\cdots&a_{1n}b_{1n}\\ a_{21}b_{21}&a_{22}b_{22}&\cdots&a_{2n}b_{2n}\\ \vdots&\vdots&\ddots&\vdots\\ a_{m1}b_{m1}&a_{m2}b_{m2}&\cdots&a_{mn}b_{mn} \end{bmatrix}\] - 克罗内积
Kronnecker product
:\[\mathbf A \otimes \mathbf B =\begin{bmatrix} a_{11}\mathbf B&a_{12}\mathbf B&\cdots&a_{1n}\mathbf B\\ a_{21}\mathbf B&a_{22}\mathbf B&\cdots&a_{2n}\mathbf B\\ \vdots&\vdots&\ddots&\vdots\\ a_{m1}\mathbf B&a_{m2}\mathbf B&\cdots&a_{mn}\mathbf B \end{bmatrix}\]
设 \(\mathbf x,\mathbf a,\mathbf b,\mathbf c\)为 \(n\)阶向量, \(\mathbf A,\mathbf B,\mathbf C,\mathbf X\)为\(n\)阶方阵,则:
对于矩阵的迹,有下列偏导数成立:
矩阵求导的链式法则[4]#
标量对标量的链式求导#
假设x, y, z都为标量(或者说一维向量),链式关系为x -> y -> z。根据高数中的链式法则
上面的计算过程很简单,不多解释。
向量对向量链式求导(分子布局)#
假设\(\mathbf x\),\(\mathbf y\),\(\mathbf z\)都为向量,链式关系为\(\mathbf x\) -> \(\mathbf y\) -> \(\mathbf z\)。如果我们要求\(\frac{\partial \mathbf z}{\partial \mathbf x}\),可以直接用链接法则求导
假设\(\mathbf x\),\(\mathbf y\),\(\mathbf z\)的维度分别为\(m\),\(n\),\(p\),\(\frac{\partial \mathbf z}{\partial \mathbf x}\)的维度为\(p \times m\),而\(\frac{\partial \mathbf z}{\partial \mathbf y}\)的维度为\(p \times n\),\(\frac{\partial \mathbf y}{\partial \mathbf x}\)的维度为\(n \times m\),\(p \times n\)与\(n \times m\)的维度刚好为\(p \times m\),与左边相同。
标量对多向量的链式求导(分母布局)#
在深度学习中,一般我们的损失函数为一个标量函数,比如MSE或者Cross Entropy,因此最后求导的目标函数为标量。
假设我们最终优化的目标为\(z\)是个标量,\(\mathbf x\),\(\mathbf y\)分为是\(m\),\(n\)维向量,依赖关系为\(\mathbf x\)->\(\mathbf y\)->\(\mathbf z\)。现在需要求的是\(\frac{\partial z}{\partial \mathbf x}\),维度为\(m \times 1\)。
易知有\(\frac{\partial \mathbf z}{\partial \mathbf y}\)为\(n \times 1\), \(\frac{\partial \mathbf y}{\partial \mathbf x}\)为\(m \times n\),则\(\frac{\partial \mathbf y}{\partial\mathbf x} \cdot \frac{\partial \mathbf z}{\partial \mathbf y}\)的维度为\(m \times 1\),与左边能对上。
因此有
扩展到多个向量\(\mathbf y_1\) -> \(\mathbf y_2\) -> \(\mathbf y_3\) -> ...-> \(\mathbf y_n\) -> \(z\)
以常见的最小二乘求导为例:
损失函数\(C\)是个标量,假设\(\mathbf X\)为\(m \times n\)的矩阵,\(\mathbf \theta\)为\(n \times 1\)的向量,我们要求\(C\)对\(\mathbf \theta\)的导数,令\(z = \mathbf X \mathbf \theta - \mathbf y\),\(C = \mathbf z^T \mathbf z\),由上面的链式关系 \(\frac{\partial C}{\partial \mathbf \theta} = \frac{\partial \mathbf z}{\partial \mathbf \theta} \cdot \frac{\partial C}{\partial \mathbf z} = 2 \mathbf X^T(\mathbf X \mathbf \theta - \mathbf y)\)。
注:此处采用分母布局,故\(\frac{\partial \mathbf z}{\partial \mathbf \theta} = \mathbf X^T\)。
核对一下维度
\(\frac{\partial C}{\partial \mathbf \theta}\)是\(n \times 1\), \(\mathbf X^T\)是\(n \times m\),\(\mathbf X \mathbf \theta - \mathbf y\)是\(m \times 1\), \(\mathbf X^T (\mathbf X\mathbf \theta - \mathbf y)\)是\(n \times 1\),能与左边对上。
其中
所以最小二乘最优解的矩阵表达式为
标量对多矩阵链式求导(分母布局)#
神经网络中,最常见的计算方式是\(\mathbf Y = \mathbf {WX} + \mathbf b\),其中\(\mathbf W\)为权值矩阵。
看个更为常规的描述:
假设\(z = f(\mathbf Y)\),\(\mathbf Y =\mathbf{Ax} + \mathbf b\),其中\(\mathbf A\)为\(m \times k\)矩阵,\(\mathbf x\)为\(k \times 1\)向量,\(\mathbf b\)为\(m \times 1\)向量,那么\(\mathbf Y\)也为\(m \times 1\)向量,\(z\)为一个标量。
如果要求\(\frac{\partial z}{\partial \mathbf x}\),结果为\(k \times 1\)的维度。\(\frac{\partial z}{\partial \mathbf y}\)的维度为\(m \times 1\), \(\mathbf A\)的维度为\(m \times k\)。
\(\frac{\partial z}{\partial \mathbf x} = \mathbf A^T \cdot \frac{\partial z}{\partial \mathbf y}\)。
左边的维度为\(k \times 1\),右边的维度为\(k \times m\) 与\(m \times 1\)相乘,也是\(k \times 1\),刚好能对上。
当\(\mathbf X\)为矩阵时,按同样的方式进行推导可以得到一样的结论。
如果要求\(\frac{\partial z}{\partial \mathbf A}\),结果为\(m \times k\)矩阵。\(\frac{\partial z}{\partial \mathbf Y}\)的维度为\(m \times 1\), \(\mathbf X\)的维度为\(k \times 1\)。
\(\frac{\partial z}{\partial \mathbf A} = \frac{\partial z}{\partial \mathbf Y} \cdot \mathbf X^T\)。
当\(\mathbf X\)为矩阵时,按同样的方式进行推导可以得到一样的结论。
参考#
- [1] Wikipedia
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步