噪声条件分数网络——NCSN原理解析

1、前言

本篇文章,我们讲NCSN,也就是噪声条件分数网络。这是宋飏老师在2019年提出的模型,思路与传统的生成模型大不相同,令人拍案叫绝!!!

参考论文:

①Generative Modeling by Estimating Gradients of the Data Distribution (arxiv.org)

②Tutorial on Diffusion Models for Imaging and Vision (arxiv.org)

参考代码:GitHub - Lingyu-Kong/ncsn: Handwritten Score-Based Generative Model

视频:[噪声条件得分(分数)网络——NCSN原理解析-哔哩哔哩]

Ps:这篇文章我简单讲一下思路就算了,过程并不严谨,因为这个内容并不是很重要

2、引入

回忆一下梯度下降,假设我们有一个二次函数
f ( x ) = ( 0.5 x − 3 ) 2 f(x)=(0.5x-3)^2 f(x)=(0.5x3)2
导数为 f ′ ( x ) = ( 0.5 x − 3 ) f'(x)=(0.5x-3) f(x)=(0.5x3),使用梯度下降
x t + 1 = x t − 0.1 f ′ ( x t ) (1) x_{t+1}=x_t-0.1f'(x_t)\tag{1} xt+1=xt0.1f(xt)(1)
其中 x t 、 x t + 1 x_t、x_{t+1} xtxt+1表示优化前和优化后的x对应的值, 0.1 0.1 0.1是步长。初始化蓝色点 x t = − 6 x_t=-6 xt=6,迭代100轮梯度下降,就可以得到下面的图(可以看到蓝色点逐渐向着函数最低点靠近)

在这里插入图片描述

为什么会这样?因为梯度总是指向函数值上升的方向。而Eq.(1),是减去梯度,相当于对梯度取反方向。于是x的值就沿着函数值下降的方向走了。如果换成梯度上升,则Eq.(1)改为
x t + 1 = x t + 0.1 f ′ ( x t ) (2) x_{t+1}=x_t+0.1f'(x_t)\tag{2} xt+1=xt+0.1f(xt)(2)
对应图像为

在这里插入图片描述

再回忆一下一维高斯分布的概率密度的图像

在这里插入图片描述

当y值(密度值)取到最高点,其对应样本点在均值处

此时我们注意到,高斯分布的图像,与Eq.(2)何其相像,那我们把Eq.(2)里面的 f ( x ) f(x) f(x)当作是高斯分布的密度函数,而 x x x则对应高斯分布的样本点
x t + 1 = x t + 0.1 f ′ ( x t ) x_{t+1}=x_t+0.1f'(x_t) xt+1=xt+0.1f(xt)
那么这个梯度上升的意思就变成了,对于一个样本 x t x_t xt,不断往概率密度函数 f ′ ( x t ) f'(x_t) f(xt)密度值高的地方靠近。如果优化到最优点,那么图像就会变成这样

在这里插入图片描述

也就是说,样本点 x t x_t xt,最终会走到概率值最高对应的点,那么此时的样本点 x t x_t xt,就可以认为是从高斯分布中采样出来的一个概率最高的样本。我们写成概率分布的一般形式
x t + 1 = x t + α ∇ x P ( x t ) x_{t+1}=x_t+\alpha \nabla_xP(x_t) xt+1=xt+αxP(xt)
α \alpha α表示步长,比如之前的0.1, ∇ x \nabla_x x是对x求梯度。

我们在 P ( x t ) P(x_t) P(xt)前面取一个log对数,不改变单调性,仍然会使 x t x_t xt收敛到最优值
x t + 1 = x t + α ∇ x log ⁡ P ( x t ) x_{t+1}=x_t+\alpha \nabla_x\log P(x_t) xt+1=xt+αxlogP(xt)
更一般的,从一个概率分布中采样,我们往往会存在一些偏差项,于是我们加上一个随机噪声
x t + 1 = x t + α ∇ x log ⁡ P ( x t ) + 2 α z t (3) x_{t+1}=x_t+\alpha \nabla_x\log P(x_t)+\sqrt{2\alpha}z_t\tag{3} xt+1=xt+αxlogP(xt)+2α zt(3)
2 α \sqrt{2\alpha} 2α 是缩放系数,而 z t z_t zt是标准高斯分布,加上一个噪声后, x t x_t xt的收敛值会在概率最高点处不断徘徊

