矩阵求导

矩阵作为数学和工程学科中常见的工具,广泛应用于各种领域中。在这些应用中,我们有时需要对矩阵中的某个元素或整个矩阵、向量进行求导。本文将介绍矩阵求导的基本原理、运算和一些常见公式及其应用。

矩阵求导的引入#

矩阵求导(Matrix Derivative)也称作矩阵微分(Matrix Differential),在机器学习、图像处理、最优化等领域的公式推导中经常用到。矩阵求导实际上是多元变量的微积分问题,只是应用在矩阵空间上而已,即为标量求导的一个推广,他的定义为将自变量中的每一个数与因变量中的每一个数求导。

在本文中,我们在表示向量和矩阵时,通过用单个变量来表示许多变量的方式,把矩阵记法的效用发挥到最大。接下来我们用不同字体来区分标量、向量和矩阵。我们使用M(n,m)来表示包含nm列的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]

  1. \(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}\)

  2. \(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\)

  3. \(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\)阶方阵,则:

\[\frac{\partial(\mathbf {a}^{T}\mathbf {x}) }{\partial \mathbf {x} }=\frac{\partial(\mathbf {x}^{T}\mathbf {a}) }{\partial \mathbf {x} } =\mathbf {a} \]

\[\frac{\partial(\mathbf {a}^{T}\mathbf X\mathbf {b}) }{\partial \mathbf X }=\mathbf {a}\mathbf {b}^{T}=\mathbf {a}\otimes\mathbf {b}\in \mathbb R^{n\times n} \]

\[\frac{\partial(\mathbf {a}^{T}\mathbf X^{T}\mathbf {b}) }{\partial \mathbf X }=\mathbf {b}\mathbf {a}^{T}=\mathbf {b}\otimes\mathbf {a}\in \mathbb R^{n\times n} \]

\[\frac{\partial(\mathbf {a}^{T}\mathbf X\mathbf {a}) }{\partial \mathbf X }=\frac{\partial(\mathbf {a}^{T}\mathbf X^{T}\mathbf {a}) }{\partial \mathbf X }=\mathbf {a}\otimes\mathbf {a} \]

\[\frac{\partial(\mathbf {a}^{T}\mathbf X^{T}\mathbf X\mathbf {b}) }{\partial \mathbf X }=\mathbf X(\mathbf {a}\otimes\mathbf {b}+\mathbf {b}\otimes\mathbf {a}) \]

\[\frac{\partial[(\mathbf A\mathbf {x}+\mathbf {a})^{T}\mathbf C(\mathbf B\mathbf {x}+\mathbf {b})]}{\partial \mathbf {x}}=\mathbf A^{T}\mathbf C(\mathbf B\mathbf {x}+\mathbf {b})+\mathbf B^{T}\mathbf C(\mathbf A\mathbf {x}+\mathbf {a}) \]

\[\frac{\partial (\mathbf {x}^{T}\mathbf A \mathbf {x})}{\partial \mathbf {x}}=(\mathbf A+\mathbf A^{T})\mathbf {x} \]

\[\frac{\partial[(\mathbf X\mathbf {b}+\mathbf {c})^{T}\mathbf A(\mathbf X\mathbf {b}+\mathbf {c})]}{\partial \mathbf X}=(\mathbf A+\mathbf A^{T})(\mathbf X\mathbf {b}+\mathbf {c})\mathbf {b}^{T} \]

\[\frac{\partial (\mathbf {b}^{T}\mathbf X^{T}\mathbf A \mathbf X\mathbf {c})}{\partial \mathbf X}=\mathbf A^{T}\mathbf X\mathbf {b}\mathbf {c}^{T}+\mathbf A\mathbf X\mathbf {c}\mathbf {b}^{T} \]

对于矩阵的迹,有下列偏导数成立:

\[\frac{\partial [tr(f(\mathbf X))]}{\partial \mathbf X }=(f^{\prime}(\mathbf X))^{T} \]

\[\frac{\partial [tr(\mathbf A\mathbf X\mathbf B)]}{\partial \mathbf X }=\mathbf A^{T}\mathbf B^{T} \]

\[\frac{\partial [tr(\mathbf A\mathbf X^{T}\mathbf B)]}{\partial \mathbf X }=\mathbf B\mathbf A \]

\[\frac{\partial [tr(\mathbf A\otimes\mathbf X )]}{\partial \mathbf X }=tr(\mathbf A)\mathbf I \]

