如何计算将 1X1 神经元作为输入并将其乘以常数 NXN 矩阵的自定义深度学习层的梯度?
How to calculate the gradient for a custom deep learning layer that takes a 1X1 neuron as input and multiplies it by a constant NXN matrix?
我想创建一个自定义深度学习层,它将一个 1X1 神经元作为输入,并使用它来缩放一个常量、预定义的 NXN 矩阵。我不明白如何计算这一层的梯度。
我知道在这种情况下 dLdZ 是 NXN 并且 dLdX 应该是 1X1,我不明白 dZdX 应该是什么来满足它,它显然不是一个简单的链式导数,其中 dLdX = dLdZ*dZdX 因为尺寸不匹配。
这个问题与语言无关,我在这里用 Matlab 写的。
%M 是常数 NXN 矩阵
%X 是 1X1X1Xb
Z = zeros(N,N,1,b);
for i = 1:b
Z(:,:,:,i) = squeeze(X(:,:,1,i))*M;
end
==============================
编辑:我得到的答案非常有帮助。我现在执行计算如下:
dLdX = zeros(1,1,1,b);
for i = 1:b
dLdX(:,:,:,i) =sum(sum(dLdZ(:,:,:,i).*M)));
end
这非常有效。谢谢!!
我觉得你的问题有点不清楚。我将假设您的目标是通过您在定义层之上的梯度将梯度传播到一批标量值。我按照我的理解来回答吧。
U 有参数 X,它是一个标量,维度为 b (b: batch_size)。这用于缩放常量矩阵 Z,其维度为 NxN。假设你立即从缩放矩阵 Z' = Z*X 计算一些标量损失 L,其中 Z' 的维度为 bxNxN。
然后你可以根据以下公式计算 X 中的梯度:
dL/dX = dL/dZ * dZ/dX --> 请注意,该产品的尺寸确实匹配(与您的初始印象不同),因为 dL/dZ' 是 bxNxN 并且dZ'/dX 为 bxNxN。对正确的索引求和得到 dL/dX,它的维度为 b。
我的理解对吗?
干杯
我想创建一个自定义深度学习层,它将一个 1X1 神经元作为输入,并使用它来缩放一个常量、预定义的 NXN 矩阵。我不明白如何计算这一层的梯度。
我知道在这种情况下 dLdZ 是 NXN 并且 dLdX 应该是 1X1,我不明白 dZdX 应该是什么来满足它,它显然不是一个简单的链式导数,其中 dLdX = dLdZ*dZdX 因为尺寸不匹配。
这个问题与语言无关,我在这里用 Matlab 写的。 %M 是常数 NXN 矩阵 %X 是 1X1X1Xb
Z = zeros(N,N,1,b);
for i = 1:b
Z(:,:,:,i) = squeeze(X(:,:,1,i))*M;
end
============================== 编辑:我得到的答案非常有帮助。我现在执行计算如下:
dLdX = zeros(1,1,1,b);
for i = 1:b
dLdX(:,:,:,i) =sum(sum(dLdZ(:,:,:,i).*M)));
end
这非常有效。谢谢!!
我觉得你的问题有点不清楚。我将假设您的目标是通过您在定义层之上的梯度将梯度传播到一批标量值。我按照我的理解来回答吧。
U 有参数 X,它是一个标量,维度为 b (b: batch_size)。这用于缩放常量矩阵 Z,其维度为 NxN。假设你立即从缩放矩阵 Z' = Z*X 计算一些标量损失 L,其中 Z' 的维度为 bxNxN。
然后你可以根据以下公式计算 X 中的梯度:
dL/dX = dL/dZ * dZ/dX --> 请注意,该产品的尺寸确实匹配(与您的初始印象不同),因为 dL/dZ' 是 bxNxN 并且dZ'/dX 为 bxNxN。对正确的索引求和得到 dL/dX,它的维度为 b。
我的理解对吗?
干杯