在GIT模型的研究论文中,解释了使用强大的视觉编码器并为语言模型采用随机参数。这次,由于目标是最终使用7B级语言模型,因此语言模型将应用预训练的模型。将检查以下模块进行微调。这 胃肠道投影作为一个已初始化的模块,始终包含在内。有些组合可能看起来多余,但本次试验对它们进行了探索,并没有过多关注。
用于训练的模块被赋予梯度,而其余模块被修改为没有梯度。
# 指定要训练的参数(全部训练会增加内存使用量)
对于名称,model.model.named_parameters() 中的 p:
if np.any([keys_finetune 中的 k 的名称中的 k]):
p.requires_grad = True
别的:
p.requires_grad = False
用于本次考试的视觉编码器和法学硕士是:
- openai/clip-vit-base-patch16
- 脸书/opt-350m
训练使用COCO数据集并持续5个epoch。
以下是每个实验期间训练的目标模块:
- 项目: GIT 投影。随机初始化,因此始终经过训练。
- 洛拉: 应用了语言模型中self-attention的Query、Key、Value。
- 选择: 所有层都经过训练。
- 维特: 所有层都经过训练。
- 头: 最终OPT的lm_head就训练完成了。
(注:虽然LoRA可以应用于ViT,但为了避免实验过于复杂,这次没有包括在内。)
如训练损失图所示,很明显某些组的表现不佳。当OPT包含在培训中时就是这种情况。尽管所有实验都是在相当相似的条件下进行的,但在微调语言模型时可能需要更详细的调整,例如学习率。接下来将检查结果(不包括训练中包含 OPT 的模型)。
训练和验证损失都随着 投影+LoRA 模型。最终微调 头 层显示出几乎相同的结果。如果也训练 ViT,Loss 会显得稍高,结果看起来不稳定。即使在 ViT 训练期间添加 LoRA,损失仍然很高。为了使用这些数据进行微调,似乎使用预先训练的 ViT 模型而不更新其参数会产生更稳定的结果。 LoRA的有效性已经得到了很多地方的认可,从这个实验可以明显看出,在LLM中添加LoRA改善了训练和验证损失。
回顾一些测试数据的推理结果:
训练OPT本身时,结果和loss的结果一样差,使得模型对词一片茫然。此外,在训练 ViT 时,输出具有语义意义,但描述的内容与给定图像完全不同。然而,其他结果似乎在某种程度上捕捉了图像的特征。例如,第一张图像提到“猫”和“香蕉”,第二张图像标识“交通标志”。比较使用和不使用 LoRA 的结果,后者倾向于重复使用相似的单词,但使用 LoRA 似乎让它稍微更自然一些。培训 头 会产生有趣的输出,例如在第一张图像中使用“玩”而不是“吃”。虽然这些结果中存在一些不自然的因素,但可以推断训练成功地捕获了图像特征。
为了微调早期实验中的条件,使用了稍小的语言模型 OPT-350m。现在,目的是将语言模型切换到 7B 模型。不仅仅是OPT,更强的LLM、LLaMA和MPT也将被引入。
可以通过与 OPT 类似的方式集成这两个模型。参考前向功能 骆驼模型 和 MPT模型,将投影图像向量与文本标记相结合,并将掩模从 因果注意力面具 到 GIT 的注意力面具。需要注意的一件事是:对于 MPT,掩码不是 (0, -inf),而是 (False, True)。后续流程可类似实施。
要使用带 OPT 的 7B 级型号,只需将型号名称从 facebook/opt-350m 更改为 facebook/opt-6.7b。
对于 LLaMA,随着 LLaMA2 的推出,这将成为首选模型。要使用这个预训练模型,需要获得 Meta 和 Hugging Face 的批准。 Hugging Face 需要一个帐户,因此请务必进行设置。批准通常会在几个小时内完成。然后,在执行训练的终端上登录Hugging Face。
Huggingface-cli 登录
您可以使用在 Hugging Face 帐户 → 设置 → 访问令牌中创建的令牌登录。
训练参数保持一致,使用 COCO 数据集并持续 3 个 epoch。根据实验1的结果,设置微调的模块为 投影+LoRA.
让我们看看结果。
回顾损失,很明显使用 LLaMA2 和 MPT 作为 LLM 的模型显示出更令人满意的减少。我们也观察一下推理结果。
关于第一张图像,对于所有模型来说,与 OPT-350m 相比,表情似乎更自然。没有“一根香蕉一根香蕉”之类的怪异表述,凸显了LLM的实力。对于第二张图片,诸如“交通灯”或“建筑物”之类的短语仍然存在一些困难。对于如此复杂的图像,可能需要考虑升级ViT模型。
最后,让我们对 GPT-4 流行的图像进行推理。
尽管由于使用法学硕士,预计会有流畅的反应,但结果却相当简单。这可能是因为该模型仅在 COCO 上进行训练。
鉴于之前实验的结果并不理想,因此决定合并 COCO 以外的数据进行训练。目前使用的M3IT数据集相当全面,它可以处理大量与COCO相同格式的数据。
它旨在使用来自该来源的数据,不包括“中文”和“视频”类别。最初,COCO 训练数据集包含 566,747 条数据。通过将其与其他来源相结合,该数字增加到 1,361,650。尽管大小大约增加了一倍,但由于任务多样性的增加,数据集被认为具有更高的质量。
使用以下命令可以轻松实现处理多个 Pytorch 数据集 连接数据集.
数据集列表 = [
datasets.load_dataset("MMInstruction/M3IT", i) for i in m3it_name_list
]
train_dataset = torch.utils.data.ConcatDataset([d["train"] for d in dataset_list])
训练进行1个epoch,使用LLaMA2模型进行微调 投影和 LoRA,与实验2类似。
由于与这次相比没有损失,所以让我们直接进入推理结果。
除了解决简单问题外,该模型现在还可以处理更复杂的挑战。通过为比字幕更复杂的任务添加数据集,功能得到了显着扩展。仅经过 1 个 epoch 的训练就能达到如此高的准确率,令人惊讶。
让我们用下面的示例图像来测试它。鉴于数据集的多样性增加,提出问题的方式略有修改。
虽然“Umbrella”的描述仍然是固定的,但感觉它正在变得更好。为了进一步改进,需要增加训练周期的数量,添加更多类型或数量的数据集,并利用更强大的 ViT 或 LLM。尽管如此,考虑到计算和数据资源,这样一个模型可以在短短半天内开发出来,这令人印象深刻。
发表评论