图像表示为

在这里插入图片描述

现在,我们更进一步,我们把 x t x_t xt当作是一个随机初始化的图像,然后 P ( x ) P(x) P(x)是我们训练图像的所对应的分布,通过不断执行Eq.(3),便可以让随机初始化的图像,不断往 P ( x ) P(x) P(x)概率最高点周围靠近,那么就间接说明,经过了大T步Eq.(3),得到的 x t x_t xt,可以认为是从 P ( x ) P(x) P(x)中采样出来的。

仔细看一下,这不就是一个生成图像的过程吗?

这种方式,又被称为郎之万动力采样。emmmmm,不懂,物理学的东西。。。

我们看一个可视化的过程(图像来自参考①)

在这里插入图片描述

3、目标函数

既然Eq.(3)能够通过迭代的方式,生成图像,那自然只需要求解Eq.(3)就可以了。不幸的是,我们没办法求解

我们的训练图像,它们所服从的概率分布往往及其复杂,也就是说 P ( x ) P(x) P(x)是难以求解的​,好在我们的目标并不是求出 P ( x ) P(x) P(x),而是对应的梯度(也称为分数)
L = 1 2 E P d a t a ( x ) [ ∣ ∣ s θ ( x ) − ∇ x log ⁡ P d a t a ( x ) ∣ ∣ 2 2 ] (4) L_{}=\frac{1}{2}\mathbb{E}_{P_{data}(x)}\left[||s_\theta(x)-\nabla_x\log P_{data}(x)||_2^2\right]\tag{4} L=21EPdata(x)[∣∣sθ(x)xlogPdata(x)22](4)
P d a t a P_{data} Pdata表示训练数据所服从的分布

也就是通过最小化上式,便可得到 s θ ( x ) ≈ ∇ x log ⁡ P d a t a ( x ) s_\theta(x)\approx \nabla_x\log P_{data}(x) sθ(x)xlogPdata(x)

4、问题

理论上,我们直接求解Eq.(4)就可以了,但是,我们样本所服从的分布往往是服从,概率分布中往往存在一些低密度区域,那么对应的样本就很少。

而样本少,意味着对应为止的梯度分数,得不到很好的训练,那么神经网络在那些样本点就很容易估不准。作者博客给出了一张很形象的图像(图像来自参考①)

在这里插入图片描述

可以看到,数据的密度分别都在左下角和右上角,那么这些区域就能够用神经网络得到很好的拟合,对应Accurate区域。相反,低密度区域,没有得到很好的拟合,对应Inaccurate区域。

当我们使用郎之万动力采样的时候,随机初始化一个 x 0 x_0 x0,它落在低密度区域的概率非常之高。而低密度的区域没有经过很好的训练,所以郎之万动力采样在短时间内很难得到较好的结果。

那么,该如何解决这个问题呢?一个很好的方法就是——加噪声

我们通过对图像加入随机扰动噪声,会填充原本的低密度区域,从而让整个区域看起来较为的均匀(图像来自参考①)

在这里插入图片描述

也就是这样,让原本的密度点扩张开来。

加噪的过程我们可以表示为 x ~ = x + σ z \tilde x=x+\sigma z x~=x+σz x x x表示原始图像, x ~ \tilde x x~表示加噪后的图像。

我们用 q ( x ~ ∣ x ) ∼ N ( x , σ 2 I ) q(\tilde x|x)\sim N(x,\sigma^2I) q(x~x)N(x,σ2I)去表示这个加噪过程

