机器学习|矩阵知识汇总(迹函数,标量、向量和矩阵相互求导,链式法则)|学习笔记

此笔记学习和整理自刘建平-机器学习中的矩阵向量求导1-4
此篇学习笔记md文档支持Typora检索,可参考
理科生学习笔记制作/markdown+Latex / Typora
md文档下载链接文末

矩阵向量求导

*没有说明的向量都为列向量

1.求导定义与求导布局

1.矩阵向量求导引入

  • 标量对标量的求导,如标量y对标量x的求导为yx\frac{\partial y}{\partial x}

    • 一组标量yi,i=1,2,...,my_i,i=1,2,...,m来对一个标量x的求导,为yix,i=1,2,...,m\frac{\partial y_i}{\partial x},i=1,2,...,m
  • 向量对标量的求导,就是向量里的每个分量分别对标量的求导

    • 维度为m的一个向量y对一个标量x的求导,结果也为一个m维的向量为yx\frac{\partial y}{\partial x}
  • 类似结论也存在与标量对向量的求导,向量对向量的求导,向量对矩阵的求导,矩阵对向量的求导,以及矩阵对矩阵的求导

  • 向量矩阵求导本质是多元函数求导,仅仅是把函数的自变量,因变量以及标量求导的结果排列成了向量矩阵的形式,方便表达与计算,更简洁

    求导的自变量用x表示标量,x表示n维向量,X表示mxn维度的举证,求导的因变量用y表示标量,y表示m维向量,Y表示pxq维度的矩阵

2. 矩阵向量求导定义

自变量\因变量 标量y 向量y 矩阵Y
标量x yx\frac{\partial y}{\partial x} yx\frac{\partial y}{\partial x} Yx\frac{\partial Y}{\partial x}
向量x yx\frac{\partial y}{\partial x} yx\frac{\partial y}{\partial x} Yx\frac{\partial Y}{\partial x}
矩阵X yX\frac{\partial y}{\partial X} yX\frac{\partial y}{\partial X} YX\frac{\partial Y}{\partial X}

3. 矩阵向量求导布局

  • 目的:为了解决矩阵向量求导的结果不唯一,即在机器学习算法优化过程中,如果行向量或者列向量随便写,那么结果不唯一

  • 基本的求导布局:分子布局(numerator layout)和分母布局(denominator layout)

    • 分子布局:求导结果的维度以分子为主

      e.g 向量y是一个m维的列向量,那么求导结果yx\frac{\partial y}{\partial x}也是一个m维列向量。

    • 分母布局:求导结果的维度以分母为主

      e.g 向量yy是一个m维的列向量,那么求导结果yx\frac{\partial y}{\partial x}是一个m维行向量。

    • 分子布局和分母布局的结果相差一个转置

      e.g 标量y对矩阵X,如果按分母布局,则求导结果的维度和矩阵X的维度mxn是一致的。如果是分子布局,则求导结果的维度为nxm

      因此,对于标量对向量或者矩阵求导,向量或者矩阵对标量求导这4种情况,对应的分子布局和分母布局的排列方式已经确定了

  • 列向量对列向量的求导

    e.g m维列向量y对n维列向量x求导

    对于这两个向量的求导,一共有m*n个标量对标量的求导。求导结果是排列为一个矩阵。

    1. 如果是分子布局,则矩阵的第一个维度以分子为准,即结果是一个mxn的矩阵

    yx=(y1x1y1x2y1xny2x1y2x2y2xnymx1ymx2ymxn) \frac{\partial y}{\partial x} = \begin{pmatrix} \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_m}{\partial x_1} & \frac{\partial y_m}{\partial x_2} & \cdots & \frac{\partial y_m}{\partial x_n} \\ \end{pmatrix}

    一般叫做雅克比(Jacobian)矩阵,可用yxT\frac{\partial y}{\partial x^T}来定义。

    1. 如果是分母布局,则求导的结果矩阵的第一维度以分母为准,即结果是一份nxm的矩阵

    yx=(y1x1y2x1ymx1y1x2y2x2ymx2y1xny2xnymxn) \frac{\partial y}{\partial x} = \begin{pmatrix} \frac{\partial y_1}{\partial x_1} & \frac{\partial y_2}{\partial x_1} & \cdots & \frac{\partial y_m}{\partial x_1} \\ \frac{\partial y_1}{\partial x_2} & \frac{\partial y_2}{\partial x_2} & \cdots & \frac{\partial y_m}{\partial x_2} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial y_1}{\partial x_n} & \frac{\partial y_2}{\partial x_n} & \cdots & \frac{\partial y_m}{\partial x_n} \\ \end{pmatrix}

    一般叫做梯度矩阵,可用yTx\frac{\partial y^T}{\partial x}来定义

    对于上面5种求导类型,可以各选择一种布局来求导,但是对于某以种类型求导类型,不能同时使用分子布局和分母布局求导

    (在机器学习算法原理资料推导中,一般会使用混合布局的思路,即如果是向量或者矩阵对标量求导,则会使用分子布局为准,如果是标量对向量或者是矩阵求导,则以分母布局为准。对于向量对向量的求导,有些分歧)

    自变量\因变量 标量y 列向量y 矩阵Y
    标量x / yx\frac{\partial y}{\partial x} 分子布局:m维列向量(默认);分母布局:m维行向量 Yx\frac{\partial Y}{\partial x} 分子布局:pxq矩阵(默认);分母布局:qxp矩阵
    列向量x yx\frac{\partial y}{\partial x} 分子布局:n维行向量;分母布局:n维列向量(默认) yx\frac{\partial y}{\partial x} 分子布局:mxn雅克比矩阵(默认);分母布局:nxm梯度矩阵 /
    矩阵X yX\frac{\partial y}{\partial X} 分子布局:nxm矩阵;分母布局:mxn矩阵(默认) / /

