当前位置: 首页 > news >正文

DDPM 做了什么

本博客主要侧重点在于HOW也就是DDPM怎么做的而不是WHY为什么要这样做
DDPM过程

那么第一个问题DDPM做了一件什么事:这个算法通过逐渐向原图像添加噪声来破坏图像,然后再学习如何从噪声成恢复图像。
第二件事如何做到的:通过训练一个网络,这个网络输入为加噪声图片和添加噪声的次数,输出为网络预测施加在图像上的噪声
添加噪声的过程 也就是前向扩散过程 满足这个式子:

逐步添加高斯噪声到数据 x 0 x_0 x0
q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β t x t − 1 , β t I ) q(x_t | x_{t-1}) = \mathcal{N}\left(x_t; \sqrt{1-\beta_t} x_{t-1}, \beta_t I\right) q(xtxt1)=N(xt;1βt xt1,βtI)
最终隐式表达:
q ( x t ∣ x 0 ) = N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) q(x_t | x_0) = \mathcal{N}\left(x_t; \sqrt{\bar{\alpha}_t} x_0, (1-\bar{\alpha}_t)I\right) q(xtx0)=N(xt;αˉt x0,(1αˉt)I)
其中:

  • α t = 1 − β t \alpha_t = 1 - \beta_t αt=1βt
  • α ˉ t = ∏ i = 1 t α i \bar{\alpha}_t = \prod_{i=1}^t \alpha_i αˉt=i=1tαi
    这边的 β t \beta_t βt是自己设的

这个式子用人话来说就是由原图像加噪t次后产生的图像(就命名为 I t I_t It吧)要满足偏差为 α ˉ t x 0 \sqrt{\bar{\alpha}_t} x_0 αˉt x0 方差为 ( 1 − α ˉ t ) I (1-\bar{\alpha}_t)I (1αˉt)I 的正态分布。
听起来是不是还是不像人话,没事代码一看便懂

def q_xt_x0(self, x0: torch.Tensor, t: torch.Tensor) -> Tuple[torch.Tensor, torch.Tensor]:
    mean = gather(self.alpha_bar, t) ** 0.5 * x0
    var = 1 - gather(self.alpha_bar, t)
    return mean, var

def q_sample(self, x0: torch.Tensor, t: torch.Tensor, eps: Optional[torch.Tensor] = None):
    if eps is None:
           eps = torch.randn_like(x0)
    mean, var = self.q_xt_x0(x0, t)
    return mean + (var ** 0.5) * eps

也就是 I t I_t It是由 I 0 I_0 I0乘上一个系数然后加上由标准正态分布采样得到的和原图像大小一致的随机噪声乘上系数得到的。
那么为什么mean + (var ** 0.5) * eps = N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) \mathcal{N}\left(x_t; \sqrt{\bar{\alpha}_t} x_0, (1-\bar{\alpha}_t)I\right) N(xt;αˉt x0,(1αˉt)I) 呢?
因为这边的 e p s ∼ N ( 0 , I ) eps\sim \mathcal{N}(0, I) epsN(0,I) 所以 ( v a r ∗ ∗ 0.5 ) ∗ e p s ∼ N ( 0 , ( 1 − α ˉ t ) I ) (var ** 0.5) * eps \sim \mathcal{N}(0,(1-\bar{\alpha}_t)I) (var0.5)epsN(0,(1αˉt)I) (这块看不懂去看看概率论吧) 那么 m e a n + ( v a r ∗ ∗ 0.5 ) ∗ e p s ∼ N ( α ˉ t x 0 , ( 1 − α ˉ t ) I ) mean + (var ** 0.5) * eps \sim N(\sqrt{\bar{\alpha}_t} x_0, (1-\bar{\alpha}_t)I) mean+(var0.5)epsN(αˉt x0,(1αˉt)I) 满足了隐式表达的式子 。

说完了添加噪声,那么自然来到了如何去除噪声,前面也说过,我们训练一个网络网络输入为 I t I_t It和t,输出为网络预测的第t次施加在图像上的噪声。我们把这个网络就记作 ϵ θ ( I t , t ) \epsilon_\theta(I_t, t) ϵθ(It,t) ,我们的目标是使得网络预测的噪声和添加在图像上的噪声越相似越好,就得到了网络的损失函数
L ( θ ) = E t , x 0 , ϵ [ ∥ ϵ − ϵ θ ( I t , t ) ∥ 2 ] \mathcal{L}(\theta) = \mathbb{E}_{t, x_0, \epsilon} \left[ \| \epsilon - \epsilon_\theta(I_t, t) \|^2 \right] L(θ)=Et,x0,ϵ[ϵϵθ(It,t)2]
训练过程就是采样,计算损失函数,反向传播更新参数。具体就不多说了

TODO:DDPM的噪声预测网络结构

http://www.dtcms.com/a/113548.html

相关文章:

  • 2007-2019年各省地方财政其他支出数据
  • 格式工厂怎样插入内置音频文件
  • 硬件工程师面试问题(五):蓝牙面试问题与详解
  • 在响应式网页的开发中使用固定布局、流式布局、弹性布局哪种更好
  • vllm作为服务启动,无需额外编写sh文件,一步到位【Ubuntu】
  • 『Linux_网络』 第一章 网络基础概念
  • 分表字段选择策略:以电商交易订单为例的最佳实践
  • Java项目之基于ssm的怀旧唱片售卖系统(源码+文档)
  • 大数据时代的隐私保护:区块链技术的创新应用
  • 通过构造函数和几何条件,研究了不同函数的最近点存在性、性质及单调性
  • ZKmall开源商城多云高可用架构方案:AWS/Azure/阿里云全栈实践
  • 紧急更新!MinIO发布RELEASE.2025-04-03T14-56-28Z版本,修复高危漏洞CVE-2025-31489,用户需立即升级!
  • raft协议中一条数据写入流程
  • Java 实现插入排序:[通俗易懂的排序算法系列之三]
  • 文献总结:TPAMI综述BEV感知—Delving into the devils of bird‘s-eye-view perception
  • Socket编程TCP
  • HarmonyOS:WebView 控制及 H5 原生交互实现
  • 硬件学习之器件篇-蜂鸣器
  • 第三章 react redux的学习之redux和react-redux,@reduxjs/toolkit依赖结合使用
  • use_tempaddr 笔记250405
  • setj集合
  • 1.5 基于改进蛇优化VGG13SE故障诊断方法的有效性分析
  • Python实现链接KS3,并将文件数据上传到KS3
  • 【spring Cloud Netflix】OpenFeign组件
  • 第二十九章:Python-mahotas库:图像处理的高效工具
  • 使用 pytest-xdist 进行高效并行自化测试
  • PHP的垃圾回收机制
  • 我的创作历程:从不情愿到主动分享的成长
  • 用北太天元脚本解决了关于双曲线的求离心率对应的参数、等腰三角形条件下的点坐标和向量点积条件下的参数范围
  • 如何判断栈生长的方向