标准分布的累计分布函数的差分去模拟离散的高斯分布

标准分布的累计分布函数的差分去模拟离散的高斯分布

  • 如何理解图像生成中“标准分布的累积分布函数的差分去模拟离散的高斯分布”?
  • discretized_gaussian_log_likelihood
    • code
  • approx_standard_normal_cdf
  • tanh激活函数
  • 标准正态分布的累积密度函数

如何理解图像生成中“标准分布的累积分布函数的差分去模拟离散的高斯分布”?

图像生成需要计算整个图片的似然概率的大小,但是通常来说(比如diffusion中求L0)能获得的通常都是图片对应的连续高斯分布(均值和方差),但是图片的像素值是0-255的离散值,因此计算图片的似然需要离散的高斯分布。如何通过连续的分布获取离散的分布有不同的处理方法,其中一种做法的定义是离散的p(x)=连续高斯分布(PDF)概率密度函数中以x为中心一个单位所占的面积大小,此时计算面积大小就可以通过累积分布函数(CDF)去算,具体为离散的p(x)=CDF(x+半个单位)-CDF(x-半个单位),这就是所谓的差分。值得注意的是,累积分布函数通常都是标准正态分布才能近似,因此如果你有的是一个高斯分布(非标准),需要将其归一化后转变为标准正态分布再进行后续处理

知乎

discretized_gaussian_log_likelihood

code

IDDPM官方源码的gaussian_diffusion.py
对于t=0,则要计算的就是 L 0 = − log ⁡ p θ ( x 0 ∣ x 1 ) L_0=-\log p_{\theta}(x_0|x_1) L0=logpθ(x0x1)
当t=0时,则model出来的均值和方差即为 x 0 x_0 x0的均值和方差


        # 对应着L[0]损失函数,负对数似然NLL:Negative Log Likelihood,用累积分布函数的差分去拟合高斯分布
        # 一般称之为Decoder NLL    L0 = -log p(x0|x1)
        # discretized_gaussian_log_likelihood: 这是一个常见的操作:用连续分布的累积分布函数的差分,去模拟离散分布
        decoder_nll = -discretized_gaussian_log_likelihood(
            x_start, means=out["mean"], log_scales=0.5 * out["log_variance"]
        ) # x_start:就是我们观测的数据,将之带入分布之中,看其可能性为多大
        # mean和log_scales就是分布的均值和标准差
        # 离散的高斯分布的似然,传入的是x0, 预测的均值,预测的对数的标准差
        assert decoder_nll.shape == x_start.shape
        decoder_nll = mean_flat(decoder_nll) / np.log(2.0)   # 除以np.log(2.0),得到binary_predimension,做一个归一化

        # At the first timestep return the decoder NLL,
        # otherwise return KL(q(x_{t-1}|x_t,x_0) || p(x_{t-1}|x_t))
        # t=0时刻,用离散的高斯分布去计算似然,此时model输出的正是x0的mu和sigma
        # t>0时刻,直接用KL散度
        # 当t=0时刻返回decoder——nll; 不等于0时返回kl
        output = th.where((t == 0), decoder_nll, kl)
        return {"output": output, "pred_xstart": out["pred_xstart"]}

IDDPM官方源码的loss.py

def approx_standard_normal_cdf(x):
    """
    A fast approximation of the cumulative distribution function of the
    standard normal.
    """
    return 0.5 * (1.0 + th.tanh(np.sqrt(2.0 / np.pi) * (x + 0.044715 * th.pow(x, 3))))


