生成扩散模型漫谈(一):DDPM = 拆楼 + 建楼

2023-11-08

说到生成模型,VAEGAN可谓是“如雷贯耳”,本站也有过多次分享。此外,还有一些比较小众的选择,如flow模型VQ-VAE等,也颇有人气,尤其是VQ-VAE及其变体VQ-GAN,近期已经逐渐发展到“图像的Tokenizer”的地位,用来直接调用NLP的各种预训练方法。除了这些之外,还有一个本来更小众的选择——扩散模型(Diffusion Models)——正在生成模型领域“异军突起”,当前最先进的两个文本生成图像——OpenAI的DALL·E 2和Google的Imagen,都是基于扩散模型来完成的。

Imagen“文本-图片”的部分例子

从本文开始,我们开一个新坑,逐渐介绍一下近两年关于生成扩散模型的一些进展。据说生成扩散模型以数学复杂闻名,似乎比VAE、GAN要难理解得多,是否真的如此?扩散模型真的做不到一个“大白话”的理解?让我们拭目以待。

新的起点 #

其实我们在之前的文章《能量视角下的GAN模型(三):生成模型=能量模型》《从去噪自编码器到生成模型》也简单介绍过扩散模型。说到扩散模型,一般的文章都会提到能量模型(Energy-based Models)、得分匹配(Score Matching)、朗之万方程(Langevin Equation)等等,简单来说,是通过得分匹配等技术来训练能量模型,然后通过郎之万方程来执行从能量模型的采样。

从理论上来讲,这是一套很成熟的方案,原则上可以实现任何连续型对象(语音、图像等)的生成和采样。但从实践角度来看,能量函数的训练是一件很艰难的事情,尤其是数据维度比较大(比如高分辨率图像)时,很难训练出完备能量函数来;另一方面,通过朗之万方程从能量模型的采样也有很大的不确定性,得到的往往是带有噪声的采样结果。所以很长时间以来,这种传统路径的扩散模型只是在比较低分辨率的图像上做实验。

如今生成扩散模型的大火,则是始于2020年所提出的DDPM(Denoising Diffusion Probabilistic Model),虽然也用了“扩散模型”这个名字,但事实上除了采样过程的形式有一定的相似之外,DDPM与传统基于朗之万方程采样的扩散模型可以说完全不一样,这完全是一个新的起点、新的篇章。

准确来说,DDPM叫“渐变模型”更为准确一些,扩散模型这一名字反而容易造成理解上的误解,传统扩散模型的能量模型、得分匹配、朗之万方程等概念,其实跟DDPM及其后续变体都没什么关系。有意思的是,DDPM的数学框架其实在ICML2015的论文《Deep Unsupervised Learning using Nonequilibrium Thermodynamics》就已经完成了,但DDPM是首次将它在高分辨率图像生成上调试出来了,从而引导出了后面的火热。由此可见,一个模型的诞生和流行,往往还需要时间和机遇,

拆楼建楼 #

很多文章在介绍DDPM时,上来就引入转移分布,接着就是变分推断,一堆数学记号下来,先吓跑了一群人(当然,从这种介绍我们可以再次看出,DDPM实际上是VAE而不是扩散模型),再加之人们对传统扩散模型的固有印象,所以就形成了“需要很高深的数学知识”的错觉。事实上,DDPM也可以有一种很“大白话”的理解,它并不比有着“造假-鉴别”通俗类比的GAN更难。

首先,我们想要做一个像GAN那样的生成模型,它实际上是将一个随机噪声z�变换成一个数据样本x�的过程:

随机噪声z类比⏐↓⏐砖瓦水泥−→−−−−−变换−→−−−−−建设样本数据x⏐↓⏐类比高楼大厦(1)(1)随机噪声�→变换样本数据�类比↓↓类比砖瓦水泥→建设高楼大厦

