首页 > 解决方案 > 如何计算将 1X1 神经元作为输入并将其乘以恒定 NXN 矩阵的自定义深度学习层的梯度?

问题描述

我想创建一个自定义深度学习层,将 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

这完美地工作。谢谢!!

标签: deep-learninggradient-descentbackpropagation

解决方案


我认为你的问题有点不清楚。我假设你的目标是将梯度通过你上面定义的层传播到一批标量值。让我按照我的理解来回答吧。

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。

我理解你正确吗?

干杯


推荐阅读