矩阵向量求导-定义法,矩阵微分+迹函数,矩阵向量链式求导法则

矩阵向量求导

摘自:https://www.cnblogs.com/pinard/p/10825264.html,并加入了自己的一丢丢想法。

说明1

  • 在矩阵向量求导中,可以采用定义法,微分法和链式求导法。
  • 选择:优先选择链式求导法,其次选择微分法,最后使用定义法。
  • 无论采用哪种方法都涉及到求导布局的问题,应首先掌握求导布局。

说明2

  • 符号约定:
    • x x x小写字母表示标量。
    • x \mathbf{x} x小写黑体字母表示向量(默认是列向量)。
    • X X X大写字母表示矩阵。
  • 求导布局约定:
    1. 标量对向量求导和标量对矩阵求导均采用分母布局,保证求导的结果使得和向量或矩阵同型。
    2. 向量对标量求导和矩阵对标量求导均采用分子布局,保证求导的结果使得和向量或矩阵同型。
    3. 向量对向量求导采用分子布局,即雅克比式
  • 其他约定:
    • 不涉及以下求导
      1. 标量对标量求导【因为这个相比较其他的求导方式来说,简单了】
      2. 向量对矩阵的求导【遇到的不多】
      3. 矩阵对矩阵的求导【遇到的不多】
      4. 矩阵对矩阵的求导【遇到的不多】
      5. 想深入了解,请参见:https://www.cnblogs.com/pinard/p/10930902.html

1.定义法

  • 标量对向量或对矩阵求导,采用分母布局;向量对向量求导采用分子布局。

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

  • 解决 标 量 向 量 \frac{标量}{向量}

  • 标量对向量的求导,其实就是标量对向量里的每个分量分别求导,最后把求导的结果排列在一起,按一个向量表示而已。那么我们可以将实值函数对向量的每一个分量来求导,最后找到规律,得到求导的结果向量

    • 操作步骤:
      • 各个元素展开,并表示。【简单的元素好表示,复杂的就不怎么好表示了;这就是局限该方法的局限性】
      • 每个元素均进行求导操作。
      • 选定一种求导布局,排列好求导完各个元素的顺序。
举个例子

y = a T x \mathbf{y}=\mathbf{a}^T\mathbf{x} y=aTx,求解 ∂ y ∂ x \frac{\partial \mathbf{y}}{\partial \mathbf{x}} xy

  • 将标量(分子)完全展开

∂ y ∂ x i = ∂ a T x x i = ∂ ∑ j = 1 n a j x j ∂ x i = a i \frac{\partial \mathbf{y}}{\partial x_i} =\frac{\partial \mathbf{a}^T\mathbf{x}}{x_i} =\frac{\partial \sum_{j=1}^{n} a_j x_j}{\partial x_i} =a_i xiy=xiaTx=xij=1najxj=ai

  • 因为采用分母布局,结果应该和分母(列向量)同型,所以
    ∂ a T x ∂ x = a \frac{\partial \mathbf{a}^T\mathbf{x}}{\partial \mathbf{x}}=\mathbf{a} xaTx=a

  • 同理,采用分母布局计算 ∂ x T a ∂ x \frac{\partial \mathbf{x}^T\mathbf{a}}{\partial \mathbf{x}} xxTa
    ∂ x T a ∂ x = a \frac{\partial \mathbf{x}^T\mathbf{a}}{\partial \mathbf{x}}=\mathbf{a} xxTa=a

y = x T x \mathbf{y}=\mathbf{x}^T\mathbf{x} y=xTx,求解 ∂ y ∂ x \frac{\partial \mathbf{y}}{\partial \mathbf{x}} xy

  • 将标量(分子)完全展开
    ∂ y ∂ x i = ∂ x T x x i = ∂ ∑ j = 1 n x j x j ∂ x i = 2 x j \frac{\partial \mathbf{y}}{\partial x_i} =\frac{\partial \mathbf{x}^T\mathbf{x}}{x_i} =\frac{\partial \displaystyle\sum_{j=1}^{n} x_j x_j}{\partial x_i} =2x_j xiy=xixTx=xij=1nxjxj=2xj

  • 因为采用分母布局,结果应该和分母(列向量)同型,所以

  • ∂ a T x ∂ x = 2 x \frac{\partial \mathbf{a}^T\mathbf{x}}{\partial \mathbf{x}}=2\mathbf{x} xaTx=2x

y = x T A x \mathbf{y}=\mathbf{x}^T A\mathbf{x} y=xTAx,求解 ∂ y ∂ x \frac{\partial \mathbf{y}}{\partial \mathbf{x}} xy

  • 将标量(分子)完全展开
    ∂ x T A x ∂ x k = ∂ ∑ i = 1 n ∑ j = 1 n x i A i j x j ∂ x k = ∑ i = 1 n A i k x k + ∑ i = j n A j k x k = A T x + A x \frac{\partial \mathbf{x}^T A\mathbf{x}}{\partial x_k} =\frac{\partial \displaystyle \sum_{i=1}^{n}\sum_{j=1}^{n} {x_i A_{ij} x_j}}{\partial x_k} =\sum_{i=1}^{n}A_{ik}x_k+\sum_{i=j}^{n}A_{jk}x_k =A^T\mathbf{x}+A\mathbf{x} xkxTAx=xki=1nj=1nxiAijxj=i=1nAikxk+i=jnAjkxk=ATx+Ax

  • 可以发现,这个最后写成矩阵表达形式不像上面那么简单。

    • 具体操作,相乘的地方用"十"字表示。

定义法求导对于简单的实值函数是很容易的,但是复杂的实值函数就算求出了任意一个分量的导数,要排列出最终的求导结果还挺麻烦的,因此我们需要找到其他的简便一些的方法来整体求导,而不是每次都先去针对任意一个分量,再进行排列。

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

  • 解决 标 量 矩 阵 \frac{标量}{矩阵}
举个例子