于是Eq.(3)就可以变成
L = 1 2 E P d a t a ( x ) , x ~ ∼ N ( x , σ 2 I ) [ ∣ ∣ s θ ( x + σ z ) − ∇ x ~ log ⁡ q ( x ~ ∣ x ) ∣ ∣ 2 2 ] (5) L_{}=\frac{1}{2}\mathbb{E}_{P_{data}(x),\tilde x\sim N(x,\sigma^2I)}\left[||s_\theta(x+\sigma z)-\nabla_{\tilde x}\log q(\tilde x|x)||_2^2\right]\tag{5} L=21EPdata(x),x~N(x,σ2I)[∣∣sθ(x+σz)x~logq(x~x)22](5)
emmmm,我感觉这样讲貌似挺合理的,但是它是需要证明的,也就是证明Eq.(4)、Eq.(5)的优化等价性。我就不证明了,证明过程在参考论文②,并不难,读者自己看一下就知道了

除此之外,真正导致需要加噪的,其实有其他原因,我只讲了其中一个。其他原因请看参考②,里面讲的非常之详细。我也懒得写了

现在,我们预测的是加噪后的梯度分数,通过加噪的过程,也避免了直接求解 P ( x ) P(x) P(x)的问题。那我们来看一下这个等式可以变成什么吧

如果我们加的噪声足够小,那么 P d a t a ( x ) ≈ q ( x ~ ∣ x ) P_{data}(x)\approx q(\tilde x|x) Pdata(x)q(x~x)

因为 q ( x ~ ∣ x ) q(\tilde x|x) q(x~x)是服从高斯分布的,是完全可以求出来的,所以梯度为
∇ x ~ log ⁡ q ( x ~ ∣ x ) = ∇ x ~ log ⁡ 1 2 π σ 2 d exp ⁡ { − ∣ ∣ x ~ − x ∣ ∣ 2 2 σ 2 } = ∇ x ~ ( log ⁡ 1 2 π σ 2 d − ∣ ∣ x ~ − x ∣ ∣ 2 2 σ 2 ) = − 2 ( x ~ − x ) 2 σ 2 = − x ~ − x σ 2 = − z σ \begin{aligned}\nabla_{\tilde x}\log q(\tilde x|x)=&\nabla_{\tilde x}\log \frac{1}{\sqrt{2\pi\sigma^2}^d}\exp \left\{-\frac{||\tilde x-x||^2}{2\sigma^2}\right\}\\=&\nabla_{\tilde x}\left(\log \frac{1}{\sqrt{2\pi\sigma^2}^d}-\frac{||\tilde x-x||^2}{2\sigma^2}\right)\\=&-\frac{2(\tilde x-x)}{2\sigma^2}\\=&-\frac{\tilde x -x}{\sigma^2}\\=&-\frac{z}{\sigma}\end{aligned} x~logq(x~x)=====x~log2πσ2 d1exp{2σ2∣∣x~x2}x~(log2πσ2 d12σ2∣∣x~x2)2σ22(x~x)σ2x~xσz
所以损失函数就可以变成
L = 1 2 E P d a t a ( x ) , x ~ ∼ N ( x , σ 2 I ) [ ∣ ∣ s θ ( x + σ z ) + x ~ − x σ 2 ∣ ∣ 2 2 ] L=\frac{1}{2}\mathbb{E}_{P_{data}(x),\tilde x\sim N(x,\sigma^2I)}\left[||s_\theta(x+\sigma z)+\frac{\tilde x -x}{\sigma^2}||_2^2\right] L=21EPdata(x),x~N(x,σ2I)[∣∣sθ(x+σz)+σ2x~x22]

按理说,我们只需要最优化这个目标函数即可。

可问题又来了

我们该如何加入噪声呢?加多少?加的小了,低密度区域没有得到很好的填充。加多了,直接改变原本的数据分布了,这显然也不行。

我们干脆一不做二不休,我们加多个量级噪声,不同量级都进行训练。

当训练完成之后,就得到了不同噪声强度的噪声条件得分网络。

假设不同强度等级的噪声有S个, { σ i } i = 1 S \{\sigma_i\}_{i=1}^S {σi}i=1S,我们看一张图(里面显示了三个噪声强度的情况,图像来自参考①)

在这里插入图片描述

那么进行采样的时候,就可以从高强度的噪声,进行郎之万动力采样,然后慢慢降低噪声的强度。总而言之,就是每个噪声强度,都进行一轮郎之万动力采样,比如下图(图像来自参考①)(Gif图像太大,上传不了…看视频里面吧)

