deep-learning - 如何计算将 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
这完美地工作。谢谢!!
解决方案
我认为你的问题有点不清楚。我假设你的目标是将梯度通过你上面定义的层传播到一批标量值。让我按照我的理解来回答吧。
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。
我理解你正确吗?
干杯
推荐阅读
- javascript - 将文本放在缩略图旁边而不是中心
- c# - 在 C# 应用程序中获取 Kafka 心跳状态
- python - 删除熊猫中方差低的列
- sql-server - 获取选定日期范围内每 2 天数据的总和
- swift - 使用 SwiftUI、XCode 12 和 Catalina 的新项目失败
- kotlin - 如何在 Kotlin 中读取 yaml 文件?
- django - 如何在下一个 Django 视图中减少处理表单的逻辑?
- .htaccess - 删除 URL 域中的尾随点
- javascript - 为什么我的类构造函数返回未定义?
- django - 是否可以在同一个域下为多个 django 项目提供服务?