面试官让我讲一下DeepSeek-VL2的细节

人工智能
为什么要做recaption?因为caption数据由来已久,业界有许多开源的caption数据集,这些数据集的收集、处理方式各不相同,数据内容和质量参差不齐。直接用这些数据训练会带入很多我们不想要的噪声,效果也不太好。

看DeepSeek-VL2细节之前,先简单介绍下DeepSeek-VL2提到的recaption方案和visual prompt数据。

1.recaption:PixelProse

1.1why recaption

PixelProse是《From Pixels to Prose: A Large Dataset of Dense Image Captions》中提供的一个(合成)caption数据集,共有16M条样本;论文同时也介绍了他们构造PixelProse的recaption方案。

为什么要做recaption?因为caption数据由来已久,业界有许多开源的caption数据集,这些数据集的收集、处理方式各不相同,数据内容和质量参差不齐。直接用这些数据训练会带入很多我们不想要的噪声,效果也不太好。

通过具体case的分析,主要有这么些问题:

  • 数据里存在一些NSFW和Child Sexual Abuse Material (CSAM)的内容,这在很多场景都不合适甚至不合法
  • 很多样本的图片和caption关联性太差,比如过于简短,或者缺乏准确的描述,这导致VL模型没法很好学习语言和图像之间的细节对齐关系
  • 文字是VL模型和SD模型要学习的一个重点,但是现有的caption数据很多都没有给出图中文字的详细内容,使得模型很难学习文字

1.2方案

针对分析出来的这些问题,合成高质量的caption数据的流程设计成这样:

图片图片

一步一步来看。

1)过滤

source data有三个,CommonPool、CC12M 和 RedCaps。当然如果现在我们要再多,那可以多加点数据集进去。首先,这些数据集通过NSFW分类模型和commercial Google APIs进行内容过滤,仅保留图片内容合适合法的数据。

2)选择prompt

接下来,会从下面5个预定义的prompt中随机选择一个,用于让Gemini生成新的prompt。

图片图片

3)加入alt-text

在生成的时候,会随机加入图片的alt-text到prompt中。参考《CapsFusion: Rethinking Image-Text Data at Scale》的发现,加入alt-text有机会提升生成结果细节的准确性。

4)加入Negative Descriptions

无论是VLM还是diffusion模型,对于negative描述的指令遵循能力总是比较差。比如跟diffusion模型说“画一幅没有大象的画”,最终画出来的画就有大象。

为了增强模型对negative instruction的遵循能力,随机让Gemini增加一些途中不存在的物体的描述。比如“途中有5个红色的苹果”,就会再加上negative description “但是没有任何梨子出现在途中”。

5)优化Text Recognition

文字能力是VLM和diffusion模型都很重要的一个能力,如果没有文字识别能力,多模态模型无法识别图片上的路标、广告牌、标签等信息,而diffusion模型在生成包含文字的图像时也会是一团乱码。

为了增强模型的文字理解能力,可以看到前面的5个prompt里都包含一个要求:

If any text is present in the image, mention where it is, and the font.Describe the text in detail with quotation marks.

不过生成caption的模型识别文字的准确率不是100%,甚至可能只有七八成的准确率,所以后面还要check一下。

在校验之前,先用watermark model分类一下,对于不包含watermark,且出现文字的图片,再用OCR模型进行识别。小于15个pixel的text region会被抛弃。

最终check的结果表明大概有76%的文字可以被caption模型正确识别:

图片图片

图片

当然OCR模型本身也不是100%正确的,对于样式复杂的情况,OCR模型也识别不准,不过整体上这个准确率校验还是可以参考的。

1.3.PixelProse

新合成的PixelProse文本长度相比原caption更长,包含更多细节信息:

图片图片

从文本的分词结果上看,PixelProse所包含的名词多样性也更丰富:

图片

2.Visual Prompt

这一part主要是讲一下visual prompt。

在纯文本的场景,prompt的使用大家都很熟悉的。而在多模态场景,一般来说用户指令也是以文本的形式给出,比如“图上这个人多少岁了”,“这只狗是什么品种”这样。

假设现在有一张图,上面有很多人,你想要针对其中某个人对模型进行询问。如果用文本进行描述的话,就有点困难:这些人可能没有很整齐地排列,衣着也没有鲜明特点;哪怕能够通过位置或者特征进行文字描述,这也会给模型的理解和识别造成困难。

回想一下,如果是在和人交流,那么要准确定位图上的一个人,最简单的方法就是用手指一下,或者拿笔在对应位置画个圈/箭头。那跟模型交流的时候也可以这么干:

图片图片

这个圈/箭头就是visual prompt。

如果模型具备和这些圈/箭头进行交互的能力,那么用户在交互的时候就会更加自然。

2.1.数据

要训练这样的能力,首先就要有数据。《ViP-LLaVA: Making Large Multimodal Models Understand Arbitrary Visual Prompts》就搞了一批数据。

