训练VLM(视觉语言模型)的经验

5d914f9c810eceb54115e030e7098e33.png

知乎:lym
链接:https://zhuanlan.zhihu.com/p/890327005

如果可以用prompt解决,尽量用prompt解决,因为训练(精调)的模型往往通用能力会下降,训练和长期部署成本都比较高,这个成本也包括时间成本。

基于prompt确实不行(情况包括格式输出不稳定、格式输出基本不对、任务不完全会、任务完全不会等情况,难度逐渐加大),选择上SFT微调。

业务场景基本用不到强化学习,强化解决的是最后一公里的问题,可以理解为有两种非常接近的输出(这两种输出都非常接近目标输出,此时已经解决了90%的问题),强化学习会对相同的输入,打压其中一种不希望的输出,同时增强另一种更接近目标的希望的输出(从DPO loss就可以看出)。强化是用来应对细微输出差异的,并且业务场景优先用DPO,DPO只需要pair对数据,更好构造。PPO的reward model几乎没有开源的,需要的数据更多,超参也更多,除非是逻辑或代码场景,在文本场景中,DPO效果是足够的。

业务数据质量最重要,数据量也不能少,越难的任务数据量越多

数据内容:要尽量和期望输出一致,这个一致既包括内容,也包括格式。不要期望垃圾数据能训练出好的VLM模型,不要寄希望于dalle3那种recaptioning,依靠泛化能力变换格式的玩法太高级了,我还把我不住。可以用 手工标注数据+GPT改写(甚至可以是Vision版本) 生成质量尽可能高的业务数据。改写用的GPT原本没有解决对应任务的能力也不要怕,在改写的prompt模板让它参考人工标注就行。

数据量:如果模型会该类任务,但仅是输出格式不稳定(比如json少个括号,文本输出少个\n什么的),几十到上百条业务数据就够了,不用考虑通用数据;一般普通业务需要千条业务数据(类似数据在VLM模型预训练的训练集出现过,但模型对于该任务处于会与不会区间),需要少量通用数据(10:1,1份通用)。如果特别难的task,VLM模型根本没见过(比如文生图生成数据,输出的文本也和输入图之间的关系需要重学),那需要1-2w条业务数据,通用数据5:1。

训练轮次:我训练的task就特别难,4B左右的模型甚至训练10个epoch测试集的loss还在下降。但是一般7B模型训5个epoch,70B模型训练2个epoch,就会开始过拟合了。下面是比较正常的收敛曲线。13cbf6f0d1f8fc121bd134336938f3cf.pngf2e1e4fafed01a9bb75ed878fa22dae5.png当然还有些肯定不正确的曲线:8d3e799d2187607408d354eaeb6176f5.png297218205a94d0827dd3549655cfbae6.png数据难度:可以用PPL衡量,也可以看训练集上测试的效果。

多个类型数据:先各自训练看效果,确保各自没有问题,再去混合。

训练流程

  1. 收集清洗改写增强广业务数据,同一个问题可以除了文本对话,还可以改写成选择判断,有帮助,而且这些形式更容易做评测,方便确认效果。

  2. 磨刀不误砍柴工:找一个小的VLM模型(2B~7B),按照默认微调参数对纯业务数据集上进行训练,设置较高的lr(1e-5)和较长的epoch(10轮)。训练好的模型在训练集上先测试(对,用什么训练用什么测!)。在训练集上进行测试是非常重要的,它可以一定程度排除数据集质量的问题,也不用担心过拟合的问题,同时也能确保框架底层没什么问题。别管数据质量多垃圾,别管在测试集泛化性有多差,在训练集上都应该有较好的学习效果。如果你的业务数据有多种形式,也可以在这个阶段进行配比的消融。

  3. 确保在训练集上没问题,再结合validation集上的曲线,应该可以大致确认:训练轮次(epoch)、业务数据配比、学习率、batch_size、文本长度、moe专家数量、并行配置(tp pp dp)等绝大部分超参。

PS:在VLM训练中,无论是预训练、对齐还是精调,用的都是SFT loss,没有Pretrain loss。学界可能比较喜欢用lora,但工业届全量调的更多,这俩区别不是很大,lora dim设置成128/256,scaling设置成64(dim的05倍),也能学很多东西。

