重参数化(Reparameterization)的原理

2024-04-24 00:12

本文主要是介绍重参数化(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 Fclass 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*stddef 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

这篇关于重参数化(Reparameterization)的原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/930258

相关文章

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

MyBatis-Plus 与 Spring Boot 集成原理实战示例

《MyBatis-Plus与SpringBoot集成原理实战示例》MyBatis-Plus通过自动配置与核心组件集成SpringBoot实现零配置,提供分页、逻辑删除等插件化功能,增强MyBa... 目录 一、MyBATis-Plus 简介 二、集成方式(Spring Boot)1. 引入依赖 三、核心机制

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路