2.矩阵向量求导之定义法

1. 用定义法求解标量对向量求导

  • 定义:实际是实值函数对向量的求导。即定义实值函数f:RnRf:R^n\to R, 自变量x是n维向量,而输出y是标量。

  • 实质:标量(实值函数)对向量里的每个分量分别求导,找到规律,最后把求导的结果排列在一起,按一个向量表示(结果向量)

    e.g y=aTxy=\vec{a}^T\vec{x},求解aTxx\frac{\partial {\vec{a}^T \vec{x}}}{\partial \vec{x}}

    根据定义,先对x\vec{x}的第i个分量进行求导,这是一个标量对标量的求导,如下:
    aTxxi=j=1najxjxi=aixixi=ai \frac{\partial \vec{a}^T\vec{x}}{\partial x_i}=\frac{\partial \sum_{j=1}^{n}a_jx_j}{\partial x_i}=\frac{\partial a_ix_i}{\partial x_i}=a_i
    可见,对向量的第i个分量的求导结果就等于向量a\vec{a}的第i个分量。由于是分母布局,最后所有求导结果的分量组成的是一个n维向量。也就是向量a\vec{a}
    aTxx=a \frac{\partial{\vec{a}^T\vec{x}}}{\partial{\vec{x}}}=\vec{a}
    同样的思路,可直接得到:
    xTax=a \frac{\partial{\vec{x}^T\vec{a}}}{\partial{\vec{x}}}=\vec{a}

    xTxx=2x \frac{\partial{\vec{x}^T\vec{x}}}{\partial{\vec{x}}}=2\vec{x}

    e.g y=xTAxy=\vec{x}^T\vec{A}\vec{x},求解xTAxx\frac{\partial \vec{x}^T\vec{A}\vec{x}}{\partial \vec{x}}

    x\vec{x}的第k个分量进行求导:
    xTAxxk=j=1nj=1nxiAijxjxk=i=1nAikxi+j=1nAkjxj \frac{\partial \vec{x}^T\vec{A}\vec{x}}{\partial \vec{x}_k}=\frac{\partial \sum_{j=1}^{n}\sum_{j=1}^nx_iA_{ij}x_j}{\partial x_k}= \sum_{i=1}^nA_{ik}x_i+\sum_{j=1}^nA_{kj}x_j

    xTAxx=ATx+Ax \frac{\partial \vec{x^T}\vec{A}\vec{x}}{\partial x}=\vec{A}^T\vec{x}+\vec{A}\vec{x}

    复杂的实值函数就算求出了任意一个分量的导数,要排列出最终的求导结果仍很麻烦

2. 标量对向量求导的一些基本法则

1)常亮对向量的求导结果为0

2)线性法则:如果f,gf,g都是实值函数,c1,c2c_1,c_2为常数,则:
(c1f(x)+c2g(x))x=c1f(x)x+c2g(x)x \frac{\partial (c_1f(x)+c_2g(x))}{\partial x}=c_1\frac{\partial f(x)}{\partial x}+c_2\frac{\partial g(x)}{\partial x}
3)乘法法则:如果f,gf,g都是实值函数,则:
f(x)g(x)x=f(x)g(x)x+g(x)xg(x) \frac{\partial f(x)g(x)}{\partial x}=f(x)\frac{\partial g(x)}{\partial x} + \frac{\partial g(x)}{\partial x}g(x)
*如果不是实值函数,则不能这么使用乘法法则

