在机器学习中的矩阵向量求导(三) 矩阵向量求导之微分法中,咱们讨论了使用微分法来求解矩阵向量求导的方法。可是不少时候,求导的自变量和因变量直接有复杂的多层链式求导的关系,此时微分法使用起来也有些麻烦。须要一些简洁的方法。html
本文咱们讨论矩阵向量求导链式法则,使用该法则不少时候能够帮咱们快速求出导数结果。算法
本文的标量对向量的求导,标量对矩阵的求导使用分母布局, 向量对向量的求导使用分子布局。若是遇到其余资料求导结果不一样,请先确认布局是否同样。机器学习
首先咱们来看看向量对向量求导的链式法则。假设多个向量存在依赖关系,好比三个向量$\mathbf{x} \to \mathbf{y} \to \mathbf{z}$存在依赖关系,则咱们有下面的链式求导法则:$$\frac{\partial \mathbf{z}}{\partial \mathbf{x}} = \frac{\partial \mathbf{z}}{\partial \mathbf{y}}\frac{\partial \mathbf{y}}{\partial \mathbf{x}}$$函数
该法则也能够推广到更多的向量依赖关系。可是要注意的是要求全部有依赖关系的变量都是向量,若是有一个$\mathbf{Y}$是矩阵,,好比是$\mathbf{x} \to \mathbf{Y} \to \mathbf{z}$, 则上式并不成立。布局
从矩阵维度相容的角度也很容易理解上面的链式法则,假设$\mathbf{x} , \mathbf{y} ,\mathbf{z}$分别是$m,n.p$维向量,则求导结果$\frac{\partial \mathbf{z}}{\partial \mathbf{x}}$是一个$p \times m$的雅克比矩阵,而右边$\frac{\partial \mathbf{z}}{\partial \mathbf{y}}$是一个$p \times n$的雅克比矩阵,$\frac{\partial \mathbf{y}}{\partial \mathbf{x}}$是一个$n \times m$的矩阵,两个雅克比矩阵的乘积维度恰好是$p \times m$,和左边相容。post
在咱们的机器学习算法中,最终要优化的通常是一个标量损失函数,所以最后求导的目标是标量,没法使用上一节的链式求导法则,好比2向量,最后到1标量的依赖关系:$\mathbf{x} \to \mathbf{y} \to z$,此时很容易发现维度不相容。学习
假设$\mathbf{x} , \mathbf{y} $分别是$m,n$维向量, 那么$\frac{\partial z}{\partial \mathbf{x}}$的求导结果是一个$m \times 1$的向量, 而$\frac{\partial z}{\partial \mathbf{y}}$是一个$n \times 1$的向量,$\frac{\partial \mathbf{y}}{\partial \mathbf{x}}$是一个$n \times m$的雅克比矩阵,右边的向量和矩阵是无法直接乘的。优化
可是假如咱们把标量求导的部分都作一个转置,那么维度就能够相容了,也就是:$$(\frac{\partial z}{\partial \mathbf{x}})^T = (\frac{\partial z}{\partial \mathbf{y}})^T\frac{\partial \mathbf{y}}{\partial \mathbf{x}} $$htm
可是毕竟咱们要求导的是$(\frac{\partial z}{\partial \mathbf{x}})$,而不是它的转置,所以两边转置咱们能够获得标量对多个向量求导的链式法则:$$\frac{\partial z}{\partial \mathbf{x}} = (\frac{\partial \mathbf{y}}{\partial \mathbf{x}} )^T\frac{\partial z}{\partial \mathbf{y}}$$blog
若是是标量对更多的向量求导,好比$\mathbf{y_1} \to \mathbf{y_2} \to ...\to \mathbf{y_n} \to z$,则其链式求导表达式能够表示为:$$\frac{\partial z}{\partial \mathbf{y_1}} = (\frac{\partial \mathbf{y_n}}{\partial \mathbf{y_{n-1}}} \frac{\partial \mathbf{y_{n-1}}}{\partial \mathbf{y_{n-2}}} ...\frac{\partial \mathbf{y_2}}{\partial \mathbf{y_1}})^T\frac{\partial z}{\partial \mathbf{y_n}}$$
这里咱们给一个最多见的最小二乘法求导的例子。最小二乘法优化的目标是最小化以下损失函数:$$l=(X\theta - y)^T(X\theta - y)$$
咱们优化的损失函数$l$是一个标量,而模型参数$\theta$是一个向量,指望L对$\theta$求导,并求出导数等于0时候的极值点。咱们假设向量$z = X\theta - y$, 则$l=z^Tz$, $\theta \to z \to l$存在链式求导的关系,所以:$$\frac{\partial l}{\partial \mathbf{\theta}} = (\frac{\partial z}{\partial \theta} )^T\frac{\partial l}{\partial \mathbf{z}} = X^T(2z) =2X^T(X\theta - y)$$
其中最后一步转换使用了以下求导公式:$$\frac{\partial X\theta - y}{\partial \theta} = X$$ $$\frac{\partial z^Tz}{\partial z} = 2z$$
这两个式子咱们在前几篇里已有求解过,如今能够直接拿来使用了,很是方便。
固然上面的问题使用微分法求导数也是很是简单的,这里只是给出链式求导法的思路。
下面咱们再来看看标量对多个矩阵的链式求导法则,假设有这样的依赖关系:$\mathbf{X} \to \mathbf{Y} \to z$,那么咱们有:$$\frac{\partial z}{\partial x_{ij}} = \sum\limits_{k,l}\frac{\partial z}{\partial Y_{kl}} \frac{\partial Y_{kl}}{\partial X_{ij}} =tr((\frac{\partial z}{\partial Y})^T\frac{\partial Y}{\partial X_{ij}})$$
这里你们会发现咱们没有给出基于矩阵总体的链式求导法则,主要缘由是矩阵对矩阵的求导是比较复杂的定义,咱们目前也未涉及。所以只能给出对矩阵中一个标量的链式求导方法。这个方法并不实用,由于咱们并不想每次都基于定义法来求导最后再去排列求导结果。
虽然咱们没有全局的标量对矩阵的链式求导法则,可是对于一些线性关系的链式求导,咱们仍是能够获得一些有用的结论的。
咱们来看这个常见问题:$A,X,B,Y$都是矩阵,$z$是标量,其中$z= f(Y), Y=AX+B$,咱们要求出$\frac{\partial z}{\partial X}$,这个问题在机器学习中是很常见的。此时,咱们并不能直接总体使用矩阵的链式求导法则,由于矩阵对矩阵的求导结果很差处理。
这里咱们回归初心,使用定义法试一试,先使用上面的标量链式求导公式:$$\frac{\partial z}{\partial x_{ij}} = \sum\limits_{k,l}\frac{\partial z}{\partial Y_{kl}} \frac{\partial Y_{kl}}{\partial X_{ij}}$$
咱们再来看看后半部分的导数:$$ \frac{\partial Y_{kl}}{\partial X_{ij}} = \frac{\partial \sum\limits_s(A_{ks}X_{sl})}{\partial X_{ij}} = \frac{\partial A_{ki}X_{il}}{\partial X_{ij}} =A_{ki}\delta_{lj}$$
其中$\delta_{lj}$在$l=j$时为1,不然为0.
那么最终的标签链式求导公式转化为:$$\frac{\partial z}{\partial x_{ij}} = \sum\limits_{k,l}\frac{\partial z}{\partial Y_{kl}} A_{ki}\delta_{lj} = \sum\limits_{k}\frac{\partial z}{\partial Y_{kj}} A_{ki}$$
即矩阵$A^T$的第i行和$\frac{\partial z}{\partial Y} $的第j列的内积。排列成矩阵即为:$$\frac{\partial z}{\partial X} = A^T\frac{\partial z}{\partial Y}$$
总结下就是:$$z= f(Y), Y=AX+B \to \frac{\partial z}{\partial X} = A^T\frac{\partial z}{\partial Y}$$
这结论在$\mathbf{x}$是一个向量的时候也成立,即:$$z= f(\mathbf{y}), \mathbf{y}=A\mathbf{x}+\mathbf{b} \to \frac{\partial z}{\partial \mathbf{x}} = A^T\frac{\partial z}{\partial \mathbf{y}}$$
若是要求导的自变量在左边,线性变换在右边,也有相似稍有不一样的结论以下,证实方法是相似的,这里直接给出结论:$$z= f(Y), Y=XA+B \to \frac{\partial z}{\partial X} = \frac{\partial z}{\partial Y}A^T$$ $$z= f(\mathbf{y}), \mathbf{y}=X\mathbf{a}+\mathbf{b} \to \frac{\partial z}{\partial \mathbf{X}} = \frac{\partial z}{\partial \mathbf{y}}a^T$$
使用好上述四个结论,对于机器学习尤为是深度学习里的求导问题能够很是快的解决,你们能够试一试。
矩阵向量求导在前面咱们讨论三种方法,定义法,微分法和链式求导法。在同等状况下,优先考虑链式求导法,尤为是第三节的四个结论。其次选择微分法、在没有好的求导方法的时候使用定义法是最后的保底方案。
基本上你们看了系列里这四篇后对矩阵向量求导就已经很熟悉了,对于机器学习中出现的矩阵向量求导问题已足够。这里尚未讲到的是矩阵对矩阵的求导,还有矩阵对向量,向量对矩阵求导这三种形式,这个咱们在系列的下一篇,也是最后一篇简单讨论一下,若是你们只是关注机器学习的优化问题,不涉及其余应用数学问题的,能够不关注。
(欢迎转载,转载请注明出处。欢迎沟通交流: liujianping-ok@163.com)