def discretized_gaussian_log_likelihood(x, *, means, log_scales):
    """
    这是一个常见的操作:用连续分布的累积分布函数的差分,去模拟离散分布
    Compute the log-likelihood of a Gaussian distribution discretizing to a
    given image.

    :param x: the target images. It is assumed that this was uint8 values,
              rescaled to the range [-1, 1].
    :param means: the Gaussian mean Tensor.
    :param log_scales: the Gaussian log stddev Tensor.
    :return: a tensor like x of log probabilities (in nats).
    """
    assert x.shape == means.shape == log_scales.shape
    # 减去均值      x ∈[-1, 1]
    centered_x = x - means            # 归一化后转变为标准正态分布    
    inv_stdv = th.exp(-log_scales)    # 1/sigma

    # 将[-1,1]分为255个bins, 
    # 最右边的CDF记为1,最左边的CDF记为0
    # 256个槽,对于每个槽取左右两边一个微笑的距离,  # 图片的像素值是0-255的离散值
    plus_in = inv_stdv * (centered_x + 1.0 / 255.0) # 槽的右边
    cdf_plus = approx_standard_normal_cdf(plus_in) 

    min_in = inv_stdv * (centered_x - 1.0 / 255.0) # 槽的左边
    cdf_min = approx_standard_normal_cdf(min_in) # 去算一个标准分布的累计分布函数
    # 然后再*inv_stdv,就相当于除以一个标准差,就可以得到一个近似的标准分布
    # 把这样一个近似的标准分布的累积分布函数给它算出来

    # 稳定性的一个操作:把右边的累计分布函数的对数给计算出来,且需要确保最小值不能为0
    log_cdf_plus = th.log(cdf_plus.clamp(min=1e-12))
    # 同理:要算出左边的
    log_one_minus_cdf_min = th.log((1.0 - cdf_min).clamp(min=1e-12))

    # 用小范围的CDF之差来表示PDF
    cdf_delta = cdf_plus - cdf_min  # 两个累计分布函数的差值就是近似等于概率分布的值

    # 考虑到两个极限的地方,这里用到了两个where
    log_probs = th.where(
        x < -0.999,
        log_cdf_plus,
        th.where(x > 0.999, log_one_minus_cdf_min, th.log(cdf_delta.clamp(min=1e-12))),
    )
    ''' 
    x<-0.999, 即x在最左边的时候,我们直接用log_cdf_plus,即最右边的,
    当x在最小值的位置时,我们认为x左边的那个cdf,我们把它直接赋为0.

    x>0.999,即x在最右边的时候,我们直接用1-cdf_min,在最右边的时候,
    我们把其累计分布函数强制写为1.

    对于二者之间的,我们直接对cdf_delta取一个对数就好
    '''

    assert log_probs.shape == x.shape
    return log_probs

approx_standard_normal_cdf 和 discretized_gaussian_log_likelihood 函数都是用于图像生成模型中的概率分布建模的工具函数。

approx_standard_normal_cdf 函数是用于计算标准正态分布的累积分布函数的一个近似值,这个近似值可以被用来将一个连续分布离散化为有限数量的值。在图像生成模型中,常常使用离散化的高斯分布来对图像的像素值建模,而 approx_standard_normal_cdf 函数提供了一种近似计算这种离散分布的方法。

discretized_gaussian_log_likelihood 函数则是用于计算高斯分布在离散取值下的概率密度函数的对数值。该函数将目标图像和高斯分布的均值和方差作为输入,计算出每个像素值在该分布下的概率密度函数的对数值。这个函数将图像像素值归一化为 [-1, 1] 的范围,然后将其离散化为 256 个值。对于每个值,它首先计算出对应的概率分布的累积分布函数,然后将相邻的两个累积分布函数之差作为该值的概率密度函数的近似值。最终,函数返回每个像素值在高斯分布下的概率密度函数的对数值。

在 discretized_gaussian_log_likelihood 函数中的第一行,我们可以看到这个注释:

It is assumed that this was uint8 values, rescaled to the range [-1, 1].
这个注释说明了输入的图像 x 是在 8 位无符号整数的范围 [0, 255] 内表示的,然后进行了归一化,使得图像的像素值的范围缩放到 [-1, 1] 之间。实现归一化的代码可能出现在 Dataset 或 DataLoader 中,具体实现取决于数据集的情况。在这里,我们只需要知道输入的图像在 discretized_gaussian_log_likelihood 函数中已经被归一化为 [-1, 1] 的范围了。

kl = mean_flat(kl) / np.log(2.0)
mean_flat(kl)即对c,h,w的数字求平均, 出来的kl.shape=(b,)

信息量
信息量可以用来描述事件的信息,定义一个事件 x = x \mathrm{x}=x x=x, I ( x ) = − log ⁡ P ( x ) I(x)=-\log P(x) I(x)=logP(x), 其单位为奈特(nats), 1nats表示以 1 e \frac{1}{e} e1的概率观测到一个事件所获得的信息量。
(这里log是以e为底,也有使用以2为底的对数,其单位为bit或者香农shannons)

信息论

approx_standard_normal_cdf

为什么approx_standard_normal_cdf里面的表达式是0.5 * (1.0 + th.tanh(np.sqrt(2.0 / np.pi) * (x + 0.044715 * th.pow(x, 3)))),有什么依据吗

这个表达式是一种近似计算标准正态分布的累积分布函数 (Cumulative Distribution Function, CDF) 的方法,它基于激活函数 tanh ⁡ \tanh tanh 的形状近似于标准正态分布的 CDF。具体而言,它使用了以下两个性质:

