矩阵求导技巧
前言:定义与布局
根据求导的自变量和因变量是标量,向量还是矩阵,我们有9种可能的矩阵求导定义,谈谈几种常用的。
所谓向量对标量的求导,其实就是向量里的每个分量分别对标量求导,最后把求导的结果排列在一起,按一个向量表示而已。类似的结论也存在于标量对向量的求导,向量对向量的求导,向量对矩阵的求导,矩阵对向量的求导,以及矩阵对矩阵的求导等。总而言之,所谓的向量矩阵求导本质上就是多元函数求导,仅仅是把把函数的自变量,因变量以及标量求导的结果排列成了向量矩阵的形式,方便表达与计算,更加简洁而已。一个需要要约定的点是按分量求导后的结果如何进行排布?一般来说有两种布局方式:分子布局与分母布局,无论何种选择方式都是正确的!我们需要根据我们选定的排布方式推导出一套自洽的计算理论即可!诸如:链式法则,微分定义,等等
谈谈两种排布方式
对于分子布局来说,我们求导结果的维度以分子为主
对于分母布局来说,我们求导结果的维度以分母为主
举一个例子,标量y对矩阵X求导,那么如果按分母布局,则求导结果的维度和矩阵X的维度m×n是一致的。如果是分子布局,则求导结果的维度为n×m
一般来说,我们会使用一种叫混合布局的思路:即 - 如果是向量或者矩阵对标量求导,则使用分子布局为准 (不常用) - 如果是标量对向量或者矩阵求导,则以分母布局为准。(最常用) - 对于(列)向量对(列)向量求导,有些分歧,下面以分子布局的雅克比矩阵为标准。
$$\begin{gathered}\frac{\partial\mathbf{y}}{\partial\mathbf{x}}=\begin{pmatrix}\frac{\partial y_1}{\partial x_1}&\frac{\partial y_1}{\partial x_2}&\ldots&\frac{\partial y_1}{\partial x_n}\\\frac{\partial y_2}{\partial x_1}&\frac{\partial y_2}{\partial x_2}&\ldots&\frac{\partial y_2}{\partial x_n}\\\vdots&\vdots&\ddots&\vdots\\\frac{\partial y_m}{\partial x_1}&\frac{\partial y_m}{\partial x_2}&\ldots&\frac{\partial y_m}{\partial x_n}\end{pmatrix}\end{gathered}$$
具体计算时,对y的每一个分量进行标量对向量求导,得到的导数转置后按行排列即是欲求的雅可比矩阵。
有的资料上会使用$\frac{\partial\mathbf{y}}{\partial\mathbf{x}^\mathbf{T}}$定义雅可比矩阵,数学意义与上式是一样的
标量对矩阵的求导
定义
回忆如何表示一个标量的微分,显然,df就是所有自变量变化引起的函数变化的总和,也就是 $$df=\sum_{i=1}^n\frac{\partial f}{\partial x_i}dx_i$$
- dx为标量时,df可以表示为 df = f′(x)dx
- dx为向量时,df可以表示为 $$df=\sum_{i=1}^n\frac{\partial f}{\partial
x_i}dx_i=\frac{\partial
f}{\partial\boldsymbol{x}}^Td\boldsymbol{x}$$ 其中$\frac{\partial
f}{\partial\boldsymbol{x}}^T$为f的梯度(行向量),全微分df是导数$\frac{\partial f}{\partial
x}$与微分向量dx的内积
- dX为矩阵时,借助矩阵的迹,df可以表示为 $$df=\sum_{i=1}^m\sum_{j=1}^n\frac{\partial
f}{\partial X_{ij}}dX_{ij}=\mathrm{tr}\left(\frac{\partial f}{\partial
X}^TdX\right)$$ 其中全微分df是导数$\frac{\partial f}{\partial
X}$与微分矩阵dX的内积,我们也由此自然地得出了矩阵对标量求导时的分子布局定义:标量f对矩阵原位逐个元素求导后取装置。
附:上式证明。 $$Proof.\begin{aligned} \mathrm{d}f(\boldsymbol{X})& =\frac{\partial f}{\partial x_{11}}\mathrm{d}x_{11}+\frac{\partial f}{\partial x_{12}}\mathrm{d}x_{12}+\cdots+\frac{\partial f}{\partial x_{1n}}\mathrm{d}x_{1n} \\ &+\frac{\partial f}{\partial x_{21}}\mathrm{d}x_{21}+\frac{\partial f}{\partial x_{22}}\mathrm{d}x_{22}+\cdots+\frac{\partial f}{\partial x_{2n}}\mathrm{d}x_{2n} \\ &+\ldots \\ &+\frac{\partial f}{\partial x_{m1}}\mathrm{d}x_{m1}+\frac{\partial f}{\partial x_{m2}}\mathrm{d}x_{m2}+\cdots+\frac{\partial f}{\partial x_{mn}}\mathrm{d}x_{mn} \\ df=&tr(\begin{bmatrix}\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&\vdots&\vdots\\\frac{\partial f}{\partial x_{1n}}&\frac{\partial f}{\partial x_{2n}}&\cdots&\frac{\partial f}{\partial x_{mn}}\end{bmatrix}_{n\times m}\begin{bmatrix}\mathrm{d}x_{11}&\mathrm{d}x_{12}&\cdots&\mathrm{d}x_{1n}\\\mathrm{d}x_{21}&\mathrm{d}x_{22}&\cdots&\mathrm{d}x_{2n}\\\vdots&\vdots&\vdots&\vdots\\\mathrm{d}x_{m1}&\mathrm{d}x_{m2}&\cdots&\mathrm{d}x_{mn}\end{bmatrix}_{m\times n}) \end{aligned}$$
矩阵微分的性质
- 1.加减法:d(X ± Y) = dX ± dY;矩阵乘法:d(XY) = (dX)Y + XdY;转置:
d(XT) = (dX)T;迹:dtr(X) = tr(dX)。
Proof.略 - 2.逆:dX−1 = −X−1dXX−1。此式可在XX−1 = I两侧求微分来证明。
- 3.行列式:d|X| = tr (X*dX),其中X*表示X的伴随矩阵,在X可逆时又可以写作d|X| = |X|tr(X−1dX)。此式可用Laplace展开来证明
- 4.逐元素乘法:d(X ⊙ Y) = dX ⊙ Y + X ⊙ dY,⊙表示尺寸相同的矩阵X,Y逐元素相乘。
- 5.逐元素函数:dσ(X) = σ′(X) ⊙ dX,σ(X) = [σ(Xij)]是逐元素标量函数运算, $$\left.\begin{aligned}X=\begin{bmatrix}X_{11}&X_{12}\\X_{21}&X_{22}\end{bmatrix},d\sin(X)=\begin{bmatrix}\cos X_{11}dX_{11}&\cos X_{12}dX_{12}\\\cos X_{21}dX_{21}&\cos X_{22}dX_{22}\end{bmatrix}=\cos(X)\odot dX\end{aligned}\right.$$
迹运算技巧
1.标量套上迹:a = tr (a)
2.转置:tr(AT) = tr (A).
3.线性:tr (A ± B) = tr (A) ± tr (B).
4.矩阵乘法交换:tr (AB) = tr (BA),其中A与BT尺寸相同。两侧都等于∑i, jAijBji
5.矩阵乘法/逐元素乘法交换:tr (AT(B ⊙ C)) = tr ((A ⊙ B)TC),其中A, B, C尺寸相同。两侧都等于∑ijAijBijCij
若标量函数f是矩阵X经加减乘法、逆、行列式、逐元素函数等运算构成,则使用相应的运算法则对f求微分,再使用迹技巧给df套上迹并将其它项交换至dX左侧,对照导数与微分的联系$df=\mathrm{tr}\left(\frac{\partial f}{\partial X}^TdX\right)$即可求得导数.ati.常常利用性质4,5来进行tr内部的顺序交换。
求解一些经典问题
- $f=\boldsymbol{a}^TX\boldsymbol{b}\text{,求}\frac{\partial f}{\partial X}$ 其中a, b为列向量,X为矩阵。
$$df=a^{T}dXb\\df=tr(a^{T}dX b)=tr(ba^{T}dX)\\\frac{\partial f}{\partial x}=(ba^{T})^{T}=ab^{T}$$
- f = aTexp (Xb),求$\frac{\partial f}{\partial X}$。其中a是m × 1列向量,X是m × n矩阵,b是n × 1列向 量,exp表示逐元素求指数,f是标量。
$$ \begin{aligned} df &= a^{T}(\exp(Xb) \odot d(Xb)) \\ df &= \text{tr}(a^{T}[\exp(Xb) \odot d(Xb)]) \\ df &= \text{tr}((a^{T} \odot \exp(Xb))^{T}d(Xb)) \\ df &= \text{tr}(b(a \odot \exp(Xb))^TdX) = \text{tr}(((a \odot \exp(Xb))b^T)^TdX) \\ =>\frac{\partial f}{\partial X} &= (\boldsymbol{a} \odot \exp(X\boldsymbol{b}))\boldsymbol{b}^T \end{aligned} $$
f = tr (YTMY), Y = σ(WX),求$\frac{\partial f}{\partial X}$。其中W是l × m矩阵,X是m × n矩阵,Y 是l × n矩阵,M是l × l对称矩阵,σ是逐元素函数,f是标量。 $$ \begin{aligned} df &= \operatorname{tr}((dY)^TMY) + \operatorname{tr}(Y^TMdY) \\ &= \operatorname{tr}(Y^TM^TdY) + \operatorname{tr}(Y^TMdY) \\ &= \operatorname{tr}(Y^T(M+M^T)dY) \\ \frac{\partial f}{\partial Y} &= (M+M^T)Y = 2MY \\ df &= \operatorname{tr}\left(\frac{\partial f}{\partial Y}^TdY\right) \\ df &= \operatorname{tr}\left(\frac{\partial f}{\partial Y}^T(\sigma^{\prime}(WX)\odot(WdX))\right) \\ &= \operatorname{tr}\left(\left(\frac{\partial f}{\partial Y}\odot\sigma^{\prime}(WX)\right)^TWdX\right) \\ \frac{\partial f}{\partial X} &= W^T\left(\frac{\partial f}{\partial Y}\odot\sigma^{\prime}(WX)\right) = W^T\left((2M\sigma(WX))\odot\sigma^{\prime}(WX)\right) \end{aligned} $$
l = ∥Xw − y∥2,求w的最小二乘估计,即求$\frac{\partial l}{\partial\boldsymbol{w}}$的零点。其中y是m × 1 列向量,X是m × n矩阵,w是n × 1列向量,l是标量。
$$ \begin{aligned} l &=(X\boldsymbol{w}-\boldsymbol{y})^T(X\boldsymbol{w}-\boldsymbol{y}) \\dl &=(Xd\boldsymbol{w})^T(X\boldsymbol{w}-\boldsymbol{y})+(X\boldsymbol{w}-\boldsymbol{y})^T(Xd\boldsymbol{w}) \\dl &=2(X\boldsymbol{w}-\boldsymbol{y})^TXd\boldsymbol{w} \end{aligned} $$ 对照导数与微分的联系$dl=\frac{\partial l}{\partial\boldsymbol{w}}^Td\boldsymbol{u}$ ,得到$\frac{\partial l}{\partial\boldsymbol{w}}=2X^T(X\boldsymbol{w}-\boldsymbol{y})$。$\frac{\partial l}{\partial\boldsymbol{w}}=\mathbf{0}$即XTXw = XTy,得到w的最小二乘估计为 w = (XTX)−1XTy.
向量对向量的求导
如何计算
给一个例子:DNN神经网络中第l层与第l+1层的输入输出zl + 1与zl之间的关系为 zl + 1 = Wl + 1al + bl + 1 = Wl + 1σ(zl) + bl + 1 求解: $\frac{\partial z^{l+1}}{\partial z^l}$
先用标量对向量求导的方法,依次求出zl + 1的每一个分量的导数,再排列成雅可比矩阵。
考虑zjl + 1对zl的导数
dzjl + 1 = Wl + 1σ′(zl) ⊙ dzl dzjl + 1 = ((Wl + 1)T ⊙ σ′(zl))Tdzl
j = 1到j = Nrow(W)排列成矩阵,最终写为
$$\frac{\partial z^{l+1}}{\partial z^l}=W^{l+1}diag(\sigma^{'}(z^l))$$
链式法则:
向量对向量的链式求导
定理:
若多个列向量的依赖关系为 x → y → z且其维数分别为n, p, m,则
- $\frac{\partial z}{\partial
x}=\frac{\partial z}{\partial y}\frac{\partial y}{\partial x}$
(若使用分子布局),
- $\frac{\partial z}{\partial
x}=\frac{\partial y}{\partial x}\frac{\partial z}{\partial y}$
(若使用分母布局)
对分子布局进行证明:
$$\frac{\partial z}{\partial x}=\begin{bmatrix}\frac{\partial z_1}{\partial x_1}&\frac{\partial z_1}{\partial x_2}&\cdots&\frac{\partial z_1}{\partial x_n}\\\vdots&\ddots&&\vdots\\\frac{\partial z_m}{\partial x_1}&\frac{\partial z_m}{\partial x_2}&\cdots&\frac{\partial z_m}{\partial x_n}\end{bmatrix}$$
$$\left.=\left[\begin{array}{ccccc}\sum_{i=1}^p\frac{\partial z_1}{\partial y_i}\frac{\partial y_i}{\partial x_1}&\sum_{i=1}^p\frac{\partial z_1}{\partial y_i}\frac{\partial y_i}{\partial x_2}&\cdots&\sum_{i=1}^p\frac{\partial z_1}{\partial y_i}\frac{\partial y_i}{\partial x_n}\\\vdots&\ddots&&\vdots\\\sum_{i=1}^p\frac{\partial z_m}{\partial y_i}\frac{\partial y_i}{\partial x_1}&\sum_{i=1}^p\frac{\partial z_m}{\partial y_i}\frac{\partial y_i}{\partial x_2}&\cdots&\sum_{i=1}^p\frac{\partial z_m}{\partial y_i}\frac{\partial y_i}{\partial x_n}\end{array}\right.\right]$$
$$=\begin{bmatrix}\frac{\partial z_1}{\partial y_1}&\frac{\partial z_1}{\partial y_2}&\cdots&\frac{\partial z_1}{\partial y_p}\\\vdots&\ddots&&\vdots\\\frac{\partial z_m}{\partial y_1}&\frac{\partial z_m}{\partial y_2}&\cdots&\frac{\partial z_m}{\partial y_p}\end{bmatrix}\begin{bmatrix}\frac{\partial y_1}{\partial x_1}&\frac{\partial y_1}{\partial x_2}&\cdots&\frac{\partial y_1}{\partial x_n}\\\vdots&\ddots&&\vdots\\\frac{\partial y_p}{\partial x_1}&\frac{\partial y_p}{\partial x_2}&\cdots&\frac{\partial y_p}{\partial x_n}\end{bmatrix}$$
$$=\frac{\partial z}{\partial y}\frac{\partial y}{\partial x}$$
证毕,同时推广到n个向量之间的链式法则也自然是成立的,因为多个链式总可以看为上述操作之叠加
标量对多个向量的链式求导
定理:
标量对更多的向量求导,比如y1 → y2 → … → yn → z,则有
$$\frac{\partial
z}{\partial\mathbf{y_1}}=(\frac{\partial\mathbf{y_n}}{\partial\mathbf{y_{n-1}}}\frac{\partial\mathbf{y_{n-1}}}{\partial\mathbf{y_{n-2}}}\ldots\frac{\partial\mathbf{y_2}}{\partial\mathbf{y_1}})^T\frac{\partial
z}{\partial\mathbf{y_n}}$$
标量对多个矩阵的链式求导
定理:在依赖关系X → Y → z下,满足链式法则
$$\frac{\partial z}{\partial x_{ij}}=\sum_{k,l}\frac{\partial z}{\partial Y_{kl}}\frac{\partial Y_{kl}}{\partial X_{ij}}=tr((\frac{\partial z}{\partial Y})^T\frac{\partial Y}{\partial X_{ij}})$$
我们没有给出基于矩阵整体的链式求导法则,主要原因是矩阵对矩阵的求导是比较复杂的定义,我们目前也未涉及。因此只能给出对矩阵中一个标量的链式求导方法。这个方法并不实用,因为我们并不想每次都基于定义法来求导最后再去排列求导结果。
虽然我们没有全局的标量对矩阵的链式求导法则,但是对于一些线性关系的链式求导,我们还是可以得到一些有用的结论的。
我们来看这个常见问题:A, X, B, Y都是矩阵,Z是标量,其中z = f(Y) = f(AX + B),我们欲求出 $\frac{\partial z}{\partial X}$,这个问题在机器学习中是很常见的。此时,我们并不能直接整体使用矩阵的链式求导法则,因为矩阵对矩阵的求导结果不好处理。
这里我们回归初心,使用定义法试一试,先使用上面的标量链式求导公式:
$$\frac{\partial z}{\partial x_{ij}}=\sum_{k,l}\frac{\partial z}{\partial Y_{kl}}\frac{\partial Y_{kl}}{\partial X_{ij}}$$
后半部分
$$\frac{\partial Y_{kl}}{\partial X_{ij}}=\frac{\partial\sum_s(A_{ks}X_{sl})}{\partial X_{ij}}=\frac{\partial A_{ki}X_{il}}{\partial X_{ij}}=A_{ki}\delta_{lj}$$
其中δlj为克罗内克符号,当l = j的时候为1,否则为0
那么最终的标签链式求导公式转化为: $$\frac{\partial z}{\partial x_{ij}}=\sum_{k,l}\frac{\partial z}{\partial Y_{kl}}A_{ki}\delta_{lj}=\sum_k\frac{\partial z}{\partial Y_{kj}}A_{ki}$$
排列成矩阵即为:
$$\frac{\partial z}{\partial X}=A^T\frac{\partial z}{\partial Y}$$
总结出四条deeplearning中常用的结论
$$z=f(Y),Y=AX+B\to\frac{\partial z}{\partial X}=A^T\frac{\partial z}{\partial Y}$$ $$z=f(\mathbf{y}),\mathbf{y}=A\mathbf{x}+\mathbf{b}\to\frac{\partial z}{\partial\mathbf{x}}=A^T\frac{\partial z}{\partial\mathbf{y}}$$ $$z=f(Y),Y=XA+B\to\frac{\partial z}{\partial X}=\frac{\partial z}{\partial Y}A^T$$
$$z=f(\mathbf{y}),\mathbf{y}=X\mathbf{a}+\mathbf{b}\to\frac{\partial z}{\partial\mathbf{X}}=\frac{\partial z}{\partial\mathbf{y}}a^T$$