一、为什么需要矩阵求导
- 参数的向量化:
向量化会使代码、式子更加简洁;
使用向量化代替for循环,向量化能够加速你的代码; - 求导在优化算法中的广泛应用:
优化算法需要反向传播,需要对参数矩阵进行求导
二、向量函数与矩阵求导初印象
- 标量函数:输出为标量的函数
f ( x ) = x 2 , R → R f(x)=x^2,R \rightarrow R f(x)=x2,R→R
.
f ( x ) = x 1 2 + x 2 2 , R 2 → R f(x)=x_1^2+x_2^2,R^2 \rightarrow R f(x)=x12+x22,R2→R - 向量函数:输出为向量(矩阵)
f ( x ) = [ f 1 ( x ) = x f 2 ( x ) = x 2 ] , R → R 2 f(x)= \begin{bmatrix} f_1(x)=x \\ f_2(x)=x^2 \\ \end{bmatrix},R \rightarrow R^2 f(x)=[f1(x)=xf2(x)=x2],R→R2
.
f ( x ) = [ f 11 ( x ) = x f 12 ( x ) = x 2 f 21 ( x ) = x 3 f 22 ( x ) = x 4 ] , R → R 2 × 2 f(x)= \begin{bmatrix} f_{11}(x)=x&&f_{12}(x)=x^2 \\f_{21}(x)=x^3&&f_{22}(x)=x^4 \\ \end{bmatrix},R \rightarrow R^{2 \times 2} f(x)=[f11(x)=xf21(x)=x3f12(x)=x2f22(x)=x4],R→R2×2
输入 x x x可以是标量、向量、矩阵,输出 f ( x ) f(x) f(x)也可以是标量、向量、矩阵。讨论的问题是 d f ( x ) d x = ? \frac{df(x)}{dx}=? dxdf(x)=?
矩阵求导主要讨论的是【输入 x x x是标量、向量】和【输出 f ( x ) f(x) f(x)是标量、向量】组合在一起的 4 4 4种情况。
矩阵求导的本质:
d A d B \frac{dA}{dB} dBdA:矩阵 A A A中每个元素对矩阵 B B B中的每个元素求导。
从求导后的个数看矩阵求导本质:
-
A : 1 × 1 、 B : 1 × 1 A:1 \times1、B:1 \times1 A:1×1、B:1×1
d A d B : 1 × 1 \frac{dA}{dB}:1 \times1 dBdA:1×1 -
A : 1 × p 、 B : 1 × n A:1 \times p、B:1 \times n A:1×p、B:1×n
d A d B : p × n \frac{dA}{dB}:p \times n dBdA:p×n(排列组合一下) -
A : q × p 、 B : m × n A:q \times p、B:m \times n A:q×p、B:m×n
d A d B : p × q × m × n \frac{dA}{dB}:p \times q\times m \times n dBdA:p×q×m×n
三、求导秘术:YX拉伸
秘术口诀 { 1 、标量不变、向量拉伸 2 、前面 ( Y ) 横向拉,后面 ( X ) 纵向拉 秘术口诀\begin{cases}\color{RED}{1、标量不变、向量拉伸} \\\color{RED}{2、前面(Y)横向拉,后面(X)纵向拉} \\ \end{cases} 秘术口诀{1、标量不变、向量拉伸2、前面(Y)横向拉,后面(X)纵向拉
例1:求 f ( x ) d x \frac{f(x)}{dx} dxf(x)
- f ( x ) f(x) f(x)是标量函数, f ( x ) = f ( x 1 , x 2 , … … , x n ) f(x)=f(x_1,x_2,……,x_n) f(x)=f(x1,x2,……,xn)
- x x x是列向量
这里的 f ( x ) f(x) f(x)就是口诀里的Y,它是标量不变且不用拉伸; x x x是向量,需要拉伸,根据第二条口诀要纵向拉伸。
所以 f ( x ) d x = [ ∂ f ( x ) ∂ x 1 ∂ f ( x ) ∂ x 2 … … ∂ f ( x ) ∂ x n ] \frac{f(x)}{dx}=\begin{bmatrix} \frac{\partial f(x)}{\partial x_1} \\\\ \frac{\partial f(x)}{\partial x_2} \\ …… \\ \\ \frac{\partial f(x)}{\partial x_n} \end{bmatrix} dxf(x)=⎣ ⎡∂x1∂f(x)∂x2∂f(x)……∂xn∂f(x)⎦ ⎤
实际拉伸就是将多元函数的偏导写在一个列向量里。
例2:求 f ( x ) d x \frac{f(x)}{dx} dxf(x)
- f ( x ) f(x) f(x)是向量函数, f ( x ) = [ f 1 ( x ) f 2 ( x ) … … f n ( x ) ] f(x)=\begin{bmatrix} f_1(x) \\ \\ f_2(x) \\ \\……\\ \\f_n(x) \end{bmatrix} f(x)=⎣ ⎡f1(x)f2(x)……fn(x)⎦ ⎤
- x x x是标量
这里的 f ( x ) f(x) f(x)就是口诀里的Y,它是向量需要拉伸,横向拉; x x x是标量不变且不用拉伸。
所以 f ( x ) d x = [ ∂ f 1 ( x ) ∂ x ∂ f 2 ( x ) ∂ x … … ∂ f n ( x ) ∂ x ] \frac{f(x)}{dx}=\begin{bmatrix} \frac{\partial f_1(x)}{\partial x} & \frac{\partial f_2(x)}{\partial x} & …… & \frac{\partial f_n(x)}{\partial x} \end{bmatrix} dxf(x)=[∂x∂f1(x)∂x∂f2(x)……∂x∂fn(x)]
例3:求 f ( x ) d x \frac{f(x)}{dx} dxf(x)
- f ( x ) f(x) f(x)是向量函数, f ( x ) = [ f 1 ( x ) f 2 ( x ) … … f n ( x ) ] f(x)=\begin{bmatrix} f_1(x) \\ \\ f_2(x) \\ \\……\\ \\f_n(x) \end{bmatrix} f(x)=⎣ ⎡f1(x)f2(x)……fn(x)⎦ ⎤
- x x x是列向量
f ( x ) d x = [ ∂ f ( x ) ∂ x 1 ∂ f ( x ) ∂ x 2 … ∂ f ( x ) ∂ x n ] \frac{f(x)}{dx}=\begin{bmatrix} \frac{\partial f(x)}{\partial x_1} \\\\ \frac{\partial f(x)}{\partial x_2} \\ … \\ \\ \frac{\partial f(x)}{\partial x_n} \end{bmatrix} dxf(x)=⎣ ⎡∂x1∂f(x)∂x2∂f(x)…∂xn∂f(x)⎦ ⎤= [ ∂ f 1 ( x ) ∂ x 1 ∂ f 2 ( x ) ∂ x 1 … ∂ f n ( x ) ∂ x 1 ∂ f 1 ( x ) ∂ x 2 ∂ f 2 ( x ) ∂ x 2 … ∂ f n ( x ) ∂ x 2 … … … … ∂ f 1 1 ( x ) ∂ x n ∂ f 2 ( x ) ∂ x n … ∂ f n ( x ) ∂ x n ] \begin{bmatrix} \frac{\partial f_1(x)}{\partial x_1}&&\frac{\partial f_2(x)}{\partial x_1} &&…\frac{\partial f_n(x)}{\partial x_1}\\\\ \frac{\partial f_1(x)}{\partial x_2} && \frac{\partial f_2(x)}{\partial x_2}&&… \frac{\partial f_n(x)}{\partial x_2} \\ …&&…&&…… \\ \\ \frac{\partial f_11(x)}{\partial x_n}&&\frac{\partial f_2(x)}{\partial x_n}&&…\frac{\partial f_n(x)}{\partial x_n} \end{bmatrix} ⎣ ⎡∂x1∂f1(x)∂x2∂f1(x)…∂xn∂f11(x)∂x1∂f2(x)∂x2∂f2(x)…∂xn∂f2(x)…∂x1∂fn(x)…∂x2∂fn(x)………∂xn∂fn(x)⎦ ⎤
四、常见矩阵求导公式举例
- f ( x ) = A T ⋅ X f(x)=A^T\cdot X f(x)=AT⋅X, A = [ a 1 a 2 … a n ] A=\begin{bmatrix} a_1 \\ a_2 \\…\\a_n \end{bmatrix} A=⎣ ⎡a1a2…an⎦ ⎤, X = [ x 1 x 2 … x n ] X=\begin{bmatrix} x_1 \\ x_2 \\…\\x_n \end{bmatrix} X=⎣ ⎡x1x2…xn⎦ ⎤
.
f ( x ) f(x) f(x)是标量, X X X是向量,所以:
f ( x ) = A T ⋅ X = X T ⋅ A = ∑ i = 1 n a i x i \color {red} {f(x)=A^T\cdot X=X^T\cdot A=\sum\limits_{i=1}^n a_ix_i} f(x)=AT⋅X=XT⋅A=i=1∑naixi
d A T ⋅ X d X = d X T ⋅ A d X = A \color {red} {\frac{d\ A^T\cdot X}{dX}=\frac{d\ X^T\cdot A}{dX}=A} dXd AT⋅X=dXd XT⋅A=A
2. f ( X ) = X T ⋅ A ⋅ X f(X)=X^T\cdot A\cdot X f(X)=XT⋅A⋅X , X = [ x 1 x 2 … x n ] X=\begin{bmatrix} x_1 \\ x_2 \\…\\x_n \end{bmatrix} X=⎣ ⎡x1x2…xn⎦ ⎤, A = [ a 11 a 12 … a 1 n a 21 a 22 … a 2 n … … … a n 1 a n 1 … a n n ] A=\begin{bmatrix} a_{11} & a_{12} & …a_{1n}\\ a_{21} & a_{22} & …a_{2n}\\…&…&…\\a_{n1}& a_{n1}&…a_{nn} \end{bmatrix} A=⎣ ⎡a11a21…an1a12a22…an1…a1n…a2n……ann⎦ ⎤.
.
f ( X ) = ∑ i = 1 n ∑ j = 1 n a i j x i x j f(X)=\sum\limits_{i=1}^n \sum\limits_{j=1}^n a_{ij}x_ix_j f(X)=i=1∑nj=1∑naijxixj是标量,X是向量。
d X T ⋅ A ⋅ X d X = ( A + A T ) ⋅ X \color {red} {\frac{d X^T\cdot A\cdot X}{dX}=(A+A^T) \cdot X} dXdXT⋅A⋅X=(A+AT)⋅X
五、求导细节补充
分母布局和分子布局:
- 分母布局:YX拉伸术
口诀一致,其实就是Y横向拉伸,X纵向拉伸 - 分子布局:XY拉伸术
口诀一致,其实就是X横向拉伸,Y纵向拉伸
这两个拉伸求导后元素排列不同,通常 (分母布局)T=(分子布局),互为转置关系。
如下图的 f ( X ) = X T X f(X)=X^TX f(X)=XTX的例子:
补充公式:(分母布局)
U = [ u 1 ( x ) u 2 ( x ) … u n ( x ) ] n × 1 U=\begin{bmatrix} u_1(x) \\ u_2(x) \\…\\u_n(x) \end{bmatrix}_{n\times1} U=⎣ ⎡u1(x)u2(x)…un(x)⎦ ⎤n×1, V = [ v 1 ( x ) v 2 ( x ) … v n ( x ) ] n × 1 V=\begin{bmatrix} v_1(x) \\ v_2(x) \\…\\v_n(x) \end{bmatrix}_{n\times1} V=⎣ ⎡v1(x)v2(x)…vn(x)⎦ ⎤n×1, X = [ x 1 ( x ) x 2 ( x ) … x n ( x ) ] n × 1 X=\begin{bmatrix} x_1(x) \\ x_2(x) \\…\\x_n(x) \end{bmatrix}_{n\times1} X=⎣ ⎡x1(x)x2(x)…xn(x)⎦ ⎤n×1
- 矩阵求导的乘法公式:
d V T U d X = ∂ U ∂ X V + ∂ V ∂ X U \color {red} {\frac{d\ V^T U}{d X}=\frac{∂U}{∂X}V+\frac{∂V}{∂X}U} dXd VTU=∂X∂UV+∂X∂VU - 矩阵的加法公式:
d V + U d X = d U d X + d V d X \color {red} {\frac{d\ V +U}{d X}=\frac{dU}{dX}+\frac{dV}{dX}} dXd V+U=dXdU+dXdV
电子书查阅:
可以通过这个电子书查公式
目录导航: D e r i v a t i v e s − > D e r i v a t i v e s o f M a t r i c e s , V e c t o r s a n d S c a l a r F o r m s Derivatives->Derivatives\ of\ Matrices, Vectors\ and\ Scalar\ Forms Derivatives−>Derivatives of Matrices,Vectors and Scalar Forms
公式中 a a a表示标量,a表示列向量, A A A表示矩阵