4)除法法则:如果f,gf,g都是实值函数,且g(x)0g(x)\neq0,则:
f(x)/g(x)x=1g2(x)(g(x)f(x)xf(x)g(x)(x)) \frac{\partial f(x)/g(x)}{\partial x}=\frac{1}{g^2(x)}(g(x)\frac{\partial f(x)}{\partial x}-f(x)\frac{\partial g(x)}{\partial(x)})

3. 用定义法求解标量对矩阵求导

  • 思路同标量对向量的求导类似,只是最后的结果是一个和自变量同型的矩阵

    e,g y=aTXby=\vec{a}^T\vec{X}\vec{b},求解aTXbX\frac{\partial \vec{a}^TX\vec{b}}{\partial X},其中a\vec{a}是m维向量,b\vec{b}是n维向量,X是mxn的矩阵

    对矩阵X的任意一个位置的XijX_{ij}求导,如下:
    aTXbXij=p=1mq=1napApqbqXij=aiAijbjXij=aibj \frac{\partial \vec{a}^TX\vec{b}}{\partial X_{ij}}=\frac{\partial \sum_{p=1}^m\sum_{q=1}^na_pA_{pq}b_q}{\partial X_{ij}}=\frac{\partial a_iA_{ij}b_j}{\partial X_{ij}}=a_ib_j
    (i.j)(i.j)位置的求导结果是a\vec{a}向量第i个分量和b\vec{b}第j个分量的乘积,将所有的位置的求导结果排列成一个mxn的矩阵,即为abTab^T,所以最后的求导结果为:
    aTXbX=abT \frac{\partial \vec{a}^TX\vec{b}}{\partial X}=ab^T
    如果是比较复杂的标量对矩阵求导,比如y=aTexp(Xb)y=\vec{a}^Texp(X\vec{b}),对任意标量求导容易,排列起来比较麻烦

4. 用定义法求解向量对向量求导

  • e.g y=Ax\vec{y} = A\vec{x},其中A为nxm的矩阵。x,y\vec{x},\vec{y}分别为m,n维向量。需要求导Axx\frac{\partial A\vec{x}}{\partial \vec{x}},根据定义,结果应该是一个nxm的矩阵。

    先求矩阵的第i行和向量的内积对向量的第j分量求导,用定义法求解如下:
    Aixxj=Aijxjxj=Aij \frac{\partial A_i\vec{x}}{\partial x_j}=\frac{\partial A_{ij}x_j}{\partial x_j}=Aij
    矩阵A的第i行和向量的内积对向量的第j分量求导的结果就是矩阵A的(i,j)位置的值。排列起来就是一个矩阵,由于是分子布局,所以排列出来的结果是A,而不是ATA^T

5. 定义矩阵向量求导的局限

​ 对于复杂的求导式子,中间运算会很复杂,求导出的结果排列也会很头疼。

3.矩阵向量求导之微分法

1. 矩阵微分

  • 高数中标量的导数和微分:df=f(x)dxdf=f'(x)dx,如果是多变量,则微分为:
    df=i=1nfxidxi=(fx)Tdx df=\sum_{i=1}^{n}\frac{\partial f}{\partial x_i}dx_i=(\frac{\partial f}{\partial{\vec x}})^Td\vec{x}
    标量对向量的求导和它的向量微分有一个转置的关系

  • 推广到矩阵,对于矩阵微分,定义为:
    df=i=1mj=1nfXijdXij=tr((fX)TdX) df=\sum_{i=1}^m\sum_{j=1}^n\frac{\partial f}{\partial X_{ij}}dX_{ij}=tr((\frac{\partial f}{\partial \bf X})^Td\bf X)
    第二步使用了矩阵迹的性质,即迹函数等于主对角线的和(标量)。即
    tr(ATB)=i,jAijBij tr(\bf A^T\bf B)=\sum_{i,j}A_{ij}B_{ij}
    从上面矩阵微分的式子,可以看到矩阵微分和它的导数也有一个转置的关系,不过是在外面套了一个迹函数而已。由于标量的迹函数就是它本身,那么矩阵微分和向量微分可以统一表示,即:
    df=tr((fX)TdX) df=tr((\frac{\partial f}{\partial \bf X})^Td\bf{X})

    df=tr((fx)Tdx) df = tr((\frac{\partial f}{\partial \vec x})^Td\vec{x})

2. 矩阵微分的性质

在使用矩阵微分求导前,先看看矩阵微分的性质:

1)微分加减法:d(X+Y)=dX+dY,d(XY)=dXdYd(\bf X+Y)=dX+dY,d(X-Y)=dX-dY

2)微分乘法:d(XY)=(dX)Y+X(dY)d(\bf XY)=(dX)Y + X(dY)

3)微分转置:d(XT)=(dX)Td(\bf X^T)=(dX)^T

4)微分的迹:dtr(X)=tr(dX)dtr(\bf X)=tr(dX)

