张量流中的tf.einsum()如何计算矩阵乘法的梯度?

时间:2017-04-28 18:16:20

标签: python tensorflow

在张量流tf.einsum()中可以用于矩阵乘法。例如,考虑我有两个张量A(dim=100,28,28,512)B(dim=100,28,28,512)。我正在使用tf.einsum('ijkm,ijkn>imn',A,B)将矩阵A和B乘以第二维和第三维。此乘法的输出维数为(100,512,512)。

在这种情况下,tensorflow如何处理梯度反向传播?

2 个答案:

答案 0 :(得分:5)

我不同意strangepoop的答案,主要是因为"如果你理解backprop在这些中是如何工作的,那么你可以在这里去理解backprop。"

einsum是一个优雅的操作,比matmul或任何其他张量操作更基础。理解matmul中的反向传播仅相当于理解einsum的特殊情况,并提供了非常有限的观点。

对于标准matmul操作:

c = einsum("ij,jk->ik", a, b)

c相对于a的渐变是以非常简单的方式计算的:

dc/da = einsum("ik,jk->ij", np.ones_like(c), b).

这里发生的事情非常简单:我们翻转操作数和相应的字符串。在a的位置,我们放置了c,并且在ik的位置放置了ij那就是它。

如果您的操作:

C = tf.einsum('ijkm,ijkn>imn',A,B)

相对于A的渐变只是:

dc/da = tf.einsum('imn,ijkn>ijkm',np.ones_like(C),B)

中间操作数保持不变,我们只是翻转了第一个和最后一个操作数和字符串。

那真正发生了什么?它只是对任意张量的正常乘法运算的自然概括。

正常乘法中的方法相同

e = a * b * cde/da = de/de * b * c(其中de/de只是np.ones_like(e)),

einsum中的

它是相同的,除了np.ones_like(e)现在是一个1的矩阵,而不仅仅是1并且*操作被替换使用特定的einsum字符串。

如果您想了解更多信息,那就太棒了!我确切地知道以这种方式谈论它的0资源。如果你找到一些,请告诉我:))

答案 1 :(得分:1)

如上所述heretf.einsum只是tf.matmultf.multiply的语法糖,如果您了解backprop在这些方面是如何工作的,那么您可以在这里了解backprop。