利用自己构建的agent总结的算法面试八股,会从机器学习,深度学习一直到大语言模型,多模态大模型,llm发展到现在,在这个领域已经基本没有幻觉现象了,是个不错的复习手段。持续更新...
1. 偏差 (Bias) 与方差 (Variance)
问题: 请解释机器学习中的偏差与方差,以及它们与欠拟合、过拟合的关系。
答案:
- 偏差 (Bias) :度量了模型的期望预测与真实结果的偏离程度,刻画了算法本身的拟合能力。偏差高意味着模型无法捕捉数据中的规律,导致欠拟合 (Underfitting)。
- 方差 (Variance) :度量了同样大小的训练集的变动所导致的学习性能的变化,刻画了数据扰动对模型的影响。方差高意味着模型对训练集中的随机噪声过于敏感,导致过拟合 (Overfitting)。
- 关系 :泛化误差 = 偏差2^22 + 方差 + 噪声。训练初期偏差高、方差低;随着训练加深,偏差降低、方差升高。
面试官视角:
"除了概念,你不仅要会画出那张经典的靶心图,还要知道:集成学习中的 Bagging (如随机森林) 主要是为了降低方差,而 Boosting (如 GBDT/XGBoost) 主要是为了降低偏差。"
2. L1 与 L2 正则化
问题: L1 和 L2 正则化有什么区别?从贝叶斯角度如何解释?
答案:
- L1 正则化 (Lasso) :权重的绝对值之和 (λ∑∣wi∣\lambda \sum |w_i|λ∑∣wi∣)。它倾向于让权重变为 0,从而产生稀疏解,常用于特征选择。
- L2 正则化 (Ridge) :权重的平方和 (λ∑wi2\lambda \sum w_i^2λ∑wi2)。它倾向于让权重普遍变小且分布平滑,防止单个特征权重过大,提升模型泛化能力。
- 贝叶斯解释 :L1 相当于为参数引入了 拉普拉斯分布 (Laplace) 的先验;L2 相当于引入了 高斯分布 (Gaussian) 的先验。
面试官视角:
"如果问你为什么 L1 产生稀疏解?除了直观的等高线切点解释外,更硬核的回答是 L1 在 0 点处不可导,且其梯度在非 0 处是常数,优化时更容易'卡'在坐标轴上。"
3. 梯度消失与梯度爆炸
问题: 什么是梯度消失和梯度爆炸?产生原因是什么?如何解决?
答案:
- 现象:在深层网络反向传播中,梯度通过链式法则不断连乘。如果连乘的因子大部分小于 1,梯度趋近于 0 (消失);如果大于 1,梯度指数级增长 (爆炸)。
- 原因:网络过深;初始化不当;激活函数选择不当 (如 Sigmoid 导数最大值为 0.25,多层叠加极易消失)。
- 解决 :
- 更换激活函数 (ReLU, Leaky ReLU)。
- Batch Normalization (BN)。
- 残差结构 (ResNet)。
- 梯度剪裁 (Gradient Clipping,主要针对爆炸)。
- 合理的初始化 (Xavier, Kaiming)。
面试官视角:
"你需要特别指出,LSTM 结构中的遗忘门设计,在一定程度上也是为了缓解长序列中的梯度消失问题。"
4. 激活函数:Sigmoid, Tanh, ReLU
问题: 简述 Sigmoid、Tanh 和 ReLU 的优缺点。
答案:
- Sigmoid :输出 (0,1)(0, 1)(0,1)。缺点:存在梯度消失;输出非零均值 (Non-zero centered);计算涉及指数,开销大。
- Tanh :输出 (−1,1)(-1, 1)(−1,1),解决了零均值问题。缺点:仍存在梯度消失。
- ReLU :max(0,x)max(0, x)max(0,x)。优点 :正区间不饱和,解决梯度消失;计算简单;收敛快。缺点:Dead ReLU 问题 (负区间梯度为 0,神经元可能永久失活)。
面试官视角:
"如果问到 Swish 或 GeLU,你要知道它们是 ReLU 的平滑版本。特别是 GeLU 在 Transformer 中的应用,因为它引入了随机正则化的思想 (由输入值大小决定激活概率)。"
5. 批归一化 (Batch Normalization, BN)
问题: BN 的原理是什么?为什么它能加速训练?
答案:
- 原理 :在每一层的激活函数之前,对 mini-batch 的数据进行归一化 (减均值除标准差),并引入可学习参数 γ\gammaγ 和 β\betaβ 进行缩放和平移,以保留网络的表达能力。
- 作用 :
- 缓解梯度消失/爆炸,允许使用更大的学习率。
- 减少对初始化的依赖。
- 有轻微的正则化效果 (因为均值方差是基于 batch 计算的,引入了噪声)。
- 解决 Internal Covariate Shift (内部协变量偏移) 问题。
面试官视角:
"关键追问:测试/推理 (Inference) 阶段的均值和方差怎么来?答案是:训练阶段通过移动平均 (Running Average) 记录下的全局均值和方差,而不是用测试 batch 计算。"
6. 层归一化 (Layer Normalization, LN)
问题: BN 和 LN 有什么区别?为什么 Transformer/RNN 常用 LN?
答案:
- 区别 :BN 是在 Batch 维度上,对同一个特征通道进行归一化 (纵向);LN 是在 Sample 维度上,对单个样本的所有特征进行归一化 (横向)。
- 适用性:BN 依赖 Batch Size,且对于变长序列 (RNN/NLP) 处理困难。LN 不依赖 Batch Size,对单个样本独立计算,非常适合序列长度不定的 NLP 任务 (如 Transformer)。
面试官视角:
"可以用一句话总结:CV 任务(图像特征相对固定)多用 BN,NLP 任务(序列变长、Batch Size 较小)多用 LN。"
7. 交叉熵损失 (Cross Entropy)
问题: 为什么分类任务常用交叉熵而不是均方误差 (MSE)?
答案:
- 梯度角度 :搭配 Sigmoid/Softmax 时,使用 MSE 会导致梯度中包含 sigmoid′(z)sigmoid'(z)sigmoid′(z) 项,当输出接近 0 或 1 时导数趋近 0,导致梯度消失,收敛极慢。而交叉熵求导后,分母项与 sigmoid′(z)sigmoid'(z)sigmoid′(z) 抵消,梯度呈线性,收敛更快。
- 概率角度:最小化交叉熵等价于最大化最大似然估计 (MLE)。
面试官视角:
"这里需要推导一下 Softmax + Cross Entropy 的反向传播梯度,结果非常简洁,就是 Pred−LabelPred - LabelPred−Label。这是必须掌握的'肌肉记忆'。"
8. 反向传播 (Backpropagation)
问题: 用最简练的语言描述反向传播算法。
答案:
反向传播是链式法则 (Chain Rule) 在计算图中的应用。它包含两个阶段:
- 前向传播:输入数据,经过层层计算得到预测值和 Loss。
- 反向传播:从 Loss 开始,根据链式法则计算 Loss 对每个参数的偏导数 (梯度),并利用梯度下降法更新参数。本质是将误差信号从输出端反向传递到输入端。
面试官视角:
"不要只背定义。面试中可能会让你手推一个简单的 Linear -> ReLU -> Linear 的反向传播过程,考察矩阵维度的匹配。"
9. 感受野 (Receptive Field)
问题: 什么是 CNN 中的感受野?如何计算?
答案:
- 定义:卷积神经网络中,特征图 (Feature Map) 上的一点对应输入图像上像素点的区域大小。
- 计算 :从后向前推导。RFl−1=(RFl−1)×stride+kernel_sizeRF_{l-1} = (RF_l - 1) \times \text{stride} + \text{kernel\_size}RFl−1=(RFl−1)×stride+kernel_size。
- 意义:感受野越大,能捕捉的上下文信息越多;感受野越小,越关注局部细节。
面试官视角:
"这是目标检测 (Object Detection) 面试的必考题。Dilated Convolution (空洞卷积) 的作用就是为了在不增加参数量的情况下扩大感受野。"
10. 过拟合的解决方法汇总
问题: 列举 5 种以上防止过拟合的方法。
答案:
- 增加数据量 (数据增强 Data Augmentation)。
- 正则化 (L1, L2 Regularization)。
- Dropout (随机失活)。
- Early Stopping (早停法)。
- 简化模型 (减少层数、减少参数)。
- Batch Normalization (轻微正则效果)。
- 集成学习 (Ensemble Methods)。
面试官视角:
"这道题是'送分题',但要答得全面。可以补充一点:在 LLM 时代,高质量的数据清洗也是防止模型'死记硬背'(过拟合) 噪声的重要手段。"
11. 优化器演变史 (SGD 到 Adam)
问题: 简述 SGD、Momentum、RMSprop 和 Adam 的区别与演进逻辑。
答案:
- SGD (随机梯度下降):每次随机抽取一个 batch 计算梯度更新。缺点是更新方向震荡,容易陷入局部极小值或鞍点。
- Momentum (动量法) :引入"惯性"概念,当前的更新方向不仅取决于当前梯度,还保留了历史更新方向的加权。即 vt=γvt−1+η∇J(θ)v_t = \gamma v_{t-1} + \eta \nabla J(\theta)vt=γvt−1+η∇J(θ)。这有助于在梯度方向一致时加速,震荡时抑制。
- RMSprop:引入"自适应学习率"。通过累积历史梯度的平方项,对不同参数的学习率进行动态调整(梯度大的参数学习率减小,梯度小的参数学习率增大)。
- Adam (Adaptive Moment Estimation):结合了 Momentum (一阶动量) 和 RMSprop (二阶动量) 的优点。它既有惯性,又能自适应调整学习率,是目前最通用的优化器。
面试官视角:
"很多同学只知道 Adam 好用。但在 NLP 的大模型预训练(如 BERT/GPT)中,早期的 Adam 有一个严重的权重衰减(Weight Decay)实现错误,这引出了下一个必须掌握的问题:AdamW。"
12. Adam 与 AdamW 的区别
问题: 为什么现在的大模型训练(如 LLaMA, BERT)都推荐使用 AdamW 而不是 Adam?
答案:
- 问题根源:在标准的 Adam 实现中,L2 正则化通常被实现为直接加在 Loss 函数上的罚项。然而,对于自适应学习率算法(如 Adam),由于学习率会根据梯度大小调整,直接加在 Loss 上的 L2 正则化项也会受到自适应学习率的影响,导致正则化效果不均匀、不纯粹。
- AdamW 的改进 :解耦权重衰减 (Decoupled Weight Decay) 。AdamW 将权重衰减项从梯度更新过程中独立出来,直接在参数更新的最后一步对权重进行衰减(w=w−ηλww = w - \eta \lambda ww=w−ηλw),而不混合在梯度的自适应计算中。
- 结论:AdamW 在深层网络和 Transformer 结构中泛化性能更好。
面试官视角:
"一句话总结:AdamW 修复了 Adam 在 L2 正则化实现上的数学逻辑缺陷。这是训练 Transformer 的标配。"
13. 参数初始化 (Xavier vs. Kaiming)
问题: 为什么需要特定的参数初始化?Xavier 和 Kaiming 初始化有什么区别?
答案:
- 目的 :为了保持网络各层的激活值方差 和梯度方差在传播过程中保持一致,防止梯度消失或爆炸。
- Xavier (Glorot) 初始化:假设激活函数是线性的(或用于 Sigmoid/Tanh)。它通过保持输入和输出的方差一致来推导标准差。适用于 Sigmoid/Tanh。
- Kaiming (He) 初始化 :专门针对 ReLU 及其变体设计。因为 ReLU 会将一半的输入置为 0,导致方差减半,所以 Kaiming 初始化在方差推导中引入了一个系数 2 来补偿这种方差损失。
面试官视角:
"如果你用 ReLU 激活函数却配了 Xavier 初始化,深层网络大概率训练不动(梯度迅速消失)。这是非常基础的'配置错误'。"
14. Dropout 的训练与推理
问题: Dropout 在训练和推理阶段有什么不同?为什么要进行缩放?
答案:
- 机制 :在训练时,以概率 ppp 随机将神经元的输出置为 0。
- 训练与推理的差异 :
- 训练时 :激活的神经元输出通常会除以 (1−p)(1-p)(1−p),这叫做 Inverted Dropout。
- 推理时:所有神经元都参与计算,不做任何丢弃,也不需要做额外的数值缩放。
- 为什么要除以 (1−p)(1-p)(1−p) :为了保持训练和推理阶段神经元输出的期望值一致 。如果在训练时丢弃了 ppp 的能量,剩余神经元的数值就需要放大,以弥补丢失的能量。
面试官视角:
"追问:BN (Batch Normalization) 和 Dropout 一起用会有什么问题?答:通常不建议混用或需谨慎调整顺序,因为 Dropout 引入的随机噪声会干扰 BN 对均值和方差的统计,导致训练/推理表现不一致(Variance Shift)。"
15. 学习率策略 (Warmup & Cosine Decay)
问题: 什么是 Warmup?为什么 Transformer 类模型训练必须用 Warmup?
答案:
- Warmup (预热):在训练开始阶段,将学习率从 0 缓慢线性增加到预设的初始学习率,然后再开始下降。
- 必要性 :
- 稳定初期梯度:训练初期,模型参数是随机初始化的,梯度非常不稳定且很大。如果一开始就用大学习率,模型容易震荡甚至发散。
- 避免过早过拟合:让模型先缓慢熟悉数据分布。
- Cosine Decay:预热结束后,学习率按照余弦函数曲线下降。相比阶梯式下降 (Step Decay),它更加平滑,通常能获得更好的收敛精度。
面试官视角:
"在大模型预训练中,Warmup 阶段的数据量通常占总 steps 的 1% - 5%。这是一个经验值。"
16. 1x1 卷积的作用
问题: 1x1 卷积核看似没有提取空间特征,它有什么作用?
答案:
- 升维/降维 (通道数变换):在不改变特征图尺寸 (H, W) 的前提下,改变通道数 ©。这是 Inception 网络和 ResNet 中减少参数量、降低计算成本的关键。
- 增加非线性:1x1 卷积后通常紧跟激活函数 (ReLU),在不损失分辨率的情况下增加了网络的非线性表达能力。
- 跨通道信息交互:实现了不同 Channel 之间的线性组合(全连接)。
面试官视角:
"提到 1x1 卷积,一定要联想到 Network in Network 思想,以及它在 Bottleneck (瓶颈结构) 中的核心地位。"
17. 类别不平衡处理 (Class Imbalance)
问题: 训练数据中正负样本比例严重失衡(如 1:1000),如何处理?
答案:
- 数据层面 :
- 欠采样 (Undersampling):减少多数类样本(容易丢失信息)。
- 过采样 (Oversampling):重复少数类样本(容易过拟合),或使用 SMOTE 生成插值样本。
- 算法/Loss 层面 :
- 加权 Loss:在 Cross Entropy 中为少数类样本赋予更大的权重。
- Focal Loss :FL(pt)=−α(1−pt)γlog(pt)FL(p_t) = -\alpha (1-p_t)^\gamma \log(p_t)FL(pt)=−α(1−pt)γlog(pt)。通过增加 γ\gammaγ 因子,降低简单样本(ptp_tpt 大)的权重,迫使模型专注于难分样本。
面试官视角:
"Focal Loss 最初是为目标检测(RetinaNet)提出的,用以解决前景(少)背景(多)的极端不平衡。它在多分类任务中同样有效。"
18. Pre-Norm 与 Post-Norm
问题: 在 Transformer 结构中,Pre-Norm 和 Post-Norm 有什么区别?为什么大模型(如 GPT-3, LLaMA)偏爱 Pre-Norm?
答案:
- Post-Norm (原始 BERT/Transformer):
Output = Norm(Residual + SubLayer(Input))。归一化放在残差连接之后。优点 :理论上限高;缺点:梯度在反向传播时容易在深层消失,训练难收敛,需要精心设计的 Warmup。 - Pre-Norm (GPT 系列):
Output = Input + SubLayer(Norm(Input))。归一化放在子层输入之前,残差连接在最后,是一条"直通大道"。优点 :训练极其稳定,梯度可以顺畅地流到每一层;缺点:在同等层数下,效果可能略微逊色于精调的 Post-Norm。 - 趋势 :为了训练超深网络和保证稳定性,LLM 几乎全员转向 Pre-Norm(或 RMSNorm)。
面试官视角:
"DeepNorm 是一种试图结合两者优点的尝试,但在目前的开源大模型实战中,RMSNorm + Pre-Norm 是主流组合。"
19. 训练 Loss 出现 NaN (Not a Number) 的原因
问题: 训练过程中 Loss 突然变成 NaN,可能的原因有哪些?
答案:
- 梯度爆炸:学习率太大,或者未做梯度剪裁 (Gradient Clipping)。
- 除以零 :比如在 BN 层或某些涉及除法的操作中,分母 ϵ\epsilonϵ 设置得太小。
- 脏数据:训练集中存在坏点(例如值为 Infinity 或 NaN 的输入)。
- Log(0) :交叉熵损失中,预测概率 ppp 极度接近 0,导致 log(p)\log(p)log(p) 趋于负无穷。
面试官视角:
"排查步骤通常是:先把学习率调小 10 倍 -> 检查数据 -> 加上 Gradient Clipping -> 检查自定义的 Loss 层逻辑。这是工程调试的基本素养。"
20. 深度可分离卷积 (Depthwise Separable Conv)
问题: 什么是深度可分离卷积?它为什么能加速?
答案:
- 结构 :将标准卷积分解为两步:
- Depthwise Conv:每个卷积核只负责一个通道,提取空间特征。
- Pointwise Conv (1x1):负责组合不同通道的特征。
- 优势:极大地减少了参数量和计算量 (FLOPs)。
- 应用:MobileNet 系列的核心组件,专为移动端轻量化设计。
面试官视角:
"虽然理论计算量减少了,但在 GPU 上,深度可分离卷积并不一定比标准卷积快,因为它的内存访问(IO)效率较低。这是理论 FLOPs 与实际 Latency 的差异。"