Auto-Encoding Variational Bayes (VAE原文)、变分推理

2023-10-27

  变分自动编码器大致概念已经理解了快一年多了,用Pytorch写个模型也是手到擒来的事。但由于其数学原理还是没有搞懂,在看到相关的变体时,总会被数学公式卡住,这对搞学术是致命的。下决心搞懂后,在此记录下我的理解。

公式推导——变分下界

  这篇文章提出一种拟合数据集分布的方法,拟合分布最常见的应用就是生成模型。该方法遵循极大似然策略,即对于数据集$X = \{x^{(i)}\}^N_{i=1}$,对生成模型$p_{\theta}(x)$(注意!这里的$p_{\theta}(x)$既代表生成模型本身,又代表模型生成数据$x$的边缘概率,下面类似)完成如下优化:

\begin{align}\displaystyle \max\limits_{\theta}L = \sum\limits_{i=1}^N\log p_{\theta}(x^{(i)})\end{align}

  但是,模型不可能凭空产生数据,必须要有输入才能有输出,所以作者对数据的生成过程进行了假设,假设数据集$X = \{x^{(i)}\}^N_{i=1}$的生成过程由以下两步组成:

  1、通过某个先验分布$p_{\theta^*}(z)$,抽样获得隐变量$z^{(i)}$ 。

  2、再通过某个条件分布$p_{\theta^*}(x|z)$,抽样生成$x^{(i)}$。

  显然,以上参数$\theta^*$的值、个数,甚至是计算推演的过程,都是未知的。为了使优化得以进行,就要对参数的个数和计算流程进行约束,通常专家会根据经验来给予特定数据集特定的计算过程。不失一般性,作者假设先验分布$p_{\theta^*}(z)$和似然函数$p_{\theta^*}(x|z)$来自于参数族$p_{\theta}(z)$和$p_{\theta}(x|z)$,并且它们的概率分布函数(PDFs)几乎处处可微。

  尽管有如上假设,由于$x^{(i)}$与$z$之间的关系未知,我们不能直接使用梯度下降等方式对$p_{\theta}(x|z)$进行拟合。作者采用一种迂回的方式,让模型自己学会$z$与$x$之间的关系。作者使用自动编码器的机制,与生成模型同时训练一个后验分布模型$q_{\phi}(z|x)$,用来模拟其后验分布$p_{\theta}(z|x)$,称为编码器,并称$p_{\theta}(x|z)$为解码器。概率图如下:

  其中$\theta$表示生成模型$p_{\theta}(z)p_{\theta}(x|z)$的待优化参数,$\phi$表示用于估计$p_{\theta}(z|x)$的模型的参数。

  有了$q_\phi(z|x)$作为辅助后,针对每一数据集样本,待优化式可转换如下:

\begin{align} &\log p_{\theta}(x)\\ =&  \text{E}_{q_{\phi}(z|x)}\log p_{\theta}(x)\\ =&  \text{E}_{q_{\phi}(z|x)}\log \frac{p_{\theta}(x,z)}{p_{\theta}(z|x)}\\ =&  \text{E}_{q_{\phi}(z|x)}\left[ \log p_{\theta}(x,z) - \log p_{\theta}(z|x)+\log q_{\phi}(z|x)-\log q_{\phi}(z|x) \right]\\ =&  \text{E}_{q_{\phi}(z|x)}\left[ \log \frac{q_{\phi}(z|x)}{ p_{\theta}(z|x)} + \log p_{\theta}(x,z) -\log q_{\phi}(z|x) \right]\\ =& \text{KL} \left[ q_{\phi}(z|x) || p_{\theta}(z|x) \right]+ \text{E}_{q_{\phi}(z|x)}\left[ \log p_{\theta}(x,z) -\log q_{\phi}(z|x) \right] \\ =& \text{KL} \left[ q_{\phi}(z|x) || p_{\theta}(z|x) \right]+ \mathcal{L}(\theta,\phi)        \\ \end{align}

  容易看出,由于$(8)$式第一项是相对熵非负,第二项即为待优化式$(2)$的下界,称之为变分下界。因此,我们只需对第二项进行优化,原式自然变大。将$\mathcal{L}(\theta,\phi)$进行变换如下:

