jjzjj

是什么让人工智能突然开始画画了?

51Ann 2023-03-28 原文
封面图就是用扩散模型画的。

这是最近两个大火的模型,直接冲到抱抱脸的首页。

最先火起来的是图二。因为DALLE-2出来了,由于DALLE-2只对部分大佬开放,因此它的替代品DALLE-mini就火了起来。

之后没几天stable diffusion出来了!最最重要的一点是stable diffusion已经向公众开放了(当然是付费的)。今天就来说一下这几个模型背后的东西。

今天我们来看一下这俩模型的生成效果,然后浅浅说一下背后的算法支撑。

stable diffusion生成的图片:

下面这三个例子都是直接调用stable diffusion生成的图片。在这里是直接做的zero-shot的text-to-image生成。

先看第一个,我用的是A dog is writing a blog,就是一个狗正在写博客。他一共给我生成了4张候选,我在这里只截了其中的两张图片。我们可以看到第二张好像还是比较真实的,就是一个狗趴在地上拴个绳,正在拿着笔在纸上写什么东西。我们可以勉强认为它达到了我的要求,生成了一个狗正在写博客的图片。

然后看第二张图,第二张图我的提示是a black cat wears a red skirt。就是一只黑猫穿着一个红色的裙子。它也是生成了4个候选,我截图了最现实的一张,可以看到一个黑猫穿着一个红色的小衣服。

然后再看第三组图片,我的提示是a Teddy bear plays computer games。就是一个泰迪熊正在打游戏。可以看到图二还是比较正常的,好像是在打游戏的样子。

可能因为我这几个例子都比较奇葩,所以它生成不太出来。整体效果还算是差强人意的。

差强人意:勉强使人满意。

所谓zero-shot生成,你可以简单的理解为我可以直接拿来就用,不用再对模型进行调教了。

说几个相关的概念

微调: 想一下这样,比如我拿掘金沸点训练一个说话的模型,那这个模型说出来的内容必然是沸点摸鱼的内容、和程序员相关的内容、和彩礼孩子起名相关的内容。你要让他说一下去长沙旅游怎么样,他大概率是说不出来的。

那怎么能让它说旅游相关的东西?你可以用去那儿、鞋程、马蜂喔、妹团等网站的一些用户评论来训练它。这样你问他长沙,那他就能和你说长沙旅游的事了。

few-shot: 那你想说,我一个普通用户,哪里会微调模型,所以能不能别让我微调? 可以。当训练的数据量足够大,模型能记住足够多的东西的时候,你可以不用自己训练了。但是他记住的东西太多了,还没有那么智能,他回答你之前你需要给他一点提示。这就是few-shot。

one-shot: 对比上边,不用给几个提示,给一个提示就够了。

zero-shot:我根本不用提示,直接开搞好吧。

DALLE-2

接下来看一下DALLE-2的效果:

因为这个我前面提到了它只对部分大佬开放。虽然开放了一些用户内测的申请,但是像我这种肯定是申请不上的,毕竟亚马逊的大佬也没有申请上,还在排队中。这里我就放了一下大力兔(DALLE-2)论文原文中的几个示范图片。

它的文本信息以及它生成的图片,我们可以看到这个九宫格。生成的还是非常真实的。大力兔可以生成不同风格的完全原创的图片,就是说在模型生成之前,世界上根本不存在这张照片。

并且它能做的不止图中这几个,它还可以给你往图片上添加东西。比如说你给他一个图片。然后给他指定不同的位置,再给他说你要往那边添加什么,他就可以根据你的要求生成不同的图像。

下图我们可以看到在一个屋子内的不同位置给它添加火烈鸟。

如果你设置位置在室内,可以看到它会变成一个火烈鸟的游泳圈。如果你设置在室外的话,它会生成两个真实的火焰鸟。如果你设置在室内的泳池内,它又会生成一个火烈鸟的游泳圈。我们可以看到他身上的图片是比较贴合实际的,并且他会考虑到图片的阴影,光效的变化。就是普通的图像合成无法做到的东西。

是什么支撑着上面图像的生成?

从第一个名字中我们就可以知道支撑它背后的模型是什么。diffusion model,换成中文就叫扩散模型。其实这个东西火起来是非常偶然的事情,我看大家都在调侃这个东西,说本来大家做text to image是为了增强图像生成的能力的,没想到大家突然在这个莫名其妙的方向上卷了起来。

其实它并不是第一个图像生成模型。之前已经做的如火如荼的比如说GAN呀,GAN的生成已经非常成熟了。

先看这张图。这张图是用一张照片可以生成他年幼时候的样子。我们可以在途中看到两个非常眼熟的面孔:第一个是吴恩达。第三张图是闫乐坤。

然后再看这张图。这张图是使用gan做了4个对比,用一张图片生成他老年的样子,生成他戴眼镜的样子,生成他变性的样子,以及让他做一些其他的动作。

通过上述两个例子,我们可以看到gan生成的图像已经是非常真实的了。由于它生成的图像过于真实,所以他刚开始如火如荼的时候美国甚至为此颁布了两条法令:

  1. 禁止使用相关算法拿人脸生成淫秽色情资源。
  2. 禁止使用政治人物的脸说一些他没说过的话,做一些他没做过的事。
除此之外常用的图像生成模型还有VAE、flow等。在这里就不多做介绍了。

你想说既然人家的模型都已经生成的这么好了,那你为什么还要做一个扩散模型呢?

存在必然合理,时代发展必然有它的要求。相对于之前的模型扩散模型有它不可或缺的优点。我今天这篇文章主要就是为了让大家知道现在很火的两个生成模型,背后用的是扩散模型而已,至于之后的生成模型对比啊或者更详细的一些内容以及扩散模型的讲解和推导就是纯纯的算法知识了,想看的可以挪到这里:突然火起来的diffusion model是什么?。在这篇新闻性的文章中就不折磨大家了。

有关是什么让人工智能突然开始画画了?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  6. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

    它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

  7. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

  8. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  9. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  10. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

随机推荐