假设有S个噪声强度,那么就可以变成
L = 1 S ∑ i = 1 S λ i 1 2 E P d a t a ( x ) , x ~ ∼ N ( x , σ i 2 I ) [ ∣ ∣ s θ ( x + σ i z , σ i ) + x ~ i − x σ i 2 ∣ ∣ 2 2 ] L=\frac{1}{S}\sum\limits_{i=1}^S\lambda_i\frac{1}{2}\mathbb{E}_{P_{data}(x),\tilde x\sim N(x,\sigma_i^2I)}\left[||s_\theta(x+\sigma_i z,\sigma_i)+\frac{\tilde x_i -x}{\sigma_i^2}||_2^2\right] L=S1i=1Sλi21EPdata(x),x~N(x,σi2I)[∣∣sθ(x+σiz,σi)+σi2x~ix22]
x ~ i \tilde x_i x~i表示在噪声强度为 σ i \sigma_i σi的加噪图像。 λ i \lambda_i λi代表的是一个加权系数.一般情况下,我们取 λ i = σ i 2 \lambda_i=\sigma^2_i λi=σi2

对于噪声强度数量,一般是数百到数千;噪声强度选择一般采用几何级数。

采样的时候正如前面所说,先在高强度噪声量级进行郎之万动力采样,而后慢慢降低,所以采样方法为

5、结束

好了,本篇文章到此为止,如有问题,还望指出,阿里嘎多!!!

在这里插入图片描述

6、参考

①Generative Modeling by Estimating Gradients of the Data Distribution | Yang Song (yang-song.net)

②基于分数的生成模型(Score-based generative models) — 张振虎的博客 张振虎 文档 (zhangzhenhu.com)

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

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

相关文章

cesium圆形扩散扫描效果封装

效果 封装类 优化了着色器代码;增加了边框大小调整参数,增加了清除效果方法 注:在页面销毁时需要调用清除方法 CircleDiffusion.clear()/*** circleDiffusion:圆扩散特效封装类**/// 圆扩散 class CircleDiffusion {viewer;last…

docker容器安装nexus3以及nexus3备份迁移仓库数据

一、安装步骤 1.搜索nexus3镜像 docker search nexus3 2.拉取镜像 docker pull sonatype/nexus3或者指定版本 docker pull sonatype/nexus3:3.68.0 3.查看拉取的镜像 docker images | grep "nexus3" 4.启动nexus服务 直接启动 docker run -d --name nexus3 -…

怎么查看公网IP?

在网络通信中,每个设备都会被分配一个IP地址,用于在互联网上进行唯一标识和通信。公网IP是指可以被公开访问的IP地址,可以用来建立远程连接或者进行网络访问等操作。怎么查看公网IP呢?下面将介绍几种常用的方法。 使用命令行查询公…

LabVIEW高温往复摩擦测试系统中PID控制

在LabVIEW开发高温往复摩擦测试系统中实现PID控制,需要注意以下几个方面: 1. 系统建模与参数确定 物理模型建立: 首先,需要了解被控对象的物理特性,包括热惯性、摩擦系数等。这些特性决定了系统的响应速度和稳定性。实验数据获取…

吉时利Keithley 2010数字万用表7.5 位

Keithley 2010数字万用表,7.5 位 吉时利 2010 数字万用表、7.5 位、低噪声万用表将高分辨率与生产应用所需的高速度和高准确度相结合,例如测试精密传感器、换能器、A/D 和 D/A 转换器、调节器、参考、连接器、开关和继电器。2010 基于与吉时利 2000、20…

人工智能应用-实验6-卷积神经网络分类minst手写数据集

文章目录 🧡🧡实验内容🧡🧡🧡🧡代码🧡🧡🧡🧡分析结果🧡🧡🧡🧡实验总结🧡🧡 &#x1f9…

521源码-在线客服-CRMChat网页版客服系统 UNIAPP 全方位在线客服系统源码与管理体系平台

CRMChat客服系统:基于Swoole4Tp6RedisVueMysql构建的高效沟通桥梁 CRMChat是一款独立且高性能的在线客服系统,它结合了Swoole4、Tp6、Redis、Vue以及Mysql等先进技术栈,为用户提供了卓越的在线沟通体验。该系统不仅支持在Pc端、移动端、小程…