5)微分哈达马乘积:d(XY)=XdY+dXYd(\bf X\bigodot Y)=X\bigodot dY+dX\bigodot Y

6)逐元素求导:dσ(X)=σ(X)dXd\sigma(\bf X)=\sigma'(X)\bigodot dX

7)逆矩阵微分:dX1=X1dXX1d\bf X^{-1}=-X^{-1}dXX^{-1}

8)行列式微分:dX=Xtr(X1dX)d|\bf X| = |X|tr(X^{-1}dX)

3. 使用微分法求解矩阵向量求导

第一节中得到了矩阵微分和导数关系,现在使用微分法来求解矩阵向量求导

若标量函数ff是矩阵X\bf X经加减乘法、逆、行列式、逐元素函数等运算构成,则使用相应的运算法则对ff求微分,再使用迹函数技巧给dfdf套上迹并将其它项交换至dXd\bf X左侧,那么对于迹函数里面在dXd\bf X左边的部分,我们只需要加一个转置就可以得到导数了。

主要需要用到的迹函数技巧:

1)标量的迹等于自己:tr(x)=xtr(x)=x

2)转置不变:tr(AT)=tr(A)tr(A^T)=tr(A)

3)交换律:tr(AB)=tr(BA)tr(AB)=tr(BA),需要满足A,BT\bf A,B^T同纬度

4)加减法:tr(X+Y)=tr(X)+tr(Y),tr(XY)=tr(X)tr(Y)tr(X+Y)=tr(X)+tr(Y),tr(X-Y)=tr(X)-tr(Y)

5)矩阵乘法和迹交换:tr((AB)TC)=tr(AT(BC))tr((A\bigodot B)^TC)=tr(A^T(B\bigodot C)),需要满足A,B,C同维度

e.g y=aTXby=\vec{a}^T \bf X\vec{b},yX\frac{\partial y}{\partial \bf X}

用微分乘法的性质对ff求微分,得:

dy=daTXb+aTdXb+aTXdb=aTdXbdy=d\bf \vec a^TX\vec b+\vec a^TdX\vec b +\vec a^TXd\vec b=\vec{a}^TdX\vec{b}

两边套上迹函数,即:

dy=tr(dy)=tr(aTdXb)=tr(baTdX)dy=tr(dy)=tr(\bf \vec{a}^TdX\vec{b})=tr(\vec{b}\vec{a}^TdX)

第一步到第二部使用了迹函数性质1,第三部到第四部用到了上面迹函数的性质3

根据矩阵导数和微分的定义,迹函数里面在dXd\bf X左边的部分baT\bf \vec{b}\vec{a}^T,加上一个转置即为我们要求的导数,即:

fX=(baT)T=abT\frac{\partial f}{\partial \bf X}=(\vec{b}\vec{a}^T)^T=ab^T

以上就是微分法的基本流程,先求微分再做迹函数变换,最后得到求导结果。比起定义法,我们现在不需要去对矩阵中的单个标量进行求导。

再来看看
y=aTexp(Xb)yX y=\vec{a}^Texp(\bf X\vec{b}),​\frac{\partial y}{\partial \bf X}

dy=tr(dy)=tr(aTdexp(Xb))=tr(a(exp(Xb)d(Xb)))=tr((aexp(Xb))TdX)=tr(b(aexp(Xb))TdX) dy=tr(dy)=tr(\vec{a}^Tdexp(\textbf X\vec{b}))=tr(\vec{a}(exp(\textbf X\vec{b})\bigodot d(\textbf X\vec{b})))=tr((\vec{a}\bigodot exp(\textbf X\vec{b}))^Td\textbf X)\\=tr(\vec{b}(a\bigodot exp(\textbf{X}\vec{b}))^Td\textbf X)

其中第三步到第四部使用了上面迹函数的性质5,这样求导结果为:
yX=(aexp(Xb))bT \frac{\partial y}{\partial \textbf X}=(\vec{a}\bigodot exp(\textbf X\vec{b}))\vec b^T

4. 迹函数对向量矩阵求导

由于微分法使用了迹函数的技巧,那么迹函数对向量矩阵求导这一大类问题,使用微分法是最简单直接的。下面是常见的迹函数的求导过程。

  • e.g tr(AB)A=BT\frac{\partial tr(\bf AB)}{\partial \bf A}=\bf B^T

  • e.g tr(AB)B=AT\frac{\partial tr(\bf AB)}{\partial \bf B}=\bf A^T

  • e.g tr(WTAW)W:\frac{\partial tr(W^TAW)}{\partial W}:

    证明:d(tr(WTAW))=tr(dWTAW+WTAdW)=tr(dWTAW)+tr(WTAdW)=tr((dW)TAW)+tr(WTAdW)=tr(WTATdW)+tr(WTAdW)=tr(WT(A+AT)dW)d(tr(W^TAW))=tr(dW^TAW+W^TAdW)=tr(dW^TAW)+tr(W^TAdW)\\=tr((dW)^TAW)+tr(W^TAdW)=tr(W^TA^TdW)+tr(W^TAdW)=tr(W^T(A+A^T)dW)

    因此可以得到:
    tr(WTAW)W=(A+AT)W \frac{\partial tr(W^TAW)}{\partial W}=(A+A^T)W

