0

免责声明:确实发布了数学堆栈交换或某种形式的帖子。但我从我的数学专业朋友那里听说,他们并没有真正使用爱因斯坦求和,但我知道机器学习使用了很多。因此我在这里发布了这个问题(作为优化算法性能)。

在研究矩阵计算时(例如,至少需要多少元素乘法),我试图计算以下梯度:

高级方程

其中意味着在它们的ABC第一个轴上收缩三个矩阵(例如2x32x4, 和与-轴相加)。基本上,它计算 3-matrix-contraction关于的范数梯度。然后再次计算该梯度的范数。2x53x4x52ABCAA

这相当于:

传统写作

或简化一点(由 证明autograd):

在此处输入图像描述

我们可以用爱因斯坦求和形式写出来(被einsum很多包的函数使用,比如numpytensorflow等等)

np.einsum('ia,ib,ic,jb,jc,jd,je,kd,ke->ka', A, B, C, B, C, B, C, B, C)

在写这篇文章时,我发现了矩阵B,并且C在求和中一次又一次地重复。我想知道我可以将那些“大量的 B 和 C”简化为某种矩阵功率吗?这应该使事情对数更快。我尝试手动简化但没有弄清楚。

非常感谢!如果我说的不正确,请纠正我。

4

1 回答 1

0

我发现我可以先广播(即外积)B(形状ib)和C(形状ic)以获得BC形状张量ibc

BC = np.einsum('ib,ic->ibc', B, C)

然后我可以用它的转置对它进行张量收缩以获得一个方阵:

JUMP = np.einsum('ibc,cbj->ij', BC, BC.T)

这个矩阵JUMP是正方形的,就像“梯度跳跃”算子一样,可以跳跃梯度的顺序。例如,如果我想获得问题中提到的二阶梯度,我可以简单地将其JUMP与一阶梯度相乘以获得:

g2 = JUMP @ g1

为了得到三阶,乘以它的矩阵平方:

g3 = JUMP @ JUMP @ g1

为了得到顺序,乘以它的矩阵四次幂(不是立方体):

g4 = np.linalg.matrix_power(JUMP, 4) @ g1
于 2019-01-22T09:38:19.317 回答