张量流梯度中y的元素总和在哪里?

时间:2017-03-25 21:20:09

标签: python tensorflow gradients

我试图在张量流中进行tf.gradient的攻击,对于张量y等级(M,N)和张量x等级(Q, P)人们自然期望的等级(M,N,Q,P)的梯度张量。

正如本网站*上的多个问题所指出的那样,得到的是一个等级(Q,P),它是y元素总和的等级。现在我无法弄清楚,查看张量流代码是在y元素的总和在哪里?是开始还是结束?有人可以帮我查明代码行吗?

*

1 个答案:

答案 0 :(得分:5)

我已回答here,但我猜它不是很有用,因为你无法利用这些知识来区分非标量y。标量y假设是反向AD算法设计的核心,并且您不能修改一个地方来支持非标量y。由于这种混乱不断出现,让我更详细地说明为什么它是不平凡的:

首先,反向AD如何工作 - 假设我们有一个函数f,即组件函数f_i的组合。每个组件函数采用长度为n的向量,并生成长度为n的向量。

它的导数可以表示为矩阵乘法序列。整个表达式可以表达如下。

在区分时,函数组合成为相应组件函数Jacobians的矩阵乘法。

请注意,这涉及矩阵/矩阵产品,证明对于神经网络而言过于昂贵。 IE,AlexNet在其convnet-> fc过渡层中包含8k激活。在每个矩阵为8k x 8k的情况下进行矩阵倍数需要太长时间。使其高效的技巧是假设链中的最后一个函数产生标量。然后它的雅可比矩阵是一个向量,整个事物可以用向量矩阵乘法来重写,而不是矩阵 - 矩阵乘法。

通过从左到右进行乘法可以有效地计算出这个乘积,所以你所做的一切都是nxn向量矩阵乘法而不是nxn矩阵 - 矩阵乘法。

你可以通过从不首先形成那些nxn导数矩阵来使它更有效,并且将每个分量函数与隐含地执行向量x雅可比矩阵乘积的op相关联。这就是TensorFlow tf.RegisterGradient的作用。这是" grad"与组件功能相关联。

enter image description here

现在,这是为矢量值函数完成的,如果你的函数是矩阵值的话怎么办?这是我们在神经网络中处理的典型情况。 IE,在一个矩阵乘法的层中,你乘以的矩阵是未知的,它是矩阵值。在这种情况下,最后一个导数的等级为2,其余导数的等级为3。

现在要应用链规则,你必须处理额外的符号,因为现在" x"链规则意味着矩阵乘法推广到秩-3的张量。 enter image description here

但是,请注意,由于我们使用的是grad运算符,因此我们不必明确地进行乘法运算。所以现在实际上,这个运算符现在采用rank-2的值并产生rank-2的值。

enter image description here

因此,在所有这些中,假设最终目标是标量,它允许通过传递矩阵来区分完全连接的层。

如果要扩展它以支持非标量向量,则需要修改反向AD算法以传播更多信息。 IE,对于完全连接的前馈网络,你可以传播秩3张量而不是矩阵。