为什么VAE编码器输出对数方差而不是标准差?

问题描述 投票:0回答:2

当谈论

VAE
(并查看
VAE
实现)时,编码器输出:

μ, log(方差)

当我们训练模型时(

decoder model)
的部分),我们将
log(variance)
转换为标准差:

std = exp(0.5 * logvar)

(我从这里获取示例:https://github.com/AntixK/PyTorch-VAE/blob/master/models/vanilla_vae.py

如果我们需要将

log(variance)
转换为
Standard deviation,
,为什么我们不从编码器输出标准差,而是进行计算将其转换为标准差?

deep-learning pytorch autoencoder
2个回答
1
投票

用户166243在CrossValidated(对于此类非编程问题更准确的地方)给出了一个相当完整的答案。简而言之,正如 DMcC 的答案中所述,它提高了数值稳定性。

它带来稳定性和易于训练。根据定义 sigma 必须 是一个正实数。强制执行此操作的一种方法是使用 ReLU函数获取其值,但梯度没有很好定义 大约为零。此外,标准偏差值通常是 非常小 1>>sigma>0。优化必须适用于非常小的 数字,其中浮点运算和定义不明确的 梯度带来数值不稳定。

如果您使用对数变换,您将绘制出数值上非常不稳定的图 [1,0] 区间内的小数字到 [log(1), -inf],其中您有 更多的工作空间。计算 log 和 exp 是数值型的 稳定且简单,因此您基本上获得了优化空间 变量可以在内部移动。

请不要混淆:人们不使用 log(sigma) 值作为 西格玛值,但总是将其变换回原始空间。还 在 VAE 中,您需要 Kullback-Leibler 中的 log(sigma) 值 散度项,所以无论如何你都需要计算它......


0
投票

学习日志(var)提高训练稳定性。

© www.soinside.com 2019 - 2024. All rights reserved.