\begin{align} \mathcal{L}(\theta,\phi) &= \text{E}_{q_{\phi}(z|x)}\left[ \log p_{\theta}(x,z) -\log q_{\phi}(z|x) + \log_{\theta}(z) - \log_{\theta}(z) \right] \\ &= \text{E}_{q_{\phi}(z|x)}\left[ -\log q_{\phi}(z|x) + \log_{\theta}(z) + \log p_{\theta}(x,z) - \log_{\theta}(z) \right] \\ &= \text{E}_{q_{\phi}(z|x)}\left[ -\log\frac{q_{\phi}(z|x)}{p_{\theta}(z)} + \log \frac{p_{\theta}(x,z)}{p_{\theta}(z)} \right] \\ &= -\text{KL}\left[q_{\phi}(z|x)||p_{\theta}(z)\right]+ \text{E}_{q_{\phi}(z|x)}\left[ \log p_{\theta}(x|z) \right] \\ \end{align}

  对于以上两项,我们可以把第一项理解为正则项,也就是说拟合的后验分布应该和生成模型先验分布比较接近才好;第二项理解为重构损失,就是自编码器的损失。同时对这两项进行优化,就可以使生成模型向目标靠近。

重参数化

  在以上优化式中包含随机采样过程,作者提出使用重参数化来建立可反向传播的采样。实际上就是给模型额外添加一个已知的随机变量作为输入,从而使模型的抽样过程可微。将作者于文中对以上推导的举例——变分自动编码器(VAE),拿来与$(12)$式做对比,推导的式子以及重参数化的意义就一目了然了。其中VAE的$p_{\theta}(z)$定义为相互独立的多维高斯分布。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Auto-Encoding Variational Bayes (VAE原文)、变分推理 的相关文章

  • 如何访问pandas数据框中的多级索引?

    我想用相同的索引来调用这些行 这是示例数据框 arrays np array bar bar baz baz foo foo qux qux np array one two one two one two one two df pd Da
  • 为什么我不能导入 geopandas?

    我唯一的代码行是 import geopandas 它给了我错误 OSError Could not find libspatialindex c library file 以前有人遇到过这个吗 我的脚本运行得很好 直到出现此错误 请注意
  • 如何使用pycaffe重构caffe网络

    我想要的是 加载网络后 我将分解一些特定的图层并保存新的网络 例如 原网 数据 gt conv1 gt conv2 gt fc1 gt fc2 gt softmax New net 数据 gt conv1 1 gt conv1 2 gt c
  • Python 中的六边形自组织映射

    我在寻找六边形 自组织映射 http en wikipedia org wiki Self organizing map在Python上 准备好模块 如果存在的话 绘制六边形单元格的方法 将六边形单元作为数组或其他方式使用的算法 About
  • 获取单个方程的脚本

    在文本文件中输入 a 2 8 b 3 9 c 4 8 d 5 9 e a b f c d g 0 6 h 1 7 i e g j f h output i j 期望的输出 输出 2 8 3 9 0 6 4 8 5 9 1 7 如果输入文件名
  • NLTK、搭配问题:需要解包的值太多(预期为 2)

    我尝试使用 NLTK 检索搭配 但出现错误 我使用内置的古腾堡语料库 I wrote alice nltk corpus gutenberg fileids 7 al nltk corpus gutenberg words alice al
  • 将一个时间序列插入到 pandas 中的另一个时间序列中

    我有一组定期测量的值 说 import pandas as pd import numpy as np rng pd date range 2013 01 01 periods 12 freq H data pd Series np ran
  • python ttk treeview:如何选择并设置焦点在一行上?

    我有一个 ttk Treeview 小部件 其中包含一些数据行 如何设置焦点并选择 突出显示 指定项目 tree focus set 什么也没做 tree selection set 0 抱怨 尽管小部件明显填充了超过零个项目 但未找到项目
  • Python While 循环,and (&) 运算符不起作用

    我正在努力寻找最大公因数 我写了一个糟糕的 运算密集型 算法 它将较低的值减一 使用 检查它是否均匀地划分了分子和分母 如果是 则退出程序 但是 我的 while 循环没有使用 and 运算符 因此一旦分子可整除 它就会停止 即使它不是正确
  • 字典中列表中仅有的几个索引的总和

    如果我有这种类型的字典 a dictionary dog white 3 5 black 6 7 Brown 23 1 cat gray 5 6 brown 4 9 bird blue 3 5 green 1 2 yellow 4 9 mo
  • 使用 python 将文本发送到带有逗号分隔符的列

    如何使用分隔符 在 Excel 中将一列分成两列 并使用 python 命名标题 这是我的代码 import openpyxl w openpyxl load workbook DDdata xlsx active w active a a
  • Python int 太大,无法放入 SQLite

    我收到错误 OverflowError Python int 太大 无法转换为 SQLite INTEGER 来自以下代码块 该文件约25GB 因此必须分部分读取 length 6128765 Works on partitions of
  • 在pycharm中调试python代码

    这个问题类似于this https stackoverflow com questions 10240018 how to use pycharm to debug python script一 我正在尝试调试pyethapp https
  • Python 矩阵每一行的总和

    lista 1 2 3 4 5 6 7 8 9 print lista def filas lista res for elemento in lista x sum lista elemento res append x print re
  • WindowsError:[错误 5] 访问被拒绝

    我一直在尝试终止一个进程 但我的所有选项都给出了 Windows 访问被拒绝错误 我通过以下方式打开进程 一个python脚本 test subprocess Popen sys executable testsc py 我想杀死那个进程
  • 使用 lambda 函数更改属性值

    我可以使用 lambda 函数循环遍历类对象列表并更改属性值 对于所有对象或满足特定条件的对象 吗 class Student object def init self name age self name name self age ag
  • Scrapy 蜘蛛无法工作

    由于到目前为止没有任何效果 我开始了一个新项目 python scrapy ctl py startproject Nu 我完全按照教程操作 创建了文件夹和一个新的蜘蛛 from scrapy contrib spiders import
  • 将 Scikit-Learn OneHotEncoder 与 Pandas DataFrame 结合使用

    我正在尝试使用 Scikit Learn 的 OneHotEncoder 将 Pandas DataFrame 中包含字符串的列替换为 one hot 编码的等效项 我的下面的代码不起作用 from sklearn preprocessin
  • 使用 Keras 和 fit_generator 绘制 TensorBoard 分布和直方图

    我正在使用 Keras 使用 fit generator 函数训练 CNN 这似乎是一个已知问题 https github com fchollet keras issues 3358TensorBoard 在此设置中不显示直方图和分布 有
  • 如何识别图形线条

    我有以下格式的路径的 x y 数据 示例仅用于说明 seq p1 p2 0 20 2 3 1 20 2 4 2 20 4 4 3 22 5 5 4 22 5 6 5 23 6 2 6 23 6 3 7 23 6 4 每条路径都有多个点 它们

