现在谷歌、OpenAI等大厂们的以文生图模型,是趣味新闻报道者的衣食父母、梗图爱好者的久旱甘霖。 输行字就能生成各种或唯美或搞笑的图片,不用很累很麻烦,就能很吸引人关注。 所以DALL·E系列和Imagen们,具有衣食父母和久旱甘霖的必备属性:可获取程度有限,不是随时无限派发的福利。 2022年6月中,Hugging Face公司向全网所有用户,免费完全公开了易用简洁版的DALL·E接口:DALL·E Mini,不出意料地在各种社交媒体网站又掀起了一波大创作风潮。
DALL·E Mini创作大潮:搞笑、吓人都有
现在各种社交媒体上纷纷有人表示:玩DALL·E Mini一时爽,一直玩一直爽,根本停不下来怎么办。 就像「踩滑板的便便」,摩擦摩擦,似魔鬼的步伐。
有人爱做「正常点的创作」,例如打破物种界限的「柯基版斑马」。
古代公务员要是有这些素材,也不用辛苦地把非洲长颈鹿发明成神兽麒麟了。 GitHub的码农们本色当行,在官推上发了一张「松鼠用电脑编程」的生成作品。
「哥斯拉的法庭场记素描」,不得不说,真的很像英语国家报刊上,不对外开放的案件审判报道素描风格。
「爱心熊抢劫便利店」。卡通偶像折堕如此为哪般,究竟是熊性的扭曲,还是道德的沦丧……
除此之外,DALL·E Mini生成「神兽在野地小径上散步被抓拍」的图像也有突出成就。 这是「小恐龙野地小径上散步,被摄像头抓拍到」。
这是「多邻国鹦鹉商标野地小径上散步,被摄像头抓拍到」。
DALL·E Mini生成的这些神兽散步图,背影都好孤寂凄凉。不过这可能是AI模拟的微光摄影效果。 编辑部里的大家也仿作了一下:「草泥马上路散步」,调性就阳光开朗了很多。
DALL·E Mini生成的神人图,不比神兽图效果差。 比如这张「耶稣火热霹雳舞」,以前真的不知道祂老人家身体柔韧度这么好来着,看来各种健身网站上的「和主一起做拉伸操」广告是有所本的。
还有这张「彩色玻璃上的说唱歌手狗爷」,是不是真的兼具教堂圣像窗格和印象派画作的风格。
用DALL·E Mini来恶搞影视界角色,现在也蔚为风尚。 以下是来自星战宇宙的「R2D2受洗」。可能星战宇宙的物理和化学定律与现实世界有差异,机器人过水后既不漏电也不生锈。
同样来自星战宇宙的「达斯维达凿冰捕鱼」 达斯维达老师真是好惨。被尊师砍到岩浆里泡火山澡、成了残疾人之后被亲身儿子追斩,残障人士带着呼吸机熟练掌握原力后,沦落到地球跟爱斯基摩人抢生意……
还有这张「沃特·怀特误入动物森友会世界」,秃顶孤寡末路毒枭突然就萌起来了。 可惜任天堂没有在2000年代真的推出动森,不然老白会发现在动森里搞虚拟交易赚钱,比辛辛苦苦搞蓝色冰状物实体商品养家省心省事得多。 让我们高唱一句「拒绝黄~拒绝毒~拒绝黄赌毒~」。
这张「灭霸在超市里找妈妈」,真是很符合人物角色的内核,非常戏剧专业的本行解读。 不爽了就要搞种族屠杀、一言不合就要毁灭宇宙,这就是找不到妈妈就撒泼痛哭的巨婴性格嘛。
然而这些创作都是轻口味的,相比于重口味的克苏鲁爱好者们的作品,简直清汤寡水。 比如这张「伊隆马斯克扮演裂口小丑」,就有点吓人。
「魔王打篮球」,看了这张图之后,编辑真的不敢继续追《怪奇物语》这部剧了。
各种系列恐怖片主角也出现在作品中,比如这张「面具杰森魔吃卷饼」
还有这张「猛鬼街杀人狂吃意面」……图案太吓人了,让编辑回想起DVD时代看这些恐怖片被吓到前后俱急的青葱岁月。
然而当代通俗文艺在吓人方面略逊古典艺术一筹,比如这幅「科米蛙在戈雅《农神食子》油画中上镜」。AI用当代卡通搭配19世纪的表现主义油画,能生生把初见者吓到一脊背冷汗。
还有这张「死神在金拱门点卯」,看了这个,你以后上班上学还敢迟到吗?
Demo只有60行代码!
当然,细心且关注DALL·E系列动态的读者们会发现,DALL·E Mini和之前的DALL·E大模型们,生成的图片有个明显的差异: DALL·E Mini生成的人像里,脸都比DALL·E原本们生成的更模糊。 DALL·E Mini项目的主要开发者Boris Dayma在开发手记里解释了:我们这是亲民减配版,Demo只有60行代码,功能弱少少很正常。
以下是Boris Dayma在手记中对项目的阐述。 先来看一下项目具体的实现 它会根据文本生成对应的图片:
一句简单的话,随之而来的就是一个牛油果扶手椅闪现在太空中~ 该模型使用了三个数据集:
1、包含300万张图片和标题对的「Conceptual Captions Dataset」;
2、「YFCC100M」的Open AI子集,这其中包含了大约1500万张图像,不过出于对存储空间的考虑,作者进一步对200万张图像进行了下采样。同时使用标题和文本描述作为标签,并删除对应的html标记、换行和额外的空格;
3、包含1200万张图片和标题对的「Conceptual 12M」。
在训练阶段:
1、首先图像会被VQGAN编码器进行编码,目的是将图片转换成一个token序列;
2、图片对应的文本描述会通过BART编码器进行编码;
3、BART编码器的输出和VQGAN编码器所编码的序列token会一起被送入BART解码器,该解码器是一个自回归模型,它的目的是去预测下一个token序列;
4、损失函数是交叉熵损失,用以计算模型预测的图像编码结果和VQGAN真实图像编码之间的损失值。
在推理阶段,作者只使用了简短的标签,并且尝试去生成其所对应图片,具体流程如下:
1、标签会通过BART编码器进行编码;
2、<BOS>一个起特殊作用的序列标志——起始标志,会被送入到BART解码器;
3、基于BART解码器在下一个token所预测的分布,图像token会被按顺序的进行采样;
4、图像token的序列会被送入到VQGAN的解码器进行解码;
5、最后,「CLIP」会为我们选择最好的生成结果。
接下来我们再看一下VQGAN图像编码器和解码器是怎么工作的。 Trannsformer模型想必大家都不陌生,从它诞生至今,不仅仅是屠榜了NLP领域,CV领域的卷积CNN网络更是也被它扼住了喉咙。 作者使用VQGAN的目的是将图像编码到一个离散的token序列,该序列可以直接用在Transformer模型中。 由于使用像素值序列,会导致离散值的嵌入空间太大,最终使得训练模型和满足自注意力层的内存需要极为困难。
VQGAN通过结合感知损失和GAN的判别损失来学习像素的一个「密码本」。编码器输出与「密码本」对应的索引值。 随着图像被编码到token序列中,它就可以实现在任何Transformer模型中的使用。 在该模型中,作者从大小为16,384的词汇表中将图像编码为「16x16=256」个的离散标记,使用压缩系数f=16(4块的宽度和高度各除以2)。解码后的图像是256x256(每边16x16)。 关于VQGAN的更多细节的理解,请参阅《 Taming Transformers for High-Resolution Image Synthesis》。
Seq2Seq模型是将一个token序列转换为另一个token序列,通常在NLP中用于翻译、摘要或对话建模等任务。 如果将图像编码成离散的token,那么同样的想法也可以转移到CV领域。 该模型使用了BART,作者只是对原始架构进行了微调:
1、为编码器和解码器创建了一个独立的嵌入层(当有相同类型的输入和输出时,这二者通常可以共享);
2、调整解码器输入和输出的shape,使其与VQGAN的大小保持一致(这一步不需要中间的嵌入层);
3、强制生成序列有256个token(此处并不包含作为序列开始和结束标志的<BOS>和<EOS>)。
CLIP则用于建立图像和文本之间的关系,并使用对比学习进行训练,包括最大化图像和文本对嵌入之间的积(余弦相似度,就是正样本)和最小化非关联对(即负样本)之间的乘积。 在生成图像时,作者根据模型的logits分布对图像标记进行随机抽样,这会导致样本不同而且生成图像质量不一致。 CLIP允许根据输入描述对生成的图像进行评分,从而选择最佳生成的样本。在推理阶段,直接使用OpenAI的预训练版本。
那么,CLIP与OpenAI DALL·E相比,怎么样呢? 并不是所有关于DAL细节都是公众所知的,但以下是作者认为的主要区别:
1、DALL·E使用120亿参数版本的GPT-3。相比之下,作者的模型是原来的27倍,参数约为4亿个。
2、作者大量利用预先训练的模型(VQGAN, BART编码器和CLIP),而OpenAI必须从头开始训练所有的模型。模型架构考虑了可用的预训练模型及其效率。
3、DALL·E从更小的词汇表(8,192 VS 16,384)中使用更大数量的令牌(1,024 VS 256)编码图像。
4、DALL·E使用VQVAE,而作者使用VQGAN。当作者在Seq2Seq编码器和解码器之间分割时,DALL·E将文本和图像作为单个数据流读取。这也让他们可以为文本和图像使用独立的词汇。
5、DALL·E通过自回归模型读取文本,而作者使用双向编码器。
6、DALL·E训练了2.5亿对图像和文本,而作者只使用了1500万对。的。
7、DALL·E使用更少的标记(最多256 VS 1024)和更小的词汇表(16384 VS 50264)来编码文本。 在VQGAN的训练上,作者首先从ImageNet上预先训练的checkpoint开始,压缩系数f=16,词汇表大小为16,384。 虽然在编码大范围的图像时非常高效,但预训练的checkpoint并不擅长编码人和脸(因为二者在ImageNet中并不常见),所以作者决定在一个2 x RTX A6000的云实例上对它进行大约20小时的微调。 很明显,生成的图像在人脸上的质量并没有提高很多,可能是「模型坍塌」。 一旦对模型进行了训练,我们就将Pytorch模型转换为JAX以备下一阶段使用。
训练DALL·E Mini: 该模型采用JAX编程,充分利用了TPU的优点。 作者用图像编码器预编码了所有的图像,以便更快地加载数据。 训练期间,作者很快就确定了几个近乎可行的参数:
1、每一步,每个TPU的batchsize大小为56,这是每个TPU可获得的最大内存;
2、梯度累加:有效的batchsize大小为56 × 8 TPU芯片× 8步=每次更新3,584张图像;
3、优化器Adafactor的内存效率可以让我们使用更高的batchsize;
4、2000步「热身」和以线性方式衰减的学习率。 作者花了几近半天时间通过启动超参数搜索来为模型找到一个好的学习率。 每一个NB的模型背后,大抵都有那么一段呕心沥血寻找超参数的历程吧! 在作者初步探索之后,在较长一段时间内尝试了几种不同的学习率,直到最终确定为0.005。