我们可以将这个过程想象为“建设”,其中随机噪声z�是砖瓦水泥等原材料,样本数据x�是高楼大厦,所以生成模型就是一支用原材料建设高楼大厦的施工队。

这个过程肯定很难的,所以才有了那么多关于生成模型的研究。但俗话说“破坏容易建设难”,建楼你不会,拆楼你总会了吧?我们考虑将高楼大厦一步步地拆为砖瓦水泥的过程:设x0�0为建好的高楼大厦(数据样本),xT��为拆好的砖瓦水泥(随机噪声),假设“拆楼”需要T�步,整个过程可以表示为

x=x0→x1→x2→⋯→xT−1→xT=z(2)(2)�=�0→�1→�2→⋯→��−1→��=�


建高楼大厦的难度在于,从原材料xT��到最终高楼大厦x0�0的跨度过大,普通人很难理解xT��是怎么一下子变成x0�0的。但是,当我们有了“拆楼”的中间过程x1,x2,⋯,xT�1,�2,⋯,��后,我们知道xt−1→xt��−1→��代表着拆楼的一步,那么反过来xt→xt−1��→��−1不就是建楼的一步?如果我们能学会两者之间的变换关系xt−1=μ(xt)��−1=�(��),那么从xT��出发,反复地执行xT−1=μ(xT)��−1=�(��)xT−2=μ(xT−1)��−2=�(��−1)、...,最终不就能造出高楼大厦x0�0出来?

该怎么拆 #

正所谓“饭要一口一口地吃”,楼也要一步一步地建,DDPM做生成模型的过程,其实跟上述“拆楼-建楼”的类比是完全一致的,它也是先反过来构建一个从数据样本渐变到随机噪声的过程,然后再考虑其逆变换,通过反复执行逆变换来完成数据样本的生成,所以本文前面才说DDPM这种做法其实应该更准确地称为“渐变模型”而不是“扩散模型”。

具体来说,DDPM将“拆楼”的过程建模为

xt=αtxt−1+βtεt,εt∼N(0,I)(3)(3)��=����−1+����,��∼�(0,�)


其中有αt,βt>0��,��>0α2t+β2t=1��2+��2=1βt��通常很接近于0,代表着单步“拆楼”中对原来楼体的破坏程度,噪声εt��的引入代表着对原始信号的一种破坏,我们也可以将它理解为“原材料”,即每一步“拆楼”中我们都将xt−1��−1拆解为“αtxt−1����−1的楼体 + βtεt����的原料”。提示:本文αt,βt��,��的定义跟原论文不一样。)

反复执行这个拆楼的步骤,我们可以得到:

xt====αtxt−1+βtεtαt(αt−1xt−2+βt−1εt−1)+βtεt⋯(αt⋯α1)x0+(αt⋯α2)β1ε1+(αt⋯α3)β2ε2+⋯+αtβt−1εt−1+βtεt多个相互独立的正态噪声之和(4)(4)��=����−1+����=��(��−1��−2+��−1��−1)+����=⋯=(��⋯�1)�0+(��⋯�2)�1�1+(��⋯�3)�2�2+⋯+����−1��−1+����⏟多个相互独立的正态噪声之和


可能刚才读者就想问为什么叠加的系数要满足α2t+β2t=1��2+��2=1了,现在我们就可以回答这个问题。首先,式中花括号所指出的部分,正好是多个独立的正态噪声之和,其均值为0,方差则分别为(αt⋯α2)2β21(��⋯�2)2�12(αt⋯α3)2β22(��⋯�3)2�22、...、α2tβ2t−1��2��−12β2t��2;然后,我们利用一个概率论的知识——正态分布的叠加性,即上述多个独立的正态噪声之和的分布,实际上是均值为0、方差为(αt⋯α2)2β21+(αt⋯α3)2β22+⋯+α2tβ2t−1+β2t(��⋯�2)2�12+(��⋯�3)2�22+⋯+��2��−12+��2的正态分布;最后,在α2t+β2t=1��2+��2=1恒成立之下,我们可以得到式(4)(4)的各项系数平方和依旧为1,即

