跳至主要內容

ML的数学基础——矩阵篇

原创Xenny约 2682 字大约 11 分钟机器学习机器学习数学矩阵

ML的数学基础——矩阵篇

  • 太基础的就不写了,会不定时对内容继续修修补补。

  • 表示

    标量向量矩阵
    xxx\boldsymbol{x}X\mathbf{X}

向量求导

向量对标量求导

  • 例如y=(f1(x),f2(x),)T\boldsymbol{y} = (f_1(x), f_2(x), \dots)^T

    yx=(f1(x),f2(x),)T\frac{\partial\boldsymbol{y}}{\partial x} = (f_1^{'}(x), f_2^{'}(x), \dots)^T。这个没什么好说的,写这里主要是为了引出分子布局和分母布局,对于一个向量,有行/列向量之分,对于求导来说,结果是行还是列并没有影响,但是在ML中随便写会影响后续运算,所以我们有了布局的概念

    分子布局:导数的维度以分子为主 分母布局:导数的维度以分母为主。

    所以对于上述求导,yy为列向量,如果按照分子布局,结果就是列向量反之则为行向量。

标量对向量求导

  • 例如二次型f=xTAxf = \boldsymbol{x}^TA\boldsymbol{x}ff是一个标量求fx\frac{\partial f}{\partial \boldsymbol{x}},同样的也就是标量ff对向量x\boldsymbol{x}的每个元素求导,例如对于分母布局,将得到一个列向量

    fx=[fx1,fx2,]T \frac{\partial f}{\partial \boldsymbol{x}} = [\frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \dots]^T

    我们会发现,上述就是求沿x\boldsymbol{x}方向的方向导数,也就是ff的梯度,即

    xf=fx \nabla_{\boldsymbol{x}} f = \frac{\partial f}{\partial \boldsymbol{x}}

    运算法则和标量求导一样。

