本文推导一下矩阵函数如何求导。
标量函数求导
对于标量函数\(f(x) = \frac{1}{2} x^2 – 4x + 10\),其导数为\(f'(x) = \frac{∂}{∂ x} = x – 4\),亦即求得x在取值不同的时候其(x, y)坐标对应原函数曲线的切线的斜率。导数的本质就是斜率。
向量函数求导
将函数的参数推广为向量。
设\(\vec{a} = \begin{bmatrix} 2 && 3 \end{bmatrix}, \vec{x} = \begin{bmatrix} x_1 \\ x_2 \end{bmatrix}\)、函数\(f(\vec{x}) = f(x_1, x_2) = 2 x_1 + 3 x_2 = \begin{bmatrix} 2 && 3 \end{bmatrix} \cdot \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} = \vec{a} \cdot \vec{x}\),如果我们对\(x_1\)、\(x_2\)逐个求其偏导数,便会有:\(
\begin{equation}
\left\{
\begin{aligned}
\frac{∂}{∂ x_1} = 2 \\
\frac{∂}{∂ x_2} = 3 \\
\end{aligned}
\right.
\end{equation}
\)。
亦即求与曲面相切平面的\(x_1\)、\(x_2\)两个方向的斜率。
然后我们将这组等式向量化,求导便有:\(f'(\vec{x}) = \triangledown_\vec{x} \vec{a} \cdot \vec{x} = \begin{bmatrix} 2 \\ 3 \end{bmatrix} = \vec{a}^T\)。由于求导是按向量x的位置逐个求导,所以求导后的结果应该维持向量x在函数内的布局(layout)。基于转置的规则,如果设行向量\(\vec{b} = \vec{a}^T\),那么便有\(\triangledown_\vec{x} \vec{b}^T \cdot \vec{x} = \vec{b}\)。
设\(\vec{a} = \begin{bmatrix} 2 && 3 \end{bmatrix}, \vec{x} = \begin{bmatrix} x_1 && x_2 \end{bmatrix}\)、函数\(f(\vec{x}) = 2 x_1 + 3 x_2 = \begin{bmatrix} 2 && 3 \end{bmatrix} \cdot \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} = \vec{a} \cdot \vec{x}^T\),求导便有\(\triangledown_\vec{x} \vec{a} \cdot \vec{x}^T = \vec{a}\)。
设\(\vec{a} = \begin{bmatrix} 2 \\ 3 \end{bmatrix}, \vec{x} = \begin{bmatrix} x_1 && x_2 \end{bmatrix}\)、函数\(f(\vec{x}) = x_1 2 + x_2 3 = \begin{bmatrix} x_1 && x_2 \end{bmatrix} \cdot \begin{bmatrix} 2 \\ 3 \end{bmatrix} = \vec{x} \cdot \vec{a}\),求导便有\(\triangledown_\vec{x} \vec{x} \cdot \vec{a} = \vec{a}^T\)。
设\(\vec{a} = \begin{bmatrix} 2 \\ 3 \end{bmatrix}, \vec{x} = \begin{bmatrix} x_1 \\ x_2 \end{bmatrix}\)、函数\(f(\vec{x}) = x_1 2 + x_2 3 = \begin{bmatrix} x_1 && x_2 \end{bmatrix} \cdot \begin{bmatrix} 2 \\ 3 \end{bmatrix} = \vec{x}^T \cdot \vec{a}\),求导便有\(\triangledown_\vec{x} \vec{x}^T \cdot \vec{a} = \vec{a}\)。
所以总结起来,向量函数求导的最基本规则为:
- \(\triangledown_\vec{x} \vec{a} \cdot \vec{x} = \vec{a}^T \Leftrightarrow \triangledown_\vec{x} \vec{a}^T \cdot \vec{x} = \vec{a}\);
- \(\triangledown_\vec{x} \vec{a} \cdot \vec{x}^T = \vec{a} \Leftrightarrow \triangledown_\vec{x} \vec{a}^T \cdot \vec{x}^T = \vec{a}^T\);
- \(\triangledown_\vec{x} \vec{x} \cdot \vec{a} = \vec{a}^T \Leftrightarrow \triangledown_\vec{x} \vec{x} \cdot \vec{a}^T = \vec{a}\);
- \(\triangledown_\vec{x} \vec{x}^T \cdot \vec{a} = \vec{a} \Leftrightarrow \triangledown_\vec{x} \vec{x}^T \cdot \vec{a}^T = \vec{a}^T\)。
而且向量函数求导明显符合分配律:
- \(\vec{b} = k \vec{a}, \triangledown_\vec{x} \vec{b} \cdot \vec{x} = \vec{b}^T = k \vec{a}^T = \triangledown_\vec{x} k \vec{a} \cdot \vec{x} = k \triangledown_\vec{x} \vec{a} \cdot \vec{x}\);
- \(\vec{c} = \vec{a} \pm \vec{b}, \triangledown_\vec{x} \vec{c} \cdot \vec{x} = \vec{c}^T = \vec{a}^T \pm \vec{b}^T = \triangledown_\vec{x} (\vec{a} \pm \vec{b}) \cdot \vec{x} = \triangledown_\vec{x} \vec{a} \cdot \vec{x} \pm \triangledown_\vec{x} \vec{b} \cdot \vec{x}\)。
由于所有线性函数都可以抽象为参数向量与系数向量求内积相乘,这四个规则明显其实就是按自身的需要选取两个向量的布局而得出来的。
矩阵函数求导
矩阵函数又有不同。可以将矩阵函数比喻为将向量函数的相加过程分段折叠成矩阵的形式。
先介绍一种关于m阶方阵X的运算:迹(trace),\(tr(X) = \sum\limits_{i=1}^m x_{ii}\),即将方阵对角线的所有元素相加的和。如果一个函数的参数是一个n*m矩阵X,这个矩阵的元素\(x_{nm}\)的系数\(a_{mn}\)可以写成一个m*n系数矩阵A,即\(f(X) = \sum\limits_{i=1}^m \sum\limits_{j=1}^n a_{ji} x_{ij}\),那么这个矩阵函数可以改写为\(f(X) = tr(AX)\)。十分显然直观的、矩阵的迹满足分配律和交换律:
- \(tr(A \pm X) = tr(A) \pm tr(X)\),其中\(A, X \in \mathbb{R}^{m*m}\);
- \(tr(kX) = k \cdot tr(X)\),其中\(X \in \mathbb{R}^{m*m}, k \in \mathbb{R}\);
- \(tr(AX) = tr(XA)\),其中\(A \in \mathbb{R}^{m*n}, X \in \mathbb{R}^{n*m}\)。
设\(A \in \mathbb{R}^{m*n}, X \in \mathbb{R}^{n*m}\),矩阵函数为\(f(X) = tr(AX) \in \mathbb{R}\),展开便有\(f(X) = \sum\limits_{i=1}^{m} \vec{a_i} \cdot \vec{x_i} (\vec{a_i} \in \mathbb{R}^{1*n}, \vec{x_i} \in \mathbb{R}^{n*1})\)。由于\(\vec{a_i}\)是行向量,\(\vec{x_i}\)是列向量,对累加求和每项做向量函数求导,便会得到一个n维列向量\(\vec{a_i}^T\),重复m次求导后,便会得到一个矩阵\(\begin{bmatrix} \vec{a_1}^T && \vec{a_2}^T && \dots && \vec{a_m}^T \end{bmatrix} = A^T\),即\(f'(X) = \triangledown_X tr(AX) = A^T\)。
由于矩阵函数实际上就是向量函数的推广,其求导的形式、方向与向量求导的规则一致,所以便可以方便地得到如下基本规则:
- \(\triangledown_X tr(AX) = A^T \Leftrightarrow \triangledown_X tr(A^T X) = A\);
- \(\triangledown_X tr(AX^T) = A \Leftrightarrow \triangledown_X tr(A^T X^T) = A^T\);
- \(\triangledown_X tr(XA) = A^T \Leftrightarrow \triangledown_X tr(XA^T) = A\);
- \(\triangledown_X tr(X^T A) = A \Leftrightarrow \triangledown_X tr(X^T A^T) = A^T\)。
而且矩阵函数求导同样符合分配律:
- \(B = k A, \triangledown_X tr(BX) = B^T = k A^T = \triangledown_X tr(kAX) = k \triangledown_X tr(AX)\);
- \(C = A \pm B, \triangledown_X tr(CX) = C^T = A^T \pm B^T = \triangledown_X tr[(A \pm B)X] = \triangledown_X tr(AX) \pm \triangledown_X tr(BX)\)。
最后,由于矩阵A尺寸为m*n、X尺寸为n*m,虽然\(AX \ne XA\),但是它们对应的矩阵函数求导满足交换律:
- \(\triangledown_X tr(AX) = A^T = \triangledown_X tr(XA)\);
- \(\triangledown_X tr(AX^T) = A = \triangledown_X tr(X^T A)\)。
其实不难看出,若\(f'(X) = B, f(X) \in \mathbb{R}\),那么矩阵B的尺寸必定与矩阵X相同,因为B的每项就是矩阵X的元素\(x_{ij}\)对应的导数;如果矩阵函数f是关于矩阵X的线性函数,那么对应矩阵X的元素\(x_{ij}\)对应的导数就是\(x_{ij}\)的系数。
接下来推导形式如\(f(X) = tr(AXB) \in \mathbb{R}, A \in \mathbb{R}^{m*k}, X \in \mathbb{R}^{k*n}, B \in \mathbb{R}^{n*m}\)的矩阵函数求导。
根据前面的结论,设\(\triangledown_X tr(AXB) = C\),那么C的尺寸肯定是k*n。设\(1 ⩽ i ⩽ k, 1 ⩽ j ⩽ n\)、\(c_{ij}\)是矩阵C的元素、\(x_{ij}\)是矩阵X的元素,\(c_{ij}\)是\(x_{ij}\)对应的系数。设\(\vec{a}_{i}\)是矩阵A的列向量、\(\vec{b}_{j}\)是矩阵B的行向量。根据矩阵乘法,很容易便会得到\(c_{ij} = \vec{a_i}^T \cdot \vec{b_j}^T\)。所以推广至整个矩阵C,便有\(C = A^T B^T\)。继续推广,便有:
- \(\triangledown_X tr(AXB) = A^T B^T \Leftrightarrow \triangledown_X tr(A^T XB) = A B^T \Leftrightarrow \triangledown_X tr(AXB^T) = A^T B \Leftrightarrow \triangledown_X tr(A^T XB^T) = A B\);
- \(\triangledown_X tr(AX^T B) = BA \Leftrightarrow \triangledown_X tr(A^T X^T B) = BA^T \Leftrightarrow \triangledown_X tr(A X^T B^T) = B^T A \Leftrightarrow \triangledown_X tr(A^T X^T B^T) = B^T A^T\)。
接下来推导形式如\(f(X) = tr(X^T X) \in \mathbb{R}, X \in \mathbb{R}^{n*m}\)的矩阵函数求导。观察一下便会得知,\(f(X) = tr(X^T X) = \sum\limits_{i=1}^n \sum\limits_{j=1}^m x_{ij}^2\),如果对该函数按矩阵X逐个元素求导,便会得到\(\triangledown_X tr(X^T X) = \begin{bmatrix} 2 x_{11} && 2 x_{12} && \dots && 2 x_{1m} \\ \vdots && \vdots && \vdots && \vdots \\ 2 x_{n1} && 2 x_{n2} && \dots && 2 x_{nm} \end{bmatrix} = 2 X\)。
稍微更改一下上面的矩阵函数形式,添加系数矩阵A,即\(f(X) = tr(X^T AX) \in \mathbb{R}, X \in \mathbb{R}^{n*m}, A \in \mathbb{R}^{n*n}\)。
- \(X^T A = \begin{bmatrix}
\sum\limits_{i=1}^n x_{i1} a_{i1} && \sum\limits_{i=1}^n x_{i1} a_{i2} && \dots && \sum\limits_{i=1}^n x_{i1} a_{in} \\
\sum\limits_{i=1}^n x_{i2} a_{i1} && \sum\limits_{i=1}^n x_{i2} a_{i2} && \dots && \sum\limits_{i=1}^n x_{i2} a_{in} \\
\vdots && \vdots && \vdots && \vdots \\
\sum\limits_{i=1}^n x_{im} a_{i1} && \sum\limits_{i=1}^n x_{im} a_{i2} && \dots && \sum\limits_{i=1}^n x_{im} a_{in}
\end{bmatrix}\); - 由于求导只需要关心方阵的对角线,所以只列出对角线的规则:
- \((X^T A) X = \begin{bmatrix}
\sum\limits_{j=1}^n \sum\limits_{i=1}^n x_{i1} a_{ij} x_{j1} && \dots && \dots && \dots \\
\dots && \sum\limits_{j=1}^n \sum\limits_{i=1}^n x_{i2} a_{ij} x_{j2} && \dots && \dots \\
\dots && \dots && \ddots && \dots \\
\dots && \dots && \dots && \sum\limits_{j=1}^n \sum\limits_{i=1}^n x_{im} a_{ij} x_{jm}
\end{bmatrix}\); - 实际上,\(f(X) = tr(X^T AX) = \sum\limits_{k=1}^m \sum\limits_{j=1}^n \sum\limits_{i=1}^n x_{ik} a_{ij} x_{jk}\);
- 遍历x的下标各项求导:
- \(\triangledown_X tr(X^T AX) = \begin{bmatrix}
\sum\limits_{i=1}^n x_{i1} a_{i1} + \sum\limits_{j=1}^n a_{1j} x_{j1} && \sum\limits_{i=1}^n x_{i2} a_{i1} + \sum\limits_{j=1}^n a_{1j} x_{j2} && \dots && \sum\limits_{i=1}^n x_{im} a_{i1} + \sum\limits_{j=1}^n a_{1j} x_{jm} \\
\sum\limits_{i=1}^n x_{i1} a_{i2} + \sum\limits_{j=1}^n a_{2j} x_{j1} && \sum\limits_{i=1}^n x_{i2} a_{i2} + \sum\limits_{j=1}^n a_{2j} x_{j2} && \dots && \sum\limits_{i=1}^n x_{im} a_{i2} + \sum\limits_{j=1}^n a_{2j} x_{jm} \\
\vdots && \vdots && \vdots && \vdots \\
\sum\limits_{i=1}^n x_{i1} a_{in} + \sum\limits_{j=1}^n a_{nj} x_{j1} && \sum\limits_{i=1}^n x_{i2} a_{in} + \sum\limits_{j=1}^n a_{nj} x_{j2} && \dots && \sum\limits_{i=1}^n x_{im} a_{in} + \sum\limits_{j=1}^n a_{nj} x_{jm}
\end{bmatrix}\); - 又因为:
- \(A^T X = (X^T A)^T = \begin{bmatrix}
\sum\limits_{i=1}^n a_{i1} x_{i1} && \sum\limits_{i=1}^n a_{i1} x_{i2} && \dots && \sum\limits_{i=1}^n a_{i1} x_{im} \\
\sum\limits_{i=1}^n a_{i2} x_{i1} && \sum\limits_{i=1}^n a_{i2} x_{i2} && \dots && \sum\limits_{i=1}^n a_{i2} x_{im} \\
\vdots && \vdots && \vdots && \vdots \\
\sum\limits_{i=1}^n a_{in} x_{i1} && \sum\limits_{i=1}^n a_{in} x_{i2} && \dots && \sum\limits_{i=1}^n a_{in} x_{im}
\end{bmatrix}\); - \(AX = \begin{bmatrix}
\sum\limits_{i=1}^n a_{1i} x_{i1} && \sum\limits_{i=1}^n a_{1i} x_{i2} && \dots && \sum\limits_{i=1}^n a_{1i} x_{im} \\
\sum\limits_{i=1}^n a_{2i} x_{i1} && \sum\limits_{i=1}^n a_{2i} x_{i2} && \dots && \sum\limits_{i=1}^n a_{2i} x_{im} \\
\vdots && \vdots && \vdots && \vdots \\
\sum\limits_{i=1}^n a_{ni} x_{i1} && \sum\limits_{i=1}^n a_{ni} x_{i2} && \dots && \sum\limits_{i=1}^n a_{ni} x_{im}
\end{bmatrix}\); - 所以最后便会得到:\(\triangledown_X tr(X^T AX) = A^T X + AX\)。
如果将矩阵A是一个对称方阵,即\(A^T = A\)的话,那么\(\triangledown_X tr(X^T AX) = 2AX\)。设任意矩阵B,使得\(B^T B\)可以和矩阵X相乘,由于\((B^T B)^T = B^T B\),即对称,所以便有\(\triangledown_X tr(X^T B^T BX) = 2B^T BX\)。
如果将\(tr(X^T X)\)比喻为矩阵的数量化的平方函数,那么\(\triangledown_X tr(X^T X) = 2X、\triangledown_X tr(X^T AX) = 2AX\)其实是和标量函数的求导\(\triangledown_x x^2 = 2x、\triangledown_x ax^2 = 2ax\)形式一致的。
再添加一个系数矩阵B,求\(\triangledown_X tr(X^T AXB), X \in \mathbb{R}^{n*m}, A \in \mathbb{R}^{n*n}, B \in \mathbb{R}^{m*m}\)。
过程和上面大同小异,只要一步步跟着做(实在太繁琐了),就可以推导得到:\(\triangledown_X tr(X^T AXB) = A^T X B^T + A X B\)。
同理还有:
- \(\triangledown_X tr(XX^T) = 2 X^T\);
- \(\triangledown_X tr(XAX^T) = A^T X^T + AX^T\);
- \(\triangledown_X tr(XAX^T B) = A^T X^T B^T + A X^T B\)。