zoukankan      html  css  js  c++  java
  • 矩阵求导术(下)

     原文链接:https://zhuanlan.zhihu.com/p/24863977

    本文承接上篇 ,来讲矩阵对矩阵的求导术。使用小写字母x表示标量,粗体小写字母oldsymbol{x} 表示列向量,大写字母X表示矩阵。矩阵对矩阵的求导采用了向量化的思路,常应用于二阶方法求解优化问题。

    首先来琢磨一下定义。矩阵对矩阵的导数,需要什么样的定义?第一,矩阵F(p×q)对矩阵X(m×n)的导数应包含所有mnpq个偏导数frac{partial F_{kl}}{partial X_{ij}},从而不损失信息;第二,导数与微分有简明的联系,因为在计算导数和应用中需要这个联系;第三,导数有简明的从整体出发的算法。我们先定义向量oldsymbol{f}(p×1)对向量oldsymbol{x}(m×1)的导数frac{partial oldsymbol{f}}{partial oldsymbol{x}} = egin{bmatrix} frac{partial f_1}{partial x_1} & frac{partial f_2}{partial x_1} & cdots & frac{partial f_p}{partial x_1}\ frac{partial f_1}{partial x_2} & frac{partial f_2}{partial x_2} & cdots & frac{partial f_p}{partial x_2}\ vdots & vdots & ddots & vdots\ frac{partial f_1}{partial x_m} & frac{partial f_2}{partial x_m} & cdots & frac{partial f_p}{partial x_m}\ end{bmatrix}(m×p),有doldsymbol{f} = frac{partial oldsymbol{f} }{partial oldsymbol{x} }^T doldsymbol{x} ;再定义矩阵的(按列优先)向量化mathrm{vec}(X) = [X_{11}, ldots, X_{m1}, X_{12}, ldots, X_{m2}, ldots, X_{1n}, ldots, X_{mn}]^T(mn×1),并定义矩阵F对矩阵X的导数frac{partial F}{partial X} = frac{partial mathrm{vec}(F)}{partial mathrm{vec}(X)}(mn×pq)。导数与微分有联系mathrm{vec}(dF) = frac{partial F}{partial X}^T mathrm{vec}(dX)。几点说明如下:

    1. 按此定义,标量f对矩阵X(m×n)的导数frac{partial f}{partial X}是mn×1向量,与上篇的定义不兼容,不过二者容易相互转换。为避免混淆,用记号
abla_X f表示上篇定义的m×n矩阵,则有frac{partial f}{partial X}=mathrm{vec}(
abla_X f)。虽然本篇的技术可以用于标量对矩阵求导这种特殊情况,但使用上篇中的技术更方便。读者可以通过上篇中的算例试验两种方法的等价转换。
    2. 标量对矩阵的二阶导数,又称Hessian矩阵,定义为
