生成模型详解

一、生成模型的定义

  1. 给定的训练集 X = { x 1 , x 2 , . . . , x n } X =\{x^1,x^2,...,x^n\} X={x1,x2,...,xn}
  2. 隐变量 z z z满足 p ( z ) = N ( 0 , I ) p(z)= \mathcal{N} (0,I) p(z)=N(0,I)
  3. 定义一个条件分布 p θ ( x ∣ z ) p_{\theta}(x|z) pθ(xz) θ \theta θ可以理解为生成模型的参数
  4. 训练好模型后,采样 z ∼ p ( z ) z{\sim}p(z) zp(z),利用 p θ ( x ∣ z ) p_{\theta}(x|z) pθ(xz)可以生成 x x x

注: p θ ( x ∣ z ) p_{\theta}(x|z) pθ(xz)可以理解为“生成器”,把高斯 z z z映射到数据分布 x x x

二、四种代表生成模型

在这里插入图片描述

1. VAE

注:Diffusion model的部分理论推导和VAE很相似

目的是能够得到真实数据的分布 p ( x ) p(x) p(x),这样就可以随意的生成数据。
借助隐变量 z z z描述 x x x的分布 p ( x ) p(x) p(x) p ( x ) = ∫ p ( x , z ) d z = ∫ p ( x ∣ z ) p ( z ) d z p(x) = \int p(x,z)dz = \int p(x|z)p(z)dz p(x)=p(x,z)dz=p(xz)p(z)dz

目标是最大化似然 p θ ( x ) p_{\theta}(x) pθ(x) p θ ( x ) p_{\theta}(x) pθ(x) = p θ ( z , x ) p θ ( z ∣ x ) \frac{p_{\theta}(z,x)}{p_{\theta}(z|x)} pθ(zx)pθ(z,x)= p θ ( z ) p θ ( x ∣ z ) p θ ( z ∣ x ) \frac{p_{\theta}(z)p_{\theta}(x|z)}{p_{\theta}(z|x)} pθ(zx)pθ(z)pθ(xz)

但是 p θ ( z ∣ x ) {p_{\theta}(z|x)} pθ(zx)是intractable的,通常我们都需要借助variational inference的技巧,采用 q ϕ ( z ∣ x ) {q_{\phi}(z|x)} qϕ(zx)去近似它。

将最大化似然 p θ ( x ) p_{\theta}(x) pθ(x)转化成使得 ELBO(变分下界)最大
模型似然 log ⁡ p θ ( x ) ≥ E L B O \log p_{\theta}(x) \geq ELBO logpθ(x)ELBO,
E L B O = E z ∼ q ϕ ( z ∣ x ) [ log ⁡ p θ ( x ∣ z ) + log ⁡ p ( z ) − log ⁡ q ϕ ( z ∣ x ) ] = E z ∼ q ϕ ( z ∣ x ) log ⁡ p θ ( x ∣ z ) − D K L ( q ϕ ( z ∣ x ) ∣ ∣ p ( z ) ) ELBO = \mathbb{E}_{z\sim q_{\phi}(z|x)} [\log p_{\theta}(x|z) + \log p(z) - \log q_{\phi}(z|x)] = \mathbb{E}_{z\sim q_{\phi}(z|x)} \log p_{\theta}(x|z) - D_{KL}(q_{\phi}(z|x)||p(z)) ELBO=Ezqϕ(zx)[logpθ(xz)+logp(z)logqϕ(zx)]=Ezqϕ(zx)logpθ(xz)DKL(qϕ(zx)∣∣p(z))

p θ ( x ∣ z ) p_{\theta}(x|z) pθ(xz)为decoder部分, q ϕ ( z ∣ x ) q_{\phi}(z|x) qϕ(zx)为encoder部分
模型的优化的loss为 L V A E ( θ , ϕ ) = − E L B O = D K L ( q ϕ ( z ∣ x ) ∣ ∣ p ( z ) ) − E z ∼ q ϕ ( z ∣ x ) log ⁡ p θ ( x ∣ z ) L_{VAE}(\theta,\phi) = -ELBO = D_{KL}(q_{\phi}(z|x)||p(z)) - \mathbb{E}_{z\sim q_{\phi}(z|x)} \log p_{\theta}(x|z) LVAE(θ,ϕ)=ELBO=DKL(qϕ(zx)∣∣p(z))Ezqϕ(zx)logpθ(xz)

