zoukankan      html  css  js  c++  java
  • 矩阵、向量求导法则

    矩阵微分

    http://www.iwenchao.com/mathematics/matrix-differential.html

    http://en.wikipedia.org/wiki/Matrix_calculus

    http://www.atmos.washington.edu/~dennis/MatrixCalculus.pdf

    https://ccrma.stanford.edu/~dattorro/matrixcalc.pdf

    http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=3274 里面的电子书 不错很全面

    矩阵微分(Matrix Differential)

     

    矩阵微分(Matrix Differential)也称矩阵求导(Matrix Derivative),在机器学习、图像处理、最优化等领域的公式推导过程中经常用到。本文将对各种形式下的矩阵微分进行详细的推导。

    1. 符号说明

    d(y)/d(x) 是一个列向量,其中的元素 (i) 为 d(yi)/d(x)
    d(y)/d(x) 是一个列向量,其中的元素 (i) 为 d(y)/d(xi)
    d(yT)/d(x) 是一个矩阵,其中的元素 (i,j) 为 d(yj)/d(xi)
    d(Y)/d(x) 是一个矩阵,其中的元素 (i,j) 为 d(Yi,j)/d(x)
    d(y)/d(X) 是一个矩阵,其中的元素 (i,j) 为 d(y)/d(Xi,j)
    接下来的微分计算中,假定ABC是常矩阵与X无关,YZX相关。

    2. 一次函数的微分(Linear Products)

    首先介绍一个重要的性质(类似于函数的求导): d(YZ)/d(x)=Y*d(Z)/d(x)+d(Y)/d(x)*Z,注意到分母中的x是标量(Scalar)。在微分中分母是向量的情况下,个人经验是:若d(行向量)/d(列向量)或者d(列向量)/d(行向量),则也适合这个公式,如下面的前两个公式。

      • d(xTA)/d(x) = A 
        推导过程:d(xTA)/d(x) = A*d(xT)/d(x)+xT*d(A)/d(x) = A*I+0 = A。若A为向量a也适用。
      • d(Ax)/d(xT) = A
      • 推导过程:d(
    Ax
        )/d(
    xT
        ) = [d(
    xTAT
        )/d(
    x
        )]
    T
         = (
    AT
        )
    T
         = 
    A
      • d(aTXb)/d(X) = abT
      • 首先求出
    aTXb
         = 
    aTX:,1b1
         + 
    aTX:,2b2
         + ... + 
    aTX:,nbn
        ,这是一个实数,所以对应的
    Xi,j
        的系数构成的矩阵就为微分结果,易得
    abT
        。若
    a
    b
        为矩阵
    A
    B
        公式也适用。
      • d(aTXTb)/d(X) = baT
      • 计算过程同上,若
    a
    b
        为矩阵
    A
    B
      公式也适用。

    注意,有些书上有这些公式:d(xA)/d(x)=A; d(Ax)/d(x)=AT。考虑到x为列向量,则Ax也为列向量,列向量对列向量的求导按照《矩阵论》中的公式,结果会是一个列向量而不是公式中的AT。这些特殊的情况就让数学家去钻研吧,应用研究很少遇到。

    3. 二次函数的微分(Quadratic Products)

    下面的讨论主要针对分子为二次的情况,分母还是向量或者矩阵。分母为高阶的情况较少,典型的例子有Hessian矩阵,在文章最后会介绍。

      • d(xTAx)/d(x) = (A+AT)x
      • 在SVM求对偶的过程中有这一步求导。用展开的方式可以很快求得。若
    A
        为对称阵,则d(
    xTAx
        )/d(
    x
        ) = 2
    Ax
    • d[(Ax+b)TC(Dx+e)]/d(x) = ATC(Dx+e) + DTCT(Ax+b)
    • 这是该形式最为通用的公式。
    • d(aTXTXb)/d(X) = X(abT + baT)
      • 特殊情况:d(aTXTXa)/d(X) = 2XaaT
    • d(aTXTCXb)/d(X) = CTXabT + CXbaT
      • d(aTXTCXa)/d(X) = (C + CT)XaaT
      • d(aTXTCXa)/d(X) 2CXaaT,若C对称。
    • d[(Xa+b)TC(Xa+b)]/d(X) = (C+CT)(Xa+b)aT

    4. 矩阵的迹的微分(Trace)

    在矩阵的迹tr()中的矩阵必须为方阵。设有N阶矩阵A,那么矩阵的迹tr(A)就等于A的特征值的总和,也为A矩阵的主对角线元素的总和,tr(AB)=tr(BA)。

    • d(tr(X))/d(X) = I
    • d(tr(Xk))/d(X) =k(Xk-1)T
    • d[tr(ATXBT)]/d(X) = d[tr(BXTA)]/d(X) = AB
      • d[tr(XAT)]/d(X) = d[tr(ATX)]/d(X) =d[tr(XTA)]/d(X) = d[tr(AXT)]/d(X= A
    • d[tr(AXBXT)]/d(X) = ATXBT + AXB
      • d[tr(XAXT)]/d(X) = X(A+AT)
      • d[tr(XTAX)]/d(X) = XT(A+AT)
      • d[tr(AXTX)]/d(X) = (A+AT)X
    • d[tr(AXBX)]/d(X) = ATXTBT + BTXTAT

    5. 雅可比矩阵(Jacobian)

    雅可比矩阵也可以看做是向量对向量的求导而得到的,如果y=f(x),则对应的雅可比矩阵J=d(y)/d(xT)。

    Jacobian

    6. 海森矩阵(Hessian matrix)

    如果y=f(x),则d[d(f)/d(x)]/d(x)是海森矩阵。在最优化中海森矩阵有诸多用途,如求最大值,最小值,鞍点等。

    • d2(Ax+b)TC(Dx+e)/d(X2)= ATCD + DTCTA

    Hessian

    矩阵求导好像读书的时候都没学过,因为讲矩阵的课程上不讲求导,讲求导的课又不提矩阵。如果从事机器学习方面的工作,那就一定会遇到矩阵求导的东西。维基百科上: http://en.wikipedia.org/wiki/Matrix_calculus  , 根据Y与X的不同类型(实值,向量,矩阵),给出了具体的求导公式,以及一堆相关的公式,查起来都费劲。

    机器学习中常用的矩阵求导公式

    其实在实际的机器学习工作中,最常用到的就是实值函数y对向量X的求导,定义如下(其实就是y对向量X的每一个元素求导):
    机器学习中常用的矩阵求导公式

    实值函数对矩阵X求导也类似:
    机器学习中常用的矩阵求导公式

    因为机器学习(这里指的是有监督的机器学习)的一般套路是给定输入X,选择一个模型f作为决策函数,由f(X)预测出Y'。而得到f的参数θ(往往是向量),需要定义一个loss函数(一般都是实值函数),描述当前f预测值Y'与实际的Y值的接近程度。模型学习的过程就是求使得 loss函数 L(f(X),Y)最小的参数θ。这是一个最优化问题,实际应用中都是用和梯度相关的最优化方法,如梯度下降,共轭梯度,拟牛顿法等等。

    其实只要掌握上面这个公式,就能搞定很多问题了。 

    为了方便推导,下面列出一些机器学习中常用的求导公式,其中andrew ng那一套用矩阵迹的方法还是挺不错的,矩阵的迹也是实值的,而一个实数的迹等于其本身,实际工作中可以将loss函数转化成迹,然后在求导,可能会简化推导的步骤。 

    机器学习中常用的矩阵求导公式

    以上只是一些最基本的公式,能够解决一些问题,主要是减少大家对矩阵求导的恐惧感。关于矩阵方面的更多信息可以参考上面的wiki链接以及《Matrix cookbook》(感谢  @王树森 CS 推荐)。 

    基本公式:
    Y = A * X --> DY/DX = A'
    Y = X * A --> DY/DX = A
    Y = A' * X * B --> DY/DX = A * B'
    Y = A' * X' * B --> DY/DX = B * A'

    1. 矩阵Y对标量x求导:

    相当于每个元素求导数后转置一下,注意M×N矩阵求导后变成N×M了

    Y = [y(ij)] --> dY/dx = [dy(ji)/dx]

    2. 标量y对列向量X求导:

    注意与上面不同,这次括号内是求偏导,不转置,对N×1向量求导后还是N×1向量

    y = f(x1,x2,..,xn) --> dy/dX = (Dy/Dx1,Dy/Dx2,..,Dy/Dxn)'

    3. 行向量Y'对列向量X求导:

    注意1×M向量对N×1向量求导后是N×M矩阵。

    将Y的每一列对X求偏导,将各列构成一个矩阵。

    重要结论:

    dX'/dX = I

    d(AX)'/dX = A'

    4. 列向量Y对行向量X’求导:

    转化为行向量Y’对列向量X的导数,然后转置。

    注意M×1向量对1×N向量求导结果为M×N矩阵。

    dY/dX' = (dY'/dX)'

    5. 向量积对列向量X求导运算法则:

    注意与标量求导有点不同。

    d(UV')/dX = (dU/dX)V' + U(dV'/dX)

    d(U'V)/dX = (dU'/dX)V + (dV'/dX)U'

    重要结论:

    d(X'A)/dX = (dX'/dX)A + (dA/dX)X' = IA + 0X' = A

    d(AX)/dX' = (d(X'A')/dX)' = (A')' = A

    d(X'AX)/dX = (dX'/dX)AX + (d(AX)'/dX)X = AX + A'X

    6. 矩阵Y对列向量X求导:

    将Y对X的每一个分量求偏导,构成一个超向量。

    注意该向量的每一个元素都是一个矩阵。

    7. 矩阵积对列向量求导法则:

    d(uV)/dX = (du/dX)V + u(dV/dX)

    d(UV)/dX = (dU/dX)V + U(dV/dX)

    重要结论:

    d(X'A)/dX = (dX'/dX)A + X'(dA/dX) = IA + X'0 = A

    8. 标量y对矩阵X的导数:

    类似标量y对列向量X的导数,

    把y对每个X的元素求偏导,不用转置。

    dy/dX = [ Dy/Dx(ij) ]

    重要结论:

    y = U'XV = ΣΣu(i)x(ij)v(j) 于是 dy/dX = [u(i)v(j)] = UV'

    y = U'X'XU 则 dy/dX = 2XUU'

    y = (XU-V)'(XU-V) 则 dy/dX = d(U'X'XU - 2V'XU + V'V)/dX = 2XUU' - 2VU' + 0 = 2(XU-V)U'

    9. 矩阵Y对矩阵X的导数:

    将Y的每个元素对X求导,然后排在一起形成超级矩阵。

    10.乘积的导数

    d(f*g)/dx=(df'/dx)g+(dg/dx)f'

    结论

    d(x'Ax)=(d(x'')/dx)Ax+(d(Ax)/dx)(x'')=Ax+A'x   (注意:''是表示两次转置)

    比较详细点的如下:

     [转载]矩阵求导公式【转】


    [转载]矩阵求导公式【转】

    [转载]矩阵求导公式【转】

    [转载]矩阵求导公式【转】

    [转载]矩阵求导公式【转】

    http://lzh21cen.blog.163.com/blog/static/145880136201051113615571/

    http://hi.baidu.com/wangwen926/blog/item/eb189bf6b0fb702b720eec94.html

    其他参考:

    Contents

    • Notation
    • Derivatives of Linear Products
    • Derivatives of Quadratic Products

    Notation

    • d/dx (y) is a vector whose (i) element is dy(i)/dx
    • d/dx (y) is a vector whose (i) element is dy/dx(i)
    • d/dx (yT) is a matrix whose (i,j) element is dy(j)/dx(i)
    • d/dx (Y) is a matrix whose (i,j) element is dy(i,j)/dx
    • d/dX (y) is a matrix whose (i,j) element is dy/dx(i,j)

    Note that the Hermitian transpose is not used because complex conjugates are not analytic.

    In the expressions below matrices and vectors ABC do not depend on X.

    Derivatives of Linear Products

    • d/dx (AYB) =A * d/dx (Y) * B
      • d/dx (Ay) =A * d/dx (y)
    • d/dx (xTA) =A
      • d/dx (xT) =I
      • d/dx (xTa) = d/dx (aTx) = a
    • d/dX (aTXb) = abT
      • d/dX (aTXa) = d/dX (aTXTa) = aaT
    • d/dX (aTXTb) = baT
    • d/dx (YZ) =Y * d/dx (Z) + d/dx (Y) * Z

    Derivatives of Quadratic Products

    • d/dx (Ax+b)TC(Dx+e) = ATC(Dx+e) + DTCT(Ax+b)
      • d/dx (xTCx) = (C+CT)x
        • [C: symmetric]: d/dx (xTCx) = 2Cx
        • d/dx (xTx) = 2x
      • d/dx (Ax+b)T (Dx+e) = AT (Dx+e) + DT (Ax+b)
        • d/dx (Ax+b)T (Ax+b) = 2AT (Ax+b)
      • [C: symmetric]: d/dx (Ax+b)TC(Ax+b) = 2ATC(Ax+b)
    • d/dX (aTXTXb) = X(abT + baT)
      • d/dX (aTXTXa) = 2XaaT
    • d/dX (aTXTCXb) = CTXabT + CXbaT
      • d/dX (aTXTCXa) = (C + CT)XaaT
      • [C:Symmetric] d/dX (aTXTCXa) = 2CXaaT
    • d/dX ((Xa+b)TC(Xa+b)) = (C+CT)(Xa+b)aT

    Derivatives of Cubic Products

    • d/dx (xTAxxT) = (A+AT)xxT+xTAxI

    Derivatives of Inverses

    • d/dx (Y-1) = -Y-1d/dx (Y)Y-1

    Derivative of Trace

    Note: matrix dimensions must result in an n*n argument for tr().

    • d/dX (tr(X)) = I
    • d/dX (tr(Xk)) =k(Xk-1)T
    • d/dX (tr(AXk)) = SUMr=0:k-1(XrAXk-r-1)T
    • d/dX (tr(AX-1B)) = -(X-1BAX-1)T
      • d/dX (tr(AX-1)) =d/dX (tr(X-1A)) = -X-TATX-T
    • d/dX (tr(ATXBT)) = d/dX (tr(BXTA)) = AB
      • d/dX (tr(XAT)) = d/dX (tr(ATX)) =d/dX (tr(XTA)) = d/dX (tr(AXT)= A
    • d/dX (tr(AXBXT)) = ATXBT + AXB
      • d/dX (tr(XAXT)) = X(A+AT)
      • d/dX (tr(XTAX)) = XT(A+AT)
      • d/dX (tr(AXTX)) = (A+AT)X
    • d/dX (tr(AXBX)) = ATXTBT + BTXTAT
    • [C:symmetric] d/dX (tr((XTCX)-1A) = d/dX (tr(A (XTCX)-1) = -(CX(XTCX)-1)(A+AT)(XTCX)-1
    • [B,C:symmetric] d/dX (tr((XTCX)-1(XTBX)) = d/dX (tr( (XTBX)(XTCX)-1) = -2(CX(XTCX)-1)XTBX(XTCX)-1 + 2BX(XTCX)-1

    Derivative of Determinant

    Note: matrix dimensions must result in an n*n argument for det().

    • d/dX (det(X)) = d/dX (det(XT)) = det(X)*X-T
      • d/dX (det(AXB)) = det(AXB)*X-T
      • d/dX (ln(det(AXB))) = X-T
    • d/dX (det(Xk)) = k*det(Xk)*X-T
      • d/dX (ln(det(Xk))) = kX-T
    • [Real] d/dX (det(XTCX)) = det(XTCX)*(C+CT)X(XTCX)-1
      • [C: Real,Symmetric] d/dX (det(XTCX)) = 2det(XTCX)* CX(XTCX)-1
    • [C: Real,Symmetricc] d/dX (ln(det(XTCX))) = 2CX(XTCX)-1

    Jacobian

    If y is a function of x, then dyT/dx is the Jacobian matrix of y with respect to x.

    Its determinant, |dyT/dx|, is the Jacobian of y with respect to x and represents the ratio of the hyper-volumes dy and dx. The Jacobian occurs when changing variables in an integration: Integral(f(y)dy)=Integral(f(y(x)) |dyT/dx| dx).

    Hessian matrix

    If f is a function of x then the symmetric matrix d2f/dx2 = d/dxT(df/dx) is the Hessian matrix of f(x). A value of x for which df/dx = 0 corresponds to a minimum, maximum or saddle point according to whether the Hessian is positive definite, negative definite or indefinite.

    • d2/dx2 (aTx) = 0
    • d2/dx2 (Ax+b)TC(Dx+e) = ATCD + DTCTA
      • d2/dx2 (xTCx) = C+CT
        • d2/dx2 (xTx) = 2I
      • d2/dx2 (Ax+b)T (Dx+e) = ATD + DTA
        • d2/dx2 (Ax+b)T (Ax+b) = 2ATA
      • [C: symmetric]: d2/dx2 (Ax+b)TC(Ax+b) = 2ATCA  
    http://www.psi.toronto.edu/matrix/calculus.html

    复杂矩阵问题求导方法:可以从小到大,从scalar到vector再到matrix。

     x is a column vector, A is a matrix

    d(Ax)/dx=AdAxdxA            

    d(xTA)/dxT=AdxTAdxTA   

    d(xTA)/dx=ATdxTAdxAT    

    d(xTAx)/dx=xT(AT+A)dxTAxdxxTATA

    practice:

     
     
     
     
     

     
  • 相关阅读:
    如何将DataTable转换成List<T>呢?
    mySql中SUBSTRING_INDEX函数用法
    常用 Git 命令清单
    git学习笔记
    MySql 获取表的字段名
    mysql从身份证号中提取生日、性别
    年月日转大写汉字
    ExtJs服务器端代理(Ajax)
    ExtJS客户端代理
    ExtJS 数据模型
  • 原文地址:https://www.cnblogs.com/diegodu/p/5623884.html
Copyright © 2011-2022 走看看