返回列表

3rd place solution

549. Stable Diffusion - Image to Prompts | stable-diffusion-image-to-prompts

开始: 2023-02-13 结束: 2023-05-15 AIGC与多模态 数据算法赛
第三名解决方案

第三名解决方案

作者:Fumihiro Kaneko

竞赛排名:第3名

发布时间:2023年5月16日

感谢组织者举办了一场精彩的比赛。

我的解决方案基于CLIP模型,通过直接预测384维嵌入向量实现,参考了这个基线笔记本

数据集

我使用了约40万条数据。Diffusion DB的验证分数与LB分数相关性良好,但仍存在0.025~0.03的差距。

  • Vizwiz图像字幕数据集 ~7万条

    • 这是实验的关键数据集
    • 使用该数据训练时,本地验证集与LB分数为0.5415/0.5309;而不使用时则为0.5528/0.48765
    • 我认为该字幕数据集通常比COCO更具描述性、更多样化且文本更长
    • 原始训练样本为23K,但每个样本最多有5个字幕,因此为每个样本采样了3个字幕
  • Diffusion DB,30万条

    • 仅使用SD2生成的图像,这是为了提升本地验证与LB分数的相关性
    • 21万条来自提示词过滤,另外8万条图像来自使用训练模型的困难采样
  • COCO,2.5万条

    • 在使用Vizwiz数据训练的情况下,该数据集的贡献相对较低
  • Lexica.art数据集,1万条

模型

  • 仅使用CLIP模型

    • 基线模型是ViT Base 224(laion2B),几乎所有实验都基于此模型。该模型的最终分数为:本地验证集/公开榜/私有榜 = 0.6402/0.61402/0.61357
    • 单一最佳模型:ViT L 336(open ai),本地验证集/公开榜/私有榜 = 0.6658/0.63557/0.63425
      • 对于更大的模型(ViT-H和ConvNext xxLarge),我未能找到合适的训练参数
    • 最佳提交:集成模型,包括ViT-L(laion2b, openai, datacompxl)、ViT-H和ConvNext Large/xxLarge,本地验证集/公开榜/私有榜 = 0.6791/0.64935/0.64814

训练策略

CLIP微调

与Imagenet权重相比,微调CLIP模型需要格外小心,我们必须尽可能保留原始CLIP权重以获得最佳性能。我发现以下两种方法总共提升了约0.02的分数,并花费了大量时间寻找最佳超参数。

  1. LP-FT(线性探测后微调)

  2. EMA与分层学习率衰减的组合

    • 该方法在这篇CLIP微调论文中有研究
    • ViT-B的最佳参数为(EMA衰减率,分层衰减)= (0.9998, 0.4)
    • 但对于ViT-L,该方法效果不佳,分层衰减=0.6时效果最佳。似乎初始层的衰减因子应约为1e-6,因此对于更大的模型,我们需要选择更大的后期衰减率

这两种方法不仅具有直接影响,还具有间接影响——通过这些方法,我们可以在保持CLIP原始权重的同时提高学习率,从而获得更好的结果。

数据增强

  • 裁剪/随机擦除/RandAug(不使用posterize、solarize和equalize)

    • 这提升了本地验证集分数约0.007,并使更长的训练成为可能
    • 强烈的图像变换不适合本次竞赛,我尝试寻找较弱的变换方式
    • 水平翻转会降低性能
  • 相同提示词不同种子

    • 10%的Diffusion DB和20%的Vizwiz样本包含3张图像,它们属于相同提示词但不同的SD2生成种子。每个训练周期随机选择其中一张图像
    • 这也对分数和验证损失曲线产生了积极影响
  • 隐形水印增强

    • 使用stability ai仓库中的方法在训练时向输入图像添加水印
    • 这对分数的提升不大,仅约+2.0e-5

代码

这是我的提交笔记本

同比赛其他方案