abla^2_X f = frac{partial^2 f}{partial X^2} = frac{partial 
abla_X f}{partial X}(mn×mn),是对称矩阵。对向量frac{partial f}{partial X}或矩阵
abla_X f求导都可以得到Hessian矩阵,但从矩阵
abla_X f出发更方便。
    3. frac{partial F}{partial X} = frac{partialmathrm{vec} (F)}{partial X} = frac{partial F}{partial mathrm{vec}(X)} = frac{partialmathrm{vec}(F)}{partial mathrm{vec}(X)},求导时矩阵被向量化,弊端是这在一定程度破坏了矩阵的结构,会导致结果变得形式复杂;好处是多元微积分中关于梯度、Hessian矩阵的结论可以沿用过来,只需将矩阵向量化。例如优化问题中,牛顿法的更新Delta X,满足mathrm{vec}(Delta X) = -(
abla^2_X f)^{-1}mathrm{vec}(
abla_X f)
    4. 在资料中,矩阵对矩阵的导数还有其它定义,比如frac{partial F}{partial X} = left[frac{partial F_{kl}}{partial X}
ight](mp×nq),它能兼容上篇中的标量对矩阵导数的定义,但微分与导数的联系(dF等于frac{partial F}{partial X}中每个m×n子块分别与dX做内积)不够简明,不便于计算和应用。

    然后来建立运算法则。仍然要利用导数与微分的联系mathrm{vec}(dF) = frac{partial F}{partial X}^T mathrm{vec}(dX),求微分的方法与上篇相同,而从微分得到导数需要一些向量化的技巧:

    1. 线性:mathrm{vec}(A+B) = mathrm{vec}(A) + mathrm{vec}(B)
    2. 矩阵乘法:mathrm{vec}(AXB) = (B^T otimes A) mathrm{vec}(X),其中otimes表示Kronecker积,A(m×n)与B(p×q)的Kronecker积是Aotimes B = [A_{ij}B](mp×nq)。此式证明见张贤达《矩阵分析与应用》第107-108页。
    3. 转置:mathrm{vec}(A^T) = K_{mn}mathrm{vec}(A),A是m×n矩阵,其中K_{mn}(mn×mn)是交换矩阵(commutation matrix)。
    4. 逐元素乘法:mathrm{vec}(Aodot X) = mathrm{diag}(A)mathrm{vec}(X),其中mathrm{diag}(A)(mn×mn)是用A的元素(按列优先)排成的对角阵。

    观察一下可以断言,若矩阵函数F是矩阵X经加减乘法、行列式、逆、逐元素函数等运算构成,则使用相应的运算法则对F求微分,再做向量化并使用技巧将其它项交换至vec(dX)左侧,即能得到导数。

    再谈一谈复合:假设已求得frac{partial F}{partial Y},而Y是X的函数,如何求frac{partial F}{partial X}呢?从导数与微分的联系入手,mathrm{vec}(dF) = frac{partial F}{partial Y}^Tmathrm{vec}(dY) = frac{partial F}{partial Y}^Tfrac{partial Y}{partial X}^Tmathrm{vec}(dX) ,可以推出链式法则frac{partial F}{partial X} = frac{partial Y}{partial X}frac{partial F}{partial Y}

    和标量对矩阵的导数相比,矩阵对矩阵的导数形式更加复杂,从不同角度出发常会得到形式不同的结果。有一些Kronecker积和交换矩阵相关的恒等式,可用来做等价变形:

    1. (Aotimes B)^T = A^T otimes B^T
    2. mathrm{vec}(oldsymbol{ab}^T) = oldsymbol{b}otimesoldsymbol{a}
    3. (Aotimes B)(Cotimes D) = (AC)otimes (BD)。可以对F = D^TB^TXAC求导来证明,一方面,直接求导得到frac{partial F}{partial X} = (AC) otimes (BD);另一方面,引入Y = B^T X A,有frac{partial F}{partial Y} = C otimes D, frac{partial Y}{partial X} = A otimes B,用链式法则得到frac{partial F}{partial X} = (Aotimes B)(C otimes D)
    4. K_{mn} = K_{nm}^T, K_{mn}K_{nm} = I
    5. K_{pm}(Aotimes B) K_{nq} = Botimes A,A是m×n矩阵,B是p×q矩阵。可以对AXB^T做向量化来证明,一方面,mathrm{vec}(AXB^T) = (Botimes A)mathrm{vec}(X);另一方面,mathrm{vec}(AXB^T) = K_{pm}mathrm{vec}(BX^TA^T) = K_{pm}(Aotimes B)mathrm{vec}(X^T) = K_{pm}(Aotimes B) K_{nq}mathrm{vec}(X)

    接下来演示一些算例。

    例1:F = AX,X是m×n矩阵,求frac{partial F}{partial X}

    解:先求微分:dF=AdX,再做向量化,使用矩阵乘法的技巧,注意在dX右侧添加单位阵:mathrm{vec}(dF) = mathrm{vec}(AdX) = (I_notimes A)mathrm{vec}(dX),对照导数与微分的联系得到frac{partial F}{partial X} = I_notimes A^T

    特例:如果X退化为向量, oldsymbol{f} = A oldsymbol{x} ,则根据向量的导数与微分的关系 doldsymbol{f} = frac{partial oldsymbol{f}}{partial oldsymbol{x}}^T doldsymbol{x},得到 frac{partial oldsymbol{f}}{partial oldsymbol{x}} = A^T 。

    例2:f = log |X| ,X是n×n矩阵,求
