计算梯度更新

Calculating Gradient Update

假设我想手动计算关于 Kullback-Liebler 散度损失的梯度更新,比如在 VAE 上(请参阅 pytorch 示例文档 here 中的实际示例):

KLD = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())

logvar 在哪里(为简单起见,忽略激活函数和多层等)基本上是从 400 暗特征向量到 20 暗特征向量的单层转换:

self.fc21 = nn.Linear(400, 20)
logvar = fc21(x)

关于 fc21 的权重向量,我只是在数学上不理解你如何计算它的梯度。从数学上讲,我认为这看起来像:

KL = -.5sum(1 + Wx + b - m^2 - e^{Wx + b})

dKL/dW = -.5 (x - e^{Wx + b}x)

其中W是fc21层的权重矩阵。但这里的结果与 W (20x400) 的形状不同。比如,x 只是一个 400 特征向量。那么我将如何对此执行 SGD? x 是否只广播到第二个任期,如果是,为什么?我觉得我只是在这里缺少一些数学理解......

让我们稍微简化一下示例,假设输入形状为 3 和输出形状为 2 的全连接层,则:

W = [[w1, w2, w3], [w4, w5, w6]]
x = [x1, x2, x3]
y = [w1*x1 + w2*x2 + w3*x3, w4*x1 + w5*x2 + w6*x3]
D_KL = -0.5 * [ 1 + w1*x1 + w2*x2 + w3*x3 + w4*x1 + w5*x2 + w6*x3 + b - m^2 + e^(..)] 
grad(D_KL, w1) = -0.5 * [x1 + x1* e^(..)]
grad(D_KL, w2) = -0.5 * [x2 + x2* e^(..)]
...
grad(D_KL, W) = [[grad(D_KL, w1), grad(D_KL, w2), grad(D_KL,w3)], 
                 [grad(D_KL, w4), grad(D_KL, w5), grad(D_KL,w6)]
                ]

这适用于任何维度的高阶张量。在将 x 和 W 视为标量而不是采用 element-wise 偏导数时,您的区分是错误的。