Matrix Calculus 学习笔记

 

Matrix Calculus | 学习笔记

本文将记录机器学习模型中矩阵求导相关的trick, 文中以小写字母x表示标量,粗体小写字母x表示列向量,大写字母X表示矩阵

计算的关键枢纽:导数微分的区别与联系

1.标量对标量的求导

导数可以看做一种变化率,微分可以看做是一种变化量,两者之间的关系是:

\[df = f'(x)dx\]

2.标量对向量的求导

这里f看成是一个多元函数 \(f(\boldsymbol{x_1}, \boldsymbol{x_2}, ..., \boldsymbol{x_i})\), 其全微分可以看成是对所有偏微分的求和。

\[df = \sum_{i}\frac{\partial f}{\partial \boldsymbol{x_i}}d\boldsymbol{x_i}\]

若令:

\[\frac{\partial f}{\partial \boldsymbol{x}}^T = [\frac{\partial f}{\partial \boldsymbol{x_0}}, \frac{\partial f}{\partial \boldsymbol{x_1}}, ..., \frac{\partial f}{\partial \boldsymbol{x_i}}] \\ d\boldsymbol{x} = [d\boldsymbol{x_0}, d\boldsymbol{x_1}, ..., d\boldsymbol{x_i}]^T\]

则有:

\[df = \frac{\partial f}{\partial \boldsymbol{x}}^T ~ d\boldsymbol{x}\]

此即标量对向量情境下的全微分公式,定义了全微分公式后,我们就可以利用微分来求导数。

3.标量对矩阵的求导

这里f同样看成是一个多元函数 \(f(X_{0,0}, X_{1,0}, ..., X_{m,n})\), 其全微分可以看成是对所有偏微分的求和。

\[df = \sum_{i}\sum_{j}\frac{\partial f}{\partial X_{i,j}}dX_{i,j}\]

向量可以看做是矩阵的特殊形式,因此参考上一节,标量对矩阵的全微分“似乎可以”写成:

\[df = \frac{\partial f}{\partial X}^T ~ dX\]

然而这里等式左边是一个标量,等式右边却是一个\(n*n\)的矩阵,这显然是不正确的。仔细观察等式右边所得到的的方阵, 可以发现其对角线元素之和正好等于\(\frac{\partial f}{\partial X}\)与\(dX\)对应元素乘积的和, 也就是\(\sum_{i}\sum_{j}\frac{\partial f}{\partial X_{i,j}}dX_{i,j}\), 所以将上式进行一个小修改后既可以使等式成立:

\[df = tr(\frac{\partial f}{\partial X}^T ~ dX)\]

这里\(tr\)表示求矩阵对角线元素之和,也就是所谓的

3.1 Preliminary

微分法则

  • 加减法 \(d(A \pm B)=dA \pm dB\)
  • 矩阵乘法 \(d(A B) = A(dB) + (dA)B\)
  • 矩阵转置 \(d(A^T) = (dA)^T\)
  • 迹 \(d(tr(A)) = tr(dA)\)
  • 逆 \(d(A^{-1}) = -A^{-1}(dA)A^{-1}\) (证明:\(XX^{-1}=I\)两侧微分得\(XdX^{-1}+(dX)X^{-1}=dI=0\),\(dI\)为0是因为常量矩阵)
  • 行列式 $$d A = ?$$ (不常用)
  • 逐元素乘法 \(d(A \odot B) = A \odot dB + dA \odot B,~where~\odot~means~elementwise~multiplication\)
  • 逐元素函数 \(d\sigma(A) = \sigma'(A) \odot dA,~where~\sigma(A) = [\sigma(A_{i,j})]~and~\sigma'(A) = [\sigma'(A_{i,j})]\)

迹法则

  • 加减法 \(tr(A \pm B) = tr(A) \pm tr(B)\)
  • 矩阵乘法 \(tr(AB) = tr(BA) ~w.r.t~A~has~the~same~shape~with~B^T\)
  • 矩阵转置 \(tr(A^T) = tr(A)\)
  • 矩阵乘法/逐元素乘法交换率 \(tr(A^T(B \odot C)) = tr((A \odot B)^T C)~w.r.t~A/B/C~have~same~shapes\), 两侧都等于\(\sum_{i}\sum_{j}A_{i,j}B_{i,j}C_{i,j}\)

特别的,如果我们把标量当成一种1x1的矩阵,那么标量也存在迹,标量的迹就是他本身,因此

\[df = tr(\frac{\partial f}{\partial X}^TdX)\]

给式中左边标量套上迹后,得到:

\[tr(df) = tr(\frac{\partial f}{\partial X}^TdX)\]

该等式是计算标量对矩阵的导数的核心。

3.2 Example

E1:

E2:

E3:

E4:

E5:

E6:

总结:先求微分再套上迹

4.矩阵对矩阵的求导

这里矩阵\(F \in \mathcal{R_{q*p}}\)中每一个元素都可以看成是一个多元函数,也即\(F_{q,p}(X_{0,0}, X_{1,0}, ..., X_{i,j})\) 对于其中的每一个多元函数,都存在一个全微分,所以\(dF\)的维度同样是\(q*p\)。

\[dF = \sum_{i}\sum_{j}\frac{\partial F_{q,p}}{\partial X_{i,j}}dX_{i,j},~dF \in \mathcal{R_{q*p}}\]

仿照标量对矩阵求导的全微分公式,我们希望找到\(\frac{\partial F}{\partial X}~\in~\mathcal{R_{m*n*q*p}}\) 和\(dF~\in~\mathcal{R_{q*p}}\)与\(dX~\in~\mathcal{R_{m*n}}\)之间的关系。

注意这里\(\frac{\partial F}{\partial X}\)是一个四维的张量(一般来说矩阵都特指二维)。多维张量是无法直接使用矩阵乘法的, 因为矩阵乘法本质上只能是两个二维的matrix进行叉乘。考录到四维张量代表的是\(F\)中每一个多元函数对\(X\)中每一个自变量的偏导数, 这\(m*n*q*p\)个偏导数显然是可以独立计算的,因此其对应的偏微分也可以独立计算。既然四维张量中的每一个元素都满足独立计算的假设, 那么计算顺序对最终结果就不存在任何影响,因此把四维张量压缩成二维矩阵甚至是一维向量(也即直接将张量展开)获得的结果都是相同的。 为了方便使用(二维)矩阵运算来构建全微分公式,我们暂且将\(\frac{\partial F}{\partial X}~\in~\mathcal{R_{m*n*q*p}}\) 压缩成\(\frac{\partial F}{\partial X}~\in~\mathcal{R_{mn*qp}}\)的二维矩阵。

注意,当我们把四维张量压缩到\(mn*qp\)后,\(dF~\in~\mathcal{R_{q*p}}\)和\(dX~\in~\mathcal{R_{m*n}}\)同样需要做相应的 变化(或者说压缩操作)以进行矩阵乘法,具体的,我们需要将\(dF~\in~\mathcal{R_{q*p}}\)压缩成 \(dF~\in~\mathcal{R_{qp*1}}\),将\(dX~\in~\mathcal{R_{m*n}}\)压缩成 \(dX~\in~\mathcal{R_{mn*1}}\),因为其第二维度是1,所以该操作实际上可以看作一种向量化操作,这里记为\(vec()\)。

经过上述讨论,很容易可以得到如下的全微分公式:

\[vec(dF) = \frac{\partial F}{\partial X}^T vec(dX)\]

该等式是计算矩阵对矩阵的导数的核心。

4.1 Preliminary

向量化法则

  • 加减法 \(vec(A + B) = vec(A) + vec(B)\)
  • 矩阵乘法 \(vec(AXB) = (B^T \otimes A)vec(X)\) 其中\(\otimes\)表示克罗内克积
  • 矩阵转置 \(vec(A^T) = K_{mn}vec(A)\)
  • 逐元素乘法 \(vec(A \odot X) = diag(A)vec(X)\) 其中\(K_{mn} \in \mathcal{R_{mn*mn}}\)是交换矩阵

克罗内克积法则

克罗内克积一般是在求二阶偏导时才能用到,更具体的例子是使用牛顿法的更新\(\triangle X\)的时候

4.2 Example

E1: \(F=AX,~X\in\mathcal{R_{m*n}},~A\in\mathcal{R_{k*m}},~F\in\mathcal{R_{k*n}},~\frac{\partial F}{\partial X}?\)

E2: \(F=Aexp(XB),~X\in\mathcal{R_{m*n}},~B\in\mathcal{R_{n*p}},~A\in\mathcal{R_{k*m}},~F\in\mathcal{R_{k*p}},~\frac{\partial F}{\partial X}?\)

总结:先求微分再套上向量化