5. 微分法求导小结

  • 使用矩阵微分,可以在不对向量或矩阵中的某一元素单独求导再拼接,因此会比较方便,当然熟练使用的前提是对上面矩阵微分的性质,以及迹函数的性质熟练运用

  • 微分法主要是用于解决标量对向量、标量对矩阵求导。而向量对向量的求导是不用微分法的

  • 向量对矩阵的求导,比如神经网络中输出层为多个节点时,就是一个向量

4.矩阵向量求导链式法则

本篇中标量对向量的求导,标量对矩阵的求导使用分母布局,向量对向量的求导使用分子布局。

1. 向量对向量求导的链式法则

假设多个向量存在依赖关系,比如三个向量xyz\vec x \to \vec y \to \vec z存在依赖关系,则有下面的链式求导法则:
zx=zyyx \frac{\partial \vec z}{\partial \vec x}=\frac{\partial \vec z}{\partial \vec y}\frac{\partial \vec y}{\partial \vec x}
该法则可以推广到更多的向量依赖关系。但是所有依赖关系的变量都是向量,如果有一个Y\bf Y是矩阵,比如是xYz\vec x \to \textbf Y \to \vec z,则上式并不成立。

从矩阵维度相容的角度也很容易理解上面的链式法则,假设x,y,z\vec x,\vec y,\vec z分别是m,n,p维向量,则求导结果zx\frac{\partial \vec z}{\partial \vec x}是一个pxm的雅克比矩阵,而右边zy\frac{\partial \vec z}{\partial \vec y}是pxn的雅克比矩阵,yx\frac{\partial \vec y}{\partial \vec x}是一个nxm的矩阵,两个雅克比矩阵的乘积维度刚好是pxm,和左边相容。

2. 标量对多个向量的链式求导法则

在机器学习算法中,最终要优化的一般是一个标量损失函数,因此最后求导的目标是标量,无法使用上一节的链式求导法则,比如两个向量,最后到一标量的依赖关系:xyz\vec x\to \vec y \to z,此时很容易发现维度不相容。

假设x,y\vec x, \vec y分别是m,n维向量,那么zx\frac{\partial z}{\partial \vec x}的求导结果是一个mx1的向量,而zy\frac{\partial z}{\partial \vec y}是一个nx1的向量,yx\frac{\partial \vec y}{\partial \vec x}是一个nxm的雅克比矩阵,右边的向量和矩阵是没法直接乘的。

但是假如把标量求导的部分都做一个转置,那么维度就可以相容了,也就是:
(zx)T=(zy)Tyx (\frac{\partial z}{\partial \vec x})^T=(\frac{\partial z}{\partial \vec y})^T\frac{\partial \vec y}{\partial \vec x}
但是毕竟要求导的是zx\frac{\partial z}{\partial \vec x},而不是它的转置,因此两边转置我们可以得到标量对多个向量求导的链式法则。
zx=(yx)Tzy \frac{\partial z}{\partial \vec x}=(\frac{\partial \vec y}{\partial \vec x})^T\frac{\partial z}{\partial \vec y}
如果是标量对更多向量的求导,比如y1y2...ynz\vec y_1 \to \vec y_2\to...\to \vec y_n \to z,则其链式求导表达式可以表示为:
zy1=(ynyn1yn1yn2...y2y1)Tzyn \frac{\partial z}{\partial \vec y_1}=(\frac{\partial \vec y_n}{\partial \vec y_{n-1}}\frac{\partial \vec y_{n-1}}{\partial \vec y_{n-2}}...\frac{\partial \vec y_2}{\partial \vec y_1})^T\frac{\partial z}{\partial \vec y_n}
这里给一个最小二乘法求导的例子。最小二乘法优化的目标是最小化如下损失函数:
l=(Xθy)T(Xθy) l=(\textbf X \vec \theta-\vec y)^T(\textbf X \vec \theta-\vec y)
优化的损失函数ll是一个标量,而模型参数θ\theta是一个向量,期望L对θ\theta求导,并求出导数等于0时候的极值点。假设向量z=Xθyz=\textbf X\vec \theta-y,则l=zTzl=z^Tz,θzl\theta \to z\to l存在链式求导的关系,因此:
lθ=(zθ)Tlz=XT(2z)=2XT(Xθy) \frac{\partial l}{\partial \vec \theta}=(\frac{\partial \vec z}{\partial \vec \theta})^T\frac{\partial l}{\partial \vec z}= \vec X^T(2\vec z)=2\vec X^T(\vec X\vec \theta-\vec y)
其中最后一步转换使用了如下求导公式:
Xθyθ=XzTzz=2z \frac{\partial \vec X\vec \theta-\vec y}{\partial \vec \theta}=\vec X \\ \frac{\partial \vec z^T \vec z}{\partial \vec z}=2\vec z