(αt⋯α1)2+(αt⋯α2)2β21+(αt⋯α3)2β22+⋯+α2tβ2t−1+β2t=1(5)(5)(��⋯�1)2+(��⋯�2)2�12+(��⋯�3)2�22+⋯+��2��−12+��2=1


所以实际上相当于有

xt=(αt⋯α1)记为α¯tx0+1−(αt⋯α1)2−−−−−−−−−−−−√记为β¯tε¯t,ε¯t∼N(0,I)(6)(6)��=(��⋯�1)⏟记为�¯��0+1−(��⋯�1)2⏟记为�¯��¯�,�¯�∼�(0,�)


这就为计算xt��提供了极大的便利。另一方面,DDPM会选择适当的αt��形式,使得有α¯T≈0�¯�≈0,这意味着经过T�步的拆楼后,所剩的楼体几乎可以忽略了,已经全部转化为原材料ε�提示:本文α¯t�¯�的定义跟原论文不一样。)

又如何建 #

“拆楼”是xt−1→xt��−1→��的过程,这个过程我们得到很多的数据对(xt−1,xt)(��−1,��),那么“建楼”自然就是从这些数据对中学习一个xt→xt−1��→��−1的模型。设该模型为μ(xt)�(��),那么容易想到学习方案就是最小化两者的欧氏距离:

∥xt−1−μ(xt)∥2(7)(7)‖��−1−�(��)‖2


其实这已经非常接近最终的DDPM模型了,接下来让我们将这个过程做得更精细一些。首先“拆楼”的式(3)(3)可以改写为xt−1=1αt(xt−βtεt)��−1=1��(��−����),这启发我们或许可以将“建楼”模型μ(xt)�(��)设计成

μ(xt)=1αt(xt−βtϵθ(xt,t))(8)(8)�(��)=1��(��−����(��,�))


的形式,其中θ�是训练参数,将其代入到损失函数,得到

∥xt−1−μ(xt)∥2=β2tα2t∥εt−ϵθ(xt,t)∥2(9)(9)‖��−1−�(��)‖2=��2��2‖��−��(��,�)‖2


前面的因子β2tα2t��2��2代表loss的权重,这个我们可以暂时忽略,最后代入结合式(6)(6)(3)(3)所给出xt��的表达式

xt=αtxt−1+βtεt=αt(α¯t−1x0+β¯t−1ε¯t−1)+βtεt=α¯tx0+αtβ¯t−1ε¯t−1+βtεt(10)(10)��=����−1+����=��(�¯�−1�0+�¯�−1�¯�−1)+����=�¯��0+���¯�−1�¯�−1+����


得到损失函数的形式为

∥∥εt−ϵθ(α¯tx0+αtβ¯t−1ε¯t−1+βtεt,t)∥∥2(11)(11)‖��−��(�¯��0+���¯�−1�¯�−1+����,�)‖2


可能读者想问为什么要回退一步来给出xt��,直接根据式(6)(6)来给出xt��可以吗?答案是不行,因为我们已经事先采样了εt��,而εt��ε¯t�¯�不是相互独立的,所以给定εt��的情况下,我们不能完全独立地采样ε¯t�¯�

降低方差 #

原则上来说,损失函数(11)(11)就可以完成DDPM的训练,但它在实践中可能有方差过大的风险,从而导致收敛过慢等问题。要理解这一点并不困难,只需要观察到式(11)(11)实际上包含了4个需要采样的随机变量:

1、从所有训练样本中采样一个x0�0

2、从正态分布N(0,I)�(0,�)中采样ε¯t−1,εt�¯�−1,��(两个不同的采样结果);

3、从1∼T1∼�中采样一个t�

