拼多多9.19线下面经:大模型算法一面到主管面
- 轮次
- 一面+二面+HR面+主管面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
一面
- 主要问实习项目,然后讲了一下论文。
- 手撕:给一个长度为 n 的数组,找出一个三元组满足
i < j < k且a[i] < a[j] < a[k],要求时间复杂度 O(n)、空间复杂度 O(1)。
二面
- 实习项目 + 论文
- LoRA 的 alpha、rank 分别是什么含义?
- VLM 中减少 vision token 的方法有哪些?
- 介绍一下 Qwen-VL 系列的位置编码。
- Qwen3.6 没有使用 DeepStack 的原因是什么?
- adapter 采用 MLP 和 Q-Former 的区别?为什么 MLP 成为主流?
- 手撕:搜索旋转排序数组。
HR 面
- 实习情况、家庭、薪资、为什么选择拼多多等。
主管面
- 介绍实习项目
- 手撕:给了 n 堆黄金,每堆黄金有一个价值 vi,要求把这 n 堆分成两部分,使得最后这两部分的总价值差值最小。
《参考解析》
递增三元组的 O(n) 时间、O(1) 空间解法:不需要额外数组,只维护两个变量——first 记录当前遇到的最小值,second 记录已找到的「最小的递增对」的第二个值。遍历数组时:若 x > second,说明找到了完整三元组,直接返回 true;否则若 x > first,更新 second = x;否则更新 first = x。直觉是贪心地压低候选值,为后面留最大空间(力扣 334 递增的三元子序列)。要注意题干是否要求严格递增(用 > 而不是 >=),以及等值元素的处理。如果面试官进一步要求「输出三元组的下标」,O(1) 空间就做不到了(至少要记住 first 的位置),这时要主动说明并给出 O(1) 判断存在性 + O(n) 记录方案的取舍。
LoRA 的 rank 与 alpha:LoRA 冻结原权重 W,旁路两个低秩矩阵 B(d×r)、A(r×k),前向变成 h = Wx + (α/r)·BAx。rank r 决定可训练参数量与表达能力——r 越大越接近全量微调,也越容易过拟合,常见取值 8/16/32/64,注意力层的 q、v 通常给得比 k、o 大。α 是缩放系数,α/r 相当于给 LoRA 分支的学习率做缩放,所以调 α 与调学习率高度耦合;实践中常见做法是固定 r 调 α,或直接设 α = r、α = 2r。初始化上 A 用高斯、B 置零,保证训练起点与原模型完全等价;推理时可以把 BA merge 回 W,做到零额外延迟。顺带可以提 target_modules 选择、lora_dropout、以及多套 LoRA 热切换的工程价值。
VLM 中减少 vision token 的方法:① 结构型压缩——Q-Former/Resampler 用固定数量的可学习 query 通过 cross-attention 抽取视觉信息(BLIP-2 路线),token 数变成常数;② 池化型——平均池化、pixel shuffle(把 2×2 相邻 patch 拼到通道维)、token merge(按相似度合并冗余 token);③ 剪枝型——按注意力权重或特征相似度丢弃不重要 token;④ 输入侧——动态分辨率与自适应切图(AnyRes),只在关键区域保留高分辨率;⑤ 编码器侧——加大 patch size、用分层下采样、只取 ViT 部分层输出。压缩率越高,OCR、小目标、细粒度定位的损失越大,所以选型要按任务定,并在评测集上验证不是「压了就完事」。
Qwen-VL 系列的位置编码:早期 Qwen-VL 把图像切 patch 后展平,与文本 token 拼成一条序列,用可学习的位置编码 + 绝对位置来标记。Qwen2-VL 之后换成了 M-RoPE(多模态旋转位置编码),把位置拆成时间、高度、宽度三个分量:文本 token 三个分量共用同一个位置值,图像 token 的高度/宽度分量按 patch 在网格中的 (h, w) 给出,时间分量用于视频帧。这样模型能显式感知二维空间结构,并且对任意分辨率有更好的外推能力,文本与图像拼接处的序号仍然连续。回答时最好点出「为什么需要二维位置」——一维展平会破坏图像的邻接关系,影响定位与文档理解。
Qwen3.6 为什么不用 DeepStack:DeepStack 的思路是取 ViT 不同深度的多层特征,分别注入 LLM 的不同层,用来增强细粒度视觉理解。不采用它的可能理由是:多层特征拼接会显著拉长视觉序列,注意力开销随长度平方增长,训练与推理成本都高;跨模块对齐让训练更复杂、更不稳定;而在视觉编码器更强、原生动态分辨率方案成熟的条件下,这部分收益与代价不成比例。答这题的正确姿势是承认这是模型设计的取舍,说明「加了会换来什么、代价是什么」,而不是替官方下结论——面试官更想听你的分析框架。
MLP adapter 与 Q-Former 的区别:Q-Former 用固定数量的 query 通过 cross-attention 从视觉特征里抽取信息,天然压缩 token 数,并且可以用图文对比 + 生成的多目标任务做对齐(BLIP-2 两阶段),但它结构复杂、query 数量固定形成信息瓶颈、与 LLM 的衔接还需要额外投影,细粒度任务上会丢信息。MLP(线性层或两层 MLP)只做「视觉特征空间 → LLM 词嵌入空间」的投影,结构极简、梯度路径短、训练稳定,配合强视觉编码器和海量图文数据就足以对齐,且天然支持任意分辨率、多图与视频帧(token 数随输入可变)。LLaVA 一脉因此成为主流。补充一句:当 token 预算紧、需要固定长度表征(如检索式任务)时,Q-Former 仍有价值。
搜索旋转排序数组:二分的核心是每轮先判断哪一半是有序的:若 nums[l] <= nums[mid],则 [l, mid] 有序,检查 target 是否落在 [nums[l], nums[mid]) 内决定收缩哪一侧;否则 [mid, r] 有序,同理处理。O(log n),用闭区间写法(while l <= r)边界最不容易错。如果数组允许重复元素(力扣 81),当 nums[l] == nums[mid] == nums[r] 时无法判断哪侧有序,只能 l++、r-- 退化,最坏 O(n)。
黄金分堆(两部分价值差最小):这是子集和/划分问题——设总和为 S,等价于找一个子集和尽量接近 S/2,答案即 |S − 2 × 子集和|。做法取决于数据规模:n 小且 vi 不大时用 0/1 背包 dp[和] 布尔或 bitset,O(n·S);n ≤ 40 且 vi 很大时用 meet-in-the-middle,把 n 堆分成两半各枚举子集和(各 2^(n/2)),排序后双指针找最接近 S/2 的组合,O(2^(n/2) log);vi 是浮点数或超大(超过 1e18)时是 NP-hard,只能近似(贪心 + 局部交换)。面试里先问清 n 与 vi 的范围再选方案,这题考的正是分类讨论而不是背模板。