重参数化技巧:高斯分布采样

本文介绍了如何在神经网络中利用重参数化技巧进行高斯分布采样。通过从标准高斯分布N(0, I)采样得到的噪声,然后通过Z=μ+σ×ϵ变换,可以将采样过程变得可导,从而在训练过程中用于解码器的输入。这种方法在变分自编码器等模型中尤其常见。
摘要由CSDN通过智能技术生成

1、高斯分布采样

我们现在得到了有样本X得到的分布X ~ N( μ \mu μ, σ \sigma σ^2),通过采样我们得到确定的隐变量向量,从而作为解码器的输入。采样这个操作本身是不可导的,但是我们可以通过重参数化技巧,将简单分布的采样结果变换到特定分布中,如此一来则可以对变换过程进行求导。具体而言,我们从标准高斯分布中采样,并将其变换到X ~ N( μ \mu μ, σ \sigma σ^2),过程如下:

ϵ \epsilon ϵ ~ N ( 0 , I ) N(0, I) N(0,I)
Z = μ + σ × ϵ Z=\mu +\sigma × \epsilon Z=μ+σ×ϵ

也就是说,从 N( μ \mu μ, σ \sigma σ^2) 采样 Z Z Z ,等同于从 ϵ \epsilon ϵ ~ N ( 0 , I ) N(0, I) N(0,I)中采样高斯噪声 ϵ \epsilon ϵ,再将其按 Z = μ + σ × ϵ Z=\mu +\sigma × \epsilon Z=μ+σ×ϵ 变换。

import torch

def reparametrize(mean,lg_var): # 采样器方法:对方差(lg_var)进行还原,并从高斯分布中采样,将采样数值映射到编码器输出的数据分布中。
        std = lg_var.exp().sqrt()
        # torch.FloatTensor(std.size())的作用是,生成一个与std形状一样的张量。然后,调用该张量的normal_()方法,系统会对该张量中的每个元素在标准高斯空间(均值为0、方差为1)中进行采样。
        eps = torch.FloatTensor(std.size()).normal_() # 随机张量方法normal_(),完成高斯空间的采样过程。
        return eps.mul(std).add_(mean)
  • 17
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值