3.标量对多个矩阵的链式求导法则

假设有这样的依赖关系:XYz\textbf X \to \textbf Y\to z,那么我们有:
zXij=k,lzYklYklXij=tr((zY)TYXij) \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 \textbf Y})^T\frac{\partial \textbf Y}{\partial X_{ij}})
这里并没有给出基于矩阵整体的链式求导法则,主要原因是矩阵对矩阵的求导是比较复杂的定义,目前也为未涉及。因此只能给出对矩阵中一个标量的链式求导方法。这个方法并不实用,因为我们并不想每次都基于定义法来求导,最后再去排列求导结果。

虽然没有全局的标量对矩阵 的链式求导法则,但是对于一些线性关系的链式求导,还是有一些有用的结论。

常见问题:A,X,B,Y\bf A,X,B,Y都是矩阵,z是标量,其中z=f(Y),Y=AX+Bz=f(\textbf Y),\textbf Y=A\textbf X+B,我们要求出zX\frac{\partial z}{\partial \textbf X},这个问题在机器学习中是很常见的。此时,并不能直接整体使用矩阵的链式求导法则,因为矩阵对矩阵的求导结果不好处理。

因此这里使用定义法试一试,先使用上面的标量链式求导公式:
zXij=k,lzYklYklXij \frac{\partial z}{\partial X_{ij}}=\sum_{k,l}\frac{\partial z}{\partial Y_{kl}}\frac{\partial Y_{kl}}{\partial X_{ij}}
后半部分的导数:
YklXij=s(AksXsl)Xij=AkiXilXij=Akiδlj \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\delta_{lj}l=jl=j时为1,否则为0。

那么最终的标签链式求导公式转化为:
zxij=k,lzYklAkiδlj=kzYkjAkj \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_{kj}
即矩阵AT\bf A^T的第i行和zY\frac{\partial z}{\partial \bf Y}的第j列的内积。排列成矩阵即为:
zX=ATzY \frac{\partial z}{\partial \bf X}=\textbf A^T\frac{\partial z}{\partial \bf Y}
总结下就是:
z=f(Y),Y=AX+BzX=ATzY z=f(\textbf Y),\textbf Y=A\textbf X+B \to \frac{\partial z}{\partial \textbf X}=A^T\frac{\partial z}{\partial \textbf Y}
这结论x\bf x是一个向量时也成立,即:
z=f(y),y=Ax+bzx=ATzy z=f(\vec y),\vec y=A\vec x+b\to \frac{\partial z}{\partial \vec x}=A^T\frac{\partial z}{\partial \vec y}
如果要求导的自变量在左边,线性变换在右边,也有类似稍有不同的结论,证明方法是类似的,这里直接给出结论.
z=f(Y),Y=XA+BzX=zYAT z=f(\textbf Y),\textbf Y=\textbf XA+B \to \frac{\partial z}{\partial \textbf X}=\frac{\partial z}{\partial \textbf Y}A^T

z=f(y),y=xa+bzx=zyaT z=f(\vec y),\vec y=\vec xa+b\to \frac{\partial z}{\partial \vec x}=\frac{\partial z}{\partial \vec y}a^T

使用好上述四个结论,对于机器学习尤其是深度学习里的求导问题可以非常快的解决

4. 矩阵向量求导小结

  • 矩阵向量求导在前面讨论了三种方法,定义法、微分法和链式求导法。在同等情况下,优先考虑链式求导方法,尤其是第三节的四个结论。其次选择微分法,在没有好的求导方法时使用定义法是最后的保底方案。

  • 链式法面对向量对矩阵的导数是不行的,只能用定义法做

  • 这四篇对矩阵向量求导的介绍,对于机器学习中出现的矩阵向量求导问题已足够。剩下的是矩阵对矩阵的求导,还有矩阵对向量,向量对矩阵求导这三种形式,是其他应用的数学问题。