abla_X f
abla^2_X f

    解:使用上篇中的技术可求得
abla_X f = X^{-1T} 。为求
abla^2_X f,先求微分:d
abla_X f = -(X^{-1}dXX^{-1})^T,再做向量化,使用转置和矩阵乘法的技巧mathrm{vec}(d
abla_X f)= -K_{nn}mathrm{vec}(X^{-1}dX X^{-1}) = -K_{nn}(X^{-1T}otimes X^{-1})mathrm{vec}(dX),对照导数与微分的联系,得到
abla^2_X f = -K_{nn}(X^{-1T}otimes X^{-1}),注意它是对称矩阵。在X是对称矩阵时,可简化为
abla^2_X f = -X^{-1}otimes X^{-1}

    例3:F = Aexp(XB),A是l×m,X是m×n,B是n×p矩阵,exp()为逐元素函数,求frac{partial F}{partial X}

    解:先求微分:dF = A(exp(XB)odot (dXB)),再做向量化,使用矩阵乘法的技巧:mathrm{vec}(dF) = (I_potimes A)mathrm{vec}(exp(XB)odot (dXB)),再用逐元素乘法的技巧:mathrm{vec}(dF) = (I_p otimes A) mathrm{diag}(exp(XB))mathrm{vec}(dXB),再用矩阵乘法的技巧:mathrm{vec}(dF) = (I_potimes A)mathrm{diag}(exp(XB))(B^Totimes I_m)mathrm{vec}(dX),对照导数与微分的联系得到frac{partial F}{partial X} = (Botimes I_m)mathrm{diag}(exp(XB))(I_potimes A^T)

    例4【一元logistic回归】:l = -y oldsymbol{x}^T oldsymbol{w} + log(1 + exp(oldsymbol{x}^Toldsymbol{w})),求
abla_oldsymbol{w} l
abla^2_oldsymbol{w} l。其中y是取值0或1的标量,oldsymbol{x},oldsymbol{w}是向量。

    解:使用上篇中的技术可求得
