1. 请介绍梯度下降的几种变体,以及各自的优缺点
回答思路:这是百度算法岗经典基础题,要对比BGD/SGD/Mini-batch GD,并说明Adam等自适应优化器的原理。
- 三种基础形式:批量梯度下降、随机梯度下降、Mini-batch梯度下降。
- 动量方法:Momentum,解决梯度方向震荡问题。
- 自适应学习率:AdaGrad、RMSProp、Adam,重点说Adam。
- 实际使用建议:什么场景用什么优化器。
回答示例:
- 批量梯度下降(BGD):每次更新使用全部训练数据计算梯度。优点是梯度方向准确,收敛稳定;缺点是计算开销巨大,数据量大时无法实际使用。
- 随机梯度下降(SGD):每次只用一个样本计算梯度。优点是更新快,能逃离局部最优;缺点是梯度方向噪声大,收敛路径震荡明显,需要精心调节学习率。
- Mini-batch梯度下降:折中方案,每次用小批量数据(如32/64/128条)计算梯度。目前深度学习训练的标准方法,兼顾计算效率和梯度稳定性。
- Adam(Adaptive Moment Estimation):结合了Momentum(利用历史梯度方向)和RMSProp(自适应调整各参数学习率)两者的优点:
- 维护梯度的一阶矩(均值)和二阶矩(未中心化方差)的指数移动平均;
- 对每个参数独立调整学习率;
- 在大多数任务上收敛快、调参容忍度高。 实践建议:默认用Adam(lr=1e-3, β1=0.9, β2=0.999),如果追求极致泛化性能(如ImageNet benchmark)可切换到带momentum的SGD,需要更精细调学习率。
2. Transformer的注意力机制是如何工作的?
回答思路:百度AI岗必考题,要从公式层面解释清楚Self-Attention,并说明Multi-Head的作用。
- Self-Attention计算流程:Q/K/V矩阵 → 点积 → Scale → Softmax → 加权求和。
- 为什么要Scale(除以√d_k):防止点积结果过大导致Softmax梯度消失。
- Multi-Head的作用:让模型在不同子空间学习不同维度的注意力关系。
- 与RNN的核心区别:并行计算、全局依赖(不受序列长度限制)。
回答示例: Self-Attention的计算过程如下: 给定输入序列X,通过三个可学习矩阵Wq/Wk/Wv线性变换得到Q(Query)、K(Key)、V(Value): Attention(Q, K, V) = Softmax(QK^T / √d_k) × V 具体步骤:
- 计算Q和所有K的点积,得到每个位置对其他位置的"注意力得分矩阵";
- 除以√d_k(维度的平方根)进行缩放,防止d_k较大时点积值过大导致Softmax函数进入梯度饱和区;
- 对每行做Softmax归一化,得到注意力权重(每行之和为1);
- 用注意力权重对V做加权求和,得到每个位置的输出表示。 Multi-Head Attention将Q/K/V分别投影到h个不同的低维子空间,在每个子空间独立计算Attention,最后将h个结果拼接并线性变换。这样模型可以同时关注不同位置的不同语义特征(比如一个头关注语法关系,另一个关注语义相似性)。 相比RNN,Transformer的核心优势是:每个位置都可以直接与序列中所有其他位置交互(全局感受野),且所有位置的计算可以完全并行,大幅提升了训练效率。
3. 如何处理机器学习中的类别不平衡问题?
回答思路:百度推荐/风控场景下类别不平衡极为常见(正负样本可能达到1:100),要给出多个层面的解决方案。
- 数据层面:过采样(SMOTE)、欠采样、生成对抗网络(GAN)。
- 算法层面:class_weight调整、Focal Loss。
- 评估层面:不能只看Accuracy,要用AUC/F1/精确率召回率曲线。
- 业务层面:根据误报代价调整决策阈值。
回答示例: 以广告点击率预估为例,CTR通常在1%-3%,正负样本比约1:50。 数据层面:
- 过采样:SMOTE(合成少数类过采样)在少数类样本之间插值生成新样本,比简单复制更有效;
- 欠采样:随机去除部分多数类样本,适合数据量很大时使用,但会损失信息;
- 负采样:深度学习场景常用,以固定比例(如1:4)随机保留负样本,同时用sample_weight修正偏差。 算法层面:
- class_weight:在sklearn或PyTorch的损失函数中设置类别权重,自动加大少数类样本的梯度贡献;
- Focal Loss:Facebook提出,通过(1-pt)^γ因子降低易分类样本(大量负样本)的损失权重,让模型专注于难分类的正样本。 评估层面: 不能只看Accuracy(全预测为负类也能达到99%准确率)。正确使用:AUC-ROC(衡量整体排序能力)、PR曲线(查准-查全权衡)、F1-score(综合精确率和召回率)。
4. 你的毕业设计/项目中用到了哪些模型?遇到了什么挑战?
回答思路:百度非常重视项目实战深度,要展示你对模型选择的思考过程,而不只是"用了BERT"。
- 问题定义:什么任务、数据规模、评估指标。
- 模型选择:为什么选这个模型,对比了哪些备选方案。
- 遇到的挑战:过拟合/数据噪声/推理速度等。
- 解决方案:具体技术手段。
- 结果:量化指标提升。
回答示例: 我的毕业设计是一个中文医疗问答系统,任务是对患者提问做意图识别(分为问药、问症状、问医院等8个类别)。 模型选择:初版用TextCNN,F1约82%;后来换用预训练的BERT-base-chinese,迁移学习后F1提升到91.3%。但BERT推理延迟达230ms/条,不满足实时响应需求。 挑战与解决:
- 推理速度:用知识蒸馏将BERT压缩为6层DistilBERT,推理速度提升3倍(降至75ms),F1仅下降0.8%(90.5%);
- 领域词汇缺失:医疗专业词(如"阿托伐他汀")在通用BERT词典中被切成碎片,导致理解偏差。解决方案:在词表中增加医疗术语,并用医疗语料(CHIP数据集)对BERT做二次预训练;
- 数据不平衡:8个类别样本量差异大(最多10000条 vs 最少500条)。使用Focal Loss + 对少数类做back-translation数据增强,各类F1均衡度提升明显。
5. 为什么想来百度,你对百度文心大模型有什么了解?
回答思路:这道题考察你对百度技术战略的认知,要展示真实研究,不能只说"百度是AI公司"。
- 技术认知:文心大模型的技术特点(ERNIE系列演进、知识增强)。
- 产品认知:文心一言、百度搜索AI化的实际体验。
- 个人契合点:你的方向如何与百度的技术战略匹配。
回答示例: 我对百度文心大模型的认知主要有几个维度: 技术层面:文心大模型基于ERNIE(Enhanced Representation through kNowledge IntEgration)系列,从早期的ERNIE 1.0通过知识图谱增强预训练,到文心3.5/4.0引入RLHF人类反馈对齐,在中文理解和生成任务上有明显的本地化优势,尤其在中文逻辑推理和文化常识上表现优于部分通用英文模型。 产品层面:我深度使用过文心一言,感受最深的是它对中文语境的理解比较自然,在诗歌创作、商业文案等中文生成任务上有差异化竞争力。百度将大模型能力直接嵌入搜索结果,形成"搜索+生成"的新范式,这是其他模型公司暂时无法复制的流量入口优势。 个人契合:我在毕设中做的医疗NLP工作让我对大模型的垂直领域适配有一定实践积累,百度在医疗AI方向的布局(灵医智惠)与我的研究方向高度契合,希望加入后能在大模型的领域精调和知识增强方向做出贡献。
6. 什么是过拟合?如何防止过拟合?
回答思路:机器学习基础题,百度算法岗几乎必问,要覆盖从数据、模型、训练三个层面的完整防过拟合策略。
- 什么是过拟合:训练误差持续下降但验证误差反而上升,模型记住了噪声而非规律。
- 数据层面:数据增强、更多训练数据。
- 模型层面:减少参数量、使用正则化(L1/L2/Dropout)、集成学习(Bagging)。
- 训练层面:Early Stopping、交叉验证。
回答示例: 过拟合的本质是模型复杂度超过了数据所能支撑的复杂度——模型不仅学习了数据中的真实规律,还把噪声(偶然出现的个别样本的特征)也记住了。 防止过拟合的方法:
- 数据增强:在图像任务中对图像做旋转/翻转/裁剪/颜色抖动;在NLP中对文本做同义词替换、回译(中文→英文→中文)等,增加训练样本多样性,让模型学到真正的pattern而不是个别样本。
- 正则化:
- L1正则(Lasso):在损失函数中加入|w|项,会将部分权重置零(特征选择),适合特征稀疏的场景;
- L2正则(Ridge):在损失函数中加入w²项,让权重趋近于0但不等于0,适合特征之间存在多重共线性的场景;
- Dropout:训练时随机丢弃一定比例(如20%-50%)的神经元,强迫网络不依赖特定神经元,从而学到更鲁棒的表征。
- 简化模型:减少网络层数/每层神经元数量,用参数量更少的模型(如用BERT-base而非BERT-large)。
- Early Stopping:监控验证集误差,当验证误差连续N个epoch不再下降时停止训练,避免训练过度。
- 集成学习(Bagging):训练多个模型的平均值,减少单一模型的方差。对抗过拟合最经典的方法之一。
7. 算法题:手写一个Top-K问题(海量数据找最大的K个数)
回答思路:百度算法岗高频题,海量数据场景要展示数据无法全部加载到内存的解决方案。
- 小数据量:排序取前K,O(n log n)。
- 大数据量:小顶堆,O(n log K)。
- 海量数据(单机内存不够):分治 + 堆,先对每个文件局部排序,再归并。
- 分布式场景:MapReduce,Map阶段输出局部Top-K,Reduce阶段合并。
【回答示例】 // 内存充足时:小顶堆,O(n log k)
public int[] topK(int[] nums, int k) {
PriorityQueue<Integer> minHeap = new PriorityQueue<>(k);
for (int num : nums) {
minHeap.offer(num);
if (minHeap.size() > k) minHeap.poll();
}
int[] result = new int[k];
for (int i = k - 1; i >= 0; i--) {
result[i] = minHeap.poll();
}
return result;
}
海量数据场景(单机内存不足,无法一次加载10亿个整数):
- 分治:将10亿个整数哈希分片到1000个小文件(每个文件约1000万条);
- 局部排序:用小顶堆对每个文件找出各自的Top-K(每个文件1000万数 → 取1000个最大值),结果写入1000个文件;
- 归并:将1000个局部Top-K文件合并,用堆选出全局Top-K。 时间复杂度:O(N)(遍历一次)→ O(N log K)(局部排序)→ O(K log 1000)(最终归并)。
8. 介绍一下CNN中卷积层、池化层和全连接层的作用
【回答思路】 计算机视觉基础题,CNN三大组件各自的功能是理解深度学习视觉模型的基础。
- 卷积层:局部感受野 + 参数共享,提取局部特征(边缘/纹理/形状)。
- 池化层:降低特征图尺寸,增强平移不变性(Max Pooling/Avg Pooling)。
- 全连接层:将分布式特征映射到样本标记空间,做最终的分类/回归。
- 现代趋势:用Global Average Pooling替代FC减少过拟合,Vision Transformer逐步替代CNN。
【回答示例】 卷积层(Conv Layer): 卷积核(Filter)在输入特征图上滑动,每滑动一步(步长stride)做一次局部内积运算,输出一个特征值。 核心特性: • 局部感受野:每个神经元只连接上一层的局部区域(如3×3或5×5),模拟人类视觉皮层的局部感知特性; • 参数共享:同一个卷积核的参数在整个特征图上共享,大幅减少参数量(如无参数共享,全连接层需要输入通道×输出通道×kernel_size²); • 层次性:浅层卷积提取低级特征(边缘、角点),深层卷积提取高级语义特征(物体部件、整体)。
池化层(Pooling Layer): 对特征图做降采样,常用Max Pooling(取区域内最大值)和Average Pooling(取均值)。 作用: • 降低特征图尺寸,减少后续层的计算量; • 增强对平移、旋转的不变性(图像平移几个像素,最大值位置可能不变); • 抽象特征,降低过拟合风险。
全连接层(FC Layer): 将前面卷积/池化提取的分布式特征压缩为统一的特征向量,通过矩阵乘法映射到输出空间(如分类的类别数)。是分类器的"最后一击"。现代CNN倾向于用Global Average Pooling替代FC,减少过拟合。
9. 你对大模型(LLM)的幻觉问题怎么看?有哪些缓解方法?
【回答思路】 百度是AI大模型公司,对LLM的理解是百度算法岗的必要知识,幻觉问题是当前最活跃的研究方向。
- 什么是幻觉:LLM生成的内容看似流畅合理,但包含事实错误或无中生有。
- 幻觉来源:训练数据偏差、知识截止日期、长尾知识缺失、概率采样的随机性。
- 缓解方法:RAG(检索增强生成)、事实链验证链(CoT+Fact Check)、减少Temperature/Top-p。
- 百度的实践:结合百度搜索/百科知识库的RAG路线。
【回答示例】 大模型幻觉(Hallucination)的根源是:LLM本质是"高级的概率补全器",它生成的是"最像真话的话",而不是"事实上的真话"。
幻觉产生的原因:
- 知识陈旧:模型的训练数据有截止日期,无法知道训练之后发生的事件(如你问今天的天气,模型必须承认不知道);
- 长尾知识缺失:常识和常见知识在训练语料中出现频率高,模型学得好;但医学、法律等长尾专业领域,模型记忆模糊,容易捏造细节;
- 概率采样:生成时用Temperature采样,即使top-1答案正确,调整高Temperature也可能选中错误答案。
缓解方法:
- RAG(检索增强生成)(最有效):将用户问题先检索百度搜索/百科的知识库,将检索到的相关段落作为Context注入Prompt,让模型"照着证据说话",而不是凭空生成。百度的文心一言就采用了搜索+RAG的技术路线。
- 思维链验证(Chain-of-Thought + Fact Check):先用CoT让模型分步推理,在推理过程中主动要求模型标注每个陈述的"置信度"和"依据",对低置信度段落触发检索验证。
- 采样参数调整:在需要精确回答的场景,降低Temperature(如0.1-0.3),让模型更倾向于选择最高概率答案;在创意写作场景才使用高Temperature。
10. 手撕算法题:二叉树的最近公共祖先(LCA)
【回答思路】 百度算法岗高频经典题,递归和迭代两种方法都要掌握。
- 递归法:从根向下递归,如果当前节点等于p或q则返回当前节点;左右子树返回值都不为空则当前节点是LCA。
- 进阶:如果需要支持父节点指针(带parent指针的树),可以用Set记录路径再找交点。
【回答示例】
// 递归法,时间复杂度 O(n),每个节点最多访问一次
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
// 递归终止条件:找到目标节点或到达空节点
if (root == null || root == p || root == q) return root;
// 在左右子树中分别查找
TreeNode left = lowestCommonAncestor(root.left, p, q);
TreeNode right = lowestCommonAncestor(root.right, p, q);
// 左右子树都有返回值,说明p和q分别在左右子树,当前节点是LCA
if (left != null && right != null) return root;
// 只有一边有返回值,说明p和q都在这一侧
return left != null ? left : right;
}
// 进阶版(带parent指针的树)
public TreeNode lowestCommonAncestorWithParent(TreeNode p, TreeNode q) {
Set<TreeNode> path = new HashSet<>();
// p向上遍历,记录所有祖先
while (p != null) {
path.add(p);
p = p.parent;
}
// q向上遍历,第一个已在path中的节点就是LCA
while (q != null) {
if (path.contains(q)) return q;
q = q.parent;
}
return null;
}
🆗 准备好了吗?