tanh ⁡ ( x ) \tanh(x) tanh(x) 的范围是 ( − 1 , 1 ) (-1, 1) (1,1),且当 x x x 趋近于正负无穷时, tanh ⁡ ( x ) \tanh(x) tanh(x) 趋近于 ± 1 \pm 1 ±1。因此, 0.5 ∗ ( 1 + tanh ⁡ ( x ) ) 0.5 * (1 + \tanh(x)) 0.5(1+tanh(x)) 的范围是 ( 0 , 1 ) (0, 1) (0,1),且当 x x x 趋近于正负无穷时,它趋近于 1 1 1

x x x 的分布为标准正态分布时, 2 / π ⋅ x \sqrt{2/\pi} \cdot x 2/π x 的分布的均值为 0 0 0,方差为 2 π \frac{2}{\pi} π2。因此, 2 / π ⋅ x \sqrt{2/\pi} \cdot x 2/π x 的分布形状与标准正态分布的形状相似。

x x x 的分布为标准正态分布时, 2 / π ⋅ x \sqrt{2/\pi} \cdot x 2/π x 的分布的均值和方差为:
均值: E [ 2 / π ⋅ x ] = 2 π ⋅ E [ x ] = 0 E[\sqrt{2/\pi} \cdot x] = \sqrt{\frac{2}{\pi}} \cdot E[x] = 0 E[2/π x]=π2 E[x]=0
方差: V a r [ 2 / π ⋅ x ] = ( 2 / π ) 2 ⋅ V a r [ x ] = 2 π Var[\sqrt{2/\pi} \cdot x] = (\sqrt{2/\pi})^2 \cdot Var[x] = \frac{2}{\pi} Var[2/π x]=(2/π )2Var[x]=π2
因为标准正态分布的均值为 0,方差为 1,所以 2 / π ⋅ x \sqrt{2/\pi} \cdot x 2/π x 的分布的均值为 0,方差为 2 π \frac{2}{\pi} π2

通过将这两个性质结合起来,可以将 2 / π ⋅ x \sqrt{2/\pi} \cdot x 2/π x 的分布形状近似为标准正态分布的 CDF,从而得到了 0.5 ∗ ( 1 + tanh ⁡ ( 2 / π ⋅ x ) ) 0.5 * (1 + \tanh(\sqrt{2/\pi} \cdot x)) 0.5(1+tanh(2/π x)) 的近似式。这个式子可以用于计算标准正态分布的累积分布函数,因为 0.5 ∗ ( 1 + tanh ⁡ ( 2 / π ⋅ x ) ) 0.5 * (1 + \tanh(\sqrt{2/\pi} \cdot x)) 0.5(1+tanh(2/π x)) 的范围是 ( 0 , 1 ) (0, 1) (0,1),且当 x x x 趋近于正负无穷时,它趋近于 1 1 1

这个多项式的形式是通过使用泰勒级数展开式进行推导得到的。具体来说,我们想要一个三次多项式来近似标准正态分布的累积分布函数。因此,我们可以考虑使用泰勒级数展开式来逼近标准正态分布的累积分布函数。泰勒级数展开式如下所示:

Φ ( x ) ≈ 1 2 + 1 2 π x − 1 6 2 π x 3 + 1 24 2 π x 5 \Phi(x) \approx \frac{1}{2}+\frac{1}{\sqrt{2 \pi}} x-\frac{1}{6 \sqrt{2 \pi}} x^{3}+\frac{1}{24 \sqrt{2 \pi}} x^{5} Φ(x)21+2π 1x62π 1x3+242π 1x5

其中, Φ ( x ) \Phi(x) Φ(x) 表示标准正态分布的累积分布函数。将此展开式与 0.5 ∗ ( 1.0 + tanh ⁡ ( 2 / π ⋅ x ) ) 0.5 * (1.0 + \tanh(\sqrt{2/\pi} \cdot x)) 0.5(1.0+tanh(2/π x)) 进行比较,可以发现它们的形式很相似。我们可以通过调整展开式中的常数项和三次项系数,使得它们的近似程度更好。

经过一些推导和调整,我们可以得到以下多项式:
x + 0.44715 x 3 x+0.44715x^3 x+0.44715x3

这个多项式的形式与上面的泰勒展开式非常相似,但是它们的系数已经经过调整,以使得近似程度更好。

tanh激活函数

