Допустим, я хочу вручную рассчитать обновление градиента по отношению к потере расхождения Кульбака-Либлера, скажем, на VAE (см. фактический пример из документации образца pytorch здесь):
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 только второй термин, и если да, то почему? Я чувствую, что мне просто не хватает некоторого математического понимания здесь...