为何VAE编码器输出对数方差而非标准差?
为什么VAE编码器输出log(方差)而非直接输出标准差?
在VAE的实现里,编码器会输出均值μ和对数方差log(var),再通过std = exp(0.5 * logvar)转换成标准差,而非直接输出标准差,核心原因有这几点:
数值稳定性更强:标准差必须是非负的,如果直接让网络输出标准差,得用ReLU这类激活函数强制非负,但ReLU在值接近0时梯度会消失,导致训练停滞。而输出log(var)后,通过指数转换得到的标准差天然非负,且指数函数的梯度始终有效,不会出现梯度消失的死区问题。
优化过程更顺畅:对数方差的取值范围是全体实数,网络可以不受限制地输出任意值,不用考虑值域约束;而标准差只能是非负的,相当于给网络输出加了硬限制,会束缚优化的灵活性,增加训练难度。
适配KL散度计算:VAE损失里的KL散度项,本身就需要用到方差的对数。如果编码器直接输出log(var),可以直接代入公式计算,既省去了额外的对数运算,还能避免因方差趋近于0时计算对数导致的数值溢出问题。
内容的提问来源于stack exchange,提问作者user3668129
相关产品推荐
相关产品推荐

