【Kaggle Stable Diffusion】比赛top方案总结

文摘   科技   2023-05-16 19:46   浙江  

关注我 带你康好康的


    前言:参加的kaggle比赛终于结束啦,很遗憾,最后一天被反超,错失金牌,最后的成绩:14/1231, 银牌第二的成绩。今天,奋发图强,总结教训,学习一波top方案的解决方案吧!



因为方案过多,所以这么只分享部分的方案,全部方案链接放在了本文最后。

第二名方案

第二名的解决方案是基于ViT的方法。同样通过运行 Stable Diffusion 创建了自己的数据集,并训练了一个模型以监督的方式预测prompt embedding。概览如下图所示。

数据集生成

通过上图可以看到,数据集非常大,有8m的大小!要生成这么多的图像,显卡不能少,其次要加速图像生成的过程:第二名通过以下修改以将生成速度提高 4 倍。

  1. 将调度程序从DDIM更改为DPMSolver++ (diffusers.DPMSolverMultistepScheduler),并将步数从 50 更改为 16。

  2. 使用xformer

    之前担心减少生成步数会导致 prompt 到 image 的映射发生偏移,但没有明显的质的差异,判断提高生成速度的优势更大,所以选择了这种方法。xformers 导致了大约 30% 的加速。模型的训练也使用了xformers,后面会介绍。注意生成时使用的随机数对生成的整体图像有很大的影响,因此需要使用不同的种子来生成图像。起初我将种子固定为 0 以确保可重复性,但我意识到这个错误并为每个prompt使用了不同的种子,这大大提高了分数。


prompts来源

从各个图文数据集,筛选出有效的prompt,然后拿去生成图像,其中,第二名也用了chatgpt造prompt,和我们团队的想法是一样的。

模型与训练

在这种需要看图像表征的比赛,使用 CLIP 的预训练模型一般比使用 ImageNet 分类的模型表现更好。

主要使用了以下四个模型

  • ConvNeXt xxlarge (CLIP-convnext_xxlarge-laion2B-s34B-b82K-augreg-rewind)

  • BLIP-2 VisionModel (EVA01-g?, Salesforce/blip2-opt-2.7b)

  • EVA02-L (timm/eva02_large_patch14_clip_336.merged2b_s6b_b61k)

  • EVA02-e (timm/eva02_enormous_patch14_plus_clip_224.laion2b_s9b_b144k)

2.微调分类头 关于 CLIP 的微调,有人建议仅训练最后一个线性层 (LP) 和在 LP 之后微调整个模型的 LP-FT 可以有效地泛化。

3.提高分辨率也有显著效果。CLIP 模型通常以 224 的分辨率进行训练,但 224 不利于识别包含多个对象的复杂上下文。通过插值位置编码,可以让VIT接受更大的分辨率。可以使用 timm 中实现的 resample_abs_pos_embed 等函数实现。

4.Q former使用 BLIP-2 的 Q-former 实现了一个架构,将视觉模型输出的embedding转换为长度为 77 的embedding。然后我将该模型的输出与 SentenceTransformer 的embedding进行了比较,并根据此比较训练模型。简单地取均方误差(MSE)会受到词序的很大影响,所以使用匈牙利方法找到具有最小 MSE 的匹配,并计算这些匹配之间的 MSE。Q-former 和 vision model 同时训练不稳定,比赛期间一直没能成功。但是,通过冻结预训练视觉模型并仅训练添加的 Q-former,在单个模型的排行榜 (LB) 上实现了 +0.001 到 +0.003 的性能提升。此外,由于视觉模型被冻结,在使用 Q-former 进行预测时,可以获得视觉模型的独立输出,几乎没有额外的成本。

第三名方案

第三名的解决方案同样是基于ViT的方法。但他们的数据更少,仅使用了几十万的数据,所以这里有不少值得学习的微调方案。

CLIP微调

与 imagenet 权重相比,微调 CLIP 模型需要格外小心,我们必须尽可能保持原始 CLIP 权重以获得最佳性能。以下两种方法总共将分数提高了 ~ 2%。

1.LP-FT 这是在之前比赛的 top-1 解决方案以及本次比赛的其他团队中研究的。

2.EMA 和逐层学习率衰减的结合 这已在 CLIP 微调论文中进行了研究。ViT-B 的最佳参数是(EMA 衰减,逐层衰减)=(0.9998,0.4) 但这对 ViT-L 不起作用,分层衰减 = 0.6 是最好的。初始层的衰减因子似乎应该在 1e-6 左右,因此我们必须为较大的模型选择较大的后期衰减。

