[Docs] 在mlp1层之前,新增一个全连接层,应该怎么训练?
📚 The doc issue
在mlp1层之前,新增一个全连接层,应该怎么训练,视觉层和语言层都参与训练吗?辛苦帮忙解答下@czczup
Suggest a potential alternative/fix
No response
能否提供一下更详细的需求?
能否提供一下更详细的需求?
@lll2343 感谢回复,这里的出发点是输入的图片分辨率比较大,num_image_token的数量需要从256->64, 想过两个方案,一是直接修改mlp1层,二是增加一个新的mlp用于降维,想了解下怎么训练比较好,或者是否有其他方案?
另外,如果相要提升模型对特定领域流程图的理解能力,应该怎么训练呢?
Hi,
-
修改 MLP 无法减少
num_image_token
pixel_shuffle已降低num_image_token,详见 [extract_feature函数]。 如果输入图片分辨率较高,可以通过调整max_dynamic_patch来减少切图数量。 -
增加训练步数
修改[meta.json]中的repeat_time参数(见 meta.json),在该数据集上训练更多步数以提升性能。
Hi,
- 修改 MLP 无法减少
num_image_tokenpixel_shuffle已降低num_image_token,详见 [extract_feature函数]。 如果输入图片分辨率较高,可以通过调整max_dynamic_patch来减少切图数量。- 增加训练步数 修改
[meta.json]中的repeat_time参数(见 meta.json),在该数据集上训练更多步数以提升性能。
@lll2343 ,感谢回复~
- 【调整
max_dynamic_patch来减少切图数量】,这样存在一个问题,如果图片分辨率较高,比如4000x3000,在显存一定的情况下,max_dynamic_patch需要设置的较小,比如默认的12,这样最佳切分是4x3,切分后图片总的分辨率变为(448x4,448x3),会导致图片失真严重; - 目前我们显存比较紧张,在设置较大
max_dynamic_patch的情况下,想要通过降低num_image_token数量的方式(例如256->64),进而降低显存占用。修改mlp1是适配num_image_token的调整。因此想了解修改之后如何训练模型; - 关于流程图能力这块,我想了解的是,数据集一般怎么构造,我的任务是根据流程图,输出caption,那我需要构造一些流程图节点识别数据、流程描述数据等,一同训练么 期待回复~
Hi,
-
降低
num_image_token的方法修改
MLP1并不会直接减少num_image_token。实际上,这是通过pixel_shuffle来实现的。目前downsample_ratio设置为 0.5,num_image_token已经从 256 降低到了 64。您可以将downsample_ratio设置得更小,例如 0.25,这样num_image_token将从 256 降至 16。具体实现请参考 extract_feature 函数。vit_embeds = vit_embeds[:, 1:, :] # b,256,c # 假设图像尺寸为 224x224,num_patch=14,downsample_ratio=0.5 h = w = int(vit_embeds.shape[1] ** 0.5) # 16,16 vit_embeds = vit_embeds.reshape(vit_embeds.shape[0], h, w, -1) # b,16,16,c vit_embeds = self.pixel_shuffle(vit_embeds, scale_factor=self.downsample_ratio) # b,8,8,c*4 vit_embeds = vit_embeds.reshape(vit_embeds.shape[0], -1, vit_embeds.shape[-1]) # b,64,c*4 vit_embeds = self.mlp1(vit_embeds) # b,64,llm_em return vit_embeds -
重新训练
MLP1的开销修改
MLP1后需要重新训练projetcor来进行对其,包括预训练和微调。这将带来较大的计算和时间开销。 -
调整
max_dynamic_patch的设置在训练时,您可以不需要设置较小的
max_dynamic_patch,例如设置为 6;而在推理时,可以使用较大的值,如 12,这样也能够正常工作。 -
是的,构建一批符合您需求的 Caption 数据用于训练,以确保模型能够适应您的特定任务。
Hi,
- 降低
num_image_token的方法 修改MLP1并不会直接减少num_image_token。实际上,这是通过pixel_shuffle来实现的。目前downsample_ratio设置为 0.5,num_image_token已经从 256 降低到了 64。您可以将downsample_ratio设置得更小,例如 0.25,这样num_image_token将从 256 降至 16。具体实现请参考 extract_feature 函数。vit_embeds = vit_embeds[:, 1:, :] # b,256,c # 假设图像尺寸为 224x224,num_patch=14,downsample_ratio=0.5 h = w = int(vit_embeds.shape[1] ** 0.5) # 16,16 vit_embeds = vit_embeds.reshape(vit_embeds.shape[0], h, w, -1) # b,16,16,c vit_embeds = self.pixel_shuffle(vit_embeds, scale_factor=self.downsample_ratio) # b,8,8,c*4 vit_embeds = vit_embeds.reshape(vit_embeds.shape[0], -1, vit_embeds.shape[-1]) # b,64,c*4 vit_embeds = self.mlp1(vit_embeds) # b,64,llm_em return vit_embeds- 重新训练
MLP1的开销 修改MLP1后需要重新训练projetcor来进行对其,包括预训练和微调。这将带来较大的计算和时间开销。- 调整
max_dynamic_patch的设置 在训练时,您可以不需要设置较小的max_dynamic_patch,例如设置为 6;而在推理时,可以使用较大的值,如 12,这样也能够正常工作。- 是的,构建一批符合您需求的 Caption 数据用于训练,以确保模型能够适应您的特定任务。
@lll2343 非常感谢,关于num_image_token这块,已经明白了,还有两个小问题,请教下:
- 现在internvl2.5版本中,
image_size默认是448,downsample_ratio设置为 0.5的情况下,对应的num_image_token是256,您和团队在训练模型时,为什么没有采用64这种更低的量级呀,会影响模型的效果吗? - 对于流程图训练这块,期望您能提供更多的经验,想了解的是,我们任务中的流程图的节点,和传统节点不太一致,因此,对于caption生成的任务,是直接构建如下示例1,端到端数据即可,还是需要混合一些示例2的数据,让模型认识不同的节点类型呢?
- 示例1:{"query": "请解释说明图中流程图的含义", "answer": "xxx"}
- 示例2:{"query": "图中
[*, *, *, *] 是什么图形", "answer": "图中是决策节点"}
- 会影响模型效果,感知能力会有下降
- 最好是混合一些示例2的数据,经验上来讲训练效果会变好一些