常用矩阵导数
最开始接触神经网络的时候有线性感知机的前向传播和反向传播推导,里面用到了对向量求导的手段。后面了解到这是矩阵论里面一块很大的内容,叫矩阵的导数,也一直没学明白。但是后来学最优化和模式识别之后,似乎常用的矩阵导数并不是很多,这边来盘点一下常用的矩阵导数。
为什么要做矩阵导数?
要费劲对矩阵求导数肯定有它的原因,在机器学习里一般是为了优化某些参数。现在训练神经网络是使用了一阶导数的随机梯度下降法。这里提到一个概念叫梯度,一个点的梯度指向该函数上升最快的方向,用\(\nabla f(\mathbf{x})\)表示。 \[ \nabla f(\mathbf{x}) = \frac{\partial f}{\partial \mathbf{x}} = \begin{bmatrix}\frac{\partial f}{\partial \mathbf{x_1}}\\\frac{\partial f}{\partial \mathbf{x_2}}\\ \vdots \\ \frac{\partial f}{\partial \mathbf{x_d}} \end{bmatrix} \] 如果\(\mathbf{x_0}\)是参数的初始点,我们希望优化\(f(\mathbf{x})\)到最小值点,那沿着\(-\nabla f(\mathbf{x_0})\),即负梯度方向移动可能是不错的主意。
有的算法会使用二阶导数来优化,将二阶导数构成的矩阵称为黑塞矩阵(Hessian Matrix)。简单来说这个矩阵的元素满足: \[ H_{ij} = \frac{\partial^2 f}{\partial \mathbf{x_i} \partial \mathbf{x_j}} \] 比如牛顿法等优化方法,使用计算复杂的黑塞矩阵后能获得比梯度法更快的收敛速度。
在机器学习的优化过程中,求含向量、矩阵的导数是很常见的事,需要知道一些常用的矩阵导数。
常用的矩阵导数
对向量求导: \[ \frac{\partial }{\partial \mathbf{x}} [\mathbf{M}x] = \mathbf{M} \tag{1} \]
\[ \frac{\partial }{\partial \mathbf{x}} [x^T \mathbf{M}x] = (\mathbf{M}+ \mathbf{M}^T)x \tag{2} \]
对于(2)式,如果矩阵\(\mathbf{M}\)是对称矩阵,那么可写成: \[ \frac{\partial }{\partial \mathbf{x}} [x^T \mathbf{M}x] = 2\mathbf{M}x \tag{3} \] 如果是两个向量相乘: \[ \frac{\partial }{\partial \mathbf{x}} [y^Tx] = \frac{\partial }{\partial \mathbf{x}} [x^T y] = y \tag{4} \] 矩阵对某个标量求导: \[ \tilde{\mathbf{M}} = \frac{\partial \mathbf{M}}{\partial \mathbf{\theta}} \] 可以对矩阵\(\mathbf{M}\)做逐元素求导: \[ \tilde{\mathbf{M}}_{ij} = \frac{\partial \mathbf{M}_{ij}}{\partial \mathbf{\theta}} \tag{5} \] 如果是逆矩阵,求导公式为: \[ \frac{\partial \mathbf{M}^{-1}}{\partial \theta} = \mathbf{M}^{-1} \frac{\partial \mathbf{M}}{\partial \mathbf{\theta}} \mathbf{M}^{-1} \tag{6} \] (1)~(5)在机器学习算法的推导过程中使用频次很高,(6)的话一些证明题要用到。