百度大模型算法岗面经:多模态架构到 PagedAttention 的二面追问
- 轮次
- 一面+二面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
一面
- 简述多模态大模型的整体架构与核心组成模块。
- 介绍主流视觉语言 Adapter 的种类、功能原理,谈谈对 Q-Former 的认知。
- 详细说明 ViT 视觉 Transformer 的图像预处理与特征提取机制。
- 阐述自注意力底层原理,说明 Attention Score 除以根号 d 的核心原因。
- 对比多头注意力与单头注意力,分析多头机制的核心优势。
- 分析 ViT 相较于传统 CNN 模型,在视觉任务中的核心优势。
- 手撕 LeetCode 221 最大正方形,讲解解题思路、时间与空间复杂度。
二面(后训练 + Agent 专项)
- 对比 MHA、MQA、GQA 三种注意力机制,分析三者推理速度、显存占用差异,并说明各自 KV Cache 占用比例。
- 简述 Nano、Image2.0、Seedream 等主流图像生成模型的底层技术路线。
- 解释 PagedAttention 的工作原理,说明其能否降低显存占用及底层原因。
- 区分深度学习中 Dataset、DataLoader、Sampler 三者的核心作用与差异。
- 基于 Qwen3 搭建代码补全 Agent,Tokenizer 模块会遇到哪些工程问题,对应解决方案是什么?
《参考解析》
多模态大模型的整体架构:可以按「编码—对齐—推理—生成」四段拆。视觉编码器(CLIP-ViT、SigLIP 一类)把图像切成 patch 并编成视觉特征;模态对齐模块把视觉特征映射到语言模型的词嵌入空间,主流做法分两类——简单投影层(MLP / Linear,如 LLaVA)和查询式压缩(Q-Former,如 BLIP-2);中间是 LLM 主干,负责多模态理解与推理;输出侧按任务接文本头或生成头(扩散模型 / 自回归图像 token)。近几年还有一条「原生多模态」路线,把图像直接离散成 token 和文本拼在同一条序列里训练,省掉独立的对齐模块。
视觉语言 Adapter 与 Q-Former:Adapter 分三类——投影式(一层或几层 MLP,把视觉特征维度对齐到 LLM 词嵌入,训练成本低)、查询式(Q-Former,用一组可学习 query token 通过 cross-attention 从冻结的视觉编码器里抽取固定条数的视觉特征)、以及插入式(在 LLM 层间插 cross-attention,如 Flamingo)。Q-Former 的设计要点是:query 数量固定(比如 32 个),所以无论图像分辨率多高,进入 LLM 的视觉 token 数都是常数,能显著压短上下文;它通常分两阶段训练,先做图文对比与匹配学习,再接到 LLM 上做生成式对齐。代价是信息瓶颈——固定 32 个 token 装不下细粒度信息,OCR、密集小目标这类任务上会明显吃亏。
ViT 的图像预处理与特征提取:图像先 resize 到固定分辨率(如 224×224),切成固定大小的 patch(如 16×16),每个 patch 拉平成向量后过一层线性投影得到 patch embedding;再在序列最前面拼一个可学习的 [CLS] token,加上可学习或正弦位置编码,送进标准 Transformer 编码器(多头自注意力 + MLP + LayerNorm + 残差)。下游分类取 [CLS] 的输出,检测分割类任务则取 patch token 的输出。要注意的工程点:分辨率变化时需要插值位置编码,patch 边长决定了序列长度和计算量(复杂度与 patch 数的平方成正比)。
Attention Score 除以根号 d 的原因:假设 q 和 k 的各维独立、零均值、方差为 1,那么它们的点积是 d 个独立乘积之和,方差为 d,标准差是根号 d。d 越大点积的数值幅度越大,softmax 的输入分布越尖锐,结果会逼近 one-hot——此时 softmax 的梯度趋近于 0,反向传播几乎传不动,训练容易停滞。除以根号 d 就是把点积的方差重新拉回 1 量级,让 softmax 工作在梯度健康的区间。这个推导要能当场写出来,只答「防止梯度消失」通常会被追问细节。
多头注意力的优势:多头把 d 维的 q/k/v 投影到 h 个子空间,每个头维度 d/h,各自独立做注意力再拼接投影回来。好处是模型可以在不同子空间里并行学习不同类型的依赖关系——有的头盯局部相邻、有的头盯句法或长程指代,单头只能在同一个表示空间里折中。总参数量和计算量与单头大致相当(因为每头维度被压到 d/h),所以是「同样的算力买更多样的视角」。代价是每个头维度变低,某些任务上单头表达更集中,但总体多头更优。
ViT 对比 CNN:ViT 从第一层就是全局感受野,任意两个 patch 之间一步可达,长程依赖建模天然更强;结构上没有卷积的局部性与平移等变这类归纳偏置,因此在小数据上不如 CNN,但在大数据 + 大参数量下天花板更高、扩展性更好(这也正是「ViT 需要 JFT-300M 级别数据」的原因)。CNN 的优势在于归纳偏置带来的样本效率和局部特征提取效率,在数据不足或边缘部署场景仍然常用。实践中常见混合方案(ConvNeXt 用卷积模仿 Transformer 设计、或 CNN 主干 + Transformer 颈部)取两边的好处。
MHA / MQA / GQA 与 KV Cache 占用:KV Cache 的大小 = 2(K 和 V)× 层数 × KV 头数 × 每头维度 × 序列长度 × batch × 精度字节数。MHA 每个注意力头都有独立的 K/V,KV 头数等于 query 头数,cache 最大;MQA 让所有头共享同一组 K/V,KV 头数降到 1,cache 约为 MHA 的 1/n_head,显存最省、推理最快,但质量损失相对明显;GQA 把 query 头分成若干组,每组共享一组 K/V,KV 头数介于 1 和 n_head 之间(常见 n_head/8),是质量与速度的折中,也是现在主流开源模型(Llama 3、Qwen 系列)的默认选择。三者的差距在长上下文和大 batch 下会被放大,因为 cache 随序列长度和 batch 线性增长。答的时候主动给出公式,比只讲定性结论更有说服力。
PagedAttention 能不能降显存:严格说它不减少 KV Cache 本身该占的字节数,而是减少浪费。传统实现为每个请求按最大可能长度预留一段连续显存,实际生成长度往往远小于预留值,加上内存碎片,显存利用率常常只有两三成。PagedAttention 借鉴操作系统的虚拟内存分页,把 KV Cache 切成固定大小的 block,用 block table 维护逻辑块到物理块的映射,按需分配、几乎无碎片,官方数据把利用率提到 90% 以上。效果是同一张卡能塞下更大的 batch 和更长的上下文,从而提升吞吐;另外一个副产品是块级共享——同一条 prompt 的多个采样可以共享前缀块,配合 copy-on-write 进一步省显存。
Dataset、DataLoader、Sampler 的分工:Dataset 只负责「拿到第 i 个样本」和「一共多少个样本」(__getitem__ / __len__),不该关心批量、顺序和并行。Sampler 决定「按什么顺序取哪些索引」,shuffle、分布式切分、按长度分桶这些逻辑都归它,DataLoader 的 shuffle=True 实际上是构造了一个 RandomSampler。DataLoader 是调度层:按 sampler 给出的索引去 Dataset 取样本、用 collate_fn 拼成一个 batch、用多进程 worker 预取、把数据搬到设备上。三者拆开的价值在于可替换——换采样策略只动 sampler,换数据增强只动 Dataset,不用改训练循环。
Qwen3 代码补全 Agent 中 Tokenizer 的工程问题:可以按几点答。一是流式增量解码:token 是按 BPE 切分的,直接逐 token 解码会在多字节字符和合并 token 上产生乱码,必须维护一个缓冲、按字符边界输出,并处理最后一个未完成 token 的回退。二是特殊 token 与 FIM 格式:代码补全通常要用 fill-in-the-middle(<|fim_prefix|> / <|fim_middle|> / <|fim_suffix|>)构造训练与推理输入,这些 token 必须正确注册且不被 BPE 切碎。三是长上下文的截断策略:按字符粗暴截断会切断语法结构,应该按行、按函数边界或按 AST 截,同时保证 FIM 的 prefix/suffix 比例。四是空白与缩进保真——代码对空格和缩进敏感,tokenizer 的 clean_up_tokenization_spaces 之类后处理必须关掉,否则生成的代码缩进会错。五是不常见标识符会被切成很多碎片,导致补全质量下降,常见对策是扩充词表或在词表层做适配。六是前缀缓存要求 token 序列稳定,否则缓存命中率会掉,这与 prompt 拼装顺序强相关。
手撕 221 最大正方形:动态规划,dp[i][j] 表示以 (i, j) 为右下角的最大正方形边长,转移是 dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1(仅当该格为 1),答案为所有 dp 值的最大值。时间 O(mn),空间可以滚动成一维 O(n)。讲解时把「为什么取三者最小」说清楚——往左、往上、往左上三个方向都被这个边长约束住,取最小才不会越界出非全 1 的区域。