要采样的随机变量越多,就越难对损失函数做准确的估计,反过来说就是每次对损失函数进行估计的波动(方差)过大了。很幸运的是,我们可以通过一个积分技巧来将ε¯t−1,εt�¯�−1,��合并成单个正态随机变量,从而缓解一下方差大的问题。

这个积分确实有点技巧性,但也不算复杂。由于正态分布的叠加性,我们知道αtβ¯t−1ε¯t−1+βtεt���¯�−1�¯�−1+����实际上相当于单个随机变量β¯tε|ε∼N(0,I)�¯��|�∼�(0,�),同理βtε¯t−1−αtβ¯t−1εt���¯�−1−���¯�−1��实际上相当于单个随机变量β¯tω|ω∼N(0,I)�¯��|�∼�(0,�),并且可以验证E[εω⊤]=0�[��⊤]=0,所以这是两个相互独立的正态随机变量。

接下来,我们反过来将εt��ε,ω�,�重新表示出来

εt=(βtε−αtβ¯t−1ω)β¯tβ2t+α2tβ¯2t−1=βtε−αtβ¯t−1ωβ¯t(12)(12)��=(���−���¯�−1�)�¯���2+��2�¯�−12=���−���¯�−1��¯�


代入到式(11)(11)得到

=Eε¯t−1,εt∼N(0,I)[∥∥εt−ϵθ(α¯tx0+αtβ¯t−1ε¯t−1+βtεt,t)∥∥2]Eω,ε∼N(0,I)[∥∥∥βtε−αtβ¯t−1ωβ¯t−ϵθ(α¯tx0+β¯tε,t)∥∥∥2](13)(13)��¯�−1,��∼�(0,�)[‖��−��(�¯��0+���¯�−1�¯�−1+����,�)‖2]=��,�∼�(0,�)[‖���−���¯�−1��¯�−��(�¯��0+�¯��,�)‖2]


注意到,现在损失函数关于ω�只是二次的,所以我们可以展开然后将它的期望直接算出来,结果是

β2tβ¯2tEε∼N(0,I)[∥∥∥ε−β¯tβtϵθ(α¯tx0+β¯tε,t)∥∥∥2]+常数(14)(14)��2�¯�2��∼�(0,�)[‖�−�¯�����(�¯��0+�¯��,�)‖2]+常数


再次省掉常数和损失函数的权重,我们得到DDPM最终所用的损失函数:

∥∥∥ε−β¯tβtϵθ(α¯tx0+β¯tε,t)∥∥∥2(15)(15)‖�−�¯�����(�¯��0+�¯��,�)‖2


提示:原论文中的ϵθ��实际上就是本文的β¯tβtϵθ�¯�����,所以大家的结果是完全一样的。)

递归生成 #

至此,我们算是把DDPM的整个训练流程捋清楚了。内容写了不少,你要说它很容易,那肯定说不上,但真要说非常困难的地方也几乎没有——没有用到传统的能量函数、得分匹配等工具,甚至连变分推断的知识都没有用到,只是借助“拆楼-建楼”的类比和一些基本的概率论知识,就能得到完全一样的结果。所以说,以DDPM为代表的新兴起的生成扩散模型,实际上没有很多读者想象的复杂,它可以说是我们从“拆解-重组”的过程中学习新知识的形象建模。

训练完之后,我们就可以从一个随机噪声xT∼N(0,I)��∼�(0,�)出发执行T�步式(8)(8)来进行生成:

xt−1=1αt(xt−βtϵθ(xt,t))(16)(16)��−1=1��(��−����(��,�))


这对应于自回归解码中的Greedy Search。如果要进行Random Sample,那么需要补上噪声项:

xt−1=1αt(xt−βtϵθ(xt,t))+σtz,z∼N(0,I)(17)(17)��−1=1��(��−����(��,�))+���,�∼�(0,�)


