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

Abh*_*oke 2 python tensorflow

在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).

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

Bru*_*vic 7

我不同意strangepoop的回答,主要是在"如果你理解backprop在这些中是如何工作的那个,你可以在这里去理解反向支持."

einsum是一种优雅的操作,比matmul任何其他张量操作更基础.理解反向传播matmul只是为了理解特殊情况,einsum并提出了非常有限的观点.

在标准matmul操作的情况下:

c = einsum("ij,jk->ik", a, b)
Run Code Online (Sandbox Code Playgroud)

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

dc/da = einsum("ik,jk->ij", np.ones_like(c), b).
Run Code Online (Sandbox Code Playgroud)

这里发生的事情非常简单:我们翻转操作数和相应的字符串.在这个地方a我们把c和和的地方ik我们把ij.而已.

在您的操作情况下:

C = tf.einsum('ijkm,ijkn>imn',A,B)
Run Code Online (Sandbox Code Playgroud)

关于的梯度A就是:

dc/da = tf.einsum('imn,ijkn>ijkm',np.ones_like(C),B)
Run Code Online (Sandbox Code Playgroud)

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

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

在正常乘法中的方式相同

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

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

如果您想了解更多相关内容,那太好了!我确切地知道0以这种方式谈论它的资源.如果你找到一些,请告诉我:)