abla_oldsymbol{w} l = oldsymbol{x}(sigma(oldsymbol{x}^Toldsymbol{w}) - y),其中sigma(a) = frac{exp(a)}{1+exp(a)}为sigmoid函数。为求
abla^2_oldsymbol{w} l,先求微分:d
abla_oldsymbol{w} l = oldsymbol{x} sigma'(oldsymbol{x}^Toldsymbol{w})oldsymbol{x}^T doldsymbol{w} ,其中sigma'(a) = frac{exp(a)}{(1+exp(a))^2}为sigmoid函数的导数,对照导数与微分的联系,得到
abla_w^2 l = oldsymbol{x}sigma'(oldsymbol{x}^Toldsymbol{w})oldsymbol{x}^T

    推广:样本(oldsymbol{x}_1, y_1), dots, (oldsymbol{x}_n,y_n)l = sum_{i=1}^N left(-y_i oldsymbol{x}_i^Toldsymbol{w} + log(1+exp(oldsymbol{x_i}^Toldsymbol{w}))
ight),求
abla_w l
abla^2_w l。有两种方法,方法一:先对每个样本求导,然后相加;方法二:定义矩阵X = egin{bmatrix}oldsymbol{x}_1^T \ vdots \ oldsymbol{x}_n^T end{bmatrix},向量oldsymbol{y} = egin{bmatrix}y_1 \ vdots \ y_nend{bmatrix},将l写成矩阵形式l = -oldsymbol{y}^T Xoldsymbol{w} + oldsymbol{1}^Tlog(oldsymbol{1} + exp(Xoldsymbol{w})),进而可以求得
abla_oldsymbol{w} l = X^T(sigma(Xoldsymbol{w}) - oldsymbol{y})
abla_w^2 l = X^T	ext{diag}(sigma'(Xoldsymbol{w}))X

    例5【多元logistic回归】:l = -oldsymbol{y}^Tlog 	ext{softmax}(Woldsymbol{x}) = -oldsymbol{y}^TWoldsymbol{x} + log(oldsymbol{1}^Texp(Woldsymbol{x})),求
abla_W l
abla^2_W l

    解:上篇例3中已求得
abla_W l = (	ext{softmax}(Woldsymbol{x})-oldsymbol{y})oldsymbol{x}^T。为求
abla^2_W l,先求微分:定义oldsymbol{a} = Woldsymbol{x}d	ext{softmax}(oldsymbol{a}) = frac{exp(oldsymbol{a})odot doldsymbol{a}}{oldsymbol{1}^Texp(oldsymbol{a})} - frac{exp(oldsymbol{a}) (oldsymbol{1}^T(exp(oldsymbol{a})odot doldsymbol{a}))}{(oldsymbol{1}^Texp(oldsymbol{a}))^2},这里需要化简去掉逐元素乘法,第一项中exp(oldsymbol{a})odot doldsymbol{a} = 	ext{diag}(exp(oldsymbol{a})) doldsymbol{a} ,第二项中oldsymbol{1}^T(exp(oldsymbol{a})odot doldsymbol{a}) = exp(oldsymbol{a})^Tdoldsymbol{a},故有d	ext{softmax}(oldsymbol{a}) = 	ext{softmax}'(oldsymbol{a})doldsymbol{a},其中	ext{softmax}'(oldsymbol{a}) = frac{	ext{diag}(exp(oldsymbol{a}))}{oldsymbol{1}^Texp(oldsymbol{a})} - frac{exp(oldsymbol{a})exp(oldsymbol{a})^T}{(oldsymbol{1}^Texp(oldsymbol{a}))^2} ,代入有d
abla_W l = 	ext{softmax}'(oldsymbol{a})doldsymbol{a}oldsymbol{x}^T = 	ext{softmax}'(Woldsymbol{x})dW oldsymbol{x}oldsymbol{x}^T,做向量化并使用矩阵乘法的技巧,得到
abla^2_W l = (oldsymbol{x}oldsymbol{x}^T) otimes 	ext{softmax}'(Woldsymbol{x})

    最后做个总结。我们发展了从整体出发的矩阵求导的技术,导数与微分的联系是计算的枢纽,标量对矩阵的导数与微分的联系是df = mathrm{tr}(
abla_X^T f dX),先对f求微分,再使用迹技巧可求得导数,特别地,标量对向量的导数与微分的联系是df = 
abla_{oldsymbol{x}}f^T doldsymbol{x};矩阵对矩阵的导数与微分的联系是mathrm{vec}(dF) = frac{partial F}{partial X}^T mathrm{vec}(dX),先对F求微分,再使用向量化的技巧可求得导数,特别地,向量对向量的导数与微分的联系是doldsymbol{f} = frac{partial oldsymbol{f}}{partial oldsymbol{x}}^Tdoldsymbol{x}

    参考资料:

    1. 张贤达. 矩阵分析与应用. 清华大学出版社有限公司, 2004.
    2. Fackler, Paul L. "Notes on matrix calculus." North Carolina State University(2005).
    3. Petersen, Kaare Brandt, and Michael Syskind Pedersen. "The matrix cookbook." Technical University of Denmark 7 (2008): 15.
    4. HU, Pili. "Matrix Calculus: Derivation and Simple Application." (2012).
  • 相关阅读:
    LeetCode(287)Find the Duplicate Number
    LeetCode(290) Word Pattern
    LeetCode(205)Isomorphic Strings
    LeetCode(201) Bitwise AND of Numbers Range
    LeetCode(200) Number of Islands
    LeetCode(220) Contains Duplicate III
    LeetCode(219) Contains Duplicate II
    命令行执行Qt程序
    LeetCode(228) Summary Ranges
    redis 的安装和使用记录
  • 原文地址:https://www.cnblogs.com/zf-blog/p/8084558.html
Copyright © 2011-2022 走看看