标量函数对矩阵求导的方法
写这个是因为今天在推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的内积。
然后来考察一下基本的运算规则。 继续阅读“机器学习中的数学 –标量函数对矩阵求导的方法”