一般来说,我们可以让σt=βt��=��,即正向和反向的方差保持同步。这个采样过程跟传统扩散模型的朗之万采样不一样的地方在于:DDPM的采样每次都从一个随机噪声出发,需要重复迭代T�步来得到一个样本输出;朗之万采样则是从任意一个点出发,反复迭代无限步,理论上这个迭代无限步的过程中,就把所有数据样本都被生成过了。所以两者除了形式相似外,实质上是两个截然不同的模型。

从这个生成过程中,我们也可以感觉到它其实跟Seq2Seq的解码过程是一样的,都是串联式的自回归生成,所以生成速度是一个瓶颈,DDPM设了T=1000�=1000,意味着每生成一个图片,需要将ϵθ(xt,t)��(��,�)反复执行1000次,因此DDPM的一大缺点就是采样速度慢,后面有很多工作都致力于提升DDPM的采样速度。而说到“图片生成 + 自回归模型 + 很慢”,有些读者可能会联想到早期的PixelRNNPixelCNN等模型,它们将图片生成转换成语言模型任务,所以同样也是递归地进行采样生成以及同样地慢。那么DDPM的这种自回归生成,跟PixelRNN/PixelCNN的自回归生成,又有什么实质区别呢?为什么PixelRNN/PixelCNN没大火起来,反而轮到了DDPM?

了解PixelRNN/PixelCNN的读者都知道,这类生成模型是逐个像素逐个像素地生成图片的,而自回归生成是有序的,这就意味着我们要提前给图片的每个像素排好顺序,最终的生成效果跟这个顺序紧密相关。然而,目前这个顺序只能是人为地凭着经验来设计(这类经验的设计都统称为“Inductive Bias”),暂时找不到理论最优解。换句话说,PixelRNN/PixelCNN的生成效果很受Inductive Bias的影响。但DDPM不一样,它通过“拆楼”的方式重新定义了一个自回归方向,而对于所有的像素来说则都是平权的、无偏的,所以减少了Inductive Bias的影响,从而提升了效果。此外,DDPM生成的迭代步数是固定的T�,而PixelRNN/PixelCNN则是等于图像分辨率(宽×高×通道数宽×高×通道数),所以DDPM生成高分辨率图像的速度要比PixelRNN/PixelCNN快得多。

超参设置 #

这一节我们讨论一下超参的设置问题。

在DDPM中,T=1000�=1000,可能比很多读者的想象数值要大,那为什么要设置这么大的T�呢?另一边,对于αt��的选择,将原论文的设置翻译到本博客的记号上,大致上是

αt=1−0.02tT−−−−−−−−√(18)(18)��=1−0.02��


这是一个单调递减的函数,那为什么要选择单调递减的αt��呢?

其实这两个问题有着相近的答案,跟具体的数据背景有关。简单起见,在重构的时候我们用了欧氏距离(7)(7)作为损失函数,而一般我们用DDPM做图片生成,以往做过图片生成的读者都知道,欧氏距离并不是图片真实程度的一个好的度量,VAE用欧氏距离来重构时,往往会得到模糊的结果,除非是输入输出的两张图片非常接近,用欧氏距离才能得到比较清晰的结果,所以选择尽可能大的T�,正是为了使得输入输出尽可能相近,减少欧氏距离带来的模糊问题。

选择单调递减的αt��也有类似考虑。当t�比较小时,xt��还比较接近真实图片,所以我们要缩小xt−1��−1xt��的差距,以便更适用欧氏距离(7)(7),因此要用较大的αt��;当t�比较大时,xt��已经比较接近纯噪声了,噪声用欧式距离无妨,所以可以稍微增大xt−1��−1xt��的差距,即可以用较小的αt��。那么可不可以一直用较大的αt��呢?可以是可以,但是要增大T�。注意在推导(6)(6)时,我们说过应该有α¯T≈0�¯�≈0,而我们可以直接估算

logα¯T=∑t=1Tlogαt=12∑t=1Tlog(1−0.02tT)<12∑t=1T(−0.02tT)=−0.005(T+1)(19)(19)log⁡�¯�=∑�=1�log⁡��=12∑�=1�log⁡(1−0.02��)<12∑�=1�(−0.02��)=−0.005(�+1)