列表页9大样式,保准你看了就能掌握。

上文:一张图集齐B端列表页的16大组件,召唤神龙,看后恍然大悟。 普通列表/基础列表/常规列表 不适合移动端展示 复杂列表 加入了统计 适合移动端 项目列表 适合移动端 应用列表 适合移动端 多级列表 复杂的多级结构,下图展示了…

美国教育数据分析

文章目录 第1关:认识数据第2关:数据预处理第3关:数学成绩预测 第1关:认识数据 编程要求 根据提示,在右侧Begin-End区域补充代码,查看数据属性名称。 测试说明 程序会调用你实现的方法,查看数据…

SpringBoot——整合MyBatis

目录 MyBatis 项目总结 1、创建SQL表 2、新建一个SpringBoot项目 3、pom.xml添加依赖 4、application.properties配置文件 5、User实体类 6、UserMapper接口 7、UserMapper.xml映射文件 8、UserController控制器 9、SpringBootMyBatisApplication启动类 10、使用Po…

C语言 | Leetcode C语言题解之第98题验证二叉搜索树

题目: 题解: /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool isValid(struct TreeNode * root,long left,long right){if(!root){return true;}long…

一个超级简单的Python UI库:NiceGUI

大家好,图形用户界面(GUI)的开发往往被看作是一项复杂且繁琐的任务。Python作为一门强大的编程语言,提供了许多优秀的库来帮助开发者实现这一目标。今天,我们将介绍一个名为NiceGUI的库,它能帮助你轻松构建…

Science Robotics 封面论文:一种使用半球形纳米线阵列实现机器人视觉的超宽视场针孔复眼

研究背景 从生物复眼中汲取灵感,拥有一系列生动多样视觉功能特征的人工视觉系统最近脱颖而出。然而,这些人工系统中的大多数都依赖于可转换的电子设备,这些电子设备受到全局变形的复杂性和受限几何形状的影响,以及光学和探测器单元…

好的架构是进化来的,不是设计来的

很多年前,读了子柳老师的《淘宝技术这十年》。这本书成为了我的架构启蒙书,书中的一句话像种子一样深埋在我的脑海里:“好的架构是进化来的,不是设计来的”。 2015 年,我加入神州专车订单研发团队,亲历了专…

Wav2Vec 2.0:语音表示自监督学习框架

Wav2Vec 2.0是目前自动语音识别的模型之一。 Wav2Vec 2.0 代表了无监督预训练技术在语音识别领域的重大进步。这些方法通过直接从原始音频中学习,无需人工标记,因此可以有效利用大量未标记的语音数据集。相比于传统的监督学习数据集通常只有大约几百小时…

文章解读与仿真程序复现思路——电力系统保护与控制EI\CSCD\北大核心《基于改进Q学习算法和组合模型的超短期电力负荷预测》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Cookie 和 Session概念及相关API

目录 1.Cookie概念 2.理解会话机制 (Session) 3.相关API 3.1HttpServletRequest 3.2HttpServletResponse 3.3HttpSession 3.4Cookie 4.代码示例: 实现用户登陆 1.Cookie概念 Cookie 是存储在用户本地终端(如计算机、手机等)上的数据片段。 它…

反射获取或修改对象属性的值

利用反射既可以获取也可以写入,首先咱们先写几个获取的例子。 一:利用反射修改各数据(利用resultField.set修改) 首先定义实体类 public class Dog {private String dogUser;private int age;把DogUser的"hahaha"改为"geggegegege&quo…

LiveGBS流媒体平台GB/T28181用户手册-版本信息:查看机器码、切换查看流媒体服务

LiveGBS流媒体平台GB/T28181用户手册--版本信息:查看机器码、切换查看流媒体服务 1、版本信息1.1、查看机器码1.2、多个流媒体服务1.3、提交激活 2、搭建GB28181视频直播平台 1、版本信息 版本信息页面,可以查看到信令服务 流媒体服务相关信息,包含硬件…

免费分享一套微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】,帅呆了~~

大家好,我是java1234_小锋老师,看到一个不错的微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端) Java毕业设计…