机器学习中的数学 –标量函数对矩阵求导的方法

标量函数对矩阵求导的方法

写这个是因为今天在推CNN的反向传播的时候遇到了数学上无法理解的操作2333,google了一波发现主要问题出在我并没有学会矩阵求导运算,这个东西和普通的标量函数运算还是有很大区别的,比如认为AX对X的导数为A就是错的。因此今天专门来学习一下这个知识。

符号规定:使用小写字母x表示标量,粗体小写字母\[\boldsymbol{x} \]表示列向量,大写字母X表示矩阵。

首先思考一下标量函数对矩阵(向量)求导的定义,假设函数为f,求其对矩阵X的导数,可以记为
$$\frac{\partial f}{\partial X} = \left[\frac{\partial f }{\partial X_{ij}}\right]$$
可以发现我们要得到的其实是一个标量函数对矩阵X里的所有元素逐个求导然后把这些求导的结果根据与X里元素的位置关系排成与X同样形状的矩阵这么一个东西。当然我们可以把矩阵squeeze一下搞成一堆分离的变量逐个求,但是这样就与使用矩阵的初衷相抵触了,本来使用矩阵就是为了运算的方便整洁,那要拆开变成分散的变量还用矩阵干什么,所以有必要研究下从矩阵这个整体的角度出发的求导方法。

回想一下高等数学中多元函数的微分,可以写成
$$df = \sum_{i=1}^n \frac{\partial f}{\partial x_i}dx_i $$
换个写法把求和转变成向量内积的形式的话就是
$$df = \frac{\partial f}{\partial \boldsymbol{x}}^T d\boldsymbol{x}$$

按照之前的定义,矩阵的导数可以写成
$$df = \sum_{i=1}^m \sum_{j=1}^n \frac{\partial f}{\partial X_{ij}}dX_{ij}$$
那么同样的仿照上一段用矩阵表示多元函数微分的方式,比如内积表示这个式子的话,可以写成
$$df = \text{tr}\left(\frac{\partial f}{\partial X}^T dX\right)$$
其中tr表示矩阵的迹(仿真对角线元素之和),满足对尺寸相同的矩阵A,B,\[\text{tr}(A^TB) = \sum_{i,j}A_{ij}B_{ij}\],即\[\text{tr}(A^TB)\]是矩阵A,B的内积。