代入T=1000�=1000大致是α¯T≈e−5�¯�≈�−5,这个其实就刚好达到≈0≈0的标准。所以如果从头到尾都用较大的αt��,那么必然要更大的T�才能使得α¯T≈0�¯�≈0了。

最后我们留意到,“建楼”模型中的ϵθ(α¯tx0+β¯tε,t)��(�¯��0+�¯��,�)中,我们在输入中显式地写出了t�,这是因为原则上不同的t�处理的是不同层次的对象,所以应该用不同的重构模型,即应该有T�个不同的重构模型才对,于是我们共享了所有重构模型的参数,将t�作为条件传入。按照论文附录的说法,t�是转换成《Transformer升级之路:1、Sinusoidal位置编码追根溯源》介绍的位置编码后,直接加到残差模块上去的。

文章小结 #

本文从“拆楼-建楼”的通俗类比中介绍了最新的生成扩散模型DDPM,在这个视角中,我们可以通过较为“大白话”的描述以及比较少的数学推导,来得到跟原始论文一模一样的结果。总的来说,本文说明了DDPM也可以像GAN一样找到一个形象类比,它既可以不用到VAE中的“变分”,也可以不用到GAN中的“概率散度”、“最优传输”,从这个意义上来看,DDPM甚至算得上比VAE、GAN还要简单。

转载到请包括本文地址:生成扩散模型漫谈(一):DDPM = 拆楼 + 建楼 - 科学空间|Scientific Spaces

更详细的转载事宜请参考:《科学空间FAQ》

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

生成扩散模型漫谈(一):DDPM = 拆楼 + 建楼 的相关文章

