在机器学习中的矩阵向量求导(一) 求导定义与求导布局中,我们讨论了向量矩阵求导的9种定义与求导布局的概念。今天我们就讨论下其中的标量对向量求导,标量对矩阵求导, 以及向量对向量求导这三种场景的基本求解思路。
对于本文中的标量对向量或矩阵求导这两种情况,如前文所说,以分母布局为默认布局。向量对向量求导,以分子布局为默认布局。如遇到其他文章中的求导结果和本文不同,请先确认使用的求导布局是否一样。另外,由于机器学习中向量或矩阵对标量求导的场景很少见,本系列不会单独讨论这两种求导过程。
标量对向量求导,严格来说是实值函数对向量的求导。即定义实值函数$f: R^{n} \to R$,自变量$\mathbf{x}$是n维向量,而输出$y$是标量。对于一个给定的实值函数,如何求解$\frac{\partial y}{\partial \mathbf{x}}$呢?
首先我们想到的是基于矩阵求导的定义来做,由于所谓标量对向量的求导,其实就是标量对向量里的每个分量分别求导,最后把求导的结果排列在一起,按一个向量表示而已。那么我们可以将实值函数对向量的每一个分量来求导,最后找到规律,得到求导的结果向量。
首先我们来看一个简单的例子:$y=\mathbf{a}^T\mathbf{x}$,求解$\frac{\partial \mathbf{a}^T\mathbf{x}}{\partial \mathbf{x}}$
根据定义,我们先对$\mathbf{x}$的第i个分量进行求导,这是一个标量对标量的求导,如下:
$$\frac{\partial \mathbf{a}^T\mathbf{x}}{\partial x_i} = \frac{\partial \sum\limits_{j=1}^n a_jx_j}{\partial x_i} = \frac{\partial a_ix_i}{\partial x_i} =a_i$$
可见,对向量的第i个分量的求导结果就等于向量$\mathbf{a}$的第i个分量。由于我们是分子布局,最后所有求导结果的分量组成的是一个n维向量。那么其实就是向量$\mathbf{a}$。也就是说:$$\frac{\partial \mathbf{a}^T\mathbf{x}}{\partial \mathbf{x}} = \mathbf{a}$$
同样的思路,我们也可以直接得到:$$\frac{\partial \mathbf{x}^T\mathbf{a}}{\partial \mathbf{x}} = \mathbf{a}$$
给一个简单的测试,大家看看自己能不能按定义法推导出:$$\frac{\partial \mathbf{x}^T\mathbf{x}}{\partial \mathbf{x}} =2\mathbf{x}$$
再来看一个复杂一点点的例子:$y=\mathbf{x}^T\mathbf{A}\mathbf{x}$,求解$\frac{\partial \mathbf{x}^T\mathbf{A}\mathbf{x}}{\partial \mathbf{x}}$
我们对$\mathbf{x}$的第k个分量进行求导如下:
$$\frac{\partial \mathbf{x}^T\mathbf{A}\mathbf{x}}{\partial x_k} = \frac{\partial \sum\limits_{i=1}^n\sum\limits_{j=1}^n x_iA_{ij}x_j}{\partial x_k} = \sum\limits_{i=1}^n A_{ik}x_i + \sum\limits_{j=1}^n A_{kj}x_j $$
这个第k个分量的求导结果稍微复杂些了,仔细观察一下,第一部分是矩阵$\mathbf{A}$的第k列转置后和$x$相乘得到,第二部分是矩阵$\mathbf{A}$的第k行和$x$相乘得到,排列好就是: $$\frac{\partial \mathbf{x}^T\mathbf{A}\mathbf{x}}{\partial \mathbf{x}} = \mathbf{A}^T\mathbf{x} + \mathbf{A}\mathbf{x}$$
从上面可以看出,定义法求导对于简单的实值函数是很容易的,但是复杂的实值函数就算求出了任意一个分量的导数,要排列出最终的求导结果还挺麻烦的,因此我们需要找到其他的简便一些的方法来整体求导,而不是每次都先去针对任意一个分量,再进行排列。
在我们寻找一些简单的方法前,我们简单看下标量对向量求导的一些基本法则,这些法则和标量对标量求导的过程类似。
1) 常量对向量的求导结果为0。
2)线性法则:如果$f,g$都是实值函数,$c_1,c_2$为常数,则:$$\frac{\partial (c_1f(\mathbf{x})+c_2g(\mathbf{x})}{\partial \mathbf{x}} = c_1\frac{\partial f(\mathbf{x})}{\partial \mathbf{x}} +c_2\frac{\partial g(\mathbf{x})}{\partial \mathbf{x}} $$
3) 乘法法则:如果$f,g$都是实值函数,则:$$\frac{\partial f(\mathbf{x})g(\mathbf{x})}{\partial \mathbf{x}} = f(\mathbf{x})\frac{\partial g(\mathbf{x})}{\partial \mathbf{x}} +\frac{\partial f(\mathbf{x})}{\partial \mathbf{x}} g(\mathbf{x}) $$
要注意的是如果不是实值函数,则不能这么使用乘法法则。
4) 除法法则:如果$f,g$都是实值函数,且$g(\mathbf{x}) \neq 0$,则:$$\frac{\partial f(\mathbf{x})/g(\mathbf{x})}{\partial \mathbf{x}} = \frac{1}{g^2(\mathbf{x})}(g(\mathbf{x})\frac{\partial f(\mathbf{x})}{\partial \mathbf{x}} - f(\mathbf{x})\frac{\partial g(\mathbf{x})}{\partial \mathbf{x}})$$
现在我们来看看定义法如何解决标量对矩阵的求导问题。其实思路和第一节的标量对向量的求导是类似的,只是最后的结果是一个和自变量同型的矩阵。
我们还是以一个例子来说明。$y=\mathbf{a}^T\mathbf{X}\mathbf{b}$,求解$\frac{\partial \mathbf{a}^T\mathbf{X}\mathbf{b}}{\partial \mathbf{X}}$
其中, $\mathbf{a}$是m维向量,$\mathbf{b}$是n维向量, $\mathbf{X}$是$m \times n$的矩阵。
我们对矩阵$\mathbf{X}$的任意一个位置的$X_{ij}$求导,如下:$$\frac{\partial \mathbf{a}^T\mathbf{X}\mathbf{b}}{\partial X_{ij}} = \frac{\partial \sum\limits_{p=1}^n\sum\limits_{q=1}^n a_pA_{pq}b_q}{\partial X_{ij}} = \frac{\partial a_iA_{ij}b_j}{\partial X_{ij}} = a_ib_j$$
即求导结果在$(i.j)$位置的求导结果是$\mathbf{a}$向量第i个分量和$\mathbf{b}$第j个分量的乘积,将所有的位置的求导结果排列成一个$m \times n$的矩阵,即为$ab^T$,这样最后的求导结果为:$$\frac{\partial \mathbf{a}^T\mathbf{X}\mathbf{b}}{\partial \mathbf{X}} = ab^T$$
简单的求导的确不难,但是如果是比较复杂的标量对矩阵求导,比如$y=\mathbf{a}^Texp(\mathbf{X}\mathbf{b})$,对任意标量求导容易,排列起来还是蛮麻烦的,也就是我们遇到了和标量对向量求导一样的问题,定义法比较适合解决简单的问题,复杂的求导需要更简便的方法。这个方法我们在下一篇来讲。
同时,标量对矩阵求导也有和第二节对向量求导类似的基本法则,这里就不累述了。
这里我们也同样给出向量对向量求导的定义法的具体例子。
先来一个简单的例子: $\mathbf{y} = \mathbf{A} \mathbf{x} $,其中$ \mathbf{A}$为$n \times m$的矩阵。$\mathbf{x}, \mathbf{y}$分别为$m,n$维向量。需要求导$\frac{\partial \mathbf{A}\mathbf{x}}{\partial \mathbf{x}}$,根据定义,结果应该是一个$n \times m$的矩阵
先求矩阵的第i行和向量的内积对向量的第j分量求导,用定义法求解过程如下:$$\frac{\partial \mathbf{A_i}\mathbf{x}}{\partial \mathbf{x_j}} = \frac{\partial A_{ij}x_j}{\partial \mathbf{x_j}}= A_{ij}$$
可见矩阵 $\mathbf{A}$的第i行和向量的内积对向量的第j分量求导的结果就是矩阵 $\mathbf{A}$的$(i,j)$位置的值。排列起来就是一个矩阵了,由于我们分子布局,所以排列出的结果是$ \mathbf{A}$,而不是 $\mathbf{A}^T$
使用定义法虽然已经求出一些简单的向量矩阵求导的结果,但是对于复杂的求导式子,则中间运算会很复杂,同时求导出的结果排列也是很头痛的。下一篇我们讨论使使用矩阵微分和迹函数的方法来求解矩阵向量求导。
(欢迎转载,转载请注明出处。欢迎沟通交流: liujianping-ok@163.com)