GPT Plus Money!B O O M
时间:2023-01-26 06:30:00
NewBeeNLP原创出品
微信官方账号专栏作者@上杉翔二
悠闲会·信息检索
连接图像和文本,更多的多模态文章可以看到博主整理的系列(跨界出圈 | 谈谈BERT跨模态预训练),本文主要整理OpenAI发表的2篇文章。其中CLIP 可完成图像与文本类别的匹配,DALL·E 则可以直接基于文本描述生成图像,且性能十分优异。
CLIP
论文:Learning Transferable Visual Models From Natural Language Supervision
地址:https://arxiv.org/pdf/2103.00020.pdf
代码:https://github.com/openai/CLIP
首先是CLIP,直接看模型,分为三个步骤:Contrastive Pretraning,Create dataset classifier from label text和use for zero-shot prediction。第一部分的整体结构如上图所示,是图像编码器的双流分支(如上图所示)resnet50或者ViT等),另一边是文本编码器(如Transformer)获得特征,然后一个接一个batch的文图pair匹配数据内积的矩阵是图像的分类器,从文本的角度来看,列方向也是类似的分类器。最后,最大化对角线蓝色部分的概率(使匹配pair最大化内积相似度),比较学习[1]博主已经整理好了 不做赘述。
这一步主要是利用大量的训练数据(直接从网上获得的句子-图像对)来达特征。接下来的两个步骤是测试过程,过程如下图所示:类似于训练阶段,首先通过编码器获类的图像,然后将目标任务数据集的每个标签转换为相应的文本(因为CLIP的Pretraning数据是句子,分类任务的单词label不适用),如上图中的 dog 这一label会改造成 "A photo of a dog",并且dog这个词被mask,试着通过模型计算内积相似度来预测这个词,也可以做好分类,因为它是一种生成句子的感觉,所以它实际上非常适合做zero-shot 的分类。
同时,基于 CLIP 你也可以自由定义你的分类器!也就是说,它可以很容易地使用CLIP和很多工作结合,比如等会要整理的 DALL-E 中就用到了 CLIP来提特征。
简单看看CLIP逻辑过程
defforward(self,image,text): image_features=self.encode_image(image)#编码image text_features=self.encode_text(text)#编码text #norm一下特征 image_features=image_features/image_features.norm(dim=-1,keepdim=True) text_features=text_features/text_features.norm(dim=-1,keepdim=True) #计算内积相似度logits logit_scale=self.logit_scale.exp() logits_per_image=logit_scale*image_features@text_features.t() logits_per_text=logit_scale*text_features@image_features.t() #shape=[global_batch_size,global_batch_size] returnlogits_per_image,logits_per_text
为什么效果好?
数据集量大。Contrastive Pretraning一些使用的数据是作者从社交媒体上收集的约4亿对数据,不需要人来标记(节省人力,扩大泛化)。每个图像有多达32768个文本候选人,我认为SimCLR够大 CLIP是2倍...
学习object而不是预测整个文本描述。也就是说,dog变成 "A photo of a dog"然后预测这种形式dog,学习速度可加快4-10倍。
Vision Transformer。博主也整理过不赘述:传送门[2]。作者在代码中使用ViT,也可以和普通人比较使用。resnet速度快3倍,可以使CLIP烧钱(训练)时间更长,数据集更大。
DALL-E
论文:Zero-Shot Text-to-Image Generation
地址:https://arxiv.org/pdf/2102.12092.pdf
代码:https://github.com/openai/DALL-E
然后是DALL-E模型,CLIP可以做分类检索等任务,可以根据文本直接生成效果很好的图像。motivation目标是训练一个transformer自动建模,即文本和图片tokens转换为单一数据流主要需要考虑如何对待2D图片也转化为单数据流。
如上图所示,也可分为三个阶段:dVAE,Transformer和CLIP。
「Stage One」。dVAE每于图像的每一个patch生成token表示(获取单数据流)。具体来说是256×256的图片分为32×32个patch,然后使用训练有素的离散变分自编码器dVAE模型将每个patch映射到大小为8192的词表中,最终将一张图片转为有1024个token的表示。这个阶段会让transformer上下文尺寸(context size)减少192倍,不会大大降低视觉质量。
「Stage Two」。Transformer类似的架构GPT-3.生成预训练方法。先用图BPE-encoder对文本进行嵌入,得到256个token(不够就padding),然后concat图像token拼接,然后直接输入训练有120亿参数的参数Transformer联合分布建模联合分布(64层,每层62头,每头64维,最后维度3968)。
「sample and ranking」。最后,模型生成的图像可以采样,然后使用CLIP模型对采样结果进行排序,以获得与文本最匹配的生成图像。
值得注意的是trick:
Gumbel-Softmax。映射图像patch到词表是离散的,所以要放松条件ELB(evidence lower bound)。
- <>在VAE编码器的末端和解码器的开始使用1×1卷积
将编码器和解码器重分块的输出激活乘一个小常量
对文本-图像 token 的交叉熵损失进行归一化
因为主要图像建模,因此将文本的交叉熵损失乘以1/8,将图像的交叉熵损失乘以7/8
使用Adam算法,以指数加权的迭代平均法进行优化
混合精度训练,为了节省GPU内存并提高吞吐量
分布式优化
还有大佬复现code:https://github.com/lucidrains/DALLE-pytorch
这个复现的库可直接调用训练,似乎非常好用,如果你有足够的卡那么pip一下即可:
pip install dalle-pytorch
import torch
from dalle_pytorch import CLIP
clip = CLIP(
dim_text = 512,
dim_image = 512,
dim_latent = 512,
num_text_tokens = 10000,
text_enc_depth = 6,
text_seq_len = 256,
text_heads = 8,
num_visual_tokens = 512,
visual_enc_depth = 6,
visual_image_size = 256,
visual_patch_size = 32,
visual_heads = 8
) #设置CLIP的参数
text = torch.randint(0, 10000, (4, 256))
images = torch.randn(4, 3, 256, 256)
mask = torch.ones_like(text).bool()
loss = clip(text, images, text_mask = mask, return_loss = True) #直接训练CLIP
loss.backward()
一起交流
想和你一起学习进步!『NewBeeNLP』目前已经建立了多个不同方向交流群(机器学习 / 深度学习 / 自然语言处理 / 搜索推荐 / 图网络 / 面试交流 / 等),名额有限,赶紧添加下方微信加入一起讨论交流吧!(注意一定要备注信息才能通过)
本文参考资料
[1]
对比学习: https://nakaizura.blog.csdn.net/article/details/108941999
[2]Vision Transformer: https://nakaizura.blog.csdn.net/article/details/113095927
- END -
NLP机器阅读理解:四大任务及相应数据集、比赛
2021-09-24
阿里广告技术最新突破!全链路联动——面向最终目标的全链路一致性建模
2021-09-25
跨越『时空』的难样本挖掘!
2021-09-03
2021 年各家大厂的 AI Lab 现状如何?
2021-09-01