重参数化(Reparameterization)的原理

重参数化(Reparameterization)的原理

重参数化是变分自编码器(VAE)中用来解决可微分性问题的一种技术。在VAE中,我们的目标是最大化观测数据的边缘对数似然,这涉及到一个隐含变量 z z z的积分或求和。因为隐含变量是从某个分布中采样的,这直接导致了当我们尝试使用梯度下降方法优化VAE的参数时,由于采样操作的随机性,无法直接对其求导。

重参数化技巧通过将随机采样过程转换为确定性的操作来解决这一问题。具体来说,它将随机变量 z z z的采样过程分解为两步:

  1. 从一个固定的分布(通常是标准正态分布)中采样一个辅助噪声变量 ϵ \epsilon ϵ
  2. 通过一个可微的变换将 ϵ \epsilon ϵ映射到隐变量 z z z

这样,原本依赖于随机采样的模型输出现在变成了依赖于确定性函数的输出,使得整个模型关于其参数可微,从而可以通过标准的反向传播算法进行优化。

功能

  • 允许反向传播:通过使用重参数化技巧,VAE的训练过程可以利用基于梯度的优化算法,如SGD或Adam,因为所有操作都是可微的。
  • 改善训练稳定性:将随机性限制在输入端(噪声 ϵ \epsilon ϵ),而不是模型的中间,有助于提高模型训练的稳定性和收敛速度。
  • 支持更复杂的概率模型:这种技巧使得模型可以学习复杂的数据分布,同时保持模型的可训练性。

Python 示例

下面是使用PyTorch实现的VAE中应用重参数化技巧的简单示例:

import torch
from torch import nn
import torch.nn.functional as F

class VAE(nn.Module):
    def __init__(self):
        super(VAE, self).__init__()
        self.fc1 = nn.Linear(784, 400)  # 输入特征到隐层
        self.fc21 = nn.Linear(400, 20)  # 隐层到均值
        self.fc22 = nn.Linear(400, 20)  # 隐层到log方差
        self.fc3 = nn.Linear(20, 400)   # 隐层到输出
        self.fc4 = nn.Linear(400, 784)  # 输出层

    def encode(self, x):
        h1 = F.relu(self.fc1(x))
        return self.fc21(h1), self.fc22(h1)

    def reparameterize(self, mu, logvar):
        std = torch.exp(0.5*logvar)
        eps = torch.randn_like(std)
        return mu + eps*std

    def decode(self, z):
        h3 = F.relu(self.fc3(z))
        return torch.sigmoid(self.fc4(h3))

    def forward(self, x):
        mu, logvar = self.encode(x.view(-1, 784))
        z = self.reparameterize(mu, logvar)
        return self.decode(z), mu, logvar

# 损失函数和训练代码在这里省略,只关注模型结构和重参数化部分。

在这个示例中,reparameterize 函数接收从编码器生成的均值和对数方差,然后生成一个随机样本 z,该样本符合由均值 mu 和方差 exp(logvar) 定义的正态分布。这个过程使得模型在训练过程中能够通过梯度下

降法进行优化。

其他参考:

漫谈重参数:从正态分布到Gumbel Softmax。
Categorical Reparameterization with Gumbel-Softmax

  • 17
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值