Back

机器学习中的矩阵求导

在学习机器学习的算法时,推导过程中往往会涉及矩阵或向量求导以及一些其他的线性代数的知识。比如在推导LDA算法的时候,就是把Fisher’s Criterion求导后置零得到的结果。另外在优化的时候经常会使用到梯度下降法,这与矩阵向量求导也是分不开的。

记号

在这篇文章中,向量统一为列向量,用\(\mathbf x\)表示,矩阵用\(X\)大写字母表示,标量用\(x\)表示。求导使用\(\frac{\partial f(\mathbf x)}{\partial \mathbf x}\)表示。

线性代数的一些变换

$$ \begin{aligned} &1.\ (AB)^{-1} = B^{-1}A^{-1}\\ &2.\ (A^T)^{-1} = (A^{-1})^T\\ &3.\ AB = C \Leftrightarrow DAB = DC\\ &4.\ \left[ \begin{matrix} a & b\\ c & d \end{matrix} \right]^{-1} = \frac{1}{ad-bc}\left[ \begin{matrix} d & -b\\ -c & a \end{matrix} \right] \\ &5.\ (A+B)^T = A^T + B^T\\ &6.\ (AB)^T = B^TA^T \\ &7.\ A = A^{\frac{1}{2}}A^{\frac{1}{2}} \\ &8.\ A^0 = I \end{aligned} $$

正交矩阵

正交矩阵(orthogonal matrix)是一个方块矩阵,其元素为实数,而且行与列皆为正交的单位向量,使得该矩阵的转置矩阵为其逆矩阵:\(S^{-1} = S^T\)。比如恒等变换:

$$ \left[ \begin{matrix} 1 & 0\\ 0 & 1 \end{matrix} \right] $$

和旋转\(\alpha \):

$$ \left[ \begin{matrix} \cos \alpha & -\sin \alpha \\ \sin \alpha & \cos \alpha \end{matrix} \right] $$

Eigenvalue(特征值)

$$ A\mathbf u = \lambda \mathbf u $$

则\(\lambda\)是特征值,\(\mathbf u\)是其对应的特征向量。

由此可以推出特征值分解,即对于对称矩阵\(A\),可以被分解为:

$$ A = U \Lambda U^T $$

其中\(U\)是正交矩阵,它的列是\(A\)的特征向量,\(\Lambda\)是对角矩阵,是对应的\(A\)的特征值。

变量多次出现的求导方法

若在函数表达式中,某个变量出现了多次,可以单独计算函数对自变量的每一次出现的导数,再把结果加起来。

举例(该规则对向量和矩阵也是成立的,这里先用标量举一个简单的例子):假设函数表达式是\(f(x)=(2x+1)x+x^2\),可以先把三个\(x\)看成三个不同的变量,即把\(f\)的表达式看成\((2x_1+1)x_2+x_3^2\),然后分别计算\(\partial f / \partial x_1 = 2x_2\),\(\partial f / \partial x_2 = 2x_1 + 1\),和\(\partial f / \partial x_3 = 2x_3\),最后总的导数就是这三项加起来:\(2x_2 + 2x_1 + 1 + 2x_3\),此时再把\(x\)的下标抹掉并化简,就得到\(6x+1\)。熟悉这个过程之后,可以省掉添加下标再移除的过程。

这个方法和多层神经网络算法中的反向传递(Back Propagation)的思想方法是一样的。

最常用的四个矩阵向量求导公式

$$ \begin{aligned} &1.\ \frac{\partial A\mathbf x}{\partial \mathbf x} = A \\ &2.\ \frac{\partial \mathbf x^T \mathbf a}{\partial \mathbf x} = \frac{\partial \mathbf a^T \mathbf x}{\partial \mathbf x} = \mathbf a \\ &3.\ \frac{\partial \mathbf ||x||^2}{\partial \mathbf x} = \frac{\partial \mathbf x^T \mathbf x}{\partial \mathbf x} = 2 \mathbf x \\ &4.\ \frac{\partial \mathbf x^T A \mathbf x}{\partial \mathbf x} = (A + A^T)\mathbf x \end{aligned} $$

推导过程

最基础的出发点是,对矩阵或者向量求导,就是对其中的每一个元素关于每一个自变量中的元素进行求导,最后写成一个矩阵的形式,所以落脚点在单个元素上。

  1. 公式1

