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