数据增强

主要使用Crop/RandomErase/RandAug- 这有助于 val 得分,~ +0.007,这使得训练时间更长。- 强图像增强不适合这个比赛,适当增强一点即可。- 水平翻转使性能变差 - 相同的提示和不同的种子 - 还有一个我们团队一直没意识到的,使用同一个prompt,生成不同的图像,以增加图像的鲁棒性

第五名方案

最终提交的是四个模型的集合:

eva02_large convnext_xxlarge convnext_large vit_large 总共使用了330w的数据集。

训练过程

- 10 或 15 个 epoch,具有分布式数据并行 (DDP)、自动混合精度 (AMP) 和梯度检查点 - CosineEmbeddingLoss 作为损失函数 - MADGRAD 作为优化器 - 预热 1 或 3 个 epochs 只训练 FC 层,骨干冻结(学习率:从 1e-2 到 1e-4)- 余弦学习率调度器,学习率范围从 1e-4 到 1e-7。- 使用所有数据集微调 3 或 5 个 epoch。- 至于数据增强,我们实现了一个相对较轻的配置,如下所示:无旋转 没有水平翻转 范围为 0.5 到 1.0 的 RandomResizedCrop ColorJitter(亮度=0.05,对比度=0.05,饱和度=0.05,色调=0.05)

其余方案

其实剩下的方案也都是大同小异。无非就是制作自己的数据集,使用open_clip的模型进行微调,微调这个过程中有许多trick,比如上文提到过的,我在之前的文章中也有总结【Kaggle】如何finetune 预训练模型,其实都是差不多的思路,感兴趣的可以去看看。

最后,反思一下我们自己团队的不足!只有不断反思和总结才能促进自己的提升。

首先,我们坐拥大量A100资源,但是数据集竟然比不过人家,虽然人家也不缺显卡,但也反映了我们的效率比较低。。。应该抓紧时间生产数据才对。

其次,我们过于聚焦open_clip了,从top方案上去,大模型的威力还是非常巨大的,timm库里面有最新的eva模型,我们没有尝试,blip2这种大模型,我们也没尝试,这几块都是可以提分的地方!

最后就是微调策略上,有我们的过人之处,但也需要继续学习,还有可以改进的地方!

说了缺点,再来说说我们的优点!从top方案来看,融合基本大家都是涨1.5%,但我们的融合方案,能涨2%+!大家过于聚焦vit的威力,实际上这比赛,还有另一个思路,那就是用检索的思路!将图像和文本都做成向量去检索,有一个高质量的检索库同样能提高不少的分数,这一点在我们的方案中也有较好的效果,而其他团队并没有人去尝试。另外,实际上,我们团队训练的都是大分辨率小模型,我们发现,这个比赛,相比起大模型,大分辨率更关键,更有利于模型抓住图像的细节(当然大分辨率大模型应该更好,但我们没去尝试。。。),大分辨率的小模型,在推理时间上也不会增加太多,所以我们的融合方案能做的更复杂,能提升的更多。

最后放一下这个比赛的top方案,感兴趣的可以自行学习充电一波!

Top方案链接:

第二名:https://www.kaggle.com/competitions/stable-diffusion-image-to-prompts/discussion/410606

第三名:https://www.kaggle.com/competitions/stable-diffusion-image-to-prompts/discussion/410686

第五名:https://www.kaggle.com/competitions/stable-diffusion-image-to-prompts/discussion/410688

第七名:https://www.kaggle.com/competitions/stable-diffusion-image-to-prompts/discussion/410618

第十一名:https://www.kaggle.com/competitions/stable-diffusion-image-to-prompts/discussion/410611

第十二名:https://www.kaggle.com/competitions/stable-diffusion-image-to-prompts/discussion/410657

End 

最后,这种开放数据集的比赛,再也不想丸辣!!!太累了,呜呜呜。。。想上金牌区,钞能力+技术真的缺一不可。

                         

      你好,我是小律,一位数学专业转AI,热爱技术,思考新事物的算法工程师。在多家大厂呆过,目前就职于一家行业独角兽公司。

      这里,不止有算法干货,AI竞赛方案,还有劲燃鼓励,点滴分享!

      我每周至少更新一篇原创文章,也正在努力实现自己的人生目标,期待与你一起进步!



点个在看你最好看




不摸鱼的小律
互联网大厂算法工程师一枚,分享各种技术、职场热点和感悟。不做每日打卡的路人。
 最新文章