计算渐变更新

时间:2018-03-30 19:04:41

标签: machine-learning linear-algebra backpropagation autoencoder

假设我想手动计算关于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只播放到第二个词,如果是,为什么?我觉得我在这里缺少一些数学理解......

1 个答案:

答案 0 :(得分:1)

让我们稍微简化一下这个例子并假设一个完全连接的输入形状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视为标量而不是采用元素偏导数,你的区别是错误的。