如果只是输出格式不满意、不稳定,那么调LLM就够。如果全新的知识,那么vit和LLM以及二者间的中间层都放开比较好。参数量的大头在LLM中,但如果图片业务数据和预训练数据差异较大,vit放开也很重要。(上vit冻住,下vit放开,vit解冻后明显收敛更稳定)。我的任务比较难,肯定就是全放开训练了。9f05d621f519a873d4f3ca55bbe717d7.pngbc1a04692ff65f3349999568eca577c4.png3593fc81562ad68bc7ebf6dce0de2f46.pngffb4cdf71343bbd3be839fe2815d6dc0.png往里面加入通用数据,来维护原有通用能力(在业务垂域没搞明白前,一般先别考虑通用数据,否则变量太多,把握不住)。配比从10:1开始,不行可以试试5:1。通用数据包括两种,一种是caption,一种是instruct数据。caption数据的question基本都是”详细描述图中有什么?“,它在VLM预训练中是用来做一阶段的。Instruct数据的question就比较多样了,比如”图中叉子右边的茶杯是什么颜色的?“它一般对应预训练的二阶段微调。VLM这两个阶段虽然一阶段叫训练,二阶段叫对齐,但是loss形式是一样的,超参可能也只有学习率的差异,越往后学习率越小。全用instruct数据问题也不大,但instruct数据可能信息量可能不如caption对图片描述那么丰富,也更难收集一些。

caption的数据我翻译了些sharegpt4o的,整理好了:

https://huggingface.co/datasets/LYM2024/share_gpt4o_zh?row=0

instruct数据用的ALLAVA-4V的,量太大了翻译的还没整理好。

https://huggingface.co/datasets/FreedomIntelligence/ALLaVA-4V

这俩我是1:1用的,没做严格消融。英文数据去llamafactory找就行,中文大部分得自己动手翻译。通用 数据也可以大量用英文,融合一点自己翻译的中文,效果也不会太差的。

然后我发现个特别有意思的现象,我的业务数据是diffusion生成的图片,上面这些数据是自然图片,业务数据的通用能力几乎没有被维护。解决方案:

  1. 用现有VLM对业务数据作captioning,因为caption的question与图无关,直接取sharegpt40的就行。直接生成大量业务图片的通用数据。

  2. 用LCM的SSD或SDXL模型做Img2Img,把正prompt置空,guidance_scale置0(最好negative输出的embedding取torch.zeros),strength强度设置0.025。用无引导生成生成有diffusion特征的图片。

  3. 训练可以分多个阶段,前面用质量差一点的大量数据,后面用质量高的小批量数据,提升最终效果。两阶段question的词汇可以作下隔离,即这两批数据的question最好有点小差异,后续推理测试只用高质量数据的question。实测高质量数据的需求大会大大降低。

  4. 我个人觉得,精调这种任务,如果数据量大,在7B小模型和72B大模型上,在业务(垂域)上效果差异并不大,因为我们一般更关心业务和垂域的性能,而非要成为全面的通才。

  5. 数据质量高可以训练久一些,数据质量差训练短一些,可以保留更好的泛化性。我们的数据比较短,训练10epoch的话,输出就非常短,往往不带主语。训练6epoch就会带一些,所以不是validation loss下降就是好事,它可能同时对应着通用loss的上升,稍微遇到些长尾问题,性能就会崩溃式下降。训练太短也不行,容易学不会,至少要保证训练5epoch,看看整体的结果。


备注:昵称-学校/公司-方向/会议(eg.ACL),进入技术/投稿群

90092b174cc85c0319299cacb4f6a639.png

id:DLNLPer,记得备注呦

