百度多模态算法岗一二面面经
- 轮次
- 一面二面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
一面
- 多模态大模型的整体核心架构由哪些模块组成?
- 主流的视觉语言 Adapter 有哪些类型,各自的核心功能是什么?Q-Former 的原理与应用场景是怎样的?
- ViT 的图像预处理与特征提取完整机制是怎样的?
- 自注意力 Self-Attention 的底层原理是什么?注意力分数为什么要除以根号 d,多头注意力相比单头注意力的核心优势在哪?
- ViT 与传统 CNN 在视觉任务上的性能优势与适配场景有什么差异?
- 手撕算法:LeetCode 221 最大正方形。
二面
- MHA、MQA、GQA 三种注意力机制有什么区别?在推理速度和显存占用上各自的优劣是什么?
- MHA、MQA、GQA 三种架构下,KV Cache 的显存占用比例与资源消耗特点分别是什么?
- Nano、Image 2.0、Seedream 这些主流图像生成模型的底层技术架构与迭代路线是怎样的?
- PagedAttention 的技术原理是什么,它能不能降低显存占用,背后的核心机制是什么?
- Dataset、DataLoader、Sampler 三者的定义、功能与使用场景有什么区别?
- 基于 Qwen3 搭建代码补全 Agent,如果由你负责 tokenizer 模块,会遇到哪些核心问题,对应的优化方案是什么?
- 主流代码智能 Agent 的工作模式有哪些,核心差异与适用场景是什么?
- 团队内部算法模块已经封装成 pip 包,怎么设计方案让代码 Agent 精准识别并调用内部私有函数?
《参考解析》
-
多模态架构:三个模块与对齐策略:主流做法是视觉编码器 + 模态对齐模块 + 语言模型。视觉塔负责把图像变成 token 序列,对齐模块负责把视觉 token 投影到语言模型的语义空间,语言模型负责推理与生成。训练分两步走:先用大规模图文对做对齐(此时通常冻结两端,只训对齐层,成本可控),再用指令数据做多模态微调,让模型学会看图回答。面试里更值得展开的是取舍——对齐层参数越少越便宜,但视觉信息压缩得越狠,细粒度识别越吃亏;对齐层越重越贵,收益在文档、图表这类高密度图像上才明显。
-
Adapter 类型与 Q-Former 的定位:MLP/Linear Projector 是最省事的一类,直接把 patch 特征线性映射过去,保留的视觉 token 最多;Q-Former 用一组可学习 query 通过交叉注意力把任意长度的视觉特征压缩成固定条数,压缩率最高、下游序列最短,但压缩必然丢细节,所以它对小字、表格、密集文本要额外补高分辨率切图或 OCR 分支;Perceiver Resampler 用少量隐变量重采样,处在两者中间。Q-Former 的训练目标是关键考点:图文对比、图文匹配、基于图像的文本生成三个目标一起训,学到的 query 才既有判别性又能供生成使用。
-
ViT 预处理与注意力的两个经典追问:ViT 把图像切成固定 patch,展平后线性映射成 embedding,加上分类 token 与位置编码后送入 Transformer 编码器——位置编码必须加,否则 patch 之间的空间关系完全丢失。相比 CNN,ViT 没有局部归纳偏置,小数据上容易过拟合,需要大数据或强增强;但它的全局注意力天然适合多模态拼接,因为视觉 token 和文本 token 可以放进同一个序列。注意力除以根号 d,是因为点积结果的方差随维度线性增长,不缩放会把 softmax 推到极端饱和区、梯度趋近于零,缩放后分布更平滑、训练更稳。多头注意力的价值在于把表示空间分组,让不同的头分别关注相邻纹理、远距离依赖、语义对齐等不同模式,最后拼接投影融合——它用同样的参数量换来了更强的表达多样性。
-
KV Cache 与三种注意力架构的成本对比:KV Cache 是为了避免自回归解码时重复计算历史 token 的 key/value,代价是显存随序列长度和 batch 线性增长。同一份预算下,MHA 要为每个 query 头存一份 KV,长上下文时显存压力最大;MQA 只存一份,显存和解码访存都最省、吞吐最高,但所有头共用同一套 KV 会损失表达力,质量下降在长依赖任务上更明显;GQA 把 query 头分成若干组、每组一份 KV,等于在两者之间取了可调的中间点,实践中常用 8 组,训练时可以先用 MHA 训、再对 KV 头做均值池化转成 GQA 来省成本。回答时把「质量、显存、解码吞吐」三者的权衡讲清楚,比背优劣表更有说服力。
-
PagedAttention 与大模型推理服务的显存管理:它的核心是把 KV Cache 按固定大小的 block 管理,逻辑连续、物理离散,用 block table 做映射,因此不必为每个请求按最大长度预留连续显存,内部碎片从「预留没用满」变成「最后一个 block 的零头」,同时支持写时复制式的前缀共享。结果是显存利用率大幅提升、并发 batch 变大、吞吐上去,并且长序列请求不再容易被显存挤掉。要能说清边界:它优化的是显存管理效率,不减少单个 token 的 KV 理论开销;序列真正超过上下文上限时,仍然要靠稀疏注意力、量化或滑窗等方案。