\section{前言} 在深度学习领域中, 存在很多涉及导数相关的内容, 如: 优化算法, 深层网络更深刻的理论理解等; 由于数据的组织通常是批量形式, 因此针对矩阵进行求导的需求应运而生. 在笔者学习矩阵求导的过程中, 发现知乎的 “矩阵求导术” 讲得清晰易懂, 而且也带有适量的练习题可供学习, 是非常适合入门矩阵求导技术的学习资料. (链接见 Reference)
在这里, 我将学习过程的笔记凝练于此, 既是留给自己的一份 “说明手册”. 若能够帮助各位读者更好地学习矩阵求导, 非常荣幸.
在矩阵求导过程中, 考虑到其计算的复杂性, 我们不妨将视线转移到更 “简单” 的目标——微分上; 之后再利用导数与微分的联系, 完成矩阵求导. 这也是矩阵求导的核心所在! 因此衍生出两个问题:
- 微分应该如何进行计算?
- 导数与微分的关联是什么?
接下来的所有内容均是围绕上述核心与两个问题展开.
\section{前期工作} 这里遵循 “矩阵求导术” 的符号定义, 如下表所示.
Notation
| 定义 | 含义 |
|---|---|
| 小写字母 $ x $ | 标量/scalar |
| 粗体小写字母 $ \boldsymbol{x}\in \mathbb{R}^{n\times 1} $ | 向量/tensor |
| 大写字母 $X\in \mathbb{R}^{m\times n}$ | 矩阵/matrix |
目录
针对问题 $1$: 微分应该如何进行计算? \begin{itemize} \item 微分运算法则 \item 迹技巧 \item 矩阵向量化的运算法则 \item Kronecker 积和交换矩阵相关的恒等式 \end{itemize}
针对问题 $2$: 导数与微分的关联是什么? 考虑到标量/向量/矩阵的不同, 分为以下 $4$ 类: \begin{itemize} \item 标量 $ f $ 对向量 $\boldsymbol{x}$ 的导数 (Eq. (\ref{eq:scaler_to_tensor})) \item 标量 $f$ 对矩阵 $X$ 的导数 (Eq. (\ref{eq:scaler_to_matrix})) \item 向量 $\boldsymbol{f}$ 对向量 $\boldsymbol{x}$ 的导数 (Eq. (\ref{eq:tensor_to_tensor})) \item 矩阵 $F$ 对矩阵 $X$ 的导数 (Eq. (\ref{eq:matrix_to_matrix})) \end{itemize}
由易到难的理解路径
考虑到已有知识 (假设掌握高等数学, 线性代数等基础知识), 我们对标量对标量的导数计算方法已经掌握. 因此在学习矩阵求导的过程中, 从熟练的标量入手, 是一个不错的过渡方式. 之后我们逐步过渡到向量以及矩阵的求导计算.
标量 $ f $ 对向量 $\boldsymbol{x}$ 的导数
\[\begin{align} \label{eq:scaler_to_tensor} df=\sum_{i=1}^{n} \frac{\partial f}{\partial x_i}dx_i = {\frac{\partial f}{\partial \boldsymbol{x}}}^{\top} d\boldsymbol{x}=<\nabla f, d\boldsymbol{x}>. \end{align}\]其中, 第一个等号是全微分公式, 第二个等号体现了梯度与微分的联系.
\[\begin{proof} 1. 第一个等号 当 $z=f(x_1, x_2)$ 的时候, 有: $dz = \frac{\partial f}{\partial x_1}dx_1+\frac{\partial f}{\partial x_2}dx_2$ 成立. 因此不妨令 $\boldsymbol{x}=(x_1, x_2, ..., x_n)\in \mathbb{R}^{n\times 1}$, 所以当 $z=f(\boldsymbol{x})$, 有 $df=\sum_{i=1}^{n} \frac{\partial f}{\partial x_i}dx_i$ 成立. 2. 第二个等号 \begin{align} \label{def:relationship_between_gradient_and_differential} \frac{\partial f}{\partial \boldsymbol{x}} = \left[\begin{array}{c} \frac{\partial f}{\partial x_1}\\ \frac{\partial f}{\partial x_2}\\ ...\\ \frac{\partial f}{\partial x_n} \end{array}\right], d\boldsymbol{x} = \left[\begin{array}{c} dx_1\\ dx_2\\ ...\\ dx_n \end{array}\right]. \end{align} 由 Eq. (\ref{def:relationship_between_gradient_and_differential}) 的定义可得, 向量化表述吻合 $df$. \begin{align} \frac{\partial f}{\partial \boldsymbol{x}}^{\top} d\boldsymbol{x}= \frac{\partial f}{\partial x_1} dx_1 + \frac{\partial f}{\partial x_2} dx_2 + ... + \frac{\partial f}{\partial x_n} dx_n. \end{align} \end{proof}\]核心思想: 全微分就是所有自变量 $x_i$ 微小变化所引起函数值变化的线性叠加. 这里的 “线性” 很重要, 它意味着我们忽略了高阶无穷小量 (比如你走路时的拐弯效应), 只考虑各个方向变化的直接相加.
标量 $f$ 对矩阵 $X$ 的导数
定义为: $f$ 对 $X$ 逐元素求导, 之后排成与 $X\in \mathbb{R}^{m\times n}$ 尺寸相同的矩阵. \(\begin{align} \label{eq:scaler_to_matrix} \frac{\partial f}{\partial X}=[\frac{\partial f}{\partial X_{ij}}]. \end{align}\)
用矩阵运算更整洁. 所以在求导时不宜拆开矩阵, 而是要找一个从整体出发的算法.
接下来同样为导数与微分建立联系: \(\begin{align} df=\sum_{i=1}^{m} \sum_{j=1}^{n} \frac{\partial f}{\partial X_{ij}}dX_{ij}=\operatorname{tr} \left( {\frac{\partial f}{\partial X_{ij}}}^{\top} dX\right)=<\nabla_X f, d\boldsymbol{x}>_{F}. \end{align}\)
几何本质没变: $df$ 是梯度矩阵和微分矩阵的”内积” (仅多了个 $\operatorname{tr}$) , 衡量两者在”矩阵空间”中的”对齐程度”.
\[\begin{proof} 我们有下述定义: \begin{itemize} \item \begin{align} \frac{\partial f}{\partial X} = \left[\begin{array}{ccc} \frac{\partial f}{\partial X_{11}}& \ldots& \frac{\partial f}{\partial X_{1n}}\\ \vdots& \ddots& \vdots \\ \frac{\partial f}{\partial X_{m1}}& \ldots& \frac{\partial f}{\partial X_{mn}} \end{array}\right], dX = \left[\begin{array}{ccc} dX_{11}& \ldots& dX_{1n}\\ \vdots& \ddots& \vdots \\ dX_{m1}& \ldots& dX_{mn} \end{array}\right]. \end{align} \item 矩阵的迹 $\operatorname{tr}(A)=\sum_k A_{kk}$ 是矩阵对角线元素之和 \end{itemize} 考虑到弗罗贝尼乌斯内积性质 (Eq. (\ref{eq:frobenius_inner_product})), 有: \begin{align} \operatorname{tr}\left(\left(\frac{\partial f}{\partial\boldsymbol{X}}\right)^\top d\boldsymbol{X}\right)=\sum_{i=1}^m\sum_{j=1}^n\left(\frac{\partial f}{\partial\boldsymbol{X}}\right)_{ij}\cdot(d\boldsymbol{X})_{ij}=\sum_{i=1}^m\sum_{j=1}^n\frac{\partial f}{\partial X_{ij}}dX_{ij} \end{align} \end{proof}\]弗罗贝尼乌斯内积性质
两个矩阵乘积的迹, 等于弗罗贝尼乌斯内积 (即: 所有对应位置的元素乘积的和), 形式化为:
\[\begin{align} \label{eq:frobenius_inner_product} \operatorname{tr}(\boldsymbol{A}^\top\boldsymbol{B}) = \sum_{i}\sum_{j} A_{ij}B_{ij}. \end{align}\] \[\begin{proof} \begin{align} \operatorname{tr}(\boldsymbol{A}^\top\boldsymbol{B}) =&\sum_k(\boldsymbol{A}^\top\boldsymbol{B})_{kk}\\ =&\sum_k\sum_j (A^{\top})_{kj}B_{jk}\\ =&\sum_k\sum_j A_{jk}B_{jk}\\ =&\sum_{i}\sum_{j} A_{ij}B_{ij}. \end{align} 其中: \begin{itemize} \item 第一个等号是矩阵的迹的定义;第二个等号是矩阵乘法运算的定义; \item 第三个等号是矩阵转置的定义;第四个等号是交换上述第三个等式的求和顺序之后, 重命名所得 \end{itemize} \end{proof}\]综上, 为避免读者被绕晕, 先对上述两类的相似之处进行总结, 即, 标量求导数方法论如下: 首先求出微分 $df$;然后利用导数与微分的联系得到导数
- 若求导目标为向量, 则对照 Eq. (\ref{eq:scaler_to_tensor}): $df = {\frac{\partial f}{\partial \boldsymbol{x}}}^{\top} d\boldsymbol{x}$.
- 若求导目标为矩阵, 则对照 Eq. (\ref{eq:scaler_to_matrix}): $df = \operatorname{tr}\left( \frac{\partial f}{\partial X}^{T} \, dX \right)$.
举个例子: $f=\boldsymbol{a}\boldsymbol{x}$ 为标量函数;$\boldsymbol{a}, \boldsymbol{x}$ 均为列向量, 求 $\frac{\partial f}{\partial \boldsymbol{x}}$.
$f=\boldsymbol{a}^{\top}\boldsymbol{x}\Rightarrow df=d(\boldsymbol{a}^{\top}\boldsymbol{x}) \Rightarrow df=d\boldsymbol{a}^{\top}\cdot \boldsymbol{x}+\boldsymbol{a}^{\top}d\boldsymbol{x}\Rightarrow df=\boldsymbol{a}^{\top}d\boldsymbol{x}$.
对照 Eq. (\ref{eq:scaler_to_tensor}): $df = {\frac{\partial f}{\partial \boldsymbol{x}}}^{\top} d\boldsymbol{x}$ 不难得出: $\frac{\partial f}{\partial \boldsymbol{x}} = \boldsymbol{a}$.
上述解决了问题 $2$, 接下来聚焦于如何解决问题 $1$, 即微分的运算规则, 如下所示:
\subsubsection{微分运算法则}
-
$d(X\pm Y)=dX \pm dY; d(XY)=(dX)Y+XdY \Rightarrow d(XYZ)=(dX)YZ+XdYZ+XYdZ$.
-
$d(X^{\top})=(dX)^{\top}; dX^{-1}=-X^{-1}dXX^{-1}; d\operatorname{tr}(X)=\operatorname{tr}(dX)$
-
$d\lvert X \rvert=\operatorname{tr}(\operatorname{adj}(X)\,dX)$. 此处的 $\operatorname{adj}(X)$ 为 $X$ 的伴随矩阵;在 $X$ 可逆的时候, 有 $d\lvert X \rvert=\lvert X \rvert\,\operatorname{tr}(X^{-1} dX)$ (可由 Laplace 展开得到) .
-
$d(X \odot Y) = dX \odot Y + X \odot dY$; 此处的 $\odot$ 算子表示尺寸相同的矩阵逐元素相乘
-
$d\sigma(X)=\sigma’(X) \odot dX$; 此处的 $\sigma(X)=[\sigma(X_{ij})]$ 表示逐元素标量函数运算; $\sigma’(X)[\sigma’(X_{ij})]$ 表示逐元素求导数
迹技巧
- 标量套上迹: $a = \operatorname{tr}(a)$
- 转置: $\operatorname{tr}(A^{\top}) = \operatorname{tr}(A)$
- 线性: $\operatorname{tr}(A\pm B) = \operatorname{tr}(A) \pm \operatorname{tr}(B)$
- 矩阵乘法交换: $\operatorname{tr}(AB) = \operatorname{tr}(BA)$
- 矩阵乘法/逐元素乘法交换: $\operatorname{tr}(A^{\top}(B\odot C)) = \operatorname{tr}((A\odot B)^{\top}C)$ 两侧都等于 $\sum_{i.j} A_{ij}B_{ij}C_{ij}$
复合

