GlassyWing / nvae

An unofficial toy implementation for NVAE 《A Deep Hierarchical Variational Autoencoder》
Apache License 2.0
109 stars 20 forks source link

Hi,again I come here to ask something about the loss(the loss is negative) and a queation about the iteration of 'log_var' #6

Closed yiyayada closed 3 years ago

yiyayada commented 3 years ago

Wing神您好,请问您在训练自己数据的时候,有出现过loss为负数的情况吗,文中基本都是由KL散度组成的loss,那最后不应该趋近于0吗?

还有一个问题是关于log_var的迭代方式,在decoder文件中,进行方差迭代时 ( log_var = log_var + delta_log_var,nvae/nvae/decoder.py的128行),原文中写的迭代方式是N(mu +delta_mu,log_var * delta_log_var)---->N(µi(z<l) +∆µi(z<l,x), σi(z<l) · ∆σi(z<l,x)),也可能是我理解错了,为什么代码中对方差用加的方式迭代呢?

感谢您的不吝啬赐教~

GlassyWing commented 3 years ago

我未曾遇到Loss为负的情况,该损失是一直为负吗?至于σi(z<l) · ∆σi(z<l,x),取对数即变为了相加

yiyayada commented 3 years ago

我未曾遇到Loss为负的情况,该损失是一直为负吗?至于σi(z<l) · ∆σi(z<l,x),取对数即变为了相加

哦哦,俺傻了。我的loss一开始是正的,后来几乎就一直为负数了,用的自己的数据集训练的,没想明白为啥还

GlassyWing commented 3 years ago

我未曾遇到Loss为负的情况,该损失是一直为负吗?至于σi(z<l) · ∆σi(z<l,x),取对数即变为了相加

哦哦,俺傻了。我的loss一开始是正的,后来几乎就一直为负数了,用的自己的数据集训练的,没想明白为啥还

由于我使用的重构损失是二元交叉熵,所以无论预测值还是实际值都需要缩放到0-1,所以出现负值可能是数据集值域的问题

yiyayada commented 3 years ago

我未曾遇到Loss为负的情况,该损失是一直为负吗?至于σi(z<l) · ∆σi(z<l,x),取对数即变为了相加

哦哦,俺傻了。我的loss一开始是正的,后来几乎就一直为负数了,用的自己的数据集训练的,没想明白为啥还

由于我使用的重构损失是二元交叉熵,所以无论预测值还是实际值都需要缩放到0-1,所以出现负值可能是数据集值域的问题

HI,我发现损失是负数的原因是使用了自适应损失函数,不是数据的原因。大致看了下自适应损失函数的实现,应该是会随着真值和预测值的变化而变化,我这边的数据是通过自适应算出来的值会有负数的情况出现,去掉之后loss无负数且感觉对结果没太大影响,不知道您加上该自适应损失之后,结果有什么优化吗?

GlassyWing commented 3 years ago

我未曾遇到Loss为负的情况,该损失是一直为负吗?至于σi(z<l) · ∆σi(z<l,x),取对数即变为了相加

哦哦,俺傻了。我的loss一开始是正的,后来几乎就一直为负数了,用的自己的数据集训练的,没想明白为啥还

由于我使用的重构损失是二元交叉熵,所以无论预测值还是实际值都需要缩放到0-1,所以出现负值可能是数据集值域的问题

HI,我发现损失是负数的原因是使用了自适应损失函数,不是数据的原因。大致看了下自适应损失函数的实现,应该是会随着真值和预测值的变化而变化,我这边的数据是通过自适应算出来的值会有负数的情况出现,去掉之后loss无负数且感觉对结果没太大影响,不知道您加上该自适应损失之后,结果有什么优化吗?

由于算力限制,未做更多实验,理论上动态损失相当于叠加了多种分布,会有一些优化。另外影响训练效果的参数主要是M_N,这里在训练时设置为 batch_size / len(dataset), 建议使用更小的值试试。