AI算法工程师面试宝典【机器学习基础和深度学习剖析】【第二部分】

文章目录
【AI算法工程师面试宝典】
前言
在AI算法工程师的面试中,基础能力模块(数学+编程)决定了你能否通过初筛,而核心算法模块则决定了你能否拿到最终的offer。这一轮面试官通常是组里的技术骨干或leader,他们会深挖你对模型的理解——从损失函数到梯度更新,从评价指标到工程优化。
不同岗位的侧重点不同:机器学习岗看重GBDT/XGBoost和特征工程,CV岗必问YOLO/ResNet,NLP岗绕不开BERT/Transformer,推荐系统岗则偏好DeepFM/冷启动。但机器学习基础是所有方向的必考内容,无论你面什么岗位,逻辑回归、决策树、AUC、过拟合处理都是躲不开的。
本章将分为三个部分:机器学习基础(全方向必考)、深度学习基础(大厂算法岗核心)、方向细分模块(按岗位侧重),每个高频考题都配有核心答案和可运行的代码示例。
二、核心算法模块(核心考察项,分方向侧重)
1. 机器学习基础(所有方向必考,大厂重点深挖)
模型基础
监督学习
线性回归(Linear Regression):假设因变量与自变量呈线性关系,损失函数为均方误差MSE,闭式解为w = (X^T X)^{-1} X^T y。适用于连续值预测。
逻辑回归(Logistic Regression):虽然叫回归,实际是分类模型。通过Sigmoid函数将线性输出映射到(0,1)概率区间,损失函数为交叉熵(Binary Cross Entropy)。决策边界是线性的。
决策树(Decision Tree):树形结构,每个内部节点基于某个特征进行分裂。分裂准则:ID3用信息增益,C4.5用信息增益比,CART用基尼系数(分类)或均方误差(回归)。易过拟合,需剪枝。
随机森林(Random Forest):Bagging集成 + 随机特征选择。每棵树用自助采样(bootstrap)生成训练集,分裂时随机选取部分特征。最终结果投票(分类)或平均(回归)。
GBDT(Gradient Boosting Decision Tree):Boosting框架,每棵树拟合前一棵树的负梯度(残差近似)。梯度提升的核心是用损失函数在当前模型下的负梯度作为新的“标签”。
XGBoost:GBDT的工程优化版。引入二阶导数(Hessian)、正则化项(L1+L2)、列抽样、缺失值自动处理、并行化(按特征预排序)。相比GBDT,收敛更快、泛化更强。
LightGBM:基于XGBoost进一步优化。核心改进:单边梯度采样(GOSS) 保留大梯度样本、互斥特征捆绑(EFB) 降维、基于直方图的决策树算法 降低内存和计算量、Leaf-wise生长策略(带深度限制)。训练速度比XGBoost快数倍。
SVM:寻找最大间隔超平面。通过核技巧(RBF、多项式)将数据映射到高维空间解决线性不可分问题。对异常点敏感,适合小样本高维数据。
KNN:惰性学习,预测时计算与k个最近邻的多数投票(分类)或均值(回归)。需归一化,计算复杂度高。
无监督学习
K-Means:基于距离的聚类。步骤:随机选k个中心 → 分配样本到最近中心 → 更新中心 → 重复。缺点:需指定k,对异常值敏感,假设球形簇。用肘部法则或轮廓系数选k。
DBSCAN:基于密度的聚类。无需指定簇数,能识别任意形状簇和噪声点。参数:邻域半径eps和最小样本数min_samples。适用于噪声较多、形状不规则的数据。
层次聚类:自底向上(凝聚)或自顶向下(分裂),输出树状图。复杂度高,适合小数据集。
PCA(主成分分析):无监督降维,投影到方差最大的方向。步骤:中心化 → 协方差矩阵 → 特征值分解 → 取前k个特征向量。线性降维,丢失可解释性。
LDA(线性判别分析):有监督降维,投影后类内方差最小、类间方差最大。常用于分类前的降维。
异常检测:孤立森林(随机划分特征空间,异常点路径更短)、DBSCAN(不属任何簇的点)、One-Class SVM。
半监督学习与强化学习
- 半监督学习:少量标注数据 + 大量未标注数据。常见方法:自训练(伪标签)、协同训练、一致性正则化(如Π-Model)。核心假设:同类样本在特征空间应聚集。
- 强化学习:智能体通过与环境交互学习最优策略。核心要素:状态(S)、动作(A)、奖励®、策略(π)。Q-Learning用Q表记录状态-动作价值,DQN用神经网络替代Q表解决高维状态问题。
高频考题:线性回归与逻辑回归的区别?
| 维度 | 线性回归 | 逻辑回归 |
|---|---|---|
| 输出 | 连续值(-∞, +∞) | 概率(0,1),转化为离散类别 |
| 损失函数 | 均方误差(MSE) | 交叉熵/对数损失 |
| 激活函数 | 无(恒等映射) | Sigmoid |
| 应用 | 房价预测、销售额预测 | 垃圾邮件分类、信用评分 |
| 参数估计 | 最小二乘或梯度下降 | 梯度下降(无闭式解) |
| 假设 | 残差服从正态分布 | 无正态性假设 |
核心回答:线性回归假设因变量与自变量线性相关且误差服从高斯分布,输出连续值;逻辑回归是在线性回归的基础上套上Sigmoid函数,输出可解释为概率,用极大似然估计求解,用于分类任务。
高频考题:决策树的分裂准则(ID3、C4.5、CART)?
| 算法 | 分裂准则 | 公式 | 特点 |
|---|---|---|---|
| ID3 | 信息增益 | Gain(D,A)=H(D)-H(D|A) | 偏向取值多的特征,只能处理离散特征 |
| C4.5 | 信息增益比 | Gain_ratio=Gain/IV(A) | 修正ID3的偏向,可处理连续值(二分) |
| CART(分类) | 基尼系数 | Gini=1-Σp_k² | 二叉树,基尼系数越小越纯 |
| CART(回归) | 均方误差 | MSE=Σ(y_i-ŷ)² | 最小化平方误差 |
核心回答:ID3用信息增益(易偏向多取值特征),C4.5用信息增益比(修正偏向),CART分类用基尼系数(计算更快,二叉树),回归用MSE。CART生成的二叉树在实践中更常用。
高频考题:XGBoost与LightGBM的核心差异及优化点?
核心回答:
- 树生长策略:XGBoost是Level-wise(按层生长,平衡但可能产生冗余节点);LightGBM是Leaf-wise(按叶子生长,降低误差但易过拟合,需限制max_depth)。
- 分裂点搜索:XGBoost预排序+近似分位数;LightGBM基于直方图(连续值离散化到固定bins),内存和计算量大幅降低。
- 采样策略:XGBoost支持行采样和列采样;LightGBM额外引入GOSS(保留大梯度样本,随机丢弃小梯度样本)。
- 特征并行:LightGBM通过EFB捆绑互斥特征,减少维度。
- 类别特征:LightGBM原生支持类别特征(转化为梯度统计量),XGBoost需手动One-Hot编码。
- 缺失值:两者均自动处理,但LightGBM效率更高。
代码示例:使用sklearn API对比训练时间(示意,运行需安装包)
# 安装命令:pip install xgboost lightgbm
import numpy as np
import time
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
import xgboost as xgb
import lightgbm as lgb
# 生成数据
X, y = make_classification(n_samples=10000, n_features=50, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# XGBoost
start = time.time()
xgb_model = xgb.XGBClassifier(n_estimators=100, max_depth=5, learning_rate=0.1, random_state=42)
xgb_model.fit(X_train, y_train)
xgb_time = time.time() - start
# LightGBM
start = time.time()
lgb_model = lgb.LGBMClassifier(n_estimators=100, max_depth=5, learning_rate=0.1, random_state=42)
lgb_model.fit(X_train, y_train)
lgb_time = time.time() - start
print(f"XGBoost 训练时间: {xgb_time:.3f}s, 准确率: {xgb_model.score(X_test, y_test):.4f}")
print(f"LightGBM 训练时间: {lgb_time:.3f}s, 准确率: {lgb_model.score(X_test, y_test):.4f}")
模型评估与优化
评估指标
- 混淆矩阵:TP、TN、FP、FN。
- 准确率(Accuracy):
(TP+TN)/(P+N),不适用类别不平衡。 - 精确率(Precision):
TP/(TP+FP),预测为正中的真正正例比例。 - 召回率(Recall):
TP/(TP+FN),真正正例中被预测出的比例。 - F1值:
2*Precision*Recall/(Precision+Recall),调和平均。 - AUC-ROC:ROC曲线下面积,横轴FPR,纵轴TPR。AUC表示随机取一个正例和一个负例,模型将正例排在负例前面的概率。AUC对类别不平衡不敏感。
- AUC-PR:PR曲线下面积(横轴Recall,纵轴Precision),类别不平衡时更敏感。
- 回归指标:MAE(平均绝对误差,鲁棒)、MSE(均方误差,对大误差惩罚大)、RMSE(MSE开方,与原始量纲一致)。
过拟合与欠拟合
| 现象 | 定义 | 原因 | 解决方法 |
|---|---|---|---|
| 过拟合 | 训练集表现好,测试集差 | 模型复杂、数据少、噪声多 | 增加数据、正则化(L1/L2)、Dropout、早停、集成学习、数据增强、剪枝 |
| 欠拟合 | 训练集和测试集都差 | 模型简单、特征不足、训练不足 | 增加模型复杂度、添加特征、减少正则化、延长训练 |
特征工程
- 特征筛选:
- 过滤法:卡方检验、互信息、方差阈值、相关系数。独立于模型,速度快。
- 包裹法:递归特征消除(RFE)、前向/后向搜索。用模型性能评估,计算量大。
- 嵌入法:L1正则化(稀疏系数)、树模型的特征重要性、SHAP值。
- 特征编码:
- 独热编码(One-Hot):无序类别,如城市、颜色。维度膨胀。
- LabelEncoder:有序类别,如学历(高中→1,本科→2)。可能引入虚假大小关系。
- 目标编码(Target Encoding):用目标变量的统计量(如均值)编码,适用于高基数类别。
- 特征归一化/标准化:
- 标准化(Standardization):
(x-μ)/σ,输出均值0方差1,适用于SVM、逻辑回归、KNN等依赖距离或梯度的模型。 - 归一化(MinMax):
(x-min)/(max-min),输出[0,1],适用于像素值、神经网络输入。 - 为什么做?避免量纲差异导致模型偏向大数值特征,同时加速梯度下降收敛。
- 标准化(Standardization):
- 特征交叉:构造组合特征(如
age*income),线性模型常用;树模型自动交叉。
高频考题:AUC的物理意义?
核心答案:AUC是ROC曲线下的面积,取值范围[0.5,1]。物理意义:随机抽取一个正样本和一个负样本,模型将正样本预测得分高于负样本的概率。AUC=0.5表示随机猜测,AUC=1表示完美分类。优点:对类别分布不敏感,评估排序能力。缺点:忽略了预测概率的校准程度。
代码示例:计算并绘制ROC曲线
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc, roc_auc_score
def demo_auc():
# 模拟真实标签和预测概率
np.random.seed(42)
y_true = np.array([0]*50 + [1]*50) # 50个负例,50个正例
y_pred = np.concatenate([
np.random.beta(1, 5, 50), # 负例分数偏低
np.random.beta(5, 1, 50) # 正例分数偏高
])
# 计算ROC曲线
fpr, tpr, thresholds = roc_curve(y_true, y_pred)
roc_auc = auc(fpr, tpr)
# 直接计算AUC
auc_sk = roc_auc_score(y_true, y_pred)
print(f"AUC值: {roc_auc:.4f} (来自roc_curve), {auc_sk:.4f} (来自roc_auc_score)")
# 绘制
plt.figure(figsize=(6,5))
plt.plot(fpr, tpr, linewidth=2, label=f'ROC (AUC={roc_auc:.3f})')
plt.plot([0,1], [0,1], 'k--', label='Random (AUC=0.5)')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend()
plt.grid(alpha=0.3)
plt.show()
if __name__ == "__main__":
demo_auc()
高频考题:如何解决类别不平衡问题?
核心答案:
- 数据层面:
- 过采样(SMOTE):合成少数类样本,避免简单复制导致的过拟合。
- 欠采样(RandomUnderSampler):随机删除多数类,可能丢失重要信息。
- 结合采样(SMOTE+ENN)。
- 算法层面:
- 调整类别权重:
class_weight='balanced',损失函数中给少数类更高权重。 - 使用对不平衡鲁棒的指标:AUC、F1、PR曲线(而非准确率)。
- 异常检测框架(One-Class SVM)。
- 调整类别权重:
- 集成方法:Bagging + 平衡采样(BalancedBaggingClassifier)、EasyEnsemble。
- 阈值调整:根据验证集调优分类阈值,不固定使用0.5。
代码示例:使用class_weight处理不平衡
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from collections import Counter
# 生成极度不平衡数据(90%负类,10%正类)
X, y = make_classification(n_samples=1000, n_features=20, weights=[0.9, 0.1], random_state=42)
print("原始分布:", Counter(y))
# 模型1:不加权
lr = LogisticRegression()
lr.fit(X, y)
# 模型2:自动平衡权重
lr_balanced = LogisticRegression(class_weight='balanced')
lr_balanced.fit(X, y)
# 比较预测倾向(打印正类预测概率均值)
print(f"不加权模型 正类预测概率均值: {lr.predict_proba(X)[:,1].mean():.4f}")
print(f"平衡权重模型 正类预测概率均值: {lr_balanced.predict_proba(X)[:,1].mean():.4f}")
高频考题:特征工程中为什么要做归一化?
核心答案:
- 消除量纲影响:特征尺度差异大会使基于距离的模型(KNN、SVM、K-Means)和基于梯度下降的模型(线性回归、神经网络、逻辑回归)偏向大数值特征。
- 加速收敛:梯度下降时,未归一化的损失函数等高线呈椭圆形,导致梯度方向震荡;归一化后呈圆形,梯度下降路径更直,收敛更快。
- 正则化公平性:L1/L2正则化对所有特征施加相同惩罚,若尺度不同会导致小尺度特征被过度惩罚。
- 树模型不需要:决策树、随机森林、GBDT等基于分裂的模型不受特征尺度影响。
集成学习
核心思想:组合多个基模型以提升泛化能力。
- Bagging(Bootstrap Aggregating):并行训练多个独立模型,平均或投票。降低方差,典型代表:随机森林。
- Boosting:串行训练,每个模型纠正前一个模型的错误。降低偏差,典型代表:AdaBoost、GBDT、XGBoost。
- Stacking:训练多个基模型,然后用元模型(如逻辑回归)组合它们的输出。可融合异质模型。
集成学习的优势:通过平均或投票减少单个模型的过拟合(方差),或通过序列修正提升拟合能力(偏差)。
高频考题:随机森林为什么能降低过拟合?
核心答案:随机森林通过两种随机化降低过拟合:
- 样本随机(Bootstrap):每棵树使用有放回抽样,使得不同树训练集略有差异,平均后减少方差。
- 特征随机:每次分裂随机选取部分特征子集,使树之间相关性降低,集成后泛化能力更强。
与单棵决策树相比,随机森林虽然单棵树可能过拟合,但多棵树投票/平均后显著缓解了过拟合。
高频考题:Boosting算法的核心逻辑(梯度提升、残差提升)?
核心答案:
- 残差提升(AdaBoost):每一轮调整样本权重,让新模型更关注前一轮分错的样本。最终加权投票。
- 梯度提升(GBDT):每一轮拟合损失函数在当前模型下的负梯度(残差的推广)。对于平方损失,负梯度就是残差;对于其他损失(如交叉熵),负梯度是伪残差。每棵树拟合负梯度后,更新模型:
F_m(x) = F_{m-1}(x) + η·h_m(x)。
2. 深度学习(大厂算法岗核心,校招/社招重点)
基础概念
神经元:output = activation(w·x + b)。
激活函数:
- Sigmoid:输出(0,1),易饱和梯度消失(导数≤0.25),非零中心导致梯度更新振荡。
- Tanh:输出(-1,1),零中心,但仍有饱和梯度问题。
- ReLU:
max(0,x),计算快、缓解梯度消失、稀疏激活。缺点:死亡ReLU(负输入永远不激活)。 - Leaky ReLU:
max(αx, x),α=0.01,解决死亡问题。 - Softmax:多分类输出层,将logits转化为概率分布。
网络结构:
- CNN:卷积层提取局部特征(参数共享、平移不变性),池化层降维(最大池化、平均池化),全连接层分类/回归。
- RNN:循环结构处理序列,但存在梯度消失/爆炸,难以建模长距离依赖。
- LSTM:引入门控机制(输入门、遗忘门、输出门)和细胞状态,通过门控梯度流动,有效缓解梯度消失。
- GRU:LSTM简化版(2门:更新门、重置门),参数少,计算快,效果与LSTM相近。
- Transformer:自注意力机制(Q、K、V),多头注意力(多个投影空间),位置编码(注入序列顺序信息)。并行计算优于RNN,长距离依赖优于LSTM。
训练方法:
- 反向传播:链式法则从输出层逐层向前计算梯度。
- 优化器:
- SGD:朴素梯度下降,可能震荡,需手动调节学习率。
- Momentum:引入动量,加速收敛,减少震荡。
- Adagrad:自适应学习率,对稀疏特征有效,但学习率单调递减。
- RMSprop:指数加权移动平均梯度平方,解决Adagrad学习率消失。
- Adam:Momentum + RMSprop,目前最常用。
高频考题:ReLU激活函数的优势及缺点(死亡ReLU问题)?
核心答案:
- 优势:计算简单(max(0,x)),非饱和(正区间导数为1,缓解梯度消失),稀疏激活(部分神经元输出0,增加稀疏性),加速收敛。
- 缺点:死亡ReLU问题:当输入为负时,梯度为0,且权重不再更新,该神经元永远死亡。通常由学习率过大或初始化不当引起。解决:Leaky ReLU、PReLU、ELU,或使用较小的学习率、更好的初始化。
高频考题:LSTM如何解决RNN的梯度消失/爆炸问题?
核心答案:LSTM通过门控机制和细胞状态© 缓解梯度消失。关键设计:
- 遗忘门:选择性地丢弃历史信息。
- 输入门:决定新信息存入细胞状态。
- 输出门:决定当前时刻输出。
梯度沿细胞状态传播时,只有逐元素的加法和乘法(门控值为[0,1]),避免了RNN中重复乘以相同权重矩阵导致的梯度消失或爆炸。梯度高速公路:细胞状态上的梯度可以长时间保持,不被非线性激活函数压缩。
高频考题:Transformer为什么比RNN更高效?
核心答案:
- 并行计算:RNN是时间步串行(t步依赖t-1步),无法并行;Transformer的自注意力可一次性计算所有位置之间的交互,GPU并行高效。
- 长距离依赖:RNN需要将信息通过隐状态逐步传递,长序列时易丢失;Transformer通过直接注意力机制,任意两位置距离为1(常数路径长度),信息流动无衰减。
- 训练稳定性:RNN梯度消失/爆炸需LSTM/GRU缓解;Transformer层间有残差连接+层归一化,训练更稳定。
经典模型与应用
CNN系列:
- LeNet:开山之作,卷积+池化+全连接。
- AlexNet:ReLU、Dropout、数据增强、GPU并行。
- VGG:小卷积核(3x3)堆叠,结构规整。
- ResNet:残差连接
y = F(x) + x,允许训练超深网络(152层),解决退化问题。 - ResNeXt:分组卷积,增加网络宽度。
- EfficientNet:复合缩放(深度、宽度、分辨率协同)。
RNN/LSTM系列:文本生成、机器翻译、语音识别、时序预测。
Transformer系列:
- BERT:双向Transformer编码器,MLM + NSP预训练任务,适用于理解类任务(分类、NER、问答)。
- GPT:单向Transformer解码器,自回归语言建模,适用于生成类任务。
- T5:Text-to-Text框架,统一所有NLP任务。
- LLaMA:开源高效Transformer,使用RMSNorm、SwiGLU、RoPE等优化。
预训练-微调范式:在大规模无监督数据上预训练(语言建模/掩码语言模型),然后在下游任务上微调(少量标注数据)。节省训练成本,提升性能。
Prompt Engineering:通过构造输入模板(如“这部电影很[MASK],我认为它是___”),引导预训练模型进行few-shot/zero-shot推理。
高频考题:ResNet残差连接的作用?
核心答案:
- 缓解梯度消失:残差连接为梯度提供了“短路”路径,梯度可直接流经恒等映射传到浅层,使深层网络可训练。
- 解决退化问题:加深网络时,非残差网络会出现“退化”(训练误差升高),而残差网络让网络更容易学习恒等映射(至少不低于浅层)。
- 集成学习视角:残差网络可以看作不同深度网络的隐式集成。
高频考题:BERT的双向注意力与GPT的单向注意力的区别?
| 模型 | 注意力方向 | 预训练任务 | 适用任务 |
|---|---|---|---|
| BERT | 双向(看左右上下文) | MLM + NSP | 自然语言理解(文本分类、NER、问答) |
| GPT | 单向(只看左边,自回归) | 语言建模(预测下一个token) | 自然语言生成(文本生成、摘要、对话) |
核心回答:BERT的双向注意力使其能捕获完整上下文信息,适合理解任务;GPT的单向注意力保证自回归生成时不会看到未来信息,适合生成任务。双向注意力在生成任务中会导致“作弊”。
高频考题:预训练模型微调的常用方法?
核心答案:
- 全参数微调:更新所有参数,效果最好但计算成本高。
- 冻结部分层:冻结底层(通用特征),只微调上层(任务特定层)。
- 适配器(Adapter):在Transformer层间插入小型可训练模块,冻结原模型参数。
- LoRA:低秩适配,在权重矩阵旁添加低秩分解矩阵
A·B,只训练A、B。 - Prompt Tuning:在输入前添加可训练的连续向量(软提示),冻结模型主体。
- Prefix Tuning:在每层Key/Value前添加可训练前缀。
深度学习工程细节
正则化方法
- Dropout:训练时随机丢弃部分神经元(概率p),测试时乘以
(1-p)(或训练时缩放)。防止神经元共适应,增强泛化。 - L1/L2正则化:在损失函数加惩罚项,L1产生稀疏解,L2防止权重过大。
- Batch Normalization (BN):对每个batch的特征做标准化(减均值除方差),然后学习缩放和平移。加速收敛,允许更大学习率,有轻微正则化效果。依赖batch size,不适合小batch。
- Layer Normalization (LN):对每个样本的所有特征做标准化。不依赖batch,适用于RNN、Transformer、小batch场景。
数据增强
- 图像:随机翻转、旋转、裁剪、颜色抖动、归一化、Cutout、MixUp、CutMix。
- 文本:同义词替换、随机插入/删除、回译(翻译成其他语言再翻译回来)。
模型训练问题
- 梯度消失:发生在深层网络或饱和激活函数(Sigmoid/Tanh)。解决:ReLU/Leaky ReLU、BatchNorm、残差连接、梯度裁剪、LSTM/Transformer。
- 梯度爆炸:发生在RNN或深层网络。解决:梯度裁剪(
torch.nn.utils.clip_grad_norm_)、权重正则化、使用更小的学习率。 - Batch Size选择:小Batch(2-32)泛化更好但训练慢;大Batch(64-512)训练快但可能陷入尖锐极小值,泛化下降。常用线性缩放学习率:
lr_new = lr_base * (batch_new / batch_base)。 - 学习率调度:阶梯衰减、指数衰减、余弦退火、Warm-up(前期线性增加LR,防止早期震荡)。
高频考题:BN和LN的区别及适用场景?
核心回答:
- BN:对每个特征通道在一个batch内做标准化。适用于CNN(特征在空间和batch上统计),依赖较大batch size。不适合RNN(变长序列)和极小batch。
- LN:对每个样本所有特征做标准化。适用于RNN、Transformer,不受batch size限制,在NLP中更常用。
代码示例:
import torch
import torch.nn as nn
# BN: 输入 (N, C, H, W),对 (N, H, W) 维度做标准化
bn = nn.BatchNorm2d(3) # 3个通道
x = torch.randn(4, 3, 32, 32)
out_bn = bn(x)
# LN: 输入 (N, C, H, W),对 (C, H, W) 维度做标准化
ln = nn.LayerNorm([3, 32, 32]) # 指定特征形状
out_ln = ln(x)
print(f"BN输出形状: {out_bn.shape}, 均值≈{out_bn.mean().item():.2f}")
print(f"LN输出形状: {out_ln.shape}, 均值≈{out_ln.mean().item():.2f}")
高频考题:Dropout在训练和测试时的差异?
核心答案:
- 训练时:以概率p随机将神经元输出置0,其余激活值乘以
1/(1-p)(保持整体期望不变)。相当于每次训练一个不同的子网络。 - 测试时:不进行随机丢弃,保持所有神经元,且不进行缩放(因为训练时已做缩放)。测试时希望使用完整的模型能力。
高频考题:如何解决深度学习中的过拟合?
核心答案:
- 增加数据:收集更多数据或数据增强。
- 降低模型复杂度:减少层数/神经元数、权重共享。
- 正则化:L1/L2、Dropout、BN(轻微)、早停(Early Stopping)。
- 集成学习:训练多个模型(不同初始化/数据子集)平均。
- 标签平滑:防止模型过于自信。
- 添加噪声:输入噪声、权重噪声。
3. 方向细分模块(按岗位侧重,大厂按需考察)
自然语言处理(NLP)方向
基础任务
- 文本分类:情感分析、主题分类。
- 命名实体识别(NER):识别人名、地名、组织名等。
- 关系抽取:实体对之间的关系(如“张三-毕业于-清华大学”)。
- 文本摘要:抽取式或生成式。
- 机器翻译:编码器-解码器架构。
- 问答系统:检索式或生成式。
- 情感分析:判断文本情感倾向。
核心技术
词向量:
- Word2Vec:CBOW(上下文预测中心词)、Skip-gram(中心词预测上下文)。负采样优化。
- GloVe:基于全局词共现矩阵。
- FastText:加入子词信息(n-gram),解决OOV。
注意力机制:计算Query与Key的相似度作为Value的加权权重。使模型动态聚焦重要部分。
预训练模型:BERT、GPT、ERNIE(知识增强)、RoBERTa。
Prompt Tuning:将下游任务转化为完形填空或生成任务,固定预训练模型参数,只优化提示向量。
Few-shot / Zero-shot Learning:少量标注(few-shot)或无标注(zero-shot)下的学习,通常依赖预训练模型和提示工程。
高频考题:Word2Vec的原理(CBOW、Skip-gram)?
核心答案:
- CBOW:用上下文单词预测中心词。输入层是上下文词向量的平均(或求和),隐藏层,输出层用Softmax预测中心词。训练快,适合小数据集。
- Skip-gram:用中心词预测上下文单词。每个中心词-上下文词对视为一个训练样本。对低频词效果更好,但训练慢。
- 优化技巧:负采样(将预测目标词的任务转化为二分类,采样少量负样本)、层次Softmax(哈夫曼树加速)。
高频考题:NER的常用模型(BiLSTM+CRF)?
核心答案:BiLSTM+CRF是经典序列标注框架。
- BiLSTM:双向LSTM捕获每个字符/词的前后上下文信息,输出每个位置属于各类标签的分数(发射分数)。
- CRF(条件随机场):在BiLSTM输出基础上加入转移分数(例如,I-ORG不能紧跟在B-PER后面)。CRF解码(维特比算法)找出全局最优的标签序列,保证标签转移的合法性。
- 优势:结合LSTM的上下文表征能力和CRF的标签约束能力,相比纯Softmax分类更合理。
简单实现示意:
import torch
import torch.nn as nn
class BiLSTM_CRF(nn.Module):
def __init__(self, vocab_size, tagset_size, embedding_dim=128, hidden_dim=256):
super().__init__()
self.embedding = nn.Embedding(vocab_size, embedding_dim)
self.lstm = nn.LSTM(embedding_dim, hidden_dim // 2, num_layers=1,
bidirectional=True, batch_first=True)
self.hidden2tag = nn.Linear(hidden_dim, tagset_size)
self.crf = None # 实际会使用torchcrf或自定义
def forward(self, x):
emb = self.embedding(x) # (batch, seq_len, emb_dim)
lstm_out, _ = self.lstm(emb) # (batch, seq_len, hidden_dim)
emissions = self.hidden2tag(lstm_out) # (batch, seq_len, tagset_size)
return emissions
高频考题:如何解决低资源场景下的NLP任务?
核心答案:
- 迁移学习:使用预训练模型(BERT、XLM-R)在小数据集上微调。
- 数据增强:回译、同义词替换、随机掩码恢复(利用MLM生成)。
- 半监督学习:伪标签、一致性正则化(UDA、MixText)。
- 元学习:MAML等算法学习快速适应新任务。
- Prompt Tuning:利用预训练模型的知识,用少量示例设计模板。
计算机视觉(CV)方向
基础任务
- 图像分类:ResNet、EfficientNet。
- 目标检测:两阶段(Faster R-CNN)、单阶段(YOLO、SSD)、无锚框(CenterNet)。
- 语义分割:U-Net(医学图像)、DeepLab(空洞卷积)、Mask R-CNN(实例分割)。
- 人脸识别:FaceNet(三元组损失)、ArcFace。
- 图像生成:GAN(生成对抗网络)、Diffusion Model(扩散模型,如Stable Diffusion)。
核心技术
- 卷积操作:卷积核在输入上滑动,提取局部特征。
- 锚框(Anchor):预设不同尺度和长宽比的先验框,用于目标检测中的候选区域。
- 非极大值抑制(NMS):去除重复检测框,保留最高置信度的框。
- 迁移学习:在ImageNet等大数据集预训练,在小数据集微调。
- GAN原理:生成器G从噪声生成假样本,判别器D区分真/假,两者博弈达到纳什均衡。生成器学习到真实数据分布。
高频考题:YOLO系列的进化及核心优化?
核心回答:
- YOLOv1:端到端回归边界框和类别,速度极快但精度低。
- YOLOv2:Anchor机制、BatchNorm、多尺度训练。
- YOLOv3:多尺度预测(FPN)、Darknet-53、使用Logistic回归。
- YOLOv4:Mish激活、CSPNet、SAM注意力、PANet、Mosaic数据增强。
- YOLOv5:PyTorch实现,Focus模块、自适应锚框、集成多种Tricks。
- YOLOv7:E-ELAN、重参数化、辅助头训练。
- 核心优化:更高精度(更强骨干网络、特征金字塔、注意力)、更快速度(CSPNet、深度可分离卷积)、更少计算量(Anchor-Free、无NMS设计)。
高频考题:Mask R-CNN与Faster R-CNN的区别?
核心答案:Mask R-CNN在Faster R-CNN基础上增加分割分支,实现实例分割。区别:
- 并行输出:Faster R-CNN输出类别+边界框;Mask R-CNN额外输出二进制掩码(每个候选区域一个掩码)。
- RoI Align:替代RoI Pooling,消除量化误差,保留空间位置(双线性插值),提升分割精度。
- 损失函数:多任务损失 = 分类损失 + 边界框回归损失 + 掩码平均二值交叉熵损失。
高频考题:GAN的训练难点(模式崩溃)及解决方法?
核心答案:
- 模式崩溃:生成器只生成少数几类样本,无法覆盖真实数据分布(例如生成手写数字只有“1”)。
- 解决方法:
- 改进架构:WGAN(Wasserstein距离+梯度惩罚)、LSGAN(最小二乘损失)、SAGAN(自注意力)。
- 标签平滑:避免判别器过度自信。
- Mini-batch判别:让判别器比较batch内的样本多样性。
- 历史平均、单边标签噪声。
- 渐进式训练:从小分辨率逐步增加。
推荐系统方向
基础任务
- 召回:从海量物品中快速选出候选集(协同过滤、向量召回、双塔模型)。
- 排序:对候选集精细打分排序(LR、GBDT、DeepFM、DIN)。
- 个性化推荐:结合用户历史行为、上下文信息。
核心技术
- 协同过滤:基于用户相似度(UserCF)或物品相似度(ItemCF)。缺点:冷启动、稀疏矩阵、流行度偏差。
- 矩阵分解:SVD、SVD++,将用户-物品交互矩阵分解为低维隐向量。
- 特征交叉:FM(二阶交叉)、FFM(场感知)。
- 深度学习推荐:
- DeepFM:FM + Deep部分,同时学习低阶和高阶特征交互,端到端训练。
- Wide&Deep:Wide部分记忆共现(LR),Deep部分泛化(DNN)。
- DIN:注意力机制,根据用户历史行为与候选物品的相关性加权,捕获用户兴趣多样性。
- DIEN:在DIN基础上加入序列层(GRU)和兴趣进化层,建模用户兴趣演变。
高频考题:协同过滤的缺点及改进方法?
核心答案:
- 缺点:冷启动(新用户/新物品无交互)、稀疏性(多数用户只对少量物品有评分)、可扩展性(计算相似度矩阵O(n²))、流行度偏差(热门物品主导推荐)。
- 改进:
- 冷启动:混合推荐(用内容特征或元数据)、Bandit策略(EE探索)。
- 稀疏性:矩阵分解(降维)、图神经网络(LightGCN)、Side Information(用户画像/物品属性)。
- 可扩展性:基于物品的CF、近似最近邻(ANN)索引。
- 偏差:流行度降权、对抗训练。
高频考题:DeepFM与Wide&Deep的核心差异?
| 模型 | Wide部分 | Deep部分 | 特征交互 | 是否需要特征工程 |
|---|---|---|---|---|
| Wide&Deep | 线性模型(LR) | DNN | Wide部分手动做交叉 | 需要(特征交叉) |
| DeepFM | FM(自动二阶交叉) | DNN | FM自动学习二阶交叉 | 无需手动交叉 |
核心回答:Wide&Deep需要人工设计Wide部分的特征交叉(如user_id AND item_id),依赖特征工程;DeepFM用FM替代Wide部分,自动学习所有二阶特征交互,且与Deep共享embedding,训练更高效。
高频考题:推荐系统中的冷启动问题及解决方案?
核心答案:
- 用户冷启动:新用户无历史行为。
- 方案:热门推荐、人口统计学匹配、快速试探(多臂赌博机)、引导用户输入兴趣标签。
- 物品冷启动:新物品无交互。
- 方案:利用内容特征(标题、类别、图像)做内容推荐、以图搜图、元学习。
- 系统冷启动:无任何数据。
- 方案:先做热门榜单,同时引入少量专家标注或众包。
时序预测方向
基础任务
- 时间序列预测:ARIMA、Prophet、LSTM、Transformer(Informer、Autoformer)。
- 异常检测:基于统计(3-sigma)、基于预测残差、基于重构误差(Autoencoder)。
- 趋势分析:STL分解、HP滤波。
核心技术
- 时序特征工程:滞后特征(lag)、滑动窗口统计(均值、标准差)、时间特征(星期几、月份、是否节假日)。
- LSTM/Transformer:将时间窗口的观测值作为输入序列,预测下一个或多个值。Transformer的长距离依赖优于LSTM,但需位置编码。
- Prophet:分解模型(趋势、季节性、节假日效应),对缺失值、异常点鲁棒,可解释性强,适合商业时序。
高频考题:ARIMA与LSTM在时序预测中的区别?
核心回答:
- ARIMA:传统统计模型,假设时间序列线性、平稳(需差分)。参数(p,d,q)可解释性强,适合单变量、短期预测。
- LSTM:非线性、多变量、自动特征提取。适合复杂模式、长期依赖,但需要大量数据、调参、计算资源。工业界常用混合模型:ARIMA提取线性成分,LSTM拟合残差。
高频考题:如何处理时序数据中的缺失值和异常值?
核心回答:
- 缺失值:
- 前向填充(ffill)/后向填充(bfill)——适用于平稳序列。
- 插值(线性、样条、多项式)。
- 预测填补(用相邻值回归)。
- 模型处理(树模型可处理缺失,LSTM可加入mask)。
- 异常值:
- 统计方法:3-sigma、IQR(箱线图)。
- 基于预测:用模型预测,残差超过阈值视为异常。
- 替换:用中位数、前后均值、插值替换。
- 保留:有些异常本身是重要事件(如促销导致的销量暴涨),需结合业务判断。
复习策略建议:
- 机器学习基础:手推逻辑回归梯度更新、决策树分裂过程、XGBoost公式。掌握AUC、PR曲线、混淆矩阵的适用场景。
- 深度学习:至少手写一个简单CNN或LSTM的前向/反向(伪代码),理解ResNet、Transformer的核心思想。熟悉BN/LN、Dropout的底层实现。
- 方向模块:根据目标岗位深度复习2-3个高频模型(如CV岗重点YOLO系列、ResNet;NLP岗重点BERT、Word2Vec;推荐岗重点DeepFM、DIN)。准备1-2个自己做过的项目,能把模型选择、数据预处理、评估指标、优化过程讲清楚。
面试官最想看到的是:扎实的数学直觉 + 流利的代码实现 +
清晰的工程落地思路。希望本章内容能帮助你在面试中自信应对核心算法问题。下一篇文章将深入探讨模型部署与工程落地模块(ONNX、TensorRT、Docker、K8s、MLOps),敬请期待。
🌟 感谢您耐心阅读到这里!
💡 如果本文对您有所启发欢迎:
👍 点赞📌 收藏 📤 分享给更多需要的伙伴。
🗣️ 期待在评论区看到您的想法, 共同进步。
🔔 关注我,持续获取更多干货内容~
🤗 我们下篇文章见~
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)