在计算反向传播或最优化问题时,经常遇到向量、矩阵、张量对向量、矩阵、张量的求导问题,而类比普通函数求导经常无法处理矩阵转置的问题,因此需要使用一套更简单的符号系统进行运算,即里奇微积分

爱因斯坦求和约定

相乘时符号相同且共轭的指标,如一个共变自由指标(下标)遇到一个符号相同的反变自由指标(上标),会发生缩并运算成为哑指标,整个表达式自由指标的个数表示最终结果的自由指标个数;当自由指标只有一个 $i$ (如 $x^i,A_i^jx^i=y^j$ )时,表达式是一个向量(一维张量),有两个 $i,j$ (如 $A_i^j,A^{ij},A_i^jx^j$ )时,表达式是一个二维张量,以此类推。

符号约定

$R^n$ 表示n维列向量空间, $R^{n*}$ 表示n维行向量空间,$A_{ij}$ 表示双线性映射 $R^n\times R^n\rightarrow R$ , $A^{ij}$ 表示双线性映射 $R^{n*}\times R^{n*}\rightarrow R$,$x^i$ 表示列向量 $x$, $x_i$ 表示行向量$x^T$(也叫线性泛函或余向量)。

$\delta_i^j$ 是一个单位矩阵, $\delta_{ij}$ 是度量张量(一个双线性映射), $\delta^{ij}$ 是共轭度量张量,它们有这些性质:$x^j(=x)$ 表示原向量则$\delta_{ij}x^j=x_i(=x^{\top})$ 表示转置向量, $\delta^i_jx^i=\operatorname{diag}(x)$ , $A_j^i(=A)$ 表示原矩阵则$\delta_{ii}\delta^{jj}A_j^i(=A^\top)$ 表示转置矩阵, $\delta_{ii}\delta^{ii}=1$ , $\delta_{ij}\delta^{ii}=\delta_j^i$ ,$\frac{dx_i}{dx^j}=\delta_i^j$ , $\frac{dx^i}{dx^j}=\delta^{ij}$ , $\frac{dx_i}{dx_j}=\delta_{ij}$ , $\frac{d X_i^j}{d X_k^l} = \delta^{jl}\delta_{ik}$

矩阵表示与Ricci Calculus表示法的对比

$c = x ^ { \top } y \quad c = x _ { i } y ^ { i }$

$x = A y \quad x ^ { i } = A _ { j } ^ { i } y ^ { j }$

$x ^ { \top } = y ^ { \top } A \quad x _ { j } = y _ { i } A _ { j } ^ { i }$

$C = A \cdot B \quad C _ { k } ^ { i } = A _ { j } ^ { i } B _ { k } ^ { j }$

$A = x y ^ { \top } \quad A _ { j } ^ { i } = x ^ { i } y _ { j }$

$z = x \odot y \quad z ^ { i } = x ^ { i } y ^ { i }$

$A=x\otimes y \quad A^{ij}=x^i y^j$

$C=A\otimes B\quad C^{ij}_{kl}=A_k^i B_l^j$

$B=A\otimes x\quad B_{ij}^k=A_{ij}x^k$

$B = A \operatorname { diag } ( x ) \quad B _ { j } ^ { i } = A _ { j } ^ { i } x _ { j }$

$B = \operatorname { diag } ( x ) A \quad B _ { j } ^ { i } = x ^ { i } A _ { j } ^ { i }$

示例

根据上述原理计算 $x^TAx$ 对 $x$ 的导数:

$\frac{d (x^{\top}Ax)}{dx}$

$=\frac{d (x_i A_j^i x^j)}{d x^k}$

$=\frac{d x_i}{d x^k}A_j^i x^j+x_i A_j^i \frac{d x^j}{d x^k}$

$=\delta_i^k A_j^i x^j+ x_i A_j^i \delta^{jk}$

$=A_j^k x^j+x_i A_j^i \delta^{jk} \delta_{kk} \delta^{kk}$

$=A_j^k x^j+x_i A_j^i \delta^{j}_k \delta^{kk}$

$=A_j^k x^j+x_i A_k^i \delta^{kk}$

$=A_j^k x^j+\delta_{ii}x^i A_k^i \delta^{kk}$

$=Ax+A^{\top}x$

计算 $y\odot (Xw)$ 对 $X$ 的导数:

$\frac{\partial (y\odot (Xw))}{\partial X}$

$=\frac{\partial (y^i X_j^iw^j)}{\partial X_k^l}$

$=y^i\delta^{il}\delta_{jk}w^j$

$=y^i\delta^{il}w_k$

$=\operatorname{diag}(y)\otimes w^\top$

需要注意的是, $\delta_{ii}$ 和 $\delta^{ii}$ 并不像常规的Kronecker符号一样等于n(n是下标对应的维数),而是满足$\delta_{ii}\delta^{ii}=1$ ,它有特殊的用途。在本文中,它主要用于表示矩阵转置。在爱因斯坦约定中,表示矩阵转置是一个容易引起记号混乱的事,如果使用 $A_i^j$ 表示原矩阵(方阵), $A_j^i$ 表示转置矩阵,那么原本 $A_i^j x^i=y^j$ ,转置后却因为指标无法缩并而无法相乘得到列向量了: $A_j^i ? x^i$ ;此外,不区分上下标的爱因斯坦约定对于这是匪夷所思的。但是根据上面的定义,可以使用 $A_j^i \delta_{ii}\delta^{jj}x^i$ 表示 $A^\top x$ ,而不会产生歧义。事实上,在爱因斯坦约定中,指标只能用于表示张量的各个维,如果张量是对称的,那么不管怎么排列指标,表达式看起来都是一样的,因此本文的参考文献[4]使用了上述 $\delta_{ii}$ 和 $\delta^{ii}$ 符号规避了此问题。

如果你没有看懂本文,没有关系,使用参考文献[4]对应的网站http://matrixcalculus.org/即可在线计算矩阵、张量求导。即使你不懂如何计算爱因斯坦约定,你也可以通过numpy的np.einsum()来帮助你计算爱因斯坦约定,更多有关爱因斯坦约定的内容请参考[10]

在tensorflow中使用爱因斯坦求和约定可以极大的简化代码,使用以下代码实现矩阵乘法:

$R=A B\quad R_i^k=A_i^j B_j^k$

import tensorflow as tf
R = tf.einsum('ij,jk->ik',A,B)

参考文献

[1] Matrix calculus - Wikipedia

[2] Ricci calculus - Wikipedia

[3] Kronecker delta - Wikipedia

[4] S. Laue, M. Mitterreiter, and J. Giesen. Computing Higher Order Derivatives of Matrix and Tensor Expressions, NIPS 2018.

[5] Einstein notation

[6] Bilinear map - Wikipedia

[7] Linear form - Wikipedia

[8] Covariance and contravariance of vectors

[9] Abstract index notation

[10] Einstein notation and generalized Kronecker symbol

标签: none

评论已关闭