在张量流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如何处理梯度反向传播?
答案 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 * c
和de/da = de/de * b * c
(其中de/de
只是np.ones_like(e)
),
einsum
中的它是相同的,除了np.ones_like(e)
现在是一个1的矩阵,而不仅仅是1
并且*
操作被替换使用特定的einsum
字符串。
如果您想了解更多信息,那就太棒了!我确切地知道以这种方式谈论它的0
资源。如果你找到一些,请告诉我:))
答案 1 :(得分:1)
如上所述here,tf.einsum
只是tf.matmul
和tf.multiply
的语法糖,如果您了解backprop在这些方面是如何工作的,那么您可以在这里了解backprop。