y = a T X b \mathbf{y}=\mathbf{a}^TX\mathbf{b} y=aTXb,求解 ∂ a T X b ∂ X \frac{\partial \mathbf{a}^TX\mathbf{b}}{\partial X} XaTXb X m ∗ n , a m ∗ 1 , b n ∗ 1 X_{m*n},\mathbf{a}_{m*1},\mathbf{b}_{n*1} Xmn,am1,bn1

  • 将标量(分子)完全展开
    ∂ a T X b ∂ X = ∂ ∑ p = 1 m ∑ q = 1 n a p X p a b q ∂ X i j = ∂ a i X i j b j ∂ X i j = a i b j \frac{\partial \mathbf{a}^TX\mathbf{b}}{\partial X} =\frac{\partial \displaystyle \sum_{p=1}^{m}\sum_{q=1}^{n} a_p X_{pa} b_q}{\partial X_{ij}} =\frac{\partial a_i X_{ij} b_j}{\partial X_{ij}} =a_ib_j XaTXb=Xijp=1mq=1napXpabq=XijaiXijbj=aibj

  • 采用分母布局,最终结果为 m ∗ n m*n mn的矩阵。所以有
    ∂ a T X b ∂ X = a b T \frac{\partial \mathbf{a}^TX\mathbf{b}}{\partial X} =\mathbf{a}\mathbf{b}^T XaTXb=abT

3.用定义法求解向量对向量的求导

  • 解决 向 量 向 量 \frac{向量}{向量}
举个例子

y = A x \mathbf{y}=A\mathbf{x} y=Ax,求解 ∂ A x ∂ x \frac{\partial A\mathbf{x}}{\partial\mathbf{x}} xAx A m ∗ n , x n ∗ 1 , y m ∗ 1 A_{m*n},\mathbf{x}_{n*1},\mathbf{y}_{m*1} Amn,xn1,ym1

  • 根据向量对向量的求导的结果应该为 m ∗ n m*n mn维的矩阵。

  • 先求矩阵的第 i i i行和向量的内积对向量的第 j j j分量求导,用定义法求解过程如下:
    ∂ A i x ∂ x j = ∂ ∑ k = 1 n A i k x k ∂ x j = A i j \frac{\partial A_i \mathbf{x}}{\partial x_{j}} =\frac{\partial \displaystyle \sum_{k=1}^{n}A_{ik}x_k}{\partial x_j} =A_{ij} xjAix=xjk=1nAikxk=Aij

  • 矩阵 A A A的第 i i i行和向量的内积对向量的第 j j j分量求导的结果就是矩阵 A A A ( i , j ) (i,j) (i,j)位置的值。

  • 因为采用了分子布局,所以求导结果为 A A A;而不是采用分母布局后的 A T A^T AT

    • 可见求导布局对于最后结果的输出的影响是很大的。结果上差一个转置。

小结

​ ==使用定义法虽然已经求出一些简单的向量矩阵求导的结果,但是对于复杂的求导式子,则中间运算会很复杂,=同时求导出的结果排列也是很麻烦。==所以需要引入微分法。

2. 微分法

  • 使用微分法来求解标量对向量的求导,以及标量对矩阵的求导。
  • 标量对向量的求导,以及标量对矩阵的求导使用分母布局。

1.矩阵微分

  • 解决( 标 量 向 量 , 标 量 矩 阵 \frac{标量}{向量},\frac{标量}{矩阵} ,)。
1.单变量
  • 解决 标 量 标 量 \frac{标量}{标量} ,这里不做探讨。

  • 单变量的微分和导入关系如下:
    d f = f ′ ( x ) d x df=f'(x)dx df=f(x)dx

2.多变量
  • 解决 标 量 向 量 \frac{标量}{向量}

  • 多元变量下的微分和导数的关系如下:
    d f = ∑ i = 1 n ∂ f ∂ x i d x i = ( ∂ f ∂ x ) T d x df=\sum_{i=1}^{n}\frac{\partial f}{\partial x_i} dx_i=(\frac{\partial f}{\partial \mathbf{x}})^T d \mathbf{x} df=i=1nxifdxi=(xf)Tdx

3.矩阵微分
  • 解决 标 量 矩 阵 \frac{标量}{矩阵}

  • 矩阵下的微分和导数的关系如下:
    d f = ∑ i = 1 m ∑ j = 1 n ∂ f ∂ X i j d X i j = t r ( ( ∂ f X ) T d X ) df=\displaystyle \sum_{i=1}^{m}\sum_{j=1}^{n}\frac{\partial f}{\partial X_{ij}}dX_{ij}=tr((\frac{\partial f}{X})^TdX) df=i=1mj=1nXijfdXij=tr((Xf)TdX)

迹函数