第一项为计算两个多元高斯分布的KL散度
第二项为重建误差(reconstruction error),因为正是给定下 z z z生成真实数据的似然,对于一个给定的训练样本 x i x^i xi,我们可以采用蒙特卡洛方法(Monte Carlo method)来估计这个数学期望,即从 q ϕ ( z ∣ x i ) q_{\phi}(z|x^i) qϕ(zxi)多次采样来估计 − E z ∼ q ϕ ( z ∣ x ) log ⁡ p θ ( x i ∣ z ) ≈ − 1 L ∑ l = 1 L log ⁡ p θ ( x i ∣ z ( i , l ) ) - \mathbb{E}_{z\sim q_{\phi}(z|x)} \log p_{\theta}(x^i|z) \approx -\frac{1}{L}\sum^{L}_{l=1}\log p_{\theta}(x^i|z^{(i,l)}) Ezqϕ(zx)logpθ(xiz)L1l=1Llogpθ(xiz(i,l))

2. GAN和Flow-based Model

GAN和Flow-based Model,都是只需要一个“生成器”,先采样高斯噪声,然后用“生成器”把这个高斯噪声映射到数据分布就可以,而且只关心生成。

但是GAN和Flow-based Model也有别的缺陷,比如GAN还需要额外训练判别器,这导致训练很困难;而Flow-based Model需要模型是可逆函数,不能随便用一个图像分类or分割领域的SOTA神经网络,这也导致模型表达能力受限。

3. Diffusion model

只需要训练“生成器”,训练目标函数简单,而且不需要训练别的网络(判别器/后验分布等),并且这个生成器没啥限制,可以随便选表达能力极强的神经网络。

前向和反向是两条马尔可夫链。

  • 前向过程(加噪过程)
    1、前者通常是手工设计的,目的是将任何数据分布转换为简单的先验分布(例如,标准高斯)
    2、定义: q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β t x t − 1 , β t I ) q(x_t |x_{t-1}) = \mathcal{N}(x_t;\sqrt{1- \beta_t}x_{t-1},\beta_t\mathcal{I}) q(xtxt1)=N(xt;1βt xt1,βtI)
    原图 x 0 x_0 x0,通过不断的高斯采样噪声,得到 x t x_t xt。当 t t t趋近无穷, x T x_T xT得到的就是标准的高斯噪声,均值为0,方差为1。
    3、任意时刻的 x t x_t xt能通过 x 0 x_0 x0 β \beta β表示,假设 α t = 1 − β t \alpha_t = 1-\beta_t αt=1βt,并且 α ‾ t = ∏ i = 1 T α i \overline\alpha_t =\prod^T_{i=1}\alpha_i αt=i=1Tαi,展开 x t x_t xt可以得到: x t = α ‾ t x 0 + 1 − α ‾ t z ‾ t x_t=\sqrt{\overline\alpha_t}x_0+\sqrt{1-\overline\alpha_t}\overline{z}_t xt=αt x0+1αt zt

  • 反向过程(去噪过程)
    1、利用 x t x_t xt,使用一个深度学习模型(U-net,参数为 θ \theta θ),去计算出 x t − 1 x_{t-1} xt1
    2、定义: p θ ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , ∑ θ ( x t , t ) ) p_\theta(x_{t-1}|x_t)=\mathcal{N}(x_{t-1};\mu_\theta(x_t,t),\sum_\theta(x_t,t)) pθ(xt1xt)=N(xt1;μθ(xt,t),θ(xt,t))

    反向过程由贝叶斯定理可以推导,其中由于 q ( x t − 1 ∣ x t , x 0 ) = q ( x t ∣ x t − 1 , x 0 ) q ( x t − 1 ∣ x 0 ) q ( x t ∣ x 0 ) q(x_{t-1}|x_t,x_0)=q(x_{t}|x_{t-1},x_0)\frac{q(x_{t-1}|x_0)}{q(x_{t}|x_0)} q(xt1xt,x0)=q(xtxt1,x0)q(xtx0)q(xt1x0),可推导其分布如下:
    在这里插入图片描述
    可以看到 x t − 1 x_{t-1} xt1方差是一个定量(扩散过程参数固定),而 x t − 1 x_{t-1} xt1均值是一个依赖 x 0 x_{0} x0 x t x_{t} xt的函数。这个分布将会被用于推导扩散模型的优化目标。