1)source data

visual prompt的数据还是通过数据合成获得。源数据就是现有各种物体识别/实体分割的数据,这些数据包含物体的位置和类型/名称信息,很方便改造成visual prompt数据。

2)visual prompt type

研究人员定义了一下巴中visual prompt类型,用于标识图像中的物体,总共有8种:

图片

个人认为,这8种其实可以分成3个大类:

(1)外框

椭圆、长方形、三角形、物体的mask都属于把物体框起来的方式,只是有的框比较粗糙,有的比较精细。

在构造这类visual prompt的时候,为了引入一定的随机性,会对外框的ratio、颜色和大小进行一定的随机变化,只要保证主要物体还在框里就行。

(2)箭头

箭头和把物体圈起来的做法不同,箭头一般画在物体附近,而且有方向性。

(3)涂鸦

scribble,contour和point其实都是类似涂鸦的方式,只是涂鸦的精细程度不同,point是最简陋的,contour是最精细的,而scribble介于两者之间。scribble是用贝塞尔曲线工具模拟人类轨迹画的。

3.DeepSeek-VL2

DeepSeek-VL2开源了三个规模的模型,都是MoE:

  • DeepSeek-VL2-Tiny:总参数3B,激活参数0.57B
  • DeepSeek-VL2-Small:总参数16B,激活参数2.4B
  • DeepSeek-VL2:总参数27B,激活参数4.1B

原文给出的效果对比:

图片

不过这张图比的是激活参数。其实直接看总参数,DeepSeek-VL2的效果也是很不错的,只是没有看激活参数的优势那么大。从另一个角度想,如果DeepSeek通过模型架构和计算框架优化,可以把MoE+MLA结构做到和同样激活参数的dense模型相同效率的话,这么对比也不是不行。

DeepSeek-VL2相比前一代,主要有3个优化点:

  • 动态高分辨率vision encoding
  • LLM架构优化
  • 数据构建pipeline优化

LLM架构优化其实就是MoE + MLA,带来的语言模型效率和效果提升,这部分在《DeepSeek-V3细节探索》中有细说,此处就不展开。三个开源模型的具体结构参数:

图片图片

最小的Tiny模型没有使用MLA,而是使用MHA,这和我们之前对MLA的认知是一致的:模型每个头的大小并不需要很多,模型增大更多是增加头数,而MLA需要在头数更多的场景下才能发挥效率和效果的优势,因此模型越大MLA优势越大,而在小模型上MLA则不容易发挥优势。

另外,只有最大的DeepSeek-VL2使用了expert correction bias和sigmoid routing function,这俩都跟expert parallelism有关。

另外有点奇怪的是只有small版本的vocab是102400,其他两个都是129280

DeepSeek-VL2整体框架还是标准的三件套:

图片图片

3.1动态分辨率:Dynamic Tiling Strategy

使用高分辨率 + 动态分辨率基本上已经是现在的标准做法。

DeepSeek-VL2三个规模的模型使用的vision encoder都是SigLIP-SO400M-384,这是一个基础分辨率为384 × 384的模型。基于这个分辨率,定义了一批候选分辨率,这些候选分辨率的width和height都是384的倍数:

对于每一个原始图像,会保持ratio进行resize到每个候选分辨率,并选择使用所需padding最少的候选resolution。

最后还会加上一个原图的缩略图,因此总用有(1 + m × n)个tile,每个tile都是384 × 384的大小,由vision encoder来单独处理。

以上是vision encoder的输出。接下来是VL Adaptor的处理。

SigLIP-SO400M-384使用的patch size = 14,每个tile会产生27 × 27个visual embedding,会通过pixel unshuffle,把visual embedding的数量减少到14 × 14个。

另外,为了帮助模型识别visual embedding的位置关系,在缩略图和子图的每行visual embedding最后都会加一个 \n token,标识一下这一行embedding的结束。

这么一来总的token数就变成:

14 × (14 + 1) + 14m × (14n + 1)

最终得到的图像feature按这样排布:

图片图片

动态分辨率的方案到这里就结束了。不知道有没有细心的同学发现,上面的基础分辨率384并不是patch size 14的整数倍数(384 / 14 ≈ 27.4),我也有点奇怪,搜索之下发现确实有问题:原来SigLIP-SO400M-384的真实分辨率并不是384,而是14 × 27 = 378,384只是由于历史遗留问题一直保持这么个写法。原链接在 https://huggingface.co/google/siglip-so400m-patch14-384/discussions/4。(这简直和“2020年东京奥运会在2021举办”有异曲同工之妙)。

3.2多阶段训练

DeepSeek-VL2的训练分三个阶段:

  • 对齐:训练adaptor和vision encoder,冻结LLM
  • 预训练:全参训练
  • SFT:全参训练

图片图片

3.3数据

1)对齐