随机推荐

  • Free MyBatis plugin插件搜不到

    Free MyBatis plugin IntelliJ IDEs Plugin Marketplacehttps plugins jetbrains com plugin 8321 free mybatis plugin versions
  • AXIS2+Myeclipse 开发 Webservices

    一 准备工作 1 安装JDK 我使用的是版本是JDK1 6 下载地址 http java sun com javase downloads index jsp 下载那个rpm的bin包 即jdk 6u1 linux i586 rpm bin
  • 域名与服务器如何绑定?

    新手如何快速搭建自己的云服务器 来源 https www cnblogs com yspace p 10050452 html 相信很多小白对于服务器这个概念可能理解得很模糊 其实服务器说白了就是一台供你远端使用且可以一直开机的电脑而已 说
  • es设置数据备份--新建仓库

    前言 设置es备份首先要新建仓库 然后在kibana中配置 备份策略 多长时间备份一次等 存储库的安装 创建存储库 必须先注册快照存储库 才能执行快照和还原的操作 如果多个集群同时注册同一个快照存储库 只有一个可以有写权限 其余集群设置为r
  • centos6.5 MySQL安全模式修改Root 密码

    错误情况描述 mysql u root p ERROR 1045 28000 Access denied for user root localhost using password YES 解决办法 第一步 关闭MySQL服务 servi
  • 使用Python对Excel文件进行处理的小技巧

    Excel文件是一个常用的电子表格文件格式 它可以包含大量的数据和公式 Python有很多库可以用来处理Excel文件 下面介绍其中一些常用的库和技巧 目录 1 使用pandas库读取Excel文件 2 使用openpyxl库进行Excel
  • 内存管理分配,连续分配、分页存储、分段存储、段页式

    目录 1 连续分配管理 1 1 固定分区分配 1 2 动态分区分配 2 非连续分配方式 2 1 基本分页式内存分配管理 2 1 1 基本分页式内存思想与方法 2 1 2 进程逻辑地址与内存物理地址如何转换 2 1 3 页面在内存中的起始地址
  • typescript对与axios的封装

    import Modal message from antd import axios AxiosError AxiosRequestConfig AxiosResponse from axios import AdminConfig fr
  • 一篇搞懂java、javac版本不匹配发生的原因

    问题描述 当我们使用IDE或cmd进行java编译时 有时会发生这样的错误 Error A JNI error has occurred please check your installation and try again 异常部分描述
  • 前端面试的性能优化部分(6)每天10个小知识点

    目录 系列文章目录 前端面试的性能优化部分 1 每天10个小知识点 前端面试的性能优化部分 2 每天10个小知识点 前端面试的性能优化部分 3 每天10个小知识点 前端面试的性能优化部分 4 每天10个小知识点 前端面试的性能优化部分 5
  • sql-libs——less5(盲注)

    首先打开页面 输入 id 1 发现没有任何数据爆出这时把ID换成一个不存在数据 1试一下 发现连 you are in 都没有了 这就是典型的盲注 正确时显示you are in 不正确时什么也不显示 http 192 168 0 5 90
  • Wolfram Mathematica 动手实践

    特点 Mathematica 的介绍 目标是提供介绍 Mathematica 广度的实践经验 重点是易用性 内容 完整概述 基础知识 Mathematica 中的示例项目 输入和输出 文字处理和排版 幻灯片演示 Wolfram 语言基础 使
  • QT信号槽失效的原因

    转载自 https blog csdn net luolaihua2018 article details 110388411 信号槽失效的原因 用Qt进行信号与信号槽连接后 会出现信号槽不响应信号的情况 原因可能是以下的情况 1 类没有声
  • 【MATLAB第12期】基于LSTM长短期记忆网络的多输入多输出回归预测模型思路框架,含滑动窗口, 预测未来,单步预测与多步预测对比,多步预测步数对预测结果影响分析

    MATLAB第12期 基于LSTM RNN作为对比 长短期记忆网络的多输入多输出回归预测模型思路框架 含滑动窗口 预测未来 单步预测与多步预测对比 多步预测步数对预测结果影响分析 更新 2022 11 5更新RNN模型 预测结果附后 一 数
  • 初学(7)——Hadoop错误:can‘t create 事务 lock on /var/lib/rpm/.rpm.lock (权限不够)

    执行删除操作时出现错误 权限不够 1 使用sudo命令 2 如果出现上述情况 切换至root用户 将要执行该操作的用户添加到sudoers su vim etc sudoers xxx 要添加的用户 ALL ALL ALL 命令成功执行
  • Mac用iTerm2连接到Linux上,不能输入中文

    服务器是ubuntu 用Mac的iterm2 ssh连上去 终端显示中文乱码 也不能输入中文 然而本地终端可以显示和输入 解决方法 这种情况一般是终端和服务器的字符集不匹配 MacOSX下默认的是utf8字符集 输入locale可以查看字符
  • 步进电机实验

    通过 ULN2003 驱动模块控制 28BYJ48 步进电机运行方向和速度 按下 KEY1 键调节电机旋转方向 按下 KEY2 键 电机加速 当按下 KEY3 键 电机减速 实现对步进电机运动的简单控制 步进电机简介 步进电机是将电脉冲信号
  • java中io各种流的关闭顺序

    还是先看API void close Closes this stream and releases any system resources associated with it close void close throws IOExc
  • 【react从入门到精通】初识React

    文章目录 人工智能福利文章 前言 React技能树 什么是 React 安装和配置 React 创建 React 组件 渲染 React 组件 使用 JSX 传递属性 Props 处理组件状态 State 处理用户输入 事件处理 组合和嵌套
  • 生成扩散模型漫谈(一):DDPM = 拆楼 + 建楼

    说到生成模型 VAE GAN可谓是 如雷贯耳 本站也有过多次分享 此外 还有一些比较小众的选择 如flow模型 VQ VAE等 也颇有人气 尤其是VQ VAE及其变体VQ GAN 近期已经逐渐发展到 图像的Tokenizer 的地位 用来直