5.矩阵的迹以及迹对矩阵求导

  • 概念:矩阵的迹就是矩阵的主对角线上所有元素的和

    矩阵A的迹,记作tr(A),即tr(A)=i=1naiitr(A)=\sum_{i=1}^{n}a_{ii}

  • 定理1:tr(AB)=tr(BA),(An×m,Bm×nAm×n,Bn×m)tr(AB)=tr(BA),(A_{n\times m},B_{m\times n}或A_{m\times n},B_{n\times m})

    证明:
    tr(AB)=i=1n(AB)ii=i=1nj=1nAijBji tr(AB)=\sum_{i=1}^{n}(AB)_{ii}=\sum_{i=1}^{n}\sum_{j=1}^nA_{ij}B_{ji}

    tr(BA)=i=1n(BA)ii=i=1nj=1nBijAji=i=1nj=1nAjiBij=j=1n(AB)jj=tr(AB) tr(BA)=\sum_{i=1}^{n}(BA)_{ii}=\sum_{i=1}^{n}\sum_{j=1}^{n}B_{ij}A_{ji}=\sum_{i=1}^n\sum_{j=1}^nA_{ji}B_{ij}=\sum_{j=1}^n(AB)_{jj}=tr(AB)

    实例证明:
    A=(a1a2a3a4a5a6a7a8a9)B=(b1b2b3b4b5b6b7b8b9) A= \begin{pmatrix} a_1 & a_2 & a_3 \\ a_4 & a_5 & a_6 \\ a_7 & a_8 & a_9 \end{pmatrix} \quad B = \begin{pmatrix} b_1 & b_2 & b_3 \\ b_4 & b_5 & b_6 \\ b_7 & b_8 & b_9 \end{pmatrix}
    方法1:
    tr(AB)=a1b1+a2b4+a3b7+a4b2+a5b5+a6b8+a7b3+a8b6+a9b9tr(BA)=b1a1+b2a4+b3a7+b4a2+b5a5+b6a8+b7a3+b8a6+b9a9=tr(AB) tr(AB)=a_1b_1+a_2b_4+a_3b_7+a_4b_2+a_5b_5+a_6b_8+a_7b_3+a_8b_6+a_9b_9 \\ tr(BA)=b_1a_1+b_2a_4+b_3a_7+b_4a_2+b_5a_5+b_6a_8+b_7a_3+b_8a_6+b_9a_9=tr(AB)
    可发现
    aibjtr(AB),aibjtr(BA)aibjtr(BA),aibjtr(AB) \forall a_ib_j\in tr(AB),一定有a_ib_j \in tr(BA) \\ \forall a_ib_j\in tr(BA),一定有a_ib_j \in tr(AB)
    所以 一定有tr(AB)=tr(BA)tr(AB)=tr(BA)

  • 定理2:tr(ABC)=tr(CAB)=tr(BCA)tr(ABC)=tr(CAB)=tr(BCA)

    证明:由tr(AB)=tr(BA)tr(AB)=tr(BA)可知:
    tr(ABC)=tr((AB)C)=tr(CAB)tr(ABC)=tr(A(BC))=tr(BCA) tr(ABC)=tr((AB)C)=tr(CAB)\\ tr(ABC)=tr(A(BC))=tr(BCA)
    定理的实质是:ABC的各种循环形式的矩阵乘函数的迹都相等,如下解释:

    ABC的循环形式有三种:ABC、BCA、CAB

    就是从ABCABC中依次取以A,B,C开头且含有A、B、C的依次是:ABC、BCA、CAB,他们三个的迹相等

  • 定理3:tr(A)=tr(AT)tr(A)=tr(A^T)

    证明:矩阵转置不改变矩阵的主对角线上的所有元素

  • 定理4:d(tr(AB))=d(tr(BA))=BT,(Am×n,Bn×m)d(tr(AB))=d(tr(BA))=B^T,(A_{m\times n},B_{n\times m}矩阵)

    证明:
    tr(AB)=i=1na1ibi1+i=1na2ibi2+...+i=1namibim=j=1mi=1najibij tr(AB)=\sum_{i=1}^na_{1i}b_{i1}+\sum_{i=1}^na_{2i}b_{i2}+...+\sum_{i=1}^na_{mi}b_{im}=\sum_{j=1}^m\sum^n_{i=1}a_{ji}b_{ij}
    tr(AB)=i=1mj=1naijbjitr(AB)=\sum^m_{i=1}\sum^n_{j=1}a_{ij}b_{ji}

    tr(AB)A==i=1mj=1naijbjiaij=bij\frac{\partial tr(AB)}{\partial A}=\frac{\partial 标量}{\partial 矩阵}=\frac{\partial \sum^m_{i=1}\sum^n_{j=1}a_{ij}b_{ji}}{\partial a_{ij}}=b_{ij}
    tr(AB)A=(tr(AB)a11tr(AB)a12tr(AB)a1ntr(AB)a21tr(AB)a22tr(AB)a2ntr(AB)am1tr(AB)am2tr(AB)amn)=(b11b21bn1b12b22bn2b1mb2mbnm)=(b11b21bn1b12b22bn2b1mb2mbnm)T=BT \frac{\partial tr(AB)}{\partial A}=\begin{pmatrix}\frac{\partial tr(AB)}{\partial a_{11}} & \frac{\partial tr(AB)}{\partial a_{12}} & \cdots & \frac{\partial tr(AB)}{\partial a_{1n}} \\\frac{\partial tr(AB)}{\partial a_{21}} & \frac{\partial tr(AB)}{\partial a_{22}} & \cdots & \frac{\partial tr(AB)}{\partial a_{2n}} \\\vdots & \vdots & \ddots & \vdots \\\frac{\partial tr(AB)}{\partial a_{m1}} & \frac{\partial tr(AB)}{\partial a_{m2}} & \cdots & \frac{\partial tr(AB)}{\partial a_{mn}} \\\end{pmatrix}\\=\begin{pmatrix}b_{11} & b_{21} & \cdots & b_{n1} \\b_{12} & b_{22} & \cdots & b_{n2} \\\vdots & \vdots & \ddots & \vdots \\b_{1m} & b_{2m} & \cdots & b_{nm}\end{pmatrix}=\begin{pmatrix}b_{11} & b_{21} & \cdots & b_{n1} \\b_{12} & b_{22} & \cdots & b_{n2} \\\vdots & \vdots & \ddots & \vdots \\b_{1m} & b_{2m} & \cdots & b_{nm}\end{pmatrix}^T=B^T
    因为tr(AB)=tr(BA)tr(AB)=tr(BA),所以ABA=tr(BA)A=BT\frac{\partial AB}{\partial A}=\frac{\partial tr(BA)}{\partial A}=B^T

  • 定理5:ATBA=tr(BAT)A=B,(Am×n,Bn×m)\frac{\partial A^TB}{\partial A}=\frac{\partial tr(BA^T)}{\partial A}=B,(A_{m \times n},B_{n \times m}方阵)

  • 定理6:如果aRa \in \bf R,则有tr(a)=atr(a)=a

  • 定理7:tr(X)X=I\frac{\partial tr(X)}{\partial X}=I

    矩阵的迹对矩阵自身求导为单位矩阵II
    tr(X)X==(i=1nxiix11i=1nxiix12i=1nxiix1ni=1nxiix21i=1nxiix22i=1nxiix2ni=1nxiixm1i=1nxiixm2i=1nxiixmn)=I \frac{\partial tr(X)}{\partial X}=\frac{\partial 标量}{\partial 矩阵}= \begin{pmatrix} \frac{\sum^n_{i=1}x_{ii}}{x_{11}} & \frac{\sum^n_{i=1}x_{ii}}{x_{12}} & \cdots & \frac{\sum^n_{i=1}x_{ii}}{x_{1n}} \\ \frac{\sum^n_{i=1}x_{ii}}{x_{21}} & \frac{\sum^n_{i=1}x_{ii}}{x_{22}} & \cdots & \frac{\sum^n_{i=1}x_{ii}}{x_{2n}} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\sum^n_{i=1}x_{ii}}{x_{m1}} & \frac{\sum^n_{i=1}x_{ii}}{x_{m2}} & \cdots & \frac{\sum^n_{i=1}x_{ii}}{x_{mn}} \\ \end{pmatrix} = I

  • 定理8:dtr(ATXBT)=dtr(BXTA)=ABdtr(A^TXB^T)=dtr(BX^TA)=AB

    证明:

    $\because tr(ATXBT)=tr(ATXBT)T=tr(BXTA)=tr(ABX^T) \$

    dtr(ATXBT)=dtr(BXTA)=dtr(ABXT)\therefore dtr(A^TXB^T)=dtr(BX^TA)=dtr(ABX^T)

    dtr(ABXT)=AB\because dtr(ABX^T)=AB

    dtr(ATXBT)=dtr(BXTA)=AB\therefore dtr(A^TXB^T)=dtr(BX^TA)=AB

哈达马乘积

对于同为mxn阶的矩阵A\bf AB\bf BA\bf AB\bf B的哈达马乘积定义为:
(AB)i,j=(A)i,j(B)i,j (A\bigodot B)_{i,j}=(A)_{i,j}(B)_{i,j}

矩阵求导的基本规则

ABB=AT\frac{\partial \textbf {AB}}{\partial \textbf B} = A^T

此学习笔记《矩阵向量求导》下载
链接:https://pan.baidu.com/s/15i2l4r50aE6HwmX90mcyaQ 密码:0cd5

发布了49 篇原创文章 · 获赞 0 · 访问量 1605
展开阅读全文