∑ i = 1 m ∑ j = 1 n A i j B j i = t r ( A T B ) \displaystyle \sum_{i=1}^{m} \sum_{j=1}^{n}A_{ij}B_{ji}=tr(A^TB) i=1mj=1nAijBji=tr(ATB)

  • 其中 A , B A,B A,B同型。

  • 举个例子:
    X = ( x 11 x 12 x 21 x 22 x 31 x 31 ) d X = ( d x 11 d x 12 d x 21 d x 22 d x 31 d x 31 ) ∴ d f = ∂ f ∂ x 11 d x 11 + ∂ f ∂ x 21 d x 21 + ∂ f ∂ x 31 d x 31 + ∂ f ∂ x 12 d x 12 + ∂ f ∂ x 22 d x 22 + ∂ f ∂ x 32 d x 32 X= \begin{pmatrix} x_{11}& x_{12}\\ x_{21}& x_{22}\\ x_{31}& x_{31} \end{pmatrix}\\ dX= \begin{pmatrix} dx_{11}& dx_{12}\\ dx_{21}& dx_{22}\\ dx_{31}& dx_{31} \end{pmatrix}\\ \therefore df = \frac{\partial f}{\partial x_{11}}dx_{11}+\frac{\partial f}{\partial x_{21}}dx_{21}+\frac{\partial f}{\partial x_{31}}dx_{31} +\frac{\partial f}{\partial x_{12}}dx_{12}+\frac{\partial f}{\partial x_{22}}dx_{22}+\frac{\partial f}{\partial x_{32}}dx_{32} X=x11x21x31x12x22x31dX=dx11dx21dx31dx12dx22dx31df=x11fdx11+x21fdx21+x31fdx31+x12fdx12+x22fdx22+x32fdx32

    ∴ d f = t r ( ( ∂ f ∂ x 11 ∂ f ∂ x 12 ∂ f ∂ x 21 ∂ f ∂ x 22 ∂ f ∂ x 31 ∂ f ∂ x 23 ) T ( d x 11 d x 12 d x 21 d x 22 d x 31 d x 31 ) ) \therefore df= tr( \begin{pmatrix} \frac{\partial f}{\partial x_{11}}& \frac{\partial f}{\partial x_{12}}\\ \frac{\partial f}{\partial x_{21}}& \frac{\partial f}{\partial x_{22}}\\ \frac{\partial f}{\partial x_{31}}& \frac{\partial f}{\partial x_{23}} \end{pmatrix}^T \begin{pmatrix} dx_{11}& dx_{12}\\ dx_{21}& dx_{22}\\ dx_{31}& dx_{31} \end{pmatrix}) df=tr(x11fx21fx31fx12fx22fx23fTdx11dx21dx31dx12dx22dx31)

    其中:
    ( ∂ f ∂ x 11 ∂ f ∂ x 12 ∂ f ∂ x 21 ∂ f ∂ x 22 ∂ f ∂ x 31 ∂ f ∂ x 23 ) T ( d x 11 d x 12 d x 21 d x 22 d x 31 d x 31 ) = ( ∂ f ∂ x 11 d x 11 + ∂ f ∂ x 21 d x 21 + ∂ f ∂ x 31 d x 31 ∗ ∗ ∂ f ∂ x 12 d x 12 + ∂ f ∂ 22 d x 22 + ∂ f ∂ x 32 d x 32 ) \begin{pmatrix} \frac{\partial f}{\partial x_{11}}& \frac{\partial f}{\partial x_{12}}\\ \frac{\partial f}{\partial x_{21}}& \frac{\partial f}{\partial x_{22}}\\ \frac{\partial f}{\partial x_{31}}& \frac{\partial f}{\partial x_{23}}\end{pmatrix}^T\begin{pmatrix} dx_{11}& dx_{12}\\ dx_{21}& dx_{22}\\ dx_{31}& dx_{31}\end{pmatrix}=\begin{pmatrix} \frac{\partial f}{\partial x_{11}}dx_{11}+\frac{\partial f}{\partial x_{21}}dx_{21}+\frac{\partial f}{\partial x_{31}}dx_{31}& *\\ *& \frac{\partial f}{\partial x_{12}}dx_{12}+\frac{\partial f}{\partial 22}dx_{22}+\frac{\partial f}{\partial x_{32}}dx_{32}\\ \end{pmatrix} x11fx21fx31fx12fx22fx23fTdx11dx21dx31dx12dx22dx31=(x11fdx11+x21fdx21+x31fdx31x12fdx12+22fdx22+x32fdx32)
    所以:
    d f = t r ( ( ∂ f X ) T d X ) df=tr((\frac{\partial f}{X})^TdX) df=tr((Xf)TdX)

统一表示
  • 上面矩阵微分的式子,可以看到矩阵微分和它的导数也有一个转置的关系,不过在外面套了一个迹函数而已。由于标量的迹函数就是它本身,那么矩阵微分和向量微分可以统一表示。即:
    向 量 微 分 : d f = t r ( ( ∂ f ∂ x ) T d x ) 矩 阵 微 分 : d f = = t r ( ( ∂ f X ) T d X ) 向量微分:df=tr((\frac{\partial f}{\partial \mathbf{x}})^T d \mathbf{x})\\ 矩阵微分:df==tr((\frac{\partial f}{X})^TdX) :df=tr((xf)Tdx):df==tr((Xf)TdX)

2.矩阵微分性质和迹函数的性质

