【问题标题】:Calculating Gradient Update计算梯度更新
【发布时间】:2018-03-30 19:04:40
【问题描述】:

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

【问题讨论】:

    标签: machine-learning linear-algebra backpropagation autoencoder


    【解决方案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 视为标量而不是按元素偏导数是错误的。

    【讨论】:

    • 是的,我的错。已更正!
    猜你喜欢
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多