重参数化(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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/827560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Redis】Zset 数据类型

文章目录 常用命令zaddzcard & zcountzrange & zrevrangezpopmax & bzpopmaxzpopmin & bzpopminzrank & zrevrankzscore & zremzremrangebyrank & zremrangebyscorezincrby 多个集合间的交互命令交集 & zinterstore并集 & sunionstore 内部…

【声呐仿真】学习记录0.5-配置ssh远程连接docker、在docker中使用nvidia显卡

【声呐仿真】学习记录0.5-配置ssh远程连接docker、在docker中使用nvidia显卡 配置ssh远程连接docker1.端口映射2.配置ssh 在docker中使用nvidia显卡配置CUDA 注意:之前已经创建过容器的,需要打包成镜像,重新创建容器,因为要在创建…

【C++庖丁解牛】C++11---右值引用和移动语义

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 1 左值引用和右值引用2 左…

前端vue scope的定义以及用法

这段代码是 Vue 组件中用于定义表格列的代码,包含了自定义模板和逻辑,以显示特定格式的内容。在这里,el-table-column 来自 Element UI 框架,提供了一种简洁的方式来定义表格的列及其显示内容。 让我们看看这段代码的细节&#x…

第一个Spring Boot程序

目录 一、Spring Boot介绍 二、创建Spring Boot项目 1、插件安装(专业版不需要) 2、创建SpringBoot项目 (1)这里如果插件下载失败,解决方案: (2)项目启动失败,解决…

web测试基础知识

目录 web系统的基础 web概念(worldwideweb) 网络结构 发展 架构 B/S C/S P2P 工作原理 静态页面 动态页面 web客户端技术 浏览器的核心--渲染引擎 web服务器端技术 web服务器 应用服务器 集群环境 数据库 案例-URL 协议类型 主机名 端口 IP地址 分类 …

C#开发的全套成熟的LIS系统源码JavaScript+SQLserver 2012区域云LIS系统源码

C#开发的全套成熟的LIS系统源码JavaScriptSQLserver 2012区域云LIS系统源码 医院云LIS系统是一套成熟的实验室信息管理系统,目前已在多家三级级医院应用,并不断更新。云LIS系统是为病人为中心、以业务处理为基础、以提高检验科室管理水平和工作效率为目标…

贪心算法练习day.1

理论基础 贪心算法是一种常见的解决优化问题的方法,其基本思想就是在问题的每个决策阶段,都选择当前看起来最优的选择,即贪心地做出局部的最优决策,以此得到全局的最优解,例如在十张面额不同的钞票,让我们…

oracle sql 示例

-- 获取每个学员按照成绩的排名 selectt1.*,row_number() over (partition by student_name order by score desc) rn from t_score t1; -- 查询每个部门去除最高、最低薪水后的平均薪水 with t1 as (select t_salary_table.*,row_number() over (partition by department_id …

JVM(Java虚拟机)功能特点、垃圾回收机制

简介 JVM(Java虚拟机)是一种虚拟的计算机执行环境,用于执行Java字节码。Java虚拟机不仅仅用于执行Java语言编写的程序,还可以执行其他编译成Java字节码的语言(如Kotlin、Scala等)编写的程序。JVM的主要目标…

润申信息企业标准化管理系统 AddNewsHandler.ashx 任意用户创建漏洞复现

0x01 产品简介 润申信息科技企业标准化管理系统通过给客户提供各种灵活的标准法规信息化管理解决方案,帮助他们实现了高效的标准法规管理,完成个性化标准法规库的信息化建设。 0x02 漏洞概述 润申信息企业标准化管理系统 AddNewsHandler.ashx 接口处存在任意用户创建漏洞,…

web前端代码指南(vue3)

一、命名规范 市面上常用的命名规范: camelCase(小驼峰式命名法 —— 首字母小写)PascalCase(大驼峰式命名法 —— 首字母大写)kebab-case(短横线连接式)Snake(下划线连接式&#…

Linux安装部署Tomcat

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ Linux安装部署Tomcat //将tomcat压缩包解压到对…

python识别电脑是windows还是linux

代码实现 import osif os.name nt:print(当前操作系统是 Windows) elif os.name posix:print(当前操作系统是 Linux 或 Unix 类型的系统) else:print(未知的操作系统)

vue 3 + TS 组合式标注类型

1.组件的 emits 标注类型 <script setup lang"ts"> // 运行时 const emit defineEmits([change, update])// 基于选项 const emit defineEmits({change: (id: number) > {// 返回 true 或 false// 表明验证通过或失败},update: (value: string) > {//…

XiaodiSec day015 Learn Note 小迪安全学习笔记

XiaodiSec day015 Learn Note 小迪安全学习笔记 记录得比较凌乱&#xff0c;不尽详细 day15 还是基础的Php开发 看来是比较基础的 主题&#xff1a;登录验证 COOKIE & SESSION 后台系统有多个验证 为了方便验证使用cookie或session 类似于用户状态管理? cookie存储…

kubernetes中的副本控制器rc(replicationcontrollers)和rs(replicasets)

一、rc控制器replicationcontrollers rc控制器就是控制相同pod副本数量 使用rc控制器资源创建pod&#xff0c;设定创建pod资源的数量 1.1 案例 1.1.1、创建资源清单 [rootmaster rc-demo]# cat rc.yaml apiVersion: v1 kind: ReplicationController metadata: name: rc01 …

代码随想录打卡—day28—【回溯】— 回溯基础练习 4.17+4.19

1 93. 复原 IP 地址 也是类似前一天的分割回文串。可以用我的字符之间0101的思路&#xff0c;也可以直接用[start_idx,i]选取子串的方法&#xff0c;选取后者&#xff0c;代码简洁一点&#xff1a; class Solution { public:vector<string> ans;string path;void dfs(i…

【Ansible】04

【Ansible】03 任务块 block任务块 使用 block 可以将多个任务合并为一个组可以将整个 block任务组 , 一起控制是否要执行 # 如果webservers组中的主机系统发行版是Rocky&#xff0c;则安装并启动nginx [rootpubserver ansible]# vim block1.yml --- - name: block tasksho…

个人搭建alist网盘的经验记录备忘

1、搭建宝塔LINUX面板&#xff0c;安装Docker 2、添加仓库 3、从镜像拉取xhofe/alist:latest 4、添加容器 5、新建一个网站&#xff0c;别忘记申请个SSL证书&#xff0c;重要的是反向代理 6、新建个mysql数据库 7、修改alist数据库的链接地址&#xff0c;方便自己备份&a…