<think>嗯,用户想了解视觉语言模型VLM)的学习路径和资源。首先,我需要整理现有的引用内容,看看里面提到哪些关键点。引用1提到了PyTorch构建VLM的教程和视频资源,引用2讨论了链式推理在VLM中的应用,引用3则详细说明了VLM的预训练策略、训练阶段和数据需求。这些应该是回答的基础。 接下来,用户需要的是学习路线,包括书籍、教程、课程等资源。根据引用3的结构,可能应该分阶段来规划学习路径,比如先基础知识,再进阶学习,然后实践和深入研究。需要确保每个阶段都有对应的资源推荐,比如书籍推荐《深度学习入门》和《计算机视觉》,课程可能包括李飞飞的CS231n,或者吴恩达的深度学习课程。 然后,资源推荐部分要涵盖开源项目,比如CLIP、BLIP,以及PyTorch和Hugging Face库,这些都是构建VLM常用的工具。此外,用户提到的引用1中的视频教程应该被包含进去,作为专门整理的学习资源。 还要考虑用户可能的背景,是否需要先补充基础知识,比如深度学习、计算机视觉和自然语言处理。然后进阶到VLM的具体内容,比如模型架构、预训练策略,再到应用和优化技巧。最后,实践部分可能需要推荐数据集和实战项目,帮助用户巩固知识。 另外,用户的问题中生成的相关问题需要覆盖VLM的核心技术、优化方法、应用场景以及学习难点,这样他们可以进一步探索。要确保引用正确,每个引用对应到回答中的相应部分,比如引用3提到的预训练阶段,在回答中要标注引用标识。 可能还需要检查是否有其他资源未被引用但常用的,比如论文、GitHub项目,但根据给定的引用,可能需要限制在已有信息内。最后,确保回答结构清晰,分阶段和模块,便于用户逐步学习。</think>以下是针对视觉语言模型VLM)的系统化学习路径规划与资源推荐: ### 一、基础知识准备阶段 1. **深度学习基础** - 必学内容:神经网络基础、反向传播、CNN/RNN/Transformer架构 - 推荐资源: - 图书:《深度学习入门:基于Python的理论与实现》[^3] - 课程:吴恩达《深度学习专项课程》(Coursera) 2. **计算机视觉基础** - 重点掌握:图像特征提取、目标检测、视觉表征学习 - 推荐实践:PyTorch框架下的图像分类项目[^1] 3. **自然语言处理基础** - 核心知识点:词嵌入、注意力机制、生成式模型 - 推荐课程:斯坦福CS224n《自然语言处理与深度学习》 ### 二、VLM核心技术进阶 1. **模型架构专题** - 关键组件学习: - 视觉编码器:CLIP/SigLIP实现原理 - 语言解码器:Llama/GPT结构解析 - 跨模态投影器:向量空间对齐技术 - 推荐论文:《Learning Transferable Visual Models From Natural Language Supervision》 2. **训练策略精讲** ```python # 典型的三阶段训练代码结构示例 class VLM(nn.Module): def __init__(self): self.vision_encoder = FrozenCLIP() # 冻结的视觉编码器 self.text_decoder = LlamaForCausalLM() self.projection = LearnableProjector() # 可训练投影器 ``` - 阶段1:仅训练投影器(1-2周) - 阶段2:联合微调解码器(3-4周) - 阶段3:指令微调(2-3周) 3. **链式推理强化** - 重点突破:CoT(Chain-of-Thought)在跨模态任务中的应用[^2] - 案例实践:VQA任务中的分步推理实现 ### 三、优质学习资源导航 | 资源类型 | 推荐内容 | 特点说明 | |---------|---------|---------| | **视频教程** | [VLM全栈开发教程](引用1) | 含完整路线图与项目实战 | | **开源项目** | CLIP/BLIP代码库 | 官方实现+社区改进版 | | **论文合集** | arXiv最新论文集 | 跟踪SOTA模型进展 | | **实践平台** | Kaggle VLM竞赛 | 真实场景数据挑战 | ### 四、实战提升路径 1. **基础实验** - 使用HuggingFace库复现BLIP模型 - 在COCO数据集上完成图文匹配任务 2. **进阶挑战** - 实现自定义投影器模块 - 探索多模态指令微调策略[^3] 3. **创新方向** - 改进跨模态注意力机制 - 设计新型链式推理框架 ### 五、常见学习误区提醒 1. **不要跳过预训练阶段**:直接微调现成模型会导致基础不牢 2. **警惕数据泄露**:注意训练/验证集划分比例 3. **硬件准备建议**:至少需要16GB显存的GPU进行中等规模实验
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值