矩阵微分的性质
  • 在后面的求导中有运用。
  1. 微分加减法: d ( X + Y ) = d X + d Y d(X+Y)=dX+dY d(X+Y)=dX+dY
  2. 微分乘法: d ( X Y ) = ( d X ) Y + X ( d Y ) d(XY)=(dX)Y+X(dY) d(XY)=(dX)Y+X(dY)
  3. 微分转置 d ( x T ) = ( d X ) T d(x^T)=(dX)^T d(xT)=(dX)T
  4. 微分的迹 t r ( d X ) = d ( t r ( X ) ) tr(dX)=d(tr(X)) tr(dX)=d(tr(X))
  5. 微分的哈达玛积 d ( X ⊙ Y ) = d ( X ) ⊙ d ( Y ) d(X\odot Y)=d(X)\odot d(Y) d(XY)=d(X)d(Y)
  6. 逐个元素求导 d ( σ ′ ( X ) ) = σ ′ ( X ) ⊙ d ( X ) d(\sigma'(X))=\sigma'(X)\odot d(X) d(σ(X))=σ(X)d(X)
  7. 逆矩阵微分: d ( X − 1 ) = − X − 1 d ( X ) X − 1 d(X^{-1})=-X^{-1}d(X)X^{-1} d(X1)=X1d(X)X1
  8. 行列式微分: d ( ∣ X ∣ ) = ∣ X ∣ t r ( X − 1 d X ) d(|X|)=|X|tr(X^{-1}dX) d(X)=Xtr(X1dX)

说明:

  1. 其中的哈达玛积的计算,一般表示为 A ⊙ B A\odot B AB A ∘ B A \circ B AB,参考百度即可:哈达玛积
  2. 上述的逆矩阵的微分和行列式的微分,个人并没有推导。
迹函数的性质
  • 在后面的求导中有运用。
  1. 标量的迹等于它本身 t r ( y ) = y tr(y)=y tr(y)=y
  2. 矩阵转置不改变迹的值 t r ( A T ) = t r ( A ) tr(A^T)=tr(A) tr(AT)=tr(A)
  3. 迹满足交换律 t r ( A B ) = t r ( B A ) tr(AB)=tr(BA) tr(AB)=tr(BA),其中 A , B T A,B^T A,BT同型。
  4. 迹的加减法 t r ( X + Y ) = t r ( X ) + t r ( Y ) ; t r ( X − Y ) = t r ( X ) − t r ( Y ) tr(X+Y)=tr(X)+tr(Y);tr(X-Y)=tr(X)-tr(Y) tr(X+Y)=tr(X)+tr(Y);tr(XY)=tr(X)tr(Y)
  5. 矩阵乘法和迹交换 t r ( ( A ⊙ B ) T ⊙ C ) = t r ( A T ( B ⊙ C ) ) tr((A\odot B)^T\odot C)=tr(A^T(B \odot C)) tr((AB)TC)=tr(AT(BC))。其中 A , B , C A,B,C A,B,C同型。

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

1.法则

​ 若标量函数 f f f是矩阵 X X X经加减乘法、逆、行列式、逐元素函数等运算构成。

  1. 则使用相应的运算法则对 f f f求微分。
  2. 再使用迹函数技巧给 d f df df套上迹。
  3. 并将其它项交换至 d X dX dX左侧。
  4. 那么对于迹函数里面在 d X dX dX左边的部分,我们只需要加一个转置就可以得到导数了。
2.例子
例1

y = a T X b y=a^TXb y=aTXb,求 ∂ y ∂ X \frac{\partial y}{\partial X} Xy a m ∗ 1 , X m ∗ n , b n ∗ 1 , y 1 ∗ 1 a_{m*1},X_{m*n},b_{n*1},y_{1*1} am1,Xmn,bn1,y11。类型 标 量 矩 阵 \frac{标量}{矩阵} y y y是一个标量, d y dy dy也是一个标量。

求解步骤:

  1. 使用微分法的乘法对 f f f求微分。
    d y = d ( a T ) X b + a T d ( X ) b + a T X d ( b ) = a T d ( X ) b dy=d(a^T)Xb+a^Td(X)b+a^TXd(b)=a^Td(X)b dy=d(aT)Xb+aTd(X)b+aTXd(b)=aTd(X)b

    • 因为最终是对 X X X求导( d X dX dX),那么微分中不含 d X dX dX的最终结果都为 0 0 0
  2. 等式两边进行取迹( t r tr tr)操作。
    d y = t r ( d y ) = t r ( a T d ( X ) b ) = t r ( b a T d ( X ) ) dy=tr(dy)=tr(a^Td(X)b)=tr(ba^Td(X)) dy=tr(dy)=tr(aTd(X)b)=tr(baTd(X))

    • 第一个等式成立是因为,标量的迹等于它本身,
    • 第二等式成立是因为,那本身等式的两边取迹。
    • 第三个等式成立是为,迹函数的性质三。
  3. 已经将 d X dX dX放在迹内的最右侧了,那么其前面的部分加上转置就是求导后的结果。
    ∂ f ∂ X = ( b a T ) T = a b T \frac{\partial f}{\partial X}=(ba^T)^T=ab^T Xf=(baT)T=abT
    查表Scalar-by-matrix identities的第8行,结果一致。采用分母布局。

例2

y = a T e x p ( X b ) y=a^Texp(Xb) y=aTexp(Xb),求 ∂ y ∂ X \frac{\partial y}{\partial X} Xy a m ∗ 1 , X m ∗ n , b n ∗ 1 , y 1 ∗ 1 a_{m*1},X_{m*n},b_{n*1},y_{1*1} am1,Xmn,bn1,y11。类型 标 量 矩 阵 \frac{标量}{矩阵} y y y是一个标量, d y dy dy也是一个标量。

  1. d y = d ( a ) e x p ( X b ) + a T d ( e x p ( X b ) ) = a T d ( e x p ( X b ) ) = a T e x p ( X b ) ⊙ d ( X b ) = a T e x p ( X b ) ⊙ ( d ( X ) b ) dy=d(a)exp(Xb)+a^Td(exp(Xb))\\ =a^Td(exp(Xb))\\ =a^Texp(Xb)\odot d(Xb)\\ =a^Texp(Xb)\odot (d(X)b)\\ dy=d(a)exp(Xb)+aTd(exp(Xb))=aTd(exp(Xb))=aTexp(Xb)d(Xb)=aTexp(Xb)(d(X)b)

    1. 第三个等式成立,是很显然的,用到哈达玛积。
    2. 第四个等式成立,目标是要剥离出 d X dX dX,同时这样的写法是没用问题的。 b b b对于 X X X来说是常数。可以展开来详细看看。
  2. d y = t r ( d y ) = t r ( a T e x p ( X b ) ⊙ ( d ( X ) b ) ) = t r ( ( a ⊙ e x p ( X b ) ) T ( d ( X ) b ) ) = t r ( ( a ⊙ e x p ( X b ) ) T d X b ) = t r ( b ( a ⊙ e x p ( X b ) ) T d X ) dy=tr(dy)=tr(a^Texp(Xb)\odot (d(X)b))\\ =tr((a \odot exp(Xb))^T(d(X)b))\\ =tr((a \odot exp(Xb))^TdXb)\\ =tr(b(a \odot exp(Xb))^TdX) dy=tr(dy)=tr(aTexp(Xb)(d(X)b))=tr((aexp(Xb))T(d(X)b))=tr((aexp(Xb))TdXb)=tr(b(aexp(Xb))TdX)

    1. 第一个等号是因为,标量的迹等于它本身。
    2. 第三个等号成立是因为,迹函数的技巧5,矩阵乘法和迹交换.
    3. 第六个等号成立是因为,去掉 d X dX dX的符号和原来一样,目标也是要把 d X dX dX给剥离出来。
    4. 最后一个等号成立是因为,迹的交换律。
  3. 所以最终结论为:
    ∂ y ∂ X = ( b ( a ⊙ e x p ( X b ) ) T ) T = ( a ⊙ e x p ( X b ) ) b T \frac{\partial y}{\partial X}=(b(a \odot exp(Xb))^T)^T=(a\odot exp(Xb))b^T Xy=(b(aexp(Xb))T)T=(aexp(Xb))bT

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

1.基本形式

∂ t r ( A B ) ∂ A \frac{\partial tr(AB)}{\partial A} Atr(AB),其中 A m ∗ n , B n ∗ m A_{m*n},B_{n*m} Amn,Bnm t r ( A B ) ( 1 ∗ 1 ) tr(AB)_{(1*1)} tr(AB)(11)是个标量。类型 标 量 矩 阵 \frac{标量}{矩阵}

  1. 展开
    d ( t r ( A B ) ) = t r ( d ( A B ) ) = t r ( d ( A ) B + A d B ) = t r ( d ( A ) B ) = t r ( B d A ) d(tr(AB))=tr(d(AB))=tr(d(A)B+AdB)=tr(d(A)B)=tr(BdA) d(tr(AB))=tr(d(AB))=tr(d(A)B+AdB)=tr(d(A)B)=tr(BdA)

    1. 第一个等式成立是以为, d d d操作和 t r tr tr操作可以互换。矩阵微分性质4,微分的迹。
    2. 第二个等式成立是因为,矩阵微分2,微分乘法。
    3. 第三个等式成立是因为,做种求的是关于 d A dA dA,所以不含 d ( A ) d(A) d(A)的项最终值均为 0 0 0,故舍去。
    4. 第四个等式成立是因为,迹函数技巧3,迹的交换律。
  2. 结果,加个转置
    ∂ t r ( A B ) ∂ A = B T \frac{\partial tr(AB)}{\partial A}=B^T Atr(AB)=BT

∂ t r ( A B ) ∂ B \frac{\partial tr(AB)}{\partial B} Btr(AB),其中 A m ∗ n , B n ∗ m A_{m*n},B_{n*m} Amn,Bnm t r ( A B ) ( 1 ∗ 1 ) tr(AB)_{(1*1)} tr(AB)(11)是个标量。

  • ∂ t r ( A B ) ∂ B = A T \frac{\partial tr(AB)}{\partial B}=A^T Btr(AB)=AT
2.例子

∂ t r ( W T A W ) ∂ W = ∂ ( W T A W ) ∂ W \frac{\partial tr(W^TAW)}{\partial W}=\frac{\partial (W^TAW)}{\partial W} Wtr(WTAW)=W(WTAW) W n ∗ 1 , A n ∗ n W_{n*1},A_{n*n} Wn1,Ann, W T A W ( 1 ∗ 1 ) W^TAW_{(1*1)} WTAW(11)是一个标量。类型 标 量 向 量 \frac{标量}{向量}

  1. d ( t r ( W T A W ) ) = t r ( d ( W T A W ) ) = t r ( d ( W T ) A W + W T A d ( W ) ) = t r ( ( d ( W ) T A W + W T A d ( W ) ) = t r ( ( d ( W ) ) T A W ) + t r ( W T A d ( W ) ) = t r ( ( A W ) T d ( W ) ) + t r ( W T A d ( W ) ) d(tr(W^TAW))=tr(d(W^TAW))\\ =tr(d(W^T)AW+W^TAd(W))\\ =tr((d(W)^TAW+W^TAd(W))\\ =tr((d(W))^TAW)+tr(W^TAd(W))\\ =tr((AW)^Td(W))+tr(W^TAd(W)) d(tr(WTAW))=tr(d(WTAW))=tr(d(WT)AW+WTAd(W))=tr((d(W)TAW+WTAd(W))=tr((d(W))TAW)+tr(WTAd(W))=tr((AW)Td(W))+tr(WTAd(W))

  2. 所以,
    ∂ t r ( W T A W ) ∂ W = ( ( A W ) T ) T + ( W T A ) T = A W + A T W = ( A + A T ) W \frac{\partial tr(W^TAW)}{\partial W}=((AW)^T)^T+(W^TA)^T=AW+A^TW=(A+A^T)W Wtr(WTAW)=((AW)T)T+(WTA)T=AW+ATW=(A+AT)W

小结

  1. 使用矩阵微分,可以在不对向量或矩阵中的某一元素单独求导再拼接,因此会比较方便,当然熟练使用的前提是对上面矩阵微分的性质,以及迹函数的性质熟练运用。
  2. 还有一些场景,求导的自变量和因变量直接有复杂的多层链式求导的关系,此时微分法使用起来也有些麻烦。如果我们可以利用一些常用的简单求导结果,再使用链式求导法则。

3.链式法

​ 求导的自变量和因变量直接有复杂的多层链式求导的关系,此时微分法使用起来也有些麻烦。使用矩阵向量求导链式法则,快速求出导数结果。

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

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

假设存在多个向量的依赖关系,如 x → y → z \mathbf{x}\rightarrow \mathbf{y} \rightarrow \mathbf{z} xyz。其中 x p ∗ 1 , y m ∗ 1 , z n ∗ 1 \mathbf{x}_{p*1},\mathbf{y}_{m*1},\mathbf{z}_{n*1} xp1,ym1,zn1

  • ∂ z ∂ x \frac{\partial \mathbf{z}}{\partial \mathbf{x}} xz应该是 ( n ∗ p ) (n*p) (np)维。采用分子布局,雅克比式。

  • 所以有:
    ∂ z ∂ x = ∂ z ∂ y ∂ y ∂ x \frac{\partial \mathbf{z}}{\partial \mathbf{x}}=\frac{\partial \mathbf{z}}{\partial \mathbf{y}}\frac{\partial \mathbf{y}}{\partial \mathbf{x}} xz=yzxy
    注意:这个写法只在全是向量的依存关系时,才是对的

  • 拓展: x → y 1 ⋯ → y n → z \mathbf{x}\rightarrow \mathbf{y_1} \cdots\rightarrow \mathbf{y_n}\rightarrow \mathbf{z} xy1ynz
    ∂ z ∂ x = ∂ z ∂ y n ∂ y n ∂ y n − 1 ⋯ ∂ y ∂ x \frac{\partial \mathbf{z}}{\partial \mathbf{x}}= \frac{\partial \mathbf{z}}{\partial \mathbf{y_n}} \frac{\partial \mathbf{y_n}}{\partial \mathbf{y_{n-1}}} \cdots \frac{\partial \mathbf{y}}{\partial \mathbf{x}} xz=ynzyn1ynxy

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

​ 在机器学习算法中,最终要优化的一般是一个标量损失函数,因此最后求导的目标是标量。所以这个更常用一点。

假设存在多个向量的依赖关系,如 x → y → z \mathbf{x}\rightarrow \mathbf{y} \rightarrow z xyz。其中 x p ∗ 1 , y m ∗ 1 , z 1 ∗ 1 \mathbf{x}_{p*1},\mathbf{y}_{m*1},\mathbf{z}_{1*1} xp1,ym1,z11 z z z是标量。

  • ∂ z ∂ x \frac{\partial z}{\partial \mathbf{x}} xz应该是 ( p ∗ 1 ) (p*1) (p1)维。采用分母布局。

  • ∂ z ∂ y \frac{\partial z}{\partial \mathbf{y}} yz ( m ∗ 1 ) (m*1) (m1)维,采用分母布局。 ∂ y ∂ x \frac{\partial \mathbf{y}}{\partial \mathbf{x}} xy ( m ∗ p ) (m*p) (mp)维。

  • 要使上述的链式求导时维度可以相容,即
    维 度 p ∗ 1 = 维 度 p ∗ m ∗ 维 度 m ∗ 1 维度_{p*1}=维度_{p*m}*维度_{m*1} p1=pmm1

    ∂ z ∂ x = ( ∂ y ∂ x ) T ∂ z ∂ y \frac{\partial z}{\partial \mathbf{x}}=(\frac{\partial \mathbf{y}}{\partial \mathbf{x}})^T\frac{\partial z}{\partial \mathbf{y}} xz=(xy)Tyz

  • 推论: x → y 1 ⋯ → y n → z \mathbf{x}\rightarrow \mathbf{y_1} \cdots\rightarrow \mathbf{y_n}\rightarrow z xy1ynz
    ∂ z ∂ x = ( ∂ y n ∂ y n − 1 ∂ y n − 1 ∂ y n − 2 ⋯ ∂ y 1 ∂ x ) T ∂ z ∂ y n \frac{\partial \mathbf{z}}{\partial \mathbf{x}}= ( \frac{\partial \mathbf{y_n}}{\partial \mathbf{y_{n-1}}} \frac{\partial \mathbf{y_{n-1}}}{\partial \mathbf{y_{n-2}}} \cdots \frac{\partial \mathbf{y_{1}}}{\partial \mathbf{x}} )^T \frac{\partial z}{\partial \mathbf{y_n}} xz=(yn1ynyn2yn1xy1)Tynz

例子

设有列向量 θ \theta θ,列向量 z = X θ − y \mathbf{z}=X\theta-\mathbf{y} z=Xθy,标量 l = z T z l=z^Tz l=zTz θ n ∗ 1 , X m ∗ n , y m ∗ 1 , l 1 ∗ 1 \theta_{n*1},X_{m*n},\mathbf{y}_{m*1},l_{1*1} θn1,Xmn,ym1,l11

构成: θ → z → l \theta \rightarrow \mathbf{z} \rightarrow l θzl,求 ∂ l ∂ θ \frac{\partial l}{\partial \theta} θl
∂ l ∂ θ = ( ∂ z ∂ θ ) T ∂ l ∂ z \frac{\partial l}{\partial \theta}=(\frac{\partial \mathbf{z}}{\partial \theta})^T\frac{\partial l}{\partial \mathbf{z}} θl=(θz)Tzl

  • ∂ z ∂ θ = ∂ ( X θ − y ) ∂ θ = ∂ ( X θ ) ∂ θ = 向 量 向 量 = X \frac{\partial \mathbf{z}}{\partial \theta}=\frac{\partial (X\theta-\mathbf{y})}{\partial \theta}=\frac{\partial (X\theta)}{\partial \theta}=\frac{向量}{向量}=X θz=θ(Xθy)=θ(Xθ)==X

    • 采用分子布局, ∂ ( X θ ) ∂ θ \frac{\partial (X\theta)}{\partial \theta} θ(Xθ)是( m ∗ n m*n mn)维。所以结果是 X m ∗ n X_{m*n} Xmn,而不是 X T X^T XT
  • ∂ l ∂ z = ∂ z T z ∂ z = 标 量 向 量 = 2 z \frac{\partial l}{\partial \mathbf{z}}=\frac{\partial z^Tz}{\partial z}=\frac{标量}{向量}=2z zl=zzTz==2z

    • 这个计算,可以用定义法求解。前面已经求过了。
  • ∂ l ∂ θ = ( ∂ z ∂ θ ) T ∂ l ∂ z = X T ( 2 z ) = 2 X T ( X θ − y ) \frac{\partial l}{\partial \theta}=(\frac{\partial \mathbf{z}}{\partial \theta})^T\frac{\partial l}{\partial \mathbf{z}}=X^T(2\mathbf{z})=2X^T(X\theta - \mathbf{y}) θl=(θz)Tzl=XT(2z)=2XT(Xθy)

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

假设有 X → Y → z X \rightarrow Y \rightarrow z XYz。其中 X p ∗ q , Y m ∗ n , z 1 ∗ 1 X_{p*q},Y_{m*n},z_{1*1} Xpq,Ymn,z11 X , Y X,Y X,Y是矩阵,$z是标量。求网络的参数。

  • 矩阵对矩阵的求导是比较复杂的定义,不给出基于矩阵整体的链式求导法则。参考

  • 给出对矩阵中一个标量的链式求导方法。

  • 虽然我们没有全局的标量对矩阵的链式求导法则,但是对于一些线性关系的链式求导,还是可以得到一些有用的结论的。
    ∂ z ∂ x i j = ∑ k , l ∂ z ∂ Y k l ∂ Y k l ∂ x i j = t r ( ( ∂ z ∂ Y ) T ∂ Y ∂ x i j ) \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}}) xijz=k,lYklzxijYkl=tr((Yz)TxijY)

    • 其中 k , l k,l k,l分别从 Y Y Y的行数和列数中取值(或列数和行数)。
    • 第一等式成立是以为,在 X X X中的一个元素 x i j x_{ij} xij都和 Y Y Y中的元素 y k l y_{kl} ykl相关。同时对于 Y Y Y的某个确定的 y k ∗ l ∗ y_{k_{*}l_{*}} ykl y k ∗ l ∗ y_{k_{*}l_{*}} ykl总是和 z z z相关。所以出现对 Y Y Y中的每个元素对 x i j x_{ij} xij求导, z z z对每个 Y Y Y中的元素求导,然后用链式穿起来(因为都是标量,所以谁前谁后没关系)。
    • 第二等式成立是以为,前面矩阵微分已经详细说明了,并且举了例子。

经典例子

A , X , B , Y A,X,B,Y A,X,B,Y都是矩阵, z z z是标量,其中 z = f ( Y ) , Y = A X + B z=f(Y),Y=AX+B z=f(Y),Y=AX+B。求 ∂ z ∂ X \frac{\partial z}{\partial X} Xz就是经典的机器学习中问题。 A A A是参数矩阵, X X X是数据集构成的矩阵。其中 X m ∗ n , A p ∗ m , Y p ∗ n , z 1 ∗ 1 , B p ∗ n X_{m*n},A_{p*m},Y_{p*n},z_{1*1},B_{p*n} Xmn,Apm,Ypn,z11,Bpn

  1. 标量的链式求导法则求 ∂ z ∂ x i j \frac{\partial z}{\partial x_{ij}} xijz
    ∂ z ∂ x i j = ∑ k , l ∂ z ∂ Y k l ∂ Y k l ∂ x i j \frac{\partial z}{\partial x_{ij}}=\sum_{k,l}\frac{\partial z}{\partial Y_{kl}}\frac{\partial Y_{kl}}{\partial x_{ij}} xijz=k,lYklzxijYkl

  2. 对于 ∂ Y k l ∂ x i j \frac{\partial Y_{kl}}{\partial x_{ij}} xijYkl
    ∂ Y k l ∂ x i j = ∂ ∑ s ( A k s x s l ) ∂ x i j = ∂ ( A k i x i l ) ∂ x i j = { A k i , l = j 0 , l ≠ j = A k i δ l j . 当 l = j 时 , δ l j = 1 ; 当 l ≠ j 时 , δ l j = 0. \frac{\partial Y_{kl}}{\partial x_{ij}}=\frac{\partial \displaystyle \sum_{s}(A_{ks}x_{sl})}{\partial x_{ij}}=\frac{\partial (A_{ki}x_{il})}{\partial x_{ij}}=\begin{cases}A_{ki},l=j \\0,l\neq j\end{cases}=A_{ki}\delta_{lj}.\\当l=j时,\delta_{lj}=1;当l \neq j时,\delta_{lj}=0. xijYkl=xijs(Aksxsl)=xij(Akixil)={Aki,l=j0,l=j=Akiδlj.l=jδlj=1;l=j,δlj=0.

    1. 第一个等号成立是因为,为了方便第二个等式的推导。其实没必要给出,给出的目的只是为了强化矩阵的乘法。
      • 算的的标量的求导,那么对于 x i j x_{ij} xij的偏导一定是一个变量,说白了就是矩阵相乘时 x i j x_{ij} xij前的系数。这个系数的计算肯定用到矩阵的乘法。
    2. 第二个等式成立是因为:
      • X X X A A A相乘,现在已经知道是对 X i j X_{ij} Xij求导,它在第 i i i行出现,对应的 A k l A_{kl} Akl一定在第 i i i列。所以 s = i s=i s=i。所以锁定 A k i A_{ki} Aki。其中的 k k k是已经确定的,相当于知道了是 A A A的第 k k k行。
      • A k i A_{ki} Aki相乘的元素,对应 X X X中的第 i i i行,可以表示为 A k i x i l A_{ki}x_{il} Akixil, l l l取尽 X X X中的所有列。因为要求的是 x i j x_{ij} xij的导数,所以在 l = j l=j l=j时,对它的导数为 A k i A_{ki} Aki,在 l ≠ j l \neq j l=j时,对它的导数 0 0 0
  3. 所以
    ∂ z ∂ x i j = ∑ k , l ∂ z ∂ Y k l ∂ Y k l ∂ x i j = ∑ k ∂ z ∂ Y k j A k i δ l j = ∑ k ∂ z ∂ Y k j A k \frac{\partial z}{\partial x_{ij}}=\sum_{k,l}\frac{\partial z}{\partial Y_{kl}}\frac{\partial Y_{kl}}{\partial x_{ij}}=\sum_{k}\frac{\partial z}{\partial Y_{kj}}A_{ki}\delta_{lj}=\sum_{k}\frac{\partial z}{\partial Y_{kj}}A_{k} xijz=k,lYklzxijYkl=kYkjzAkiδlj=kYkjzAk

    • 第二个等式成立是因为,取尽所有 Y Y Y中的列数得出的结果。
      • l ≠ j l \neq j l=j时, δ \delta δ 0 0 0 l = j l = j l=j时, δ \delta δ 1 1 1
    • 第三个等式成立是因为,去掉 δ \delta δ并不会该变其值。因为 δ \delta δ的取值只有 0 或 1 0或1 01
  4. 对于 ∑ k ∂ z ∂ Y k j A k i \sum_{k}\frac{\partial z}{\partial Y_{kj}}A_{ki} kYkjzAki

    • 这个可以写成矩阵的表达形式。

    • 以为是对 k k k进行遍历求和,而给出的只有 ( k ∗ i ) (k*i) (ki) ( k ∗ l ) (k*l) (kl)。通过矩阵相乘的概念, k k k应该出现在矩阵相乘维度相容的中间,即 ( i ∗ k ) 和 ( k ∗ l ) (i*k)和(k*l) (ik)(kl) ( l ∗ k ) 和 ∗ ( k ∗ i ) (l*k)和*(k*i) (lk)(ki)

    • 若采用 ( i ∗ k ) 和 ( k ∗ l ) (i*k)和(k*l) (ik)(kl),矩阵 A T A^T AT的第 i i i行和 ∂ z ∂ Y \frac{\partial z}{\partial Y} Yz的第 j j j列的内积。
      ∂ z ∂ X = A T ∂ z ∂ Y \frac{\partial z}{\partial X}=A^T\frac{\partial z}{\partial Y} Xz=ATYz

      • 因为采用分布分母布局,所以 ∂ z ∂ X \frac{\partial z}{\partial X} Xz应该是$m*n维的。
        • A T A^T AT m ∗ p m*p mp的, ∂ z ∂ Y \frac{\partial z}{\partial Y} Yz p ∗ n p*n pn的。
        • 所以上述是维度是匹配的(相容的)。
    • 若采用 ( l ∗ k ) 和 ( k ∗ i ) (l*k)和(k*i) (lk)(ki),矩阵 ( ∂ z ∂ Y ) T (\frac{\partial z}{\partial Y})^T (Yz)T的第 l l l行和 A A A的第 i i i列的内积。
      ∂ z ∂ X = ( ∂ z ∂ Y ) T A \frac{\partial z}{\partial X}=(\frac{\partial z}{\partial Y})^TA Xz=(Yz)TA

      • 因为采用的是分母布局,所以上述的表达式维度相容,故舍去。

结论

  • 约定:采用分母布局。
结论1
  1. A , X , B , Y A,X,B,Y A,X,B,Y都是矩阵, z z z是标量,其中 z = f ( Y ) , Y = A X + B z=f(Y),Y=AX+B z=f(Y),Y=AX+B。求 ∂ z ∂ X \frac{\partial z}{\partial X} Xz

z = f ( Y ) , Y = A X + B z=f(Y),Y=AX+B z=f(Y),Y=AX+B

​ 则
∂ z ∂ X = A T ∂ z ∂ Y \frac{\partial z}{\partial X}=A^T\frac{\partial z}{\partial Y} Xz=ATYz
​ 2. 设 A A A都是矩阵, x , y , b \mathbf{x},\mathbf{y},b x,y,b是向量, z z z是标量,其中 z = f ( Y ) , Y = A x + b z=f(Y),Y=A\mathbf{x}+b z=f(Y),Y=Ax+b。求 ∂ z ∂ x \frac{\partial z}{\partial \mathbf{x}} xz
z = f ( Y ) , Y = A x + b z=f(Y),Y=A\mathbf{x}+b z=f(Y),Y=Ax+b

∂ z ∂ x = A T ∂ z ∂ y \frac{\partial z}{\partial \mathbf{x}}=A^T\frac{\partial z}{\partial \mathbf{y}} xz=ATyz

结论2
  • 如果要求导的自变量在左边,线性变换在右边,也有类似稍有不同的结论如下
  1. A , X , B , Y A,X,B,Y A,X,B,Y都是矩阵, z z z是标量,其中 z = f ( Y ) , Y = X A + B z=f(Y),Y=XA+B z=f(Y),Y=XA+B。求 ∂ z ∂ X \frac{\partial z}{\partial X} Xz
    z = f ( Y ) , Y = X A + B z=f(Y),Y=XA+B z=f(Y),Y=XA+B

    ∂ z ∂ X = ∂ z ∂ Y A T \frac{\partial z}{\partial X}=\frac{\partial z}{\partial Y}A^T Xz=YzAT

  2. X X X是矩阵, a , y , b \mathbf{a},\mathbf{y},b a,y,b是向量, z z z是标量,其中 z = f ( Y ) , Y = X a + b z=f(Y),Y=X\mathbf{a}+b z=f(Y),Y=Xa+b。求 ∂ z ∂ x \frac{\partial z}{\partial \mathbf{x}} xz
    z = f ( Y ) , Y = X a + b z=f(Y),Y=X\mathbf{a}+b z=f(Y),Y=Xa+b

    ∂ z ∂ X = ∂ z ∂ y a T \frac{\partial z}{\partial X}=\frac{\partial z}{\partial \mathbf{y}}\mathbf{a}^T Xz=yzaT

技巧
  • 无论自变量在那边,均采用分母布局的方式处理 标 量 矩 阵 \frac{标量}{矩阵}
  • ∂ z ∂ X = 参 数 矩 阵 T ∗ ∂ z ∂ Y \frac{\partial z}{\partial X}= 参数矩阵^T * \frac{\partial z}{\partial Y} Xz=TYz ∂ z ∂ X = ∂ z ∂ Y ∗ 参 数 矩 阵 T \frac{\partial z}{\partial X}= \frac{\partial z}{\partial Y} * 参数矩阵^T Xz=YzT。至于是那种形式,根据矩阵相乘时的维度相容即可判别。

小结

  • 在同等情况下,优先考虑链式求导法,尤其后面的的四个结论。其次选择微分法、最后考虑定义法。
  • 没有结局的问题是,矩阵对矩阵的求导,还有矩阵对向量,向量对矩阵求导这三种形式。这个遇到的不多,具体参考:https://www.cnblogs.com/pinard/p/10930902.html。
  • 常见的形式是: 标 量 标 量 , 标 量 向 量 , 标 量 矩 阵 , 向 量 标 量 , 向 量 向 量 , 矩 阵 标 量 \frac{标量}{标量},\frac{标量}{向量},\frac{标量}{矩阵},\frac{向量}{标量},\frac{向量}{向量},\frac{矩阵}{标量} ,,,,,
    • 重点: 标 量 向 量 , 标 量 矩 阵 , 向 量 向 量 \frac{标量}{向量},\frac{标量}{矩阵},\frac{向量}{向量} ,,
  • (矩阵微分性质+迹函数技巧)是真的强大,,矩阵向量链式求导法则(向量对多个向量求导,标量对多个向量求导,标量对多个矩阵的求导)【维度相容】。

参考:

这个是真的大佬!

  1. 求导定义与求导布局
  2. 矩阵向量求导之定义法
  3. 矩阵向量求导之微分法
  4. 矩阵向量求导链式法则
  5. 矩阵对矩阵的求导
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值