在对齐阶段,DeepSeek-VL2只用ShareGPT4v数据:包含1.2M条caption和conversation样本。

2)预训练

预训练阶段使用了70%的VL数据和30%纯文本数据。

(1)Interleaved image-text data

主要来自WIT、WikiHo和OBELICS,它们的混合比例通过在eepSeek-VL2-Tiny上实验确定;还有一个in-house数据集来增强真实世界知识的覆盖。

(2)Image captioning data

对现有的caption数据进行recaption处理,参考PixelProse的做法,在生成新caption的时候加入:

  • OCR hints
  • meta information (e.g., location, camera settings)
  • original captions

recaption之后还是存在一些质量问题,因此用DeepSeek Chat对文本质量再进行打分和过滤,这样一来caption效果得到了有效提升

(3)OCR数据

包括LaTeX OCR和12M RenderedText数据集,和一些in-house数据集,主要是中英文的。

(4)VQA数据

包括:

  • General VQA
  • Table, chart and document understanding
  • Web-to-code and plot-to-Python generation
  • QA with visual prompt

(5)Visual grounding data

数据样式:

Prompt: Locate <|ref|><query><|/ref|> in the given image.
Response: <|ref|><query><|/ref|><|det|>[[x1, y1, x2, y2],...]<|/det|>

<|ref|>, <|/ref|>, <|det|>, <|/det|> are special tokens. <query> is a place-holder for either the category name (e.g., “car”) or description of the object (e.g., “the leftmost person”). [[x1, y1, x2, y2], ...] is a list of bounding boxes, where each bounding box corresponds to an object’s position. The coordinates x1, y1 and x2, y2 specify the top-left and bottom-right corners respectively, normalized to values between 0 and 999 according to the resolution of the image.

还另外构建了负样本,把一些object从原图上消去,以增加模型robustness。

(6)Grounded conversation data

数据样式:

Prompt: <|grounding|>Can you describe the content of the image?
Response: Two <|ref|>dogs<|/ref|><|det|>[[x1, y1, x2, y2],...]<|/det|> are running on the grass.

3)SFT

(1)General visual question-answering

现有的VQA数据集有一些问题,包括:

  • response太短
  • OCR质量差
  • 有幻觉

因此把original question、image和OCR信息放在一起,重生成response,以提升数据质量。

(2)OCR and document understanding

预训练后模型的OCR能力已经很强了,因此sft阶段专注选出低质量样本,提升数据质量。

(3)Table and chart understanding

同OCR类似

(4)Reasoning, logic, and mathematics

发现detailed response在小模型上的训练效果并不好,小模型对简洁的response的学习能力更好。

(5)Textbook and academic questions

使用了包含跨学科、大学水平的教科书内容的内部数据集。

(6)Web-to-code and plot-to-Python generation

对于开源数据也重新生成response提高质量。

(7)Visual grounding

把query翻译成了中文,还加了一个negative sample。

(8)Grounded conversation

使用《Groma: Localized visual tokenization for grounding multimodal large language models》和《Flickr30k entities: Collecting region-to-phrase correspondences for richer image-to-sentence models》数据集构建对话数据。

(9)Text-Only datasets

使用了很多数据,但是没有给出比例。

一个总结,在数据这块DeepSeek-VL2在强调多样性的同时,也用现有的模型构建更强的pipeline重新生成response以提高数据质量。

3.4.cases

图片图片

图片

4.小结

  • 现有的多模态数据质量有高有低,直接使用可能有很好的效果
  • 数据多样性能够有效提升模型训练效果
  • 按这个趋势MoE有可能再次火起来?如果硬件的优化跟上,MoE说不定能成为attention一样的标准方案。MLA也同样有这个可能。
责任编辑:武晓燕 来源: Linsight
相关推荐

2023-09-12 14:56:13

MyBatis缓存机制

2021-07-28 10:08:19

类加载代码块面试

2022-06-07 12:03:33

Java内存模型

2022-06-06 15:33:20

线程Java释放锁

2023-02-18 13:34:14

Nacos健康检查机制

2020-12-10 08:43:17

垃圾回收JVM

2020-07-30 07:58:36

加密算法

2024-02-21 16:42:00

2024-02-27 15:23:48

RedLock算法Redis

2024-01-29 10:08:11

零拷贝Zero-copyCPU 拷贝

2023-12-29 13:45:00

2021-08-28 09:06:11

Dubbo架构服务

2021-11-08 15:59:01

MyBatis关联开发

2023-02-08 08:32:41

轮询锁

2020-06-02 17:17:43

HTTPS加密算法前端

2023-01-30 15:39:40

GETHTTP

2021-06-02 11:25:18

线程池Java代码

2023-03-08 07:46:53

面试官优化结构体

2020-04-26 09:33:36

三次握手网络协议HTTP

2021-08-13 07:23:15

架构秒杀系统
点赞
收藏

51CTO技术栈公众号