里奇微积分(Ricci Calculus):一种计算向量求导,矩阵求导,张量求导的简单方法
在计算反向传播或最优化问题时,经常遇到向量、矩阵、张量对向量、矩阵、张量的求导问题,而类比普通函数求导经常无法处理矩阵转置的问题,因此需要使用一套更简单的符号系统进行运算,即里奇微积分。
爱因斯坦求和约定
相乘时符号相同且共轭的指标,如一个共变自由指标(下标)遇到一个符号相同的反变自由指标(上标),会发生缩并运算成为哑指标,整个表达式自由指标的个数表示最终结果的自由指标个数;当自由指标只有一个 (如 )时,表达式是一个向量(一维张量),有两个 (如 )时,表达式是一个二维张量,以此类推。
符号约定
表示n维列向量空间, 表示n维行向量空间, 表示双线性映射 , 表示双线性映射 , 表示列向量 , 表示行向量(也叫线性泛函或余向量)。
是一个单位矩阵, 是度量张量(一个双线性映射), 是共轭度量张量,它们有这些性质: 表示原向量则 表示转置向量, , 表示原矩阵则 表示转置矩阵, , , , , ,
矩阵表示与Ricci Calculus表示法的对比
示例
根据上述原理计算 对 的导数:
计算 对 的导数:
需要注意的是, 和 并不像常规的Kronecker符号一样等于n(n是下标对应的维数),而是满足 ,它有特殊的用途。在本文中,它主要用于表示矩阵转置。在爱因斯坦约定中,表示矩阵转置是一个容易引起记号混乱的事,如果使用 表示原矩阵(方阵), 表示转置矩阵,那么原本 ,转置后却因为指标无法缩并而无法相乘得到列向量了: ,这是匪夷所思的。但是根据上面的定义,可以使用 表示 ,而不会产生歧义。事实上,在爱因斯坦约定中,指标只能用于表示张量的各个维,如果张量是对称的,那么不管怎么排列指标,表达式看起来都是一样的,因此本文的参考文献[4]使用了上述 和 符号规避了此问题。
如果你没有看懂本文,没有关系,使用参考文献[4]对应的网站http://matrixcalculus.org/即可在线计算矩阵、张量求导。即使你不懂如何计算爱因斯坦约定,你也可以通过numpy的np.einsum()来帮助你计算爱因斯坦约定,更多有关爱因斯坦约定的内容请参考[10]。
在tensorflow中使用爱因斯坦求和约定可以极大的简化代码,使用以下代码实现矩阵乘法:
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
推荐阅读: