在机器学习中的矩阵向量求导(二) 矩阵向量求导之定义法中,咱们讨论了定义法求解矩阵向量求导的方法,可是这个方法对于比较复杂的求导式子,中间运算会很复杂,同时排列求导出的结果也很麻烦。所以咱们须要其余的一些求导方法。本文咱们讨论使用微分法来求解标量对向量的求导,以及标量对矩阵的求导。html
本文的标量对向量的求导,以及标量对矩阵的求导使用分母布局。若是遇到其余资料求导结果不一样,请先确认布局是否同样。算法
在高数里面咱们学习过标量的导数和微分,他们之间有这样的关系:$df =f'(x)dx$。若是是多变量的状况,则微分能够写成:$$df=\sum\limits_{i=1}^n\frac{\partial f}{\partial x_i}dx_i = (\frac{\partial f}{\partial \mathbf{x}})^Td\mathbf{x}$$机器学习
从上次咱们能够发现标量对向量的求导和它的向量微分有一个转置的关系。函数
如今咱们再推广到矩阵。对于矩阵微分,咱们的定义为:$$df=\sum\limits_{i=1}^m\sum\limits_{j=1}^n\frac{\partial f}{\partial X_{ij}}dX_{ij} = tr((\frac{\partial f}{\partial \mathbf{X}})^Td\mathbf{X})$$布局
其中第二步使用了矩阵迹的性质,即迹函数等于主对角线的和。即$$tr(A^TB) = \sum\limits_{i,j}A_{ij}B_{ij}$$post
从上面矩阵微分的式子,咱们能够看到矩阵微分和它的导数也有一个转置的关系,不过在外面套了一个迹函数而已。因为标量的迹函数就是它自己,那么矩阵微分和向量微分能够统一表示,即:$$df= tr((\frac{\partial f}{\partial \mathbf{X}})^Td\mathbf{X})\;\; \;df= tr((\frac{\partial f}{\partial \mathbf{x}})^Td\mathbf{x})$$学习
咱们在讨论如何使用矩阵微分来求导前,先看看矩阵微分的性质:url
1)微分加减法:$d(X+Y) =dX+dY, d(X-Y) =dX-dY$htm
2) 微分乘法:$d(XY) =(dX)Y + X(dY)$blog
3) 微分转置:$d(X^T) =(dX)^T$
4) 微分的迹:$dtr(X) =tr(dX)$
5) 微分哈达马乘积: $d(X \odot Y) = X\odot dY + dX \odot Y$
6) 逐元素求导:$d \sigma(X) =\sigma'(X) \odot dX$
7) 逆矩阵微分:$d X^{-1}= -X^{-1}dXX^{-1}$
8) 行列式微分:$d |X|= |X|tr(X^{-1}dX)$
有了这些性质,咱们再来看看如何由矩阵微分来求导数。
因为第一节咱们已经获得了矩阵微分和导数关系,如今咱们就来使用微分法求解矩阵向量求导。
若标量函数$f$是矩阵$X$经加减乘法、逆、行列式、逐元素函数等运算构成,则使用相应的运算法则对$f$求微分,再使用迹函数技巧给$df$套上迹并将其它项交换至$dX$左侧,那么对于迹函数里面在$dX$左边的部分,咱们只须要加一个转置就能够获得导数了。
这里须要用到的迹函数的技巧主要有这么几个:
1) 标量的迹等于本身:$tr(x) =x$
2) 转置不变:$tr(A^T) =tr(A)$
3) 交换率:$tr(AB) =tr(BA)$,须要知足$A,B^T$同维度。
4) 加减法:$tr(X+Y) =tr(X)+tr(Y), tr(X-Y) =tr(X)-tr(Y)$
5) 矩阵乘法和迹交换:$tr((A\odot B)^TC)= tr(A^T(B \odot C))$,须要知足$A,B,C$同维度。
咱们先看第一个例子,咱们使用上一篇定义法中的一个求导问题:$$y=\mathbf{a}^T\mathbf{X}\mathbf{b}, \frac{\partial y}{\partial \mathbf{X}}$$
首先,咱们使用微分乘法的性质对$f$求微分,获得:$$dy = d\mathbf{a}^T\mathbf{X}\mathbf{b} + \mathbf{a}^Td\mathbf{X}\mathbf{b} + \mathbf{a}^T\mathbf{X}d\mathbf{b} = \mathbf{a}^Td\mathbf{X}\mathbf{b}$$
第二步,就是两边套上迹函数,即:$$dy =tr(dy) = tr(\mathbf{a}^Td\mathbf{X}\mathbf{b}) = tr(\mathbf{b}\mathbf{a}^Td\mathbf{X})$$
其中第一到第二步使用了上面迹函数性质1,第三步到第四步用到了上面迹函数的性质3.
根据咱们矩阵导数和微分的定义,迹函数里面在$dX$左边的部分$\mathbf{b}\mathbf{a}^T$,加上一个转置即为咱们要求的导数,即:$$\frac{\partial f}{\partial \mathbf{X}} = (\mathbf{b}\mathbf{a}^T)^T =ab^T$$
以上就是微分法的基本流程,先求微分再作迹函数变换,最后获得求导结果。比起定义法,咱们如今不须要去对矩阵中的单个标量进行求导了。
再来看看$$y=\mathbf{a}^Texp(\mathbf{X}\mathbf{b}), \frac{\partial y}{\partial \mathbf{X}}$$
$$dy =tr(dy) = tr(\mathbf{a}^Tdexp(\mathbf{X}\mathbf{b})) = tr(\mathbf{a}^T (exp(\mathbf{X}\mathbf{b}) \odot d(\mathbf{X}\mathbf{b}))) = tr((\mathbf{a} \odot exp(\mathbf{X}\mathbf{b}) )^T d\mathbf{X}\mathbf{b}) = tr(\mathbf{b}(\mathbf{a} \odot exp(\mathbf{X}\mathbf{b}) )^T d\mathbf{X}) $$
其中第三步到第4步使用了上面迹函数的性质5. 这样咱们的求导结果为:$$\frac{\partial y}{\partial \mathbf{X}} =(\mathbf{a} \odot exp(\mathbf{X}\mathbf{b}) )b^T $$
以上就是微分法的基本思路。
因为微分法使用了迹函数的技巧,那么迹函数对对向量矩阵求导这一大类问题,使用微分法是最简单直接的。下面给出一些常见的迹函数的求导过程,也顺便给你们熟练掌握微分法的技巧。
首先是$\frac{\partial tr(AB)}{\partial A} = B^T, \frac{\partial tr(AB)}{\partial B} =A^T$,这个直接根据矩阵微分的定义便可获得。
再来看看$\frac{\partial tr(W^TAW)}{\partial W}$:$$d(tr(W^TAW)) = tr(dW^TAW +W^TAdW) = tr(dW^TAW)+tr(W^TAdW) = tr((dW)^TAW) + tr(W^TAdW) = tr(W^TA^TdW) + tr(W^TAdW) = tr(W^T(A+A^T)dW) $$
所以能够获得:$$\frac{\partial tr(W^TAW)}{\partial W} = (A+A^T)W$$
最后来个更加复杂的迹函数求导:$\frac{\partial tr(B^TX^TCXB)}{\partial X} $: $$d(tr(B^TX^TCXB)) = tr(B^TdX^TCXB) + tr(B^TX^TCdXB) = tr((dX)^TCXBB^T) + tr(BB^TX^TCdX) = tr(BB^TX^TC^TdX) + tr(BB^TX^TCdX) = tr((BB^TX^TC^T + BB^TX^TC)dX)$$
所以能够获得:$$\frac{\partial tr(B^TX^TCXB)}{\partial X}= (C+C^T)XBB^T$$
使用矩阵微分,能够在不对向量或矩阵中的某一元素单独求导再拼接,所以会比较方便,固然熟练使用的前提是对上面矩阵微分的性质,以及迹函数的性质熟练运用。
还有一些场景,求导的自变量和因变量直接有复杂的多层链式求导的关系,此时微分法使用起来也有些麻烦。若是咱们能够利用一些经常使用的简单求导结果,再使用链式求导法则,则会很是的方便。所以下一篇咱们讨论向量矩阵求导的链式法则。
(欢迎转载,转载请注明出处。欢迎沟通交流: liujianping-ok@163.com)