Tanh的诞生比Sigmoid晚一些,sigmoid函数我们提到过有一个缺点就是输出不以0为中心,使得收敛变慢的问题。而Tanh则就是解决了这个问题。Tanh就是双曲正切函数。等于双曲余弦除双曲正弦。函数表达式和图像见下图。这个函数是一个奇函数。
tanh ⁡ ( x ) = sinh ⁡ ( x ) cosh ⁡ ( x ) = e x − e − x e x + e − x \tanh (x)=\frac{\sinh (x)}{\cosh (x)}=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} tanh(x)=cosh(x)sinh(x)=ex+exexex
在这里插入图片描述
tanh激活函数,写的很好!

标准正态分布的累积密度函数

标准正态分布的概率密度函数:
φ ( x ) = 1 2 π e − x 2 2 \varphi(x)=\frac{1}{\sqrt{2 \pi}} e^{-\frac{x^{2}}{2}} φ(x)=2π 1e2x2

标准正态分布的累积密度函数:
Φ ( x ) = 1 2 π ∫ − ∞ x e − t 2 2 d t \Phi(x)=\frac{1}{\sqrt{2 \pi}} \int_{-\infty}^{x} e^{-\frac{t^{2}}{2}} d t Φ(x)=2π 1xe2t2dt
在这里插入图片描述

标准正态分布的密度函数

标准整体分布的CDF

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

提高代码质量!详解在Gradle项目中使用PMD的正确姿势

当今的软件开发需要使用许多不同的工具和技术来确保代码质量和稳定性。PMD是一个流行的静态代码分析工具&#xff0c;可以帮助开发者在编译代码之前发现潜在的问题。在本文中&#xff0c;我们将讨论如何在Gradle中使用PMD&#xff0c;并介绍一些最佳实践。 什么是PMD&#xff…

国内智慧城市标准是怎样的?

我国智慧城市标准化工作的历史可以回溯至2013 年&#xff0c;相关工作也得到了国家标准委、中央网信办、发展改革委、工业和信息化部等部门的高度关注和支持&#xff0c;在标准化协调机制、国家标准研制实施等方面取得了积极进展。 北京智汇云舟科技有限公司成立于2012年&#…

【vSphere | Python】vSphere Automation SDK for Python Ⅲ—— vCenter Datacenter APIs

目录5. vCenter Datacenter APIs操作5.1 Create Datacenter5.2 List Datacenter5.3 Get Datacenter5.4 Delete Datacenter参考资料5. vCenter Datacenter APIs 数据中心服务&#xff08;Datacenter service&#xff09;提供管理 vCenter Server 中数据中心的操作。 操作 Cre…

新加坡电商系统上线指南

如果您正在考虑在新加坡开展电子商务业务并准备上线您的电商网站&#xff0c;以下是一些指南和建议&#xff0c;可以帮助您成功地启动和运营您的电商业务&#xff1a; 确认您的业务模式和目标市场。在上线之前&#xff0c;您需要确定您的业务模式&#xff0c;例如是B2B&#xf…

Python 进阶指南(编程轻松进阶):六、编写 Python 风格的代码

原文&#xff1a;http://inventwithpython.com/beyond/chapter6.html 强大对于编程语言来说是一个没有意义的形容词。每种编程语言都称自己长处。官方 Python 教程开头就说 Python 是一种简单易学、功能强大的编程语言。但是没有一种语言可以做另一种语言不能做的算法&#xff…

Robosense激光雷达Linux配置

文章目录1.1 速腾rs16连接&#xff1a;1.2 网络配置1&#xff09;官方说明2&#xff09;设置网络3&#xff09;检查是否连接成功2.1 激光雷达ROS包下载/编译1)下载ROS包2&#xff09;安装libpcap依赖3&#xff09;修改编译模式4&#xff09;config文件配置5&#xff09;编译并运…

AI-TestOps —— 软件测试工程师的一把利剑

写在前面软件测试的前世今生测试工具开始盛行AI-TestOps 云平台● AI-TestOps 功能模块● AI-TestOps 自动化测试流程写在前面 最近偶然间看到一句话&#xff1a;“软件测试是整个 IT 行业中最差的岗位”。这顿时激起了我对软件测试领域的兴趣&#xff0c;虽然之前未涉及过软件…

《Flutter进阶》flutter升级空安全遇到的一些问题及解决思路

空安全出来挺久了&#xff0c;由于业务需求较紧&#xff0c;一直没时间去升级空安全&#xff0c;最近花了几天去升级&#xff0c;发现其实升级也挺简单的&#xff0c;不要恐惧&#xff0c;没有想象中的多BUG。 flutter版本从1.22.4升到3.0.5&#xff1b; compileSdkVersion从1…

