DataBrick 大模型基础笔记(二)

DataBrick 大模型基础笔记(二) 上一节我们介绍了多模态模型的具体技术本节中我们看到了它们广阔的应用前景。现在让我们对本模块内容做一个快速回顾。我们看到多模态语言模型在研究领域正真正获得发展动力。Transformer是一种通用的序列处理架构能够接受非文本序列如音频和图像作为输入。然而它们也继承了我们所使用的预训练大型语言模型的一些局限性。尽管Transformer架构已经存在并似乎无处不在但它可能并非最终的架构。越来越多激动人心的多模态语言模型应用即将到来。实践环节预告 https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dtbrk-llm-fund/img/a2700ec4cf5d6f95dd0ec5d8e1683396_4.png在接下来的演示笔记本中我们将学习如何构建自己的图像描述生成模型。而在实验笔记本中你将亲手实践如何进行零样本视频分类。https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dtbrk-llm-fund/img/a2700ec4cf5d6f95dd0ec5d8e1683396_6.pnghttps://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dtbrk-llm-fund/img/a2700ec4cf5d6f95dd0ec5d8e1683396_8.png我们笔记本中见。032从零构建图像描述模型 ️https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dtbrk-llm-fund/img/977c8d21c26f6a018634ea4167c2c996_0.png在本教程中我们将学习如何构建一个基础的图像描述模型。我们将选取一个基于Transformer的视觉模型和一个基于Transformer的文本模型并将它们连接起来。之后我们会将这个“拼接”模型与一个预训练好的图像描述模型进行性能对比。概述我们将使用SBU Captions数据集它包含约100万对图像URL和英文描述。我们的目标是构建一个模型能够理解图像内容并生成对应的文字描述。整个过程包括数据准备、模型构建、训练和评估。数据准备与处理首先我们需要定义数据处理函数。这个函数需要能够同时处理图像和文本数据。以下是数据处理的关键步骤获取图像对于数据集中的每个图像URL我们将发送请求获取图像像素数据。处理图像使用视觉模型的特征提取器将图像转换为模型可理解的格式。处理文本使用文本模型的分词器将描述文本处理成单词或子词标记。我们将使用现成的分词器和特征提取器。具体来说文本部分使用GPT-2的分词器图像部分使用Vision TransformerViT的特征提取器。# 示例初始化分词器和特征提取器fromtransformersimportGPT2Tokenizer,ViTFeatureExtractor tokenizerGPT2Tokenizer.from_pretrained(gpt2)feature_extractorViTFeatureExtractor.from_pretrained(google/vit-base-patch16-224)为了加速后续的微调过程我们只使用数据集中2000个样本。构建视觉-编码器-解码器模型现在我们将视觉编码器ViT和文本解码器GPT-2连接起来形成一个视觉编码器-解码器架构。fromtransformersimportVisionEncoderDecoderModel modelVisionEncoderDecoderModel.from_encoder_decoder_pretrained(google/vit-base-patch16-224,# 编码器ViTgpt2# 解码器GPT-2)注意在加载GPT-2解码器时你可能会看到“某些权重未初始化”的警告。这是因为预训练权重并不包含适配下游任务如图像描述的所有必要参数。因此Hugging Face建议我们在下游任务上进一步微调整个模型以获得最佳性能。模型配置与训练在开始训练前我们需要定义一些模型配置例如如何处理填充标记、序列结束标记、词汇表大小、生成文本时的束搜索数量以及最大输出长度。接下来我们定义训练参数如批次大小和训练轮数。我们将使用Hugging Face的TrainingArguments和Trainer类来简化训练步骤。fromtransformersimportTrainingArguments,Trainer training_argsTrainingArguments(output_dir./image-caption-model,num_train_epochs3,per_device_train_batch_size8,save_steps10_000,save_total_limit2,)trainerTrainer(modelmodel,argstraining_args,train_datasettrain_dataset,data_collatordata_collator,)trainer.train()训练过程大约需要一分半钟。你可以通过MLflow链接监控训练日志。模型评估与问题分析训练完成后我们使用测试集中的一张图像来评估模型。图像显示的是一个有商贩和顾客的户外集市。我们让模型为这张图生成描述生成描述“从悬崖上俯瞰海滩的景色。”这个描述与图像内容完全不符。这主要归因于两个原因解码器权重问题正如之前警告所示GPT-2解码器的权重并未针对图像描述任务进行充分初始化或微调。最佳实践是先在文本描述数据上单独微调解码器再将其接入编码器-解码器架构。训练不足我们只使用了少量数据进行了短期训练。增加训练轮数、提供更多训练样本以及调整模型超参数都可能改善性能。这个实验表明简单地拼接两个强大的预训练模型并快速微调可能无法直接达到理想效果。使用预训练图像描述模型为了获得更好的效果我们可以直接使用专门为图像描述任务预训练的模型。接下来我们使用一个名为BLIP的先进模型。BLIP模型的全称是“Bootstrapping Language-Image Pre-training”其突出特点是不仅有一个生成描述的生成器还有一个过滤器来筛除不相关的描述。我们使用BLIP模型进行两种描述生成条件图像描述在输入图像时同时提供一个前缀文本如“a photo of”来引导模型。无条件图像描述直接输入图像不提供任何文本前缀。fromtransformersimportBlipProcessor,BlipForConditionalGeneration processorBlipProcessor.from_pretrained(Salesforce/blip-image-captioning-base)modelBlipForConditionalGeneration.from_pretrained(Salesforce/blip-image-captioning-base)# 条件描述texta photo ofinputsprocessor(imagesimage,texttext,return_tensorspt)outmodel.generate(**inputs)captionprocessor.decode(out[0],skip_special_tokensTrue)print(f条件描述:{caption})# 无条件描述inputsprocessor(imagesimage,return_tensorspt)outmodel.generate(**inputs)captionprocessor.decode(out[0],skip_special_tokensTrue)print(f无条件描述:{caption})对于同一张集市图片BLIP模型生成的结果如下条件描述输出“a photo of a mall with people walking around.”无条件描述输出“a large indoor shopping mall.”这两个描述都准确地捕捉了图像的核心内容尽管对“室内/室外”的判断略有不同。这也说明了评估图像描述模型的挑战性对于同一张图像可能存在多个同样正确的描述。总结本节课中我们一起学习了图像描述模型的基础构建流程。我们首先了解了如何将视觉Transformer编码器和文本Transformer解码器拼接成一个多模态模型。接着我们实现了数据预处理、模型构建和训练流程并观察到一个快速拼接微调的模型可能表现不佳。最后我们使用了专门的预训练模型BLIP它展示了显著更好的性能并介绍了条件与无条件图像描述两种生成方式。https://github.com/OpenDocCN/dsai-notes-pt1-zh/raw/master/docs/dtbrk-llm-fund/img/977c8d21c26f6a018634ea4167c2c996_2.png核心结论是对于复杂的多模态任务如图像描述使用针对该任务设计和预训练的模型如BLIP通常比简单拼接通用模型并快速微调要有效得多。当然如果我们对自建模型进行更充分、更精细的微调也有可能提升其性能。在接下来的实验中你将有机会在零样本视频分类任务上亲自实践。