机器学习中,往往是对整个数据集操作,“原子化”的运算过于繁琐,将其抽象成矩阵,使得思路更加清晰,也更便于转换成具体的代码。
基本定义
矩阵求导的本质就是普通的求导写成了矩阵的形式,因此我们约定一些规则在下文。这里用粗体小写表示向量,粗体大写表示矩阵。
向量→标量函数求导
向量→标量函数即输入为向量,输出为标量的函数。有函数,输入一个维列向量,输出一个实数。对其求导的定义式:
这个定义式正好和梯度相符合。
向量→向量函数求导
向量→向量函数即输入输出都是向量的函数。有函数,输入一个维列向量,输出一个维列向量。可以视为多个标量函数放到一个列向量中构成这个向量函数,即。如果只是对一个标量函数求导,那么就和上面一样:
现在,把上面的式子“展开”成一个梯度构成的矩阵里,才能完整表达这个向量函数所有的求导结果:
函数 求导后输出了一个的矩阵。第列是 的第行的标量函数的梯度。它其实也是Jacobian矩阵的转置。
例
上面是普遍情况,而很多时候这里的是由同一个函数组成,比如是一列函数,那么有,表示向量的每一个元素都取倒数。
也可以这样写:,看起来就和单变量的函数一样。
如果复杂一点 求导,其中是维度和维度相同的常数列向量。
先说一个前提,接下来会使用这样的表示方法:,而,带转置的表示点乘,否则就是元素相乘,不改变原来两个向量的维度。
那么上式只看其中一行的情况:,求导得,每行都如此,因此最终的结果写成。这样一来,向量之间的运算看起来就像实数之间的运算。
矩阵→标量函数求导
即输入为矩阵,输出为标量的函数的求导。有函数,其参数是矩阵。这和上面向量→标量函数求导相似,其相当于是矩阵为参数。我们只需要把它展开即可:
相当于是把丢到矩阵的每一个元素上面构成一个新的矩阵。而且这些元素的位置不变。
例
举一个具体的例子:,其中,。
不难看出本质是一个向量→向量函数,且满足。因此输出的应该是一个矩阵。我们记,。
这样一来,整个式子就紧凑了很多,看起来非常清爽。
.
.
.
.
.
参考文献
[1] Herman Kamper. Vector and Matrix Calculus: https://www.kamperh.com/notes/kamper_matrixcalculus13.pdf
网友评论