Tips
- $\log(\boldsymbol{u}/c)=\log(\boldsymbol{u})-\boldsymbol{1}\log(c)$
- $1^{\top}(\boldsymbol{u\odot \boldsymbol{v}})=\boldsymbol{u^{\top}\cdot \boldsymbol{v}}$
向量 $\boldsymbol{f}$ 对向量 $\boldsymbol{x}$ 的导数
定义向量 $\boldsymbol{f}\in \mathbb{R}^{p\times 1}$ 对向量 $\boldsymbol{x}\in \mathbb{R}^{m\times 1}$ 的导数 (此处采用的是分母布局) \(\frac{\partial\boldsymbol{f}}{\partial \boldsymbol{x}} = \begin{bmatrix} \frac{\partial f_1}{\partial x_1} & \frac{\partial f_2}{\partial x_1} & \cdots & \frac{\partial f_p}{\partial x_1} \\ \frac{\partial f_1}{\partial x_2} & \frac{\partial f_2}{\partial x_2} & \cdots & \frac{\partial f_p}{\partial x_2} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial f_1}{\partial x_m} & \frac{\partial f_2}{\partial x_m} & \cdots & \frac{\partial f_p}{\partial x_m} \end{bmatrix} \in \mathbb{R}^{m\times p}.\)
因此, 有下式成立 \(\begin{align} \label{eq:tensor_to_tensor} d\boldsymbol{f} = \frac{\partial \boldsymbol{f}}{\partial \boldsymbol{x}}^{\top} d\boldsymbol{x} \end{align}\)
矩阵 $F$ 对矩阵 $X$ 的导数
定义
定义矩阵向量化算子 $\operatorname{vec}(X)=[X_{11},\dots,X_{m1},X_{12},\dots,X_{m2},\dots,X_{1n}\dots,X_{mn}]^{\top}\in \mathbb{R}^{mn\times 1}$
此处为 “按列优先”, 即: 列元素优先排
定义矩阵 $F\in \mathbb{R}^{p\times q}$ 对矩阵 $X$ 的导数 $\frac{\partial F}{\partial X}=\frac{\partial \operatorname{vec}(F)}{\partial \operatorname{vec}(X)}\in \mathbb{R}^{mn\times pq}$
-
有下式成立
- \[\begin{align} \label{eq:matrix_to_matrix} \operatorname{vec}(dF) = \frac{\partial F}{\partial X}^{\top} \operatorname{vec}(dX) \end{align}\]
\subsubsection{矩阵向量化的运算法则}
-
线性: $\text{vec}(A + B) = \text{vec}(A) + \text{vec}(B)$
-
矩阵乘法: $\text{vec}(AXB) = (B^T \otimes A) \text{vec}(X)$
-
$\otimes$ 表示 Kronecker 积
-
设 $A = \begin{bmatrix} a_{11} & a_{12}
a_{21} & a_{22} \end{bmatrix}, \quad B = \begin{bmatrix} b_{11} & b_{12}
b_{21} & b_{22} \end{bmatrix}$, 则有: - \[A \otimes B = \begin{bmatrix} a_{11}B & a_{12}B \\ a_{21}B & a_{22}B \end{bmatrix} = \begin{bmatrix} a_{11}b_{11} & a_{11}b_{12} & a_{12}b_{11} & a_{12}b_{12} \\ a_{11}b_{21} & a_{11}b_{22} & a_{12}b_{21} & a_{12}b_{22} \\ a_{21}b_{11} & a_{21}b_{12} & a_{22}b_{11} & a_{22}b_{12} \\ a_{21}b_{21} & a_{21}b_{22} & a_{22}b_{21} & a_{22}b_{22} \end{bmatrix}\]
-
-
-
转置: $\text{vec}(A^T) = K_{mn} \text{vec}(A)$
-
$K_{mn}$ 表示交换矩阵 (commutation matrix), 将按列优先的向量化变为按行优先的向量化.
- \[K_{22} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}, \quad \text{vec}(A^T) = \begin{bmatrix} A_{11} \\ A_{12} \\ A_{21} \\ A_{22} \end{bmatrix}, \quad \text{vec}(A) = \begin{bmatrix} A_{11} \\ A_{21} \\ A_{12} \\ A_{22} \end{bmatrix}.\]
-
-
逐元素乘法: $\text{vec}(A \odot X) = \text{diag}(A) \text{vec}(X)$
- $\operatorname{diag}(A)$ 表示用 A 的所有元素 (按列优先) 排成的对角阵
- $\operatorname{diag}(A)^{\top} = \operatorname{diag}(A)$
- **Tips: 对于任意向量有: ** $\boldsymbol{a} \odot \boldsymbol{b} = \operatorname{diag}(\boldsymbol{a})\boldsymbol{b}$
- 设 $\mathbf a = \begin{bmatrix} a_1 \ a_2 \ a_3 \end{bmatrix}, \quad \mathbf b = \begin{bmatrix} b_1 \ b_2 \ b_3 \end{bmatrix} 那么 $$\mathbf a \odot \mathbf b = \begin{bmatrix} a_1 b_1 \ a_2 b_2 \ a_3 b_3 \end{bmatrix}$ 把 $\mathbf a$ 放到对角线上, 得到 $\mathrm{diag}(\mathbf a) = \begin{bmatrix} a_1 & 0 & 0 \ 0 & a_2 & 0 \ 0 & 0 & a_3 \end{bmatrix} $ 用它去乘 $\mathbf b$: $\mathrm{diag}(\mathbf a)\,\mathbf b = \begin{bmatrix} a_1 & 0 & 0 \ 0 & a_2 & 0 \ 0 & 0 & a_3 \end{bmatrix} \begin{bmatrix} b_1 \ b_2 \ b_3 \end{bmatrix} = \begin{bmatrix} a_1 b_1 \ a_2 b_2 \ a_3 b_3 \end{bmatrix} $
\subsubsection{Kronecker 积和交换矩阵相关的恒等式}
- $(A \otimes B)^T = A^T \otimes B^T$
- $\text{vec}(ab^T) = b \otimes a$
- $(A \otimes B)(C \otimes D) = (AC) \otimes (BD)$
- $K_{mn} = K_{nm}^T, \quad K_{mn} K_{nm} = I$
- $K_{pm} (A \otimes B) K_{nq} = B \otimes A$
Reference
