PyTorch归一化流训练去量化环节log determinant jacobian计算疑问
对数雅可比行列式(ldj)初始值为0的原因
ldj的作用是累计归一化流所有坐标变换步骤的雅可比行列式对数值。在执行任何变换前,输入数据处于原始空间,对应的是恒等变换,恒等变换的雅可比行列式为1,对数值ln(1)=0,因此ldj初始值设为0。
0 - log(256) * (28*28*1)的推导逻辑
该计算式对应去量化+像素值域缩放两步操作的累计ldj,完全符合归一化流的变量替换公式:
- 第一步去量化:给取值为0~255的离散像素值加一个[0,1)区间的均匀噪声,将离散像素转为连续值。该操作属于平移变换,雅可比矩阵为单位矩阵,行列式为1,对ldj的贡献为
ln(1)=0,对应式子的第一项。 - 第二步值域缩放:为了将像素值归一化到[0,1)区间,需要对去量化后的连续值做逐元素缩放:每个像素值除以256。对于输入维度为D的单通道MNIST图像,D=28281,缩放变换的雅可比矩阵是对角矩阵,对角元素均为1/256,因此行列式值为
(1/256)^D,取对数后得到ldj增量为ln((1/256)^D) = -log(256) * D,对应式子的第二项。
两步操作的ldj累计后就得到了你看到的代码逻辑。
内容的提问来源于stack exchange,提问作者kelvin.aaa2
相关产品推荐
相关产品推荐