\[\frac{\partial [tr(\mathbf A\mathbf X \mathbf B\mathbf X)]}{\partial \mathbf X }=\mathbf A^{T}\mathbf X^{T}\mathbf B^{T}+\mathbf B^{T}\mathbf X \mathbf A^{T} \]

\[\frac{\partial [tr(\mathbf X^{T} \mathbf B\mathbf X \mathbf C)]}{\partial \mathbf X }=(\mathbf B^{T}+\mathbf B)\mathbf X \mathbf C \mathbf C^{T} \]

\[\frac{\partial [tr(\mathbf C^{T}\mathbf X^{T} \mathbf B\mathbf X \mathbf C)]}{\partial \mathbf X }=\mathbf B\mathbf X \mathbf C +\mathbf B^{T}\mathbf X \mathbf C^{T} \]

\[\frac{\partial [tr(\mathbf A\mathbf X \mathbf B\mathbf X^{T} \mathbf C)]}{\partial \mathbf X }= \mathbf A^{T}\mathbf C^{T}\mathbf X\mathbf B^{T}+\mathbf C \mathbf A \mathbf X \mathbf B \]

\[\frac{\partial [tr((\mathbf A\mathbf X\mathbf B+\mathbf C)(\mathbf A\mathbf X\mathbf B+\mathbf C))]}{\partial \mathbf X }= 2\mathbf A ^{T}(\mathbf A\mathbf X\mathbf B+\mathbf C)\mathbf B^{T} \]

矩阵求导的链式法则[4]#

标量对标量的链式求导#

假设x, y, z都为标量(或者说一维向量),链式关系为x -> y -> z。根据高数中的链式法则

\[\frac{\partial z}{\partial x} = \frac{\partial z}{\partial y} \cdot \frac{\partial y}{\partial x} \]

上面的计算过程很简单,不多解释。

向量对向量链式求导(分子布局)#

假设\(\mathbf x\)\(\mathbf y\)\(\mathbf z\)都为向量,链式关系为\(\mathbf x\) -> \(\mathbf y\) -> \(\mathbf z\)。如果我们要求\(\frac{\partial \mathbf z}{\partial \mathbf x}\),可以直接用链接法则求导

\[\frac{\partial \mathbf z}{\partial \mathbf x} = \frac{\partial \mathbf z}{\partial \mathbf y} \cdot \frac{\partial \mathbf y}{\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\),与左边能对上。
因此有

\[\frac{\partial \mathbf z}{\partial \mathbf x} = \frac{\partial \mathbf y}{\partial \mathbf x} \cdot \frac{\partial \mathbf z}{\partial \mathbf y} \]

扩展到多个向量\(\mathbf y_1\) -> \(\mathbf y_2\) -> \(\mathbf y_3\) -> ...-> \(\mathbf y_n\) -> \(z\)

\[\frac{\partial \mathbf z}{\partial \mathbf y_1} = \frac{\partial \mathbf y_n}{\partial \mathbf y_{n-1}} \cdot \frac{\partial \mathbf y_{n-1}}{\partial \mathbf y_{n-2}} \cdots \frac{\partial \mathbf y_2}{\partial \mathbf y_1} \cdot \frac{\partial \mathbf z}{\partial \mathbf y_n} \]

以常见的最小二乘求导为例:

\[C = (\mathbf X \mathbf \theta - y) ^ T (\mathbf X \mathbf \theta - y) \]

损失函数\(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\),能与左边对上。

其中

\[\frac{\partial (\mathbf X \mathbf \theta - \mathbf y)}{\partial \mathbf \theta} = \mathbf X^T \]

\[\frac{\partial (\mathbf z^T \mathbf z)}{\partial \mathbf z} = 2 \mathbf z \]

所以最小二乘最优解的矩阵表达式为

\[2 \mathbf X^T(\mathbf X \mathbf \theta - \mathbf y) = 0 \]

\[\mathbf \theta = (\mathbf X^T \mathbf X)^{-1} \mathbf X^T \mathbf y \]

标量对多矩阵链式求导(分母布局)#

神经网络中,最常见的计算方式是\(\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\)为矩阵时,按同样的方式进行推导可以得到一样的结论。

参考#

posted @   crazypigf  阅读(3833)  评论(0编辑  收藏  举报
 
点击右上角即可分享
微信分享提示
主题色彩