容易看出\(A\mathbf x\)是一个向量,对其中一个元素进行求导,注意下标,求和符号内只有一项包含\(x_k\),其他的可以直接舍弃:

$$ \begin{aligned} \frac{\partial}{\partial x_k} (A\mathbf x)_{i} &= \frac{\partial}{\partial x_k} \sum_{j=1}^{n} A_{ij}x_j \\ &= A_{ik} \end{aligned} $$

所以可得在求导结果矩阵中每一行每一列的元素都等于\(A\)在这个位置上的元素,q.e.d.

  1. 公式2

\(\mathbf x^T \mathbf a\)和\(\mathbf a^T \mathbf x\)都是标量。证明过程和1相似:

$$ \frac{\partial}{\partial x_i} \mathbf x^T \mathbf a = \frac{\partial}{\partial x_i} \sum_{j=1}^{n} x_ja_j = a_i \\ \frac{\partial}{\partial x_i} \mathbf a^T \mathbf x = \frac{\partial}{\partial x_i} \sum_{j=1}^{n} a_jx_j = a_i $$

这个公式是最基本的,但极其重要和常用。

  1. 公式3

证明过程也十分简单:

$$ \frac{\partial \mathbf ||x||^2}{\partial x_i} = \frac{\partial}{\partial x_i} \sum_j x_j^2 = \frac{\partial}{\partial x_i} x_i^2 = 2x_i $$

  1. 公式4

可以看出结果是一个标量。应用前面所说的变量多次出现的求导方法,先把后面的\(A \mathbf x\)看成整体,对前一个\(\mathbf x\)求导,运用公式2,可得:

$$ \frac{\partial \mathbf x^T (A \mathbf x')}{\partial \mathbf x} = A \mathbf x' $$

类似的对后面的\(\mathbf x\)求导,可得:

$$ \frac{\partial (\mathbf x'^T A) \mathbf x}{\partial \mathbf x} = (\mathbf x'^T A)^T = A^T\mathbf x' $$

去掉一撇,加起来,可得:

$$ \frac{\partial \mathbf x^T A \mathbf x}{\partial \mathbf x} = A \mathbf x + A^T\mathbf x = (A + A^T)\mathbf x $$

q.e.d.

应用举例

LDA算法的推导过程中需要解\(\mathbf w\):

$$ \underset{\mathbf w}{\operatorname{argmax}} \frac{\mathbf w^TS_B\mathbf w}{\mathbf w^TS_W\mathbf w} $$

其中\(S_B\)和\(S_W\)都是对称矩阵。容易发现分式上下都是标量。要求最大值,对\(\mathbf w\)求导,置零即可。先运用商的导数公式:

$$ \frac{\partial}{\partial \mathbf w}\frac{\mathbf w^TS_B\mathbf w}{\mathbf w^TS_W\mathbf w} = \frac{\mathbf w^TS_W\mathbf w(\frac{\partial}{\partial \mathbf w}\mathbf w^TS_B\mathbf w) - \mathbf w^TS_B\mathbf w(\frac{\partial}{\partial \mathbf w}\mathbf w^TS_W\mathbf w)}{(\mathbf w^TS_W\mathbf w)^2} $$

求分子上的导数,运用上面的公式4:

$$ \frac{\partial}{\partial \mathbf w}\mathbf w^TS_B\mathbf w = (S_B + S_B^T)\mathbf w $$

由于\(S_B\)是对称的,\(S_B^T = S_B\),

$$ \frac{\partial}{\partial \mathbf w}\mathbf w^TS_B\mathbf w = 2S_B\mathbf w $$

对另一个倒数类似,置零可得:

$$ \frac{(\mathbf w^TS_W\mathbf w)2S_B\mathbf w - (\mathbf w^TS_B\mathbf w)2S_W\mathbf w}{(\mathbf w^TS_W\mathbf w)^2} \overset{!}{=} 0 $$

即:

$$ \begin{aligned} (\mathbf w^TS_B\mathbf w)2S_W\mathbf w &= (\mathbf w^TS_W\mathbf w)2S_B\mathbf w \\ S_W\mathbf w &= \frac{\mathbf w^TS_W\mathbf w}{\mathbf w^TS_B\mathbf w}S_B\mathbf w \\ S_W\mathbf w &= S_B\mathbf w \lambda \\ \mathbf w &= S_W^{-1} S_B\mathbf w \lambda \end{aligned} $$

另请参阅

Built with Hugo
Theme Stack designed by Jimmy