日撸 Java 三百行day11-13

文章目录说明day11-day12 顺序表1.面向过程面向对象区别2.代码2.1 面向过程2.2 面向对象day13 链表1.成员内部类2.链表的插入删除3.代码说明 闵老师的文章链接&#xff1a; 日撸 Java 三百行&#xff08;总述&#xff09;_minfanphd的博客-CSDN博客 自己也把手敲的代码放在了…

【51单片机】:LED任务及汇编解释任务

学习目标&#xff1a; 1、用汇编或者c语言实现D1 D3 D5 D7 为一组 &#xff1b;D2 D4 D6 D8 为一组 &#xff0c;两组实现 1&#xff09;一组亮约一秒 另一组灭一秒&#xff0c;这样的互闪现象五次后 25分 2&#xff09;所有灯灭约一秒后&#xff0c; …

关于ChatGPT的一些随笔

大家好&#xff0c;我是老三&#xff0c;最近几个月关于ChatGPT的信息可以说是铺天盖地。 “王炸&#xff0c;ChatGPT……” “xxx震撼发布……” “真的要失业了&#xff0c;xxx来袭……” “普通如何利用ChatGPT……” …… 不过老三前一阵比较忙&#xff0c;对ChatGPT…

ElasticSearch简介

第一章 ElasticSearch简介 1.1 什么是ElasticSearch Elaticsearch&#xff0c;简称为es&#xff0c; es是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理PB…

【数据结构与算法】树与二叉树

目录一.树1.树的定义2.结点的分类与关系3.树的相关概念4.树的表示方法二.二叉树1.二叉树的定义2.特殊二叉树3.二叉树的性质4.二叉树的顺序结构5.二叉树的链式结构(1)链式结构的创建(2)结点的创建(3)二叉树的手动构建(4)前中后序遍历(5)二叉树结点个数(6)二叉树的高度(7)第k层的…

Docker目录迁移

介绍 在docker的使用中随着下载镜像越来越多&#xff0c;构建镜像、运行容器越来越多, 数据目录必然会逐渐增大&#xff1b;当所有docker镜像、容器对磁盘的使用达到上限时&#xff0c;就需要对数据目录进行迁移。 如何避免&#xff1a; 1.在安装前对/var/lib/docker&#x…

如何3步精读《PMBOK指南》(含PMP备考资料)

初学者学习《PMBOK指南》的确有点吃亏&#xff0c;比不得那些项目管理专业以及相关专业的毕业生&#xff0c;哪怕只稍微接触过项目的都比初学者强。 所以&#xff0c;有计划性的阅读就显得尤为重要&#xff0c;要克服的不仅是阅读上的枯燥&#xff0c;还有专业知识的理解&…

Java——JDK动态代理

1.动态代理 1.1什么是动态代理&#xff1f; 动态代理(理解) 基于反射机制 举个例子&#xff0c;生活中一般在打官司的时候都会请代理律师&#xff0c;为什么要请律师呢&#xff1f;是因为开庭的时候大部人对于打官司没有经验&#xff0c;只会说出自己案件的陈述&#xff0c;并不…

软硬皆施,WMS仓库管理系统+PDA,实现效率狂飙

人工经验Excel表格&#xff0c;是传统第三方仓储企业常用的管理模式。在这种管理模式下&#xff0c;对仓库员工的Excel操作能力、业务经验和工作素养要求极高。一旦员工的经验能力不足&#xff0c;就会导致仓库业务运行不顺畅&#xff0c;效率低下&#xff0c;而员工也会因长时…

【MySQL】基于GTID的半同步主从复制(实践)

一、GTID简介 什么是GTID? 全局事务标识符GTID的全称为Global Transaction Identifier&#xff0c;是在整个复制环境中对一个事务的唯一标识。 它是MySQL 5.6加入的一个强大特性&#xff0c;目的在于能够实现主从自动定位和切换&#xff0c;而不像以前需要指定文件和位置。 …

ArduPilot飞控之DIY-F450计划

ArduPilot飞控之DIY-F450计划1. 历史2. 源由3. 计划3.1 硬件3.2 软件4. 动手4.1 接线4.1.1 ELRS nano接收机4.1.2 BN880 GPS模块4.1.3 Radio Telemetry4.2 配置4.2.1 选择四轴机型4.2.2 电源参数调整4.2.3 校准加速度计4.2.4 校准磁力计4.2.5 遥控器校准4.2.6 电机设置4.2.7 电…

企业电子招投标采购系统——功能模块功能描述+数字化采购管理 采购招投标

​ 功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外…