本文有5230字,阅读大概需要10分钟。10分钟你肯定看不完,老老实实看吧。
其实我现在正在做的方向就是扩散模型,然后恰好这个DreamStudio就是扩散模型,更巧的是它列了四条技术,第一个就是CLIP。那我们就来说一下CLIP是什么东西。
A photo if a _____ .,把一个单词变为一个句子。之后使用编码器对其进行编码获得特征。其实在这里不是必须将其变为一个句子,单个的单词也是可以进行的,但是会和训练阶段产生较大的差异,所以作者在这里还是麻烦了一点,将其都变为句子。这里怎么变为句子还是有说法的,具体可以看一下这篇文章:
然后看图中的(3),在预测阶段,我们拿到一张图之后将其丢进图片编码器,获得一个特征,之后我们使用余弦相似度计算我们获得的句子特征和图片特征,取得最终的分类结果。
补充一下,在CLIP,模型训练完之后因为是zero-shot的,所以完全可以摆脱categorical label的限制,(2)中的列表我们可以替换为任意的单词,完全不要纠结于ImageNet的1000类还是3000类,图片也可以是任意出处的图,不拘泥于某一个数据集。
总结: 因为其独特的训练方式,所以CLIP将图片和文本语义做到了强关联,每个图片都有非常好的语义特征,所以迁移效果非常好。凭借这一点,CLIP在ImageNet数据集上打败了ResNet101等专门在ImageNet上训练的模型。因为和自然语言处理的结合,CLIP训练出来的模型可以在图片域变化非常大的情况下也获得很好的效果。
这种开放式的预测答案实在是太多了。但是如果使用对比学习的训练方法,我们仅需要判断图文能不能搭配起来即可。这样任务就被简化了很多,约束也放宽了很多。看一下下图,作者将预测型的目标函数转化为对比学习的目标函数之后,训练速度一下子提高了很多。
绿色的线是CLIP最终选择的对比学习训练方式,比中间橙色的线快了四倍。中间橙色的线是使用词袋模型,将内容都抽取为特征进行匹配,比蓝色的线快了三倍,蓝色的线是原来的预测型的训练方式。
最终为了保证训练效率,选择了对比学习。
因为OpenAI的这个数据集太大了,所以训练过程中根本不用担心出现过拟合的问题,也不需要做什么数据增强,用的唯一一个数据增强就是一个随机裁剪(random square crop)。
因为模型实在是太大了,调参实在是太困难了,所以进行对比学习的时候将对比学习中很重要的一个t temperature parameter作为一个可学习的标量,所以这个参数在模型训练过程中直接就被优化了,不需要再调参了。
此外他们使用的图像和文本的编码器都不需要预训练,并且最后做projection的时候没有使用非线性的投射层,使用的是线性的投射层。
补充:看过之前我写的对比学习系列的应该知道,在SimCLR工作中因为加了一个非线性的projection之后获得了10个点的提升,但是CLIP的作者在工作过程中发现,多模态中使用线性还是非线性影响并不是很大,对此作者还进行了一个 猜测 ,这种非线性的projection应该只能适用于纯图片的单模态学习。
# image_encoder - ResNet or Vision Transformer
# text_encoder - CBOW or Text Transformer
# I[n, h, w, c] - minibatch of aligned images
# T[n, l] - minibatch of aligned texts
# W_i[d_i, d_e] - learned proj of image to embed
# W_t[d_t, d_e] - learned proj of text to embed
# t - learned temperature parameter
# extract feature representations of each modality
I_f = image_encoder(I) #[n, d_i]
T_f = text_encoder(T) #[n, d_t]
# joint multimodal embedding [n, d_e]
I_e = l2_normalize(np.dot(I_f, W_i), axis=1)
T_e = l2_normalize(np.dot(T_f, W_t), axis=1)
# scaled pairwise cosine similarities [n, n]
logits = np.dot(I_e, T_e.T) * np.exp(t)
# symmetric loss function
labels = np.arange(n)
loss_i = cross_entropy_loss(logits, labels, axis=0)
loss_t = cross_entropy_loss(logits, labels, axis=1)
loss = (loss_i + loss_t)/2
伪代码我就不讲了,具体看安安的这篇文章: CLIP模型伪代码详细解析
不是我的小号!
We train a series of 5 ResNets and 3 Vision Transformers. For the ResNets we train a ResNet-50, a ResNet-101, and then 3 more which follow EfficientNet-style model scaling and use approximately 4x, 16x, and 64x the compute of a ResNet-50 . They are denoted as RN50x4, RN50x16, and RN50x64 respectively. For the Vision Transformers we train a ViT-B/32, a ViT-B/16, and a ViT-L/14. We train all models for 32 epochs. We use the Adam optimizer with decoupled weight decay regularization applied to all weights that are not gains or biases, and decay the learning rate using a cosine schedule.训练过程作者是训练了5个ResNet网络和3个Vision Transformer模型,每个模型都训练了32个epoch。使用的是Adam优化器。
Initial hyperparameters were set using a combination of grid searches, random search, and manual tuning on the baseline ResNet50 model when trained for 1 epoch. Hyperparameters were then adapted heuristically for larger models due to computational constraints.对于所有的超参数,作者也是做了一些简单的grid search和random search进行手动调整,为了调的快一点,用的都是标准的ResNet50去做的,并且就跑了一个epoch,就突出一个懒得调。更大模型直接摆烂根本不调的。
The learnable temperature parameter t was initialized to the equivalent of 0.07 from and clipped to prevent scaling the logits by more than 100 which we found necessary to prevent training instability. We use a very large minibatch size of 32,768.训练的batch size直接拉满,到32768,我只跑过8192的,再次感叹一下OpenAI的钞能力!!!
Mixed-precision was used to accelerate training and save memory. To save additional memory, gradient checkpointing, half-precision Adam statistics, and half-precision stochastically rounded text encoder weights were used. The calculation of embedding similarities was also sharded with individual GPUs computing only the subset of the pairwise similarities necessary for their local batch of embeddings.此外作者还用了这么多加速和省内存的tricks,通过这么多的努力才把CLIP训练起来。 一番烧钱操作之后,作者最终选定了ViT-L/14并对其进行微调。然后CLIP就定下用这个了,之后我们就确定以及肯定提到图片编码器用的就是ViT-L/14@336px。
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些
我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司
有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我
导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,