特性2指的是: x t = α ‾ t x 0 + 1 − α ‾ t z ‾ t x_t=\sqrt{\overline\alpha_t}x_0+\sqrt{1-\overline\alpha_t}\overline{z}_t xt=αt x0+1αt zt转换得到 x 0 x_0 x0

在这里插入图片描述
z ‾ t \overline{z}_t zt是从 x 0 x_0 x0 x t x_t xt过程加的噪声,但是没有 x 0 x_0 x0,我们无法得到 z ‾ t \overline{z}_t zt,则可以使用模型帮我们去得到 z θ {z}_\theta zθ,然后在得到 x 0 x_0 x0,最后可以计算 x t − 1 的均值和方差 x_{t-1}的均值和方差 xt1的均值和方差 z θ {z}_\theta zθ是模型预测的噪声,需要输入 x t x_t xt t t t t t t帮助模型知道是第几次加,噪声会根据 t t t对噪声有一个 β \beta β的放缩。

  • 优化目标

    1. 最大化 p θ ( x 0 ) p_{\theta}(x_0) pθ(x0),但是 p θ ( x 1 : T ∣ x 0 ) {p_{\theta}(x_{1:T}|x_0)} pθ(x1:Tx0)是intractable的,求解和VAE类似,采用 q ϕ ( x 1 : T ∣ x 0 ) {q_{\phi}(x_{1:T}|x_0)} qϕ(x1:Tx0)去近似它,区别就是 x 0 x_0 x0到隐变量 z z z的后验变成 x 0 x_0 x0 x 1 : T x_{1:T} x1:T的后验。和VAE的推导下界类似。 q ϕ ( x 1 : T ∣ x 0 ) {q_{\phi}(x_{1:T}|x_0)} qϕ(x1:Tx0)由定义的前向的式子可算。
      在这里插入图片描述

    2. 完全展开后,优化的目标为
      在这里插入图片描述

    3. 再看一下优化的目标,没有参数的部分可以直接忽略,即 L T L_T LT。而 L t − 1 L_{t-1} Lt1根据多元高斯分布的KL散度求解等价于下面的式子
      在这里插入图片描述

    4. 最后把式子(7)的均值代进(8)的左边,将 x t x_t xt通过 x 0 x_0 x0进行表示,可得最终的优化目标
      在这里插入图片描述

    5. 最后得到的简化loss如下:
      在这里插入图片描述

  • 推理过程
    在这里插入图片描述

上面是discrete model (DDPM) 最先提出的形式

下面是continuous model (SDE) 完善理论框架
首次揭示了diffusion model的连续版本对应的数学背景,并且将统计机器学习中的denoising score matching方法与DDPM中的去噪训练统一起来。
在这里插入图片描述

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Simulink是一种流行的模型驱动工具,可以用于开发和测试复杂系统。Simulink模型可以自动生成C代码,以便在嵌入式系统中运行。本文将详细介绍Simulink模型生成代码的过程。 1. 创建模型 首先,需要创建一个Simulink模型,该模型将用于生成C代码。模型中应包含完整的算法和逻辑。可以使用Simulink库中的块来构建模型,也可以使用自定义的S函数块。 2. 配置参数 在模型中选择“Simulation Parameters”选项,可以配置生成代码所需的参数。这些参数包括生成代码的目标设备、编译器、优化级别等等。此外,还可以配置生成代码的格式,例如生成单个C文件或多个C文件。 3. 生成代码 在模型中选择“Tools”选项,然后选择“C Code Generation”选项,即可开始生成代码。Simulink会自动将模型转换成C代码,并将其保存到指定的文件夹中。生成的代码包括头文件、源文件和Makefile等文件。 4. 调试代码 生成的代码可能需要进行调试,以确保其在目标设备上可以正确运行。可以使用Simulink提供的“External Mode”功能,通过与目标设备的连接实时监视和修改变量。 5. 优化代码 生成的代码可能需要进行优化,以提高代码的性能和效率。可以使用Simulink提供的优化工具,例如“Inline Parameters”功能,将参数直接内联到代码中,从而避免函数调用的开销。 6. 部署代码 最后,将生成的代码部署到目标设备上。可以使用编译器将代码编译成可执行文件,然后将其下载到目标设备中。在目标设备上运行代码之前,确保已经正确配置了设备和外设,并且已经安装了必要的驱动程序。 总之,使用Simulink可以轻松地将模型转换成C代码,从而实现在嵌入式系统中运行。需要注意的是,生成的代码可能需要进行调试和优化,以确保其在目标设备上可以正确运行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wujiekd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值