然后来考察一下基本的运算规则。

  • 加减法:\[d(X\pm Y) = dX \pm dY\];矩阵乘法:\[d(XY) = (dX)Y + X dY \];转置:\[d(X^T) = (dX)^T\];迹:\[d\text{tr}(X) = \text{tr}(dX)\]。
  • :\[dX^{-1} = -X^{-1}dX X^{-1}\]。此式可在\[XX^{-1}=I\]两侧求微分来证明。
  • 行列式:\[d|X| = \text{tr}(X^{*}dX)\] ,其中\[X^{*}\]表示X的伴随矩阵,在X可逆时又可以写作\[d|X|= |X|\text{tr}(X^{-1}dX)\]。
  • 逐元素乘法:\[d(X\odot Y) = dX\odot Y + X\odot dY\],\[\odot\]表示尺寸相同的矩阵X,Y逐元素相乘。
  • 逐元素函数:\[d\sigma(X) = \sigma'(X)\odot dX ,\sigma(X) = \left[\sigma(X_{ij})\right]\]是逐元素标量函数运算,\[ \sigma'(X)=[\sigma'(X_{ij})]\]是逐元素求导数。举个例子,\[X=\left[\begin{matrix}x_{11} & x_{12} \\ x_{21} & x_{22}\end{matrix}\right], d \sin(X) = \left[\begin{matrix}\cos x_{11} dx_{11} & \cos x_{12} d x_{12}\\ \cos x_{21} d x_{21}& \cos x_{22} dx_{22}\end{matrix}\right] = \cos(X)\odot dX\]。

回顾这个式子\[df = \text{tr}\left(\frac{\partial f}{\partial X}^T dX\right) \],在我们求出左侧的微分df后呢,往往还需要一些迹技巧(trace trick)来将其转换为内积的形式:

  • 标量套上迹:\[a = \text{tr}(a)\]
  • 转置:\[\mathrm{tr}(A^T) = \mathrm{tr}(A)\]。
  • 线性:\[\text{tr}(A\pm B) = \text{tr}(A)\pm \text{tr}(B)\]。
  • 矩阵乘法交换:\[\text{tr}(AB) = \text{tr}(BA)\],其中A与B^T尺寸相同。两侧都等于\[\sum_{i,j}A_{ij}B_{ji}\]。
  • 矩阵乘法/逐元素乘法交换:\[\text{tr}(A^T(B\odot C)) = \text{tr}((A\odot B)^TC)\],其中A, B, C尺寸相同。两侧都等于\[\sum_{i,j}A_{ij}B_{ij}C_{ij}\]。

此时可以得出一个结论是:若标量函数f是矩阵X经加减乘法、逆、行列式、逐元素函数等运算构成,则我们可以通过用迹技巧求微分后构造内积形式的方式来得到该函数对矩阵的导数。特别地,若矩阵退化为向量,对照导数与微分的联系\[df = \frac{\partial f}{\partial \boldsymbol{x}}^T d\boldsymbol{x} \],即能得到导数。

最后,考虑一下函数的复合(链式法则):假设已求得\[\frac{\partial f}{\partial Y}\],而Y是X的函数,如何求\[\frac{\partial f}{\partial X}\]呢?在微积分中有标量求导的链式法则\[\frac{\partial f}{\partial x} = \frac{\partial f}{\partial y} \frac{\partial y}{\partial x}\],但这里我们不能随意沿用标量的链式法则,因为矩阵对矩阵的导数\[\frac{\partial Y}{\partial X}\]截至目前仍是未定义的。于是我们继续追本溯源,链式法则是从何而来?源头仍然是微分。我们直接从微分入手建立复合法则:先写出\[df = \text{tr}\left(\frac{\partial f}{\partial Y}^T dY\right)\],再将dY用dX表示出来代入,并使用迹技巧将其他项交换至dX左侧,即可得到\[\frac{\partial f}{\partial X}\]。

最常见的情形是Y = AXB,此时 \[df = \text{tr}\left(\frac{\partial f}{\partial Y}^T dY\right) = \text{tr}\left(\frac{\partial f}{\partial Y}^T AdXB\right) = \text{tr}\left(B\frac{\partial f}{\partial Y}^T AdX\right) = \text{tr}\left((A^T\frac{\partial f}{\partial Y}B^T)^T dX\right) \],可得到\[\frac{\partial f}{\partial X}=A^T\frac{\partial f}{\partial Y}B^T\]。

下图是常用的一阶和二阶矩阵求导的结果,截取自广为流传的的 The matrix cookbook

接下来是网上找到的几个计算的实例。

例1:\[f = \boldsymbol{a}^T X\boldsymbol{b},求\frac{\partial f}{\partial X}。其中\boldsymbol{a}是m×1列向量,X是m\times n矩阵,\boldsymbol{b}是n×1列向量,f是标量。\]

解:先使用矩阵乘法法则求微分,\[df = d\boldsymbol{a}^TX\boldsymbol{b}+\boldsymbol{a}^TdX\boldsymbol{b}+\boldsymbol{a}^TXd\boldsymbol{b}\],注意这里的\[\boldsymbol{a}\], \[\boldsymbol{b}\]是常量,\[d\boldsymbol{a} = \boldsymbol{0}\], \[d\boldsymbol{b} = \boldsymbol{0}\],得到:\[df = \boldsymbol{a}^T dX\boldsymbol{b}\] 。由于\[df\]是标量,它的迹等于自身,\[df = \text{tr}(df)\],套上迹并做矩阵乘法交换:\[df = \text{tr}(\boldsymbol{a}^TdX\boldsymbol{b}) = \text{tr}(\boldsymbol{b}\boldsymbol{a}^TdX)\],注意这里我们根据\[\text{tr}(AB) = \text{tr}(BA)\]交换了\[\boldsymbol{a}^TdX\]与\boldsymbol{b}[/latex]。对照导数与微分的联系\[df = \text{tr}\left(\frac{\partial f}{\partial X}^T dX\right)\],得到\[\frac{\partial f}{\partial X} = (\boldsymbol{b}\boldsymbol{a}^T)^T= \boldsymbol{a}\boldsymbol{b}^T。\]

注意:\[这里不能用\frac{\partial f}{\partial X} =\boldsymbol{a}^T \frac{\partial X}{\partial X}\boldsymbol{b}=?\],导数与矩阵乘法的交换是不合法则的运算(而微分是合法的)。有些资料在计算矩阵导数时,会略过求微分这一步,这是逻辑上解释不通的。[/latex]

例2:\[f = \boldsymbol{a}^T \exp(X\boldsymbol{b})\],求\[\frac{\partial f}{\partial X}\]。其中\[\boldsymbol{a}\]是m×1列向量,X是\[m\times n\]矩阵,\[\boldsymbol{b}\]是n×1列向量,exp表示逐元素求指数,f是标量。

解:先使用矩阵乘法、逐元素函数法则求微分:\[df = \boldsymbol{a}^T(\exp(X\boldsymbol{b})\odot (dX\boldsymbol{b}))\],再套上迹并做交换:\[df = \text{tr}( \boldsymbol{a}^T(\exp(X\boldsymbol{b})\odot (dX\boldsymbol{b}))) =\text{tr}((\boldsymbol{a}\odot \exp(X\boldsymbol{b}))^TdX \boldsymbol{b}) = \text{tr}(\boldsymbol{b}(\boldsymbol{a}\odot \exp(X\boldsymbol{b}))^TdX)\],注意这里我们先根据\[\text{tr}(A^T(B\odot C)) = \text{tr}((A\odot B)^TC)\]交换了\[\boldsymbol{a}、\exp(X\boldsymbol{b})\]与\[dX\boldsymbol{b}\],再根据\[\text{tr}(AB) = \text{tr}(BA)\]交换了\[(\boldsymbol{a}\odot \exp(X\boldsymbol{b}))^TdX\]与\[\boldsymbol{b}\]。对照导数与微分的联系\[df = \text{tr}\left(\frac{\partial f}{\partial X}^T dX\right)\],得到\[\frac{\partial f}{\partial X} = (\boldsymbol{b}(\boldsymbol{a}\odot \exp(X\boldsymbol{b}))^T)^T= (\boldsymbol{a}\odot \exp(X\boldsymbol{b}))\boldsymbol{b}^T\]。

例3:\[f = \text{tr}(Y^T M Y), Y = \sigma(WX)\],求\[\frac{\partial f}{\partial X}\]。其中W是l×m列向量,X是\[m\times n\]矩阵,Y是\[l\times n\]矩阵,M是l×l对称矩阵,\[\sigma\]是逐元素函数,f是标量。

解:先求\[\frac{\partial f}{\partial Y}\],求微分,使用矩阵乘法、转置法则:\[df = \text{tr}((dY)^TMY) + \text{tr}(Y^TMdY) = \text{tr}(Y^TM^TdY) + \text{tr}(Y^TMdY) = \text{tr}(Y^T(M+M^T)dY)\],对照导数与微分的联系,得到\[\frac{\partial f}{\partial Y}=(M+M^T)Y = 2MY\],这里M是对称矩阵。为求\[\frac{\partial f}{\partial X}\],写出\[df = \text{tr}\left(\frac{\partial f}{\partial Y}^T dY\right)\],再将dY用dX表示出来代入,并使用矩阵乘法/逐元素乘法交换:\[df = \text{tr}\left(\frac{\partial f}{\partial Y}^T (\sigma'(WX)\odot (WdX))\right) = \text{tr}\left(\left(\frac{\partial f}{\partial Y} \odot \sigma'(WX)\right)^T W dX\right)\],对照导数与微分的联系,得到\[\frac{\partial f}{\partial X}=W^T \left(\frac{\partial f}{\partial Y}\odot \sigma'(WX)\right)=W^T((2M\sigma(WX))\odot\sigma'(WX))\]。

例4【线性回归】:\[l = \|X\boldsymbol{w}- \boldsymbol{y}\|^2\], 求\[\boldsymbol{w}\]的最小二乘估计,即求\[\frac{\partial l}{\partial \boldsymbol{w}}\]的零点。其中\[\boldsymbol{y}\]是m×1列向量,X是\[m\times n\]矩阵,\[\boldsymbol{w}\]是n×1列向量,l是标量。

解:这是标量对向量的导数,不过可以把向量看做矩阵的特例。先将向量模平方改写成向量与自身的内积:\[l = (X\boldsymbol{w}- \boldsymbol{y})^T(X\boldsymbol{w}- \boldsymbol{y})\],求微分,使用矩阵乘法、转置等法则:\[dl = (Xd\boldsymbol{w})^T(X\boldsymbol{w}-\boldsymbol{y})+(X\boldsymbol{w}-\boldsymbol{y})^T(Xd\boldsymbol{w}) = 2(X\boldsymbol{w}-\boldsymbol{y})^TXd\boldsymbol{w}\]。对照导数与微分的联系\[dl = \frac{\partial l}{\partial \boldsymbol{w}}^Td\boldsymbol{w}\],得到\[\frac{\partial l}{\partial \boldsymbol{w}}= (2(X\boldsymbol{w}-\boldsymbol{y})^TX)^T = 2X^T(X\boldsymbol{w}-\boldsymbol{y})\]。\[\frac{\partial l}{\partial \boldsymbol{w}}\]的零点即\[\boldsymbol{w}\]的最小二乘估计为\[\boldsymbol{w} = (X^TX)^{-1}X^T\boldsymbol{y}\]。

例5【方差的最大似然估计】:样本\[\boldsymbol{x}_1,\dots, \boldsymbol{x}_N \sim \mathcal{N}(\boldsymbol{\mu}, \Sigma)\],求方差\[\Sigma\]的最大似然估计。写成数学式是:\[l = \log|\Sigma|+\frac{1}{N}\sum_{i=1}^N(\boldsymbol{x}_i-\boldsymbol{\bar{x}})^T\Sigma^{-1}(\boldsymbol{x}_i-\boldsymbol{\bar{x}})\],求\[\frac{\partial l }{\partial \Sigma}\]的零点。其中\[\boldsymbol{x}_i\]是\[m\times 1\]列向量,\[\bar{\boldsymbol{x}}=\frac{1}{N}\sum_{i=1}^N \boldsymbol{x}_i\]是样本均值,\[\Sigma是m\times m\]对称正定矩阵,l是标量,log表示自然对数。

解:首先求微分,使用矩阵乘法、行列式、逆等运算法则,第一项是\[d\log|\Sigma| = |\Sigma|^{-1}d|\Sigma| = \text{tr}(\Sigma^{-1}d\Sigma)\],第二项是\[\frac{1}{N}\sum_{i=1}^N(\boldsymbol{x}_i-\boldsymbol{\bar{x}})^Td\Sigma^{-1}(\boldsymbol{x}_i-\boldsymbol{\bar{x}}) = -\frac{1}{N}\sum_{i=1}^N(\boldsymbol{x}_i-\boldsymbol{\bar{x}})^T\Sigma^{-1}d\Sigma\Sigma^{-1}(\boldsymbol{x}_i-\boldsymbol{\bar{x}})\]。再给第二项套上迹做交换: \[\text{tr}\left(\frac{1}{N}\sum_{i=1}^N(\boldsymbol{x}_i-\boldsymbol{\bar{x}})^T\Sigma^{-1}d\Sigma\Sigma^{-1}(\boldsymbol{x}_i-\boldsymbol{\bar{x}})\right) =\frac{1}{N} \sum_{i=1}^N \text{tr}((\boldsymbol{x}_i-\boldsymbol{\bar{x}})^T\Sigma^{-1} d\Sigma \Sigma^{-1}(\boldsymbol{x}_i-\boldsymbol{\bar{x}}))= \] \[\frac{1}{N}\sum_{i=1}^N\text{tr}\left(\Sigma^{-1}(\boldsymbol{x}_i-\boldsymbol{\bar{x}})(\boldsymbol{x}_i-\boldsymbol{\bar{x}})^T\Sigma^{-1}d\Sigma\right)=\text{tr}(\Sigma^{-1}S\Sigma^{-1}d\Sigma)\],其中先交换迹与求和,然后将\[ \Sigma^{-1} (\boldsymbol{x}_i-\boldsymbol{\bar{x}})\]交换到左边,最后再交换迹与求和,并定义\[S = \frac{1}{N}\sum_{i=1}^N(\boldsymbol{x}_i-\boldsymbol{\bar{x}})(\boldsymbol{x}_i-\boldsymbol{\bar{x}})^T\]为样本方差矩阵。得到\[dl = \text{tr}\left(\left(\Sigma^{-1}-\Sigma^{-1}S\Sigma^{-1}\right)d\Sigma\right)\]。对照导数与微分的联系,有\[\frac{\partial l }{\partial \Sigma}=(\Sigma^{-1}-\Sigma^{-1}S\Sigma^{-1})^T\],其零点即\[\Sigma\]的最大似然估计为\[\Sigma = S\]。

例6【多元logistic回归】:\[l = -\boldsymbol{y}^T\log\text{softmax}(W\boldsymbol{x})\],求\[\frac{\partial l}{\partial W}\]。其中\[\boldsymbol{y}\]是除一个元素为1外其它元素为0的m×1列向量,W是\[m\times n\]矩阵,\[\boldsymbol{x}\]是n×1列向量,l是标量;log表示自然对数,\[\text{softmax}(\boldsymbol{a}) = \frac{\exp(\boldsymbol{a})}{\boldsymbol{1}^T\exp(\boldsymbol{a})}\],其中\[\exp(\boldsymbol{a})\]表示逐元素求指数,\[\boldsymbol{1}\]代表全1向量。

解1:首先将softmax函数代入并写成\[l = -\boldsymbol{y}^T \left(\log (\exp(W\boldsymbol{x}))-\boldsymbol{1}\log(\boldsymbol{1}^T\exp(W\boldsymbol{x}))\right) = -\boldsymbol{y}^TW\boldsymbol{x} + \log(\boldsymbol{1}^T\exp(W\boldsymbol{x}))\],这里要注意逐元素log满足等式\[\log(\boldsymbol{u}/c) = \log(\boldsymbol{u}) – \boldsymbol{1}\log(c)\],以及\[\boldsymbol{y}满足\boldsymbol{y}^T \boldsymbol{1} = 1\]。求微分,使用矩阵乘法、逐元素函数等法则:\[dl =- \boldsymbol{y}^TdW\boldsymbol{x}+\frac{\boldsymbol{1}^T\left(\exp(W\boldsymbol{x})\odot(dW\boldsymbol{x})\right)}{\boldsymbol{1}^T\exp(W\boldsymbol{x})}\]。再套上迹并做交换,注意可化简\[\boldsymbol{1}^T\left(\exp(W\boldsymbol{x})\odot(dW\boldsymbol{x})\right) = \exp(W\boldsymbol{x})^TdW\boldsymbol{x}\],这是根据等式\[\boldsymbol{1}^T (\boldsymbol{u}\odot \boldsymbol{v}) = \boldsymbol{u}^T \boldsymbol{v}\],故\[dl = \text{tr}\left(-\boldsymbol{y}^TdW\boldsymbol{x}+\frac{\exp(W\boldsymbol{x})^TdW\boldsymbol{x}}{\boldsymbol{1}^T\exp(W\boldsymbol{x})}\right) =\text{tr}(-\boldsymbol{y}^TdW\boldsymbol{x}+\text{softmax}(W\boldsymbol{x})^TdW\boldsymbol{x}) =\]\[ \text{tr}(\boldsymbol{x}(\text{softmax}(W\boldsymbol{x})-\boldsymbol{y})^TdW)\]。对照导数与微分的联系,得到\[\frac{\partial l}{\partial W}= (\text{softmax}(W\boldsymbol{x})-\boldsymbol{y})\boldsymbol{x}^T\]。

解2:定义\[\boldsymbol{a} = W\boldsymbol{x}\],则\[l = -\boldsymbol{y}^T\log\text{softmax}(\boldsymbol{a}) \],先同上求出\[\frac{\partial l}{\partial \boldsymbol{a}} = \text{softmax}(\boldsymbol{a})-\boldsymbol{y} \],再利用复合法则:\[dl = \text{tr}\left(\frac{\partial l}{\partial \boldsymbol{a}}^Td\boldsymbol{a}\right) = \text{tr}\left(\frac{\partial l}{\partial \boldsymbol{a}}^TdW \boldsymbol{x}\right) = \text{tr}\left(\boldsymbol{x}\frac{\partial l}{\partial \boldsymbol{a}}^TdW\right)\],得到\[\frac{\partial l}{\partial W}= \frac{\partial l}{\partial\boldsymbol{a}}\boldsymbol{x}^T\]。

最后一例留给经典的神经网络。神经网络的求导术是学术史上的重要成果,还有个专门的名字叫做BP算法,我相信如今很多人在初次推导BP算法时也会颇费一番脑筋,事实上使用矩阵求导术来推导并不复杂。为简化起见,我们推导二层神经网络的BP算法。

例7【二层神经网络】:\[l = -\boldsymbol{y}^T\log\text{softmax}(W_2\sigma(W_1\boldsymbol{x}))\],求\[\frac{\partial l}{\partial W_1}\]和\[\frac{\partial l}{\partial W_2}\]。其中\[\boldsymbol{y}\]是除一个元素为1外其它元素为0的的m×1列向量,\[W_2\]是\[m\times p\]矩阵,\[W_1\]是\[p \times n\]矩阵,\[\boldsymbol{x}\]是n×1列向量,l是标量;log表示自然对数,\[\text{softmax}(\boldsymbol{a}) = \frac{\exp(\boldsymbol{a})}{\boldsymbol{1}^T\exp(\boldsymbol{a})}\]同上,\[\sigma是逐元素sigmoid函数[latex]\sigma(a) = \frac{1}{1+\exp(-a)}\]。

解:定义\[\boldsymbol{a}_1=W_1\boldsymbol{x},\boldsymbol{h}_1 = \sigma(\boldsymbol{a}_1),\boldsymbol{a}_2 = W_2 \boldsymbol{h}_1\],则\[l =-\boldsymbol{y}^T\log\text{softmax}(\boldsymbol{a}_2)\]。在前例中已求出\[\frac{\partial l}{\partial \boldsymbol{a}_2} = \text{softmax}(\boldsymbol{a}_2)-\boldsymbol{y} \]。使用复合法则,\[dl = \text{tr}\left(\frac{\partial l}{\partial \boldsymbol{a}_2}^Td\boldsymbol{a}_2\right) = \text{tr}\left(\frac{\partial l}{\partial \boldsymbol{a}_2}^TdW_2 \boldsymbol{h}_1\right) + \underbrace{ \text{tr}\left(\frac{\partial l}{\partial \boldsymbol{a}_2}^TW_2 d\boldsymbol{h}_1\right)}_{dl_2}\],使用矩阵乘法交换的迹技巧从第一项得到\[\frac{\partial l}{\partial W_2}= \frac{\partial l}{\partial\boldsymbol{a}_2}\boldsymbol{h}_1^T\],从第二项得到\[\frac{\partial l}{\partial \boldsymbol{h}_1}= W_2^T\frac{\partial l}{\partial\boldsymbol{a}_2}\]。接下来对第二项继续使用复合法则来求\[\frac{\partial l}{\partial \boldsymbol{a}_1}\],并利用矩阵乘法和逐元素乘法交换的迹技巧:\[dl_2 = \text{tr}\left(\frac{\partial l}{\partial\boldsymbol{h}_1}^Td\boldsymbol{h}_1\right) = \text{tr}\left(\frac{\partial l}{\partial\boldsymbol{h}_1}^T(\sigma'(\boldsymbol{a}_1)\odot d\boldsymbol{a}_1)\right) = \text{tr}\left(\left(\frac{\partial l}{\partial\boldsymbol{h}_1}\odot \sigma'(\boldsymbol{a}_1)\right)^Td\boldsymbol{a}_1\right)\],得到\[\frac{\partial l}{\partial \boldsymbol{a}_1}= \frac{\partial l}{\partial\boldsymbol{h}_1}\odot\sigma'(\boldsymbol{a}_1)\]。为求\[\frac{\partial l}{\partial W_1}\],再用一次复合法则:\[dl_2 = \text{tr}\left(\frac{\partial l}{\partial\boldsymbol{a}_1}^Td\boldsymbol{a}_1\right) = \text{tr}\left(\frac{\partial l}{\partial\boldsymbol{a}_1}^TdW_1\boldsymbol{x}\right) = \text{tr}\left(\boldsymbol{x}\frac{\partial l}{\partial\boldsymbol{a}_1}^TdW_1\right)\],得到\[\frac{\partial l}{\partial W_1}= \frac{\partial l}{\partial\boldsymbol{a}_1}\boldsymbol{x}^T\]。

推广:样本\[(\boldsymbol{x}_1, y_1), \dots, (\boldsymbol{x}_N,y_N),l = -\sum_{i=1}^N \boldsymbol{y}_i^T\log\text{softmax}(W_2\sigma(W_1\boldsymbol{x}_i + \boldsymbol{b}_1) + \boldsymbol{b}_2)\],其中\[\boldsymbol{b}_1\]是\[p \times 1\]列向量,\[\boldsymbol{b}_2\]是\[m\times 1\]列向量,其余定义同上。

解1:定义\[\boldsymbol{a}_{1,i} = W_1 \boldsymbol{x}_i + \boldsymbol{b}_1,\boldsymbol{h}_{1,i} = \sigma(\boldsymbol{a}_{1,i}),\boldsymbol{a}_{2,i} = W_2\boldsymbol{h}_{1,i} + \boldsymbol{b}_2\],则\[l = -\sum_{i=1}^N \boldsymbol{y}_i^T \log \text{softmax}(\boldsymbol{a}_{2,i})\]。先同上可求出\[\frac{\partial l}{\partial \boldsymbol{a}_{2,i}} = \text{softmax}(\boldsymbol{a}_{2,i})-\boldsymbol{y}_i \]。使用复合法则,\[dl = \text{tr}\left(\sum_{i=1}^N\frac{\partial l}{\partial \boldsymbol{a}_{2,i}}^T d \boldsymbol{a}_{2,i}\right) = \text{tr}\left( \sum_{i=1}^N \frac{\partial l}{\partial \boldsymbol{a}_{2,i}}^T dW_2 \boldsymbol{h}_{1,i}\right) + \underbrace{\text{tr}\left( \sum_{i=1}^N \frac{\partial l}{\partial \boldsymbol{a}_{2,i}}^T W_2 d\boldsymbol{h}_{1,i}\right)}_{dl_2} + \] \[\text{tr}\left( \sum_{i=1}^N \frac{\partial l}{\partial \boldsymbol{a}_{2,i}}^T d \boldsymbol{b}_2\right)\],从第一项得到得到\[\frac{\partial l}{\partial W_2}= \sum_{i=1}^N \frac{\partial l}{\partial\boldsymbol{a}_{2,i}}\boldsymbol{h}_{1,i}^T\],从第二项得到\[\frac{\partial l}{\partial \boldsymbol{h}_{1,i}}= W_2^T\frac{\partial l}{\partial\boldsymbol{a}_{2,i}}\],从第三项得到到\[\frac{\partial l}{\partial \boldsymbol{b}_2}= \sum_{i=1}^N \frac{\partial l}{\partial\boldsymbol{a}_{2,i}}\]。接下来对第二项继续使用复合法则,得到\[\frac{\partial l}{\partial \boldsymbol{a}_{1,i}}= \frac{\partial l}{\partial\boldsymbol{h}_{1,i}}\odot\sigma'(\boldsymbol{a}_{1,i})\]。为求\[\frac{\partial l}{\partial W_1}, \frac{\partial l}{\partial \boldsymbol{b}_1}\],再用一次复合法则:\[dl_2 = \text{tr}\left(\sum_{i=1}^N \frac{\partial l}{\partial\boldsymbol{a}_{1,i}}^Td\boldsymbol{a}_{1,i}\right) = \text{tr}\left(\sum_{i=1}^N \frac{\partial l}{\partial\boldsymbol{a}_{1,i}}^TdW_1\boldsymbol{x}_i\right) + \text{tr}\left(\sum_{i=1}^N \frac{\partial l}{\partial\boldsymbol{a}_{1,i}}^Td\boldsymbol{b}_1\right)\],得到\[\frac{\partial l}{\partial W_1}= \sum_{i=1}^N \frac{\partial l}{\partial\boldsymbol{a}_{1,i}}\boldsymbol{x}_i^T,\frac{\partial l}{\partial \boldsymbol{b}_1}= \sum_{i=1}^N \frac{\partial l}{\partial\boldsymbol{a}_{1,i}}。\]

解2:可以用矩阵来表示N个样本,以简化形式。定义\[X = [\boldsymbol{x}_1, \cdots, \boldsymbol{x}_N],A_1 = [\boldsymbol{a}_{1,1},\cdots,\boldsymbol{a}_{1,N}] =W_1 X + \boldsymbol{b}_1 \boldsymbol{1}^T,H_1 = [\boldsymbol{h}_{1,1}, \cdots, \boldsymbol{h}_{1,N}] = \sigma(A_1),\]\[A_2 = [\boldsymbol{a}_{2,1},\cdots,\boldsymbol{a}_{2,N}] = W_2 H_1 + \boldsymbol{b}_2 \boldsymbol{1}^T\],注意这里使用全1向量来扩展维度。先同上求出\[\frac{\partial l}{\partial A_2} = [\text{softmax}(\boldsymbol{a}_{2,1})-\boldsymbol{y}_1, \cdots, \text{softmax}(\boldsymbol{a}_{2,N})-\boldsymbol{y}_N] \]。使用复合法则,\[dl = \text{tr}\left(\frac{\partial l}{\partial A_2}^T d A_2\right) = \text{tr}\left( \frac{\partial l}{\partial A_2}^T dW_2 H_1 \right) + \underbrace{\text{tr}\left(\frac{\partial l}{\partial A_2}^T W_2 d H_1\right)}_{dl_2} + \text{tr}\left(\frac{\partial l}{\partial A_2}^T d \boldsymbol{b}_2 \boldsymbol{1}^T\right) \],从第一项得到\[\frac{\partial l}{\partial W_2}= \frac{\partial l}{\partial A_2}H_1^T\],从第二项得到\[\frac{\partial l}{\partial H_1}= W_2^T\frac{\partial l}{\partial A_{2}}\],从第三项得到\[\frac{\partial l}{\partial \boldsymbol{b}_2}= \frac{\partial l}{\partial A_2}\boldsymbol{1}\]。接下来对第二项继续使用复合法则,得到\[\frac{\partial l}{\partial A_1}= \frac{\partial l}{\partial H_1}\odot\sigma'(A_1)\]。为求\[\frac{\partial l}{\partial W_1}, \frac{\partial l}{\partial \boldsymbol{b}_1}\],再用一次复合法则:\[dl_2 = \text{tr}\left(\frac{\partial l}{\partial A_1}^TdA_1\right) = \text{tr}\left(\frac{\partial l}{\partial A_1}^TdW_1X\right) + \text{tr}\left( \frac{\partial l}{\partial A_1}^Td\boldsymbol{b}_1 \boldsymbol{1}^T\right)\],得到\[\frac{\partial l}{\partial W_1}= \frac{\partial l}{\partial A_1}X^T,\frac{\partial l}{\partial \boldsymbol{b}_1}= \frac{\partial l}{\partial A_1}\boldsymbol{1}。\]

主要参考

  • https://www.math.uwaterloo.ca/~hwolkowi/matrixcookbook.pdf
  • https://zhuanlan.zhihu.com/p/24709748

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用 Akismet 来减少垃圾评论。了解我们如何处理您的评论数据