向量对向量求导

  • 有点类似叉乘,将得到一个矩阵。矩阵的维度和布局有关,例如mm维的y\boldsymbol{y}向量对nn维的x\boldsymbol{x}向量求导,若按照分子布局,则矩阵的第一个维度以分子为准,得到一个m×nm\times n的矩阵。

    yx=(y1x1y1x2y1xny2x1y2x2y2xnymx1ymx2ymxn) \frac{\partial\boldsymbol{y}}{\partial\boldsymbol{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}

矩阵求导

矩阵对标量求导

  • 同向量。按分子布局维度不变,按分母布局则转置。

标量对矩阵求导

  • 例如标量y=aTXby = \boldsymbol{a}^T\mathbf{X}\boldsymbol{b},其中X\mathbf{X}m×nm\times n维矩阵。

    则求yX\frac{\partial y}{\partial\mathbf{X}}也是m×nm\times n维矩阵。原理同标量对向量求导,让标量对矩阵中的每一个元素求导即可。有

    yXij=aTXbXij=aibj \left.\frac{\partial y}{\partial\mathbf{X}}\right|_{ij} = \frac{\partial \boldsymbol{a}^T\mathbf{X}\boldsymbol{b}}{\partial \mathbf{X_{ij}}} = \boldsymbol{a}_i\boldsymbol{b}_j

    不过这种方式只适用于能够展开成多项式的形式,类似标量对向量求导中的二次型,因为我们需要每个元素单独拆开进行求导,下面我们将从微分算子进行推导导数公式。

    在一元微分中有df=f(x)dx\mathrm{d}f = f^{'}(x)\mathrm{d}x,同理多元微分中有全微分公式即

    df=i=1nfxidxi=(fx)Tdx \mathrm{d}f = \sum_{i=1}^n{\frac{\partial f}{\partial x_i}\mathrm{d}x_i} = (\frac{\partial f}{\partial\boldsymbol{x}})^T\mathrm{d}\boldsymbol{x}

    我们会发现全微分df\mathrm{d}f是梯度向量fxn×1\frac{\partial f}{\partial\boldsymbol{x}}\big|_{n\times 1}与微分向量dxn×1\mathrm{d}\boldsymbol{x}\big|_{n\times 1}的内积。我们可以将此性质扩展到矩阵当中。

    对于A,B\mathbf{A},\mathbf{B}两个矩阵,其内积也就是点乘的迹有

    tr(ATB)=i,jAijBij \mathrm{tr}(\mathbf{A}^T\mathbf{B}) = \sum_{i,j}\mathbf{A}_{ij}\mathbf{B}_{ij}

    则对于矩阵求导时有

    df=ijfXijdXij=tr((fX)TdX) \mathrm{d}f = \sum_i\sum_j\frac{\partial f}{\partial\mathbf{X}_{ij}}\mathrm{d}\mathbf{X}_{ij} = \mathrm{tr}\left((\frac{\partial f}{\partial\mathbf{X}})^T\mathrm{d}\mathbf{X}\right)

  • 对此我们会发现只需要找到df\mathrm{d}fdX\mathrm{d}\mathbf{X}便可以求出fX\frac{\partial f}{\partial\mathbf{X}}。这里需要用到矩阵微分的内容,请先参考矩阵微分部分。这里举一些例子

  1. f=aTXbf = \boldsymbol{a}^T\mathbf{X}\boldsymbol{b},求fX\frac{\partial f}{\partial\mathbf{X}}

    df\mathrm{d}f,有

    df=daTXb+aTdXb+aTXdb=aTdXb \mathrm{d}f = \mathrm{d}\boldsymbol{a}^T\mathbf{X}\boldsymbol{b} + \boldsymbol{a}^T\mathrm{d}\mathbf{X}\boldsymbol{b} + \boldsymbol{a}^T\mathbf{X}\mathrm{d}\boldsymbol{b} = \boldsymbol{a}^T\mathrm{d}\mathbf{X}\boldsymbol{b}

    套上迹函数,有df=tr(aTdXb)\mathrm{d}f = \mathrm{tr}(\boldsymbol{a}^T\mathrm{d}\mathbf{X}\boldsymbol{b}),交换位置得到

    df=tr(baTdX)=tr((abT)TdX) \mathrm{d}f = \mathrm{tr}(\boldsymbol{b}\boldsymbol{a}^T\mathrm{d}\mathbf{X}) = \mathrm{tr}\left((\boldsymbol{a}\boldsymbol{b}^T)^T\mathrm{d}\mathbf{X}\right)

    此时根据导数与微分的联系,我们得到

    fX=abT \frac{\partial f}{\partial\mathbf{X}} = \boldsymbol{a}\boldsymbol{b}^T

  2. f=(Xωy)2f = (\mathbf{X}\boldsymbol{\omega} - \boldsymbol{y})^2,求fω\frac{\partial f}{\partial\mathbf{\omega}}

    这也是后续学线性回归中MSE中会遇到的实际矩阵求导问题。首先我们给这个二次多项式变形。f=(Xωy)T(Xωy)f = (\mathbf{X}\boldsymbol{\omega} - \boldsymbol{y})^T(\mathbf{X}\boldsymbol{\omega} - \boldsymbol{y})

    同样求微分df\mathrm{d}f,有

    df=(Xdωy)T(Xω)+(Xωy)T(Xdω) \mathrm{d}f = (\mathbf{X}\mathrm{d}\boldsymbol{\omega} - \boldsymbol{y})^T(\mathbf{X}\boldsymbol{\omega}) + (\mathbf{X}\boldsymbol{\omega} - \boldsymbol{y})^T(\mathbf{X}\mathrm{d}\boldsymbol{\omega})

    套上迹函数,有

    df=tr((Xdωy)T(Xω)+(Xωy)T(Xdω))=2tr((Xωy)T(Xdω)) \mathrm{d}f = \mathrm{tr}\left((\mathbf{X}\mathrm{d}\boldsymbol{\omega} - \boldsymbol{y})^T(\mathbf{X}\boldsymbol{\omega}) + (\mathbf{X}\boldsymbol{\omega} - \boldsymbol{y})^T(\mathbf{X}\mathrm{d}\boldsymbol{\omega})\right) = 2\mathrm{tr}\left((\mathbf{X}\boldsymbol{\omega} - \boldsymbol{y})^T(\mathbf{X}\mathrm{d}\boldsymbol{\omega})\right)

    此时根据导数与微分的联系,我们得到

    fω=2(Xωy)TX=2XT(Xωy) \frac{\partial f}{\partial\mathbf{\omega}} = 2(\mathbf{X}\boldsymbol{\omega} - \boldsymbol{y})^T\mathbf{X} = 2\mathbf{X}^T(\mathbf{X}\boldsymbol{\omega} - \boldsymbol{y})

链式法则

  • 通过链式求导法则可以快速求出导数结果,同时我们约定,标量对矩阵/向量的求导使用分母布局,向量对向量的求导使用分母布局。
  1. 向量对向量求导链式法则:

    zx=zyyx \frac{\partial\boldsymbol{z}}{\partial\boldsymbol{x}} = \frac{\partial\boldsymbol{z}}{\partial\boldsymbol{y}}\frac{\partial\boldsymbol{y}}{\partial\boldsymbol{x}}

    其中存在xyz\boldsymbol{x}\rightarrow\boldsymbol{y}\rightarrow\boldsymbol{z}依赖关系。

    注意

    该式中x,y,z\boldsymbol{x,y,z}都必须是向量,不能直接适用推广至矩阵。

  2. 标量对向量的链式求导

    对于向量xm×1,yn×1\boldsymbol{x}|_{m\times 1},\boldsymbol{y}|_{n\times 1}和标量zz存在依赖关系xyz\boldsymbol{x}\rightarrow\boldsymbol{y}\rightarrow z

    此时我们会发现直接链式维度不相容,因为zx\frac{\partial z}{\partial\boldsymbol{x}}按照分母布局是个m×1m \times 1的向量,而yx\frac{\partial\boldsymbol{y}}{\partial\boldsymbol{x}}是个n×mn\times m的矩阵,zy\frac{\partial z}{\partial\boldsymbol{y}}是个n×1n\times 1的向量。所以此时我们要对矩阵进行转置才能进行下一步计算,有

    zx=(yx)Tzy \frac{\partial z}{\partial\boldsymbol{x}} = (\frac{\partial\boldsymbol{y}}{\partial\boldsymbol{x}})^T\frac{\partial z}{\partial\boldsymbol{y}}

    同理我们可以推广至更多向量的情况,若有y1y2ynz\boldsymbol{y}_1\rightarrow\boldsymbol{y}_2\rightarrow\cdots\rightarrow\boldsymbol{y}_n\rightarrow z,则链式法则为

    zy1=(ynyn1yn1yn2y2y1)Tzyn \frac{\partial z}{\partial\boldsymbol{y}_1} = (\frac{\partial\boldsymbol{y}_n}{\partial\boldsymbol{y}_{n-1}}\frac{\partial\boldsymbol{y}_{n-1}}{\partial\boldsymbol{y}_{n-2}}\cdots\frac{\partial\boldsymbol{y}_2}{\partial\boldsymbol{y}_1})^T\frac{\partial z}{\partial\boldsymbol{y}_n}

    所以标量对矩阵求导中的例2我们可以用链式求导再做一次,f=(Xωy)2f = (\mathbf{X}\boldsymbol{\omega} - \boldsymbol{y})^2,求fω\frac{\partial f}{\partial\mathbf{\omega}}

    r=Xωy\boldsymbol{r} = \mathbf{X}\boldsymbol{\omega} - \boldsymbol{y}f=rTrf = \boldsymbol{r}^T\boldsymbol{r}

    则有

    fω=(rω)Tfr=XT2r=2XT(Xωy) \frac{\partial f}{\partial \boldsymbol{\omega}} = (\frac{\partial\boldsymbol{r}}{\partial\boldsymbol{\omega}})^T\frac{\partial f}{\partial \boldsymbol{r}} = \mathbf{X}^T2\boldsymbol{r} = 2\mathbf{X}^T(\mathbf{X}\boldsymbol{\omega} - \boldsymbol{y})

  3. 标量对矩阵的链式求导

    todo

矩阵对矩阵求导

  • 因为向量本质上是一个特殊的矩阵,所以向量对矩阵,矩阵对向量都属于矩阵对矩阵。

    在向量对向量求导中,我们将得到一个矩阵,那么矩阵对矩阵求导如何定义呢?

    在所有的求导中,我们都会让所有的元素两两求导,所以矩阵Fp×q\mathbf{F}|_{p\times q}对矩阵Xm×n\mathbf{X}|_{m\times n}求导后应该包含mnpqmnpq个偏导数FklXij\frac{\partial \mathbf{F}_{kl}}{\partial \mathbf{X}_{ij}},显然我们可以创造出一个三维的东西来描述它,但是这里我们不升维,而是先让矩阵降维再做运算。

    我们先对F,X\mathbf{F},\mathbf{X}向量化:

    vec(F)=[F11,,Fp1,F12,,Fp2,,F1q,,Fpq]Tvec(X)=[X11,,Xp1,X12,,Xp2,,X1q,,Xpq]T \mathrm{vec}(\mathbf{F}) = [\mathbf{F}_{11},\cdots,\mathbf{F}_{p1},\mathbf{F}_{12},\dots,\mathbf{F}_{p2},\dots, \mathbf{F}_{1q},\dots,\mathbf{F}_{pq}]^T\\ \mathrm{vec}(\mathbf{X}) = [\mathbf{X}_{11},\cdots,\mathbf{X}_{p1},\mathbf{X}_{12},\dots,\mathbf{X}_{p2},\dots, \mathbf{X}_{1q},\dots,\mathbf{X}_{pq}]^T

    这样我们便可以变成向量对向量求导得到结果了,即

    FX=vec(F)vec(X) \frac{\partial\mathbf{F}}{\partial\mathbf{X}} = \frac{\partial\mathrm{vec}(\mathbf{F})}{\partial\mathrm{vec}(\mathbf{X})}

    结果将是一个mn×pqmn\times pq的矩阵,遵循分母布局。同时有其微分和导数的关系式

    vec(dF)=(FX)Tvec(dX) \mathrm{vec}(\mathrm{d}\mathbf{F}) = (\frac{\partial\mathbf{F}}{\partial\mathbf{X}})^T\mathrm{vec}(\mathrm{d}\mathbf{X})

    在求解矩阵对矩阵的导数时,做法类似标量对矩阵求导。

    1. 首先找到dF\mathrm{d}\mathbf{F}
    2. 再向量化为vec(dF)\mathrm{vec}(\mathrm{d}\mathbf{F})
    3. 等式右边化简后找到dX\mathrm{d}\mathbf{X},根据导数与微分的关系得到FX\frac{\partial\mathbf{F}}{\partial\mathbf{X}}

常用公式

矩阵微分

  1. 转置:d(XT)=(dX)T\mathrm{d}(\mathbf{X}^T) = (\mathrm{d}\mathbf{X})^T

  2. 迹:dtr(X)=tr(dX)\mathrm{d}\mathrm{tr}(\mathbf{X}) = \mathrm{tr}(\mathrm{d}\mathbf{X})

  3. 逆:d(X1)=X1(dX)X1\mathrm{d}(\mathbf{X}^{-1}) = -\mathbf{X}^{-1}(\mathrm{d}\mathbf{X})\mathbf{X}^{-1}

    这里简要证明一下XX1=I\mathbf{X}\mathbf{X}^{-1} = \mathbf{I},两边微分有

    d(XX1)=(dX)X1+XdX1=0 \mathrm{d}(\mathbf{X}\mathbf{X}^{-1}) = (\mathrm{d}\mathbf{X})\mathbf{X}^{-1} + \mathbf{X}\mathrm{d}\mathbf{X}^{-1} = 0

    移项即可得出逆矩阵微分公式。

  4. 逐元素乘法:d(XY)=dXY+XdY\mathrm{d}(\mathbf{X}\odot\mathbf{Y}) = \mathrm{d}\mathbf{X}\odot\mathbf{Y} + \mathbf{X}\odot\mathrm{d}\mathbf{Y}

  5. 逐元素函数:dσ(X)=σ(X)dX\mathrm{d}\sigma(\mathbf{X}) = \sigma^{'}(\mathbf{X})\odot\mathrm{d}\mathbf{X}

迹公式

  1. 转置:tr(AT)=tr(A)\mathrm{tr}(\mathbf{A}^T) = \mathrm{tr}(A)
  2. 线性:tr(A±B)=tr(A)±tr(B)\mathrm{tr}(\mathbf{A}\pm \mathbf{B}) = \mathrm{tr}(\mathbf{A})\pm \mathrm{tr}(\mathbf{B})
  3. 交换律:tr(AB)=tr(BA)\mathrm{tr}(\mathbf{AB}) = \mathrm{tr}(\mathbf{BA}),当然前提是ABAB能够交换(维度相同)。

向量化

  1. 线性:vec(A+B)=vec(A)+vec(B)\mathrm{vec}(\mathbf{A}+\mathbf{B}) = \mathrm{vec}(\mathbf{A})+\mathrm{vec}(\mathbf{B})

  2. 矩阵乘法:vec(AXB)=(BTA)vec(X)\mathrm{vec}(\mathbf{AXB}) = (\mathbf{B}^T\otimes\mathbf{A})\mathrm{vec}(\mathbf{X})

    其中\otimes为克罗内克(Kronecker)积,Am×nBp×q=[AijB]mp×nq\mathbf{A}|_{m\times n}\otimes\mathbf{B}|_{p\times q} = [\mathbf{A}_{ij}\mathbf{B}]\big|_{mp\times nq}

  3. 转置:vec(AT)=Kmnvec(A)\mathrm{vec}(\mathbf{A}^T) = \mathbf{K}_{mn}\mathrm{vec}(\mathbf{A})

    其中Kmnmn×mn\mathbf{K}_{mn}|_{mn\times mn}是交换矩阵,将列优先向量化变成行优先向量化。

    例如若vec(A)=(A11,A21,A12,A22)\mathrm{vec}(\mathbf{A}) = (\mathbf{A}_{11}, \mathbf{A}_{21}, \mathbf{A}_{12}, \mathbf{A}_{22}),则有

    K22=(1000001001000001)  vec(AT)=(A11,A12,A21,A22) \mathbf{K}_{22} = \begin{pmatrix} 1&0&0&0\\ 0&0&1&0\\ 0&1&0&0\\ 0&0&0&1 \end{pmatrix}\ \ \,\mathrm{vec}(\mathbf{A}^T) = (\mathbf{A}_{11}, \mathbf{A}_{12}, \mathbf{A}_{21}, \mathbf{A}_{22})

  4. 逐元素乘法:vec(AX)=diag(A)vec(X)\mathrm{vec}(\mathbf{A}\odot\mathbf{X}) = \mathrm{diag}(\mathbf{A})\mathrm{vec}(\mathbf{X})

    其中diag(A)\mathrm{diag}(\mathbf{A})是用A\mathbf{A}的元素按列优先排成的对角阵。