随机推荐

  • java/poi 调整Excel 列宽支持自适应中文字符宽度

    apache poi是apache旗下用于读写Microsoft Office 二进制文件和OOXML 格式文件的开源库 用它来进行excel文件的导出是很趁手的 一般来说可以直接使用 Sheet autoSizeColumn方法自动调整每
  • DGA深度学习相关论文

    一 基于 word hashing 的 DGA 僵尸网络深度检测模型 2017 主要贡献 基于word hashing 将所有 域名转用二元语法字符串表示 利用词袋模型把域名映射到高维向量空间 然后利用5 层深度神 经网络对转换为高维向量的
  • OV9281+RK3399Pro 双摄像头移植

    软件环境 Kernel版本 4 4 194 SDK版本 v1 4 2 Rootfs ubuntu18 04 编译环境 ubuntu1804LTS64位 硬件环境 CPU型号 RK3399Pro 双摄像头 OV9281模组 OV9281模组
  • du命令详解

    du命令介绍 du命令 disk usage 用来展示磁盘使用量的统计信息 du和df算是一对同门师兄弟 du侧重在文件夹和文件的磁盘占用方面 而df侧重在文件系统级别的磁盘占用方面 这两个命令都非常的基础 也是每位 Linux工程师都应该
  • 演讲者模式投影到幕布也看到备注_ppt备注怎么用在放映时怎么可以不在投影仪上显示...

    ppt备注怎么用在放映时怎么可以不在投影仪上显示 时间 2013 08 30 作者 snow 来源 互联网 我们在做投影展示的时候 会将电脑的内容给完全的显示到投影机上面 而如果你设置了备注页的话 那么你编写的备注里面的内容就只能自己 演示
  • 使用JConsole远程监控elasticsearch

    ES虽然有Bigdesk插件进行监控 但是JVM调优的时候 还是习惯了用JConsole监控 ES的JVM参数 可以在elasticsearch servicewrapper插件的elasticsearch conf配置文件里很方便的设置
  • double和int区别

    double所占存储空间更大 8字节 所以能表示的值的范围更大 int 四个字节 表示的范围是 int带符号 整数 1的原码为 0000 0000 0000 0000 0000 0000 0000 0001 2147483647原码为 01
  • Chrome插件:浏览器后台与页面间通信

    content js 与 background js和popup js 通信和 background js与popup js 这些通信都用 chrome runtime sendMessage 这个方法 background js和popu
  • 发送时延和传播时延计算

    一 时延计算公式 发送时延 传输时延 数据块长度 比特 带宽 带宽或发送速率或数据传输速率 比特 每秒 传播时延 距离 米 信号转播速率 米 每秒 二 换算公式 1kb 103bit 1Mb 106bit 1Gb 109bit 1s 106
  • Tomcat常见报错

    eclipse启动服务器部署项目之后 中间修改了一部分代码 导致eclipse卡死了 毫无反应 无奈之下 只好通过任务管理器关闭eclipse 但是重新打开之后 报错无法启动Tomcat 大致报错如下 Several ports 8005
  • AutoGPT 全功能API 接入指南 (云记忆、联网、语音朗读、图像生成)

    ChatGPT狂飙160天 世界已经不是之前的样子 新建了人工智能中文站https ai weoknow com 每天给大家更新可用的国内可用chatGPT资源 一 核心OpenAI API key 必备 点击 Create new sec
  • (二)移动端 Web 开发进阶

    文章目录 一 移动端事件 1 事件 2 移动端事件 1 touch 事件 2 touch 事件的 event 对象 3 其他触摸事件 二 移动端常见问题 1 浏览器兼容性 1 HTML5
  • 机械革命极光pro的win11进行更新后,双系统ubuntu开机选择界面消失的解决方法

    笔者为了学习 按照网上教程安装好了linux内核的第二操作系统ubuntu 一开始开机能够正常进入ubuntu双系统引导界面 但在一次进入windows之后 重启就无法进入ubuntu双系统选择界面了 如果使用ubuntu安装盘 在bios
  • JRE的下载安装

    一 JRE的下载地址 Java Downloads Oracle 二 选择要下载的版本 三 第一次登录需要注册 四 注册并下载 五 按流程安装 双击打开安装包 更改安装位置 建议把C盘改成D盘 选择下一步 等待安装完成 六 配置JRE的环境
  • Spyder可在线使用!?

    不同安装 如果想使用spyder进行编程 可以用其在线版 和本地版功能一样 就是有点慢 另外需要用chrome浏览器 用火狐没法正常访问 Spyder可以在线使用 所以在没有安装python环境的电脑上 想编写python代码 可以尝一下这
  • npm和yarn安装与更换国内源地址

    安装 https classic yarnpkg com en docs install windows stable 查询与更换源 yarn config get registry 国内淘宝源 yarn config set regist
  • mongoDB如何复制collection里的数据到另一个collection方法总结

    mongoDB的可以直接复制数据库 但是对于数据库里的表却没有直接的复制语句 在项目中遇到数据放错collection了情况就很棘手 现在将方法总结如下 1 利用foreach方法在shell里直接运行 db test 复制源表 find
  • 【每日一题】跳跃游戏 (来源leetcode 55)

    给定一个非负整数数组 nums 你最初位于数组的 第一个下标 数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标 示例 1 输入 nums 2 3 1 1 4 输出 true 解释 可以先跳 1 步 从下标 0
  • 如何定位Unity死循环导致的完全卡死

    1 如何定位Unity死循环导致的完全卡死 2 如何设定Unity AssetBundle单个包大小 3 MaterialPropertyBlock修改Stencil相关参数 4 线性空间中动作文件控制材质球颜色失真问题 5 DrawMes
  • Auto-Encoding Variational Bayes (VAE原文)、变分推理

    变分自动编码器大致概念已经理解了快一年多了 用Pytorch写个模型也是手到擒来的事 但由于其数学原理还是没有搞懂 在看到相关的变体时 总会被数学公式卡住 这对搞学术是致命的 下决心搞懂后 在此记录下我的理解 公式推导 变分下界 这篇文章提