机器学习深度学习八股表格(由AI整理)
由AI整理的机器学习&深度学习八股表格,适合面试等速成场景快速记忆。
·
📊 机器学习与深度学习区别
| 维度 | 机器学习(Machine Learning) | 深度学习(Deep Learning) |
|---|---|---|
| 定义 | 通过算法从数据中学习模式,无需显式编程 | 机器学习的一个子集,使用多层神经网络自动提取特征 |
| 特征工程 | 通常需要人工设计和提取特征 | 自动从原始数据中学习特征(端到端学习) |
| 数据需求 | 对中小规模数据效果较好 | 通常需要大量数据才能发挥优势 |
| 计算资源 | 对计算资源要求较低,可在普通CPU上运行 | 依赖GPU/TPU等高性能硬件加速训练 |
| 模型复杂度 | 模型相对简单(如线性回归、SVM、决策树等) | 模型结构复杂(如CNN、RNN、Transformer等) |
| 可解释性 | 通常可解释性较强(如决策树、逻辑回归) | 可解释性较差,常被视为“黑箱” |
| 训练时间 | 训练较快 | 训练时间长,尤其在大数据和深层网络下 |
| 典型应用 | 垃圾邮件分类、信用评分、推荐系统(传统) | 图像识别、语音识别、自然语言处理、自动驾驶 |
| 泛化能力 | 在小数据集上可能泛化更好 | 在大数据集上泛化能力强,但小数据易过拟合 |
| 调参难度 | 超参数较少,调参相对简单 | 超参数多(学习率、层数、激活函数等),调参复杂 |
📊 机器学习的核心模型
| 模型类别 | 代表算法 | 核心思想 | 适用任务 | 关键特点/面试要点 |
|---|---|---|---|---|
| 线性模型 | 线性回归、逻辑回归 | 假设输入与输出之间存在线性关系 | 回归、二分类/多分类 | 简单高效、可解释性强;逻辑回归使用sigmoid/softmax + 交叉熵损失 |
| 决策树 | ID3、C4.5、CART | 通过特征划分递归构建树结构 | 分类、回归 | 易解释、无需特征缩放;易过拟合,常作为集成方法基学习器 |
| 集成学习 | 随机森林、AdaBoost、GBDT、XGBoost、LightGBM | 组合多个弱学习器提升性能 | 分类、回归 | 随机森林:Bagging + 特征随机;GBDT/XGBoost:Boosting + 梯度优化;抗过拟合、精度高 |
| 支持向量机(SVM) | 线性SVM、核SVM | 寻找最大间隔超平面 | 分类、回归(SVR) | 依赖核技巧处理非线性;对高维有效;对噪声敏感;需调参(C, γ) |
| 朴素贝叶斯 | 高斯NB、多项式NB、伯努利NB | 基于贝叶斯定理 + 特征条件独立假设 | 文本分类等 | 计算快、适合高维稀疏数据(如TF-IDF);独立性假设常不成立但实践中有效 |
| K近邻(KNN) | K-Nearest Neighbors | 基于距离度量找最近邻居投票/平均 | 分类、回归 | 无训练过程(懒学习);计算开销大;对维度灾难敏感;需特征归一化 |
| 聚类算法 | K-Means、层次聚类、DBSCAN | 无监督地将样本分组 | 无监督学习 | K-Means需指定K、对初始值敏感;DBSCAN可发现任意形状簇、抗噪;评估指标如轮廓系数 |
| 降维方法 | PCA、LDA、t-SNE | 降低特征维度,保留关键信息 | 数据压缩、可视化 | PCA:无监督,最大化方差;LDA:有监督,最大化类间/类内比;t-SNE用于可视化非线性结构 |
| EM算法 | 高斯混合模型(GMM) | 含隐变量的概率模型参数估计 | 聚类、密度估计 | E步(期望)、M步(最大化)交替;GMM是软聚类,可建模复杂分布 |
📊 深度学习的核心模型
| 模型类别 | 代表架构 | 核心机制 | 典型任务 | 关键特点/面试要点 |
|---|---|---|---|---|
| 全连接神经网络(DNN/MLP) | 多层感知机(MLP) | 全连接层 + 非线性激活(如ReLU) | 分类、回归 | 基础结构;易过拟合;参数多;需归一化输入 |
| 卷积神经网络(CNN) | LeNet、AlexNet、VGG、ResNet、EfficientNet、MixNet | 卷积层(局部感受野、权值共享)、池化、残差连接 | 图像分类、目标检测、语义分割 | 自动提取空间层次特征;平移不变性;ResNet解决梯度消失;深度可分离卷积提升效率 |
| 循环神经网络(RNN) | Vanilla RNN、LSTM、GRU | 循环结构处理序列,记忆历史信息 | 时序预测、NLP(早期) | RNN存在梯度消失/爆炸;LSTM/GRU通过门控机制缓解;难以并行 |
| Transformer | 原始Transformer、BERT、GPT、ViT | 自注意力(Self-Attention)+ 前馈网络 | NLP、CV、多模态 | 完全并行化;建模长距离依赖;位置编码(绝对/相对);成为大模型基础架构 |
| 生成对抗网络(GAN) | DCGAN、WGAN、CycleGAN、StyleGAN | 生成器 vs 判别器对抗训练 | 图像生成、风格迁移、超分 | 无监督生成;训练不稳定(模式崩溃);WGAN用Wasserstein距离改善梯度 |
| 自编码器(AE) | Vanilla AE、VAE、Denoising AE | 编码器-解码器结构,重构输入 | 降维、去噪、生成 | VAE引入概率建模,可生成新样本;隐空间连续;常用于表征学习 |
| 图神经网络(GNN) | GCN、GAT、GraphSAGE | 消息传递机制聚合邻居信息 | 图结构数据(社交网络、分子) | 处理非欧几里得数据;节点/图分类;过平滑问题;可扩展性挑战 |
| 视觉Transformer(ViT) | ViT、Swin Transformer | 将图像分块 + Transformer编码 | 图像分类、检测 | 摒弃CNN归纳偏置;大数据下性能强;Swin引入局部窗口降低计算复杂度 |
| 多模态模型 | CLIP、Flamingo、BLIP | 联合建模文本+图像等多模态信号 | 跨模态检索、图文生成 | 对比学习(如CLIP);对齐不同模态语义空间;需大规模对齐数据 |
📊 不同卷积神经网络的对比
| 网络名称 | 提出年份 | 核心创新点 | 关键结构/技术 | 优缺点 | 典型应用场景 |
|---|---|---|---|---|---|
| LeNet-5 | 1998 | 首个成功应用于手写数字识别的CNN | 卷积层 + 池化层 + 全连接层 | 简单有效,但表达能力有限 | 手写数字识别(MNIST) |
| AlexNet | 2012 | 首次在ImageNet夺冠,推动深度学习复兴 | ReLU激活、Dropout、数据增强、GPU训练 | 参数多、计算量大,但性能显著优于传统方法 | 图像分类(ImageNet) |
| VGGNet | 2014 | 使用统一的小卷积核(3×3)堆叠 | 多层3×3卷积堆叠、更深网络(16/19层) | 结构规整、迁移学习效果好,但参数量大、计算开销高 | 图像分类、目标检测特征提取 |
| GoogLeNet (Inception v1) | 2014 | 引入Inception模块,减少参数量 | Inception模块(多尺度并行卷积)、1×1卷积降维、辅助分类器 | 计算效率高、准确率高,但结构复杂 | 图像分类(ImageNet) |
| ResNet | 2015 | 引入残差连接(skip connection)解决梯度消失 | 残差块(Residual Block)、BatchNorm | 可训练极深网络(>1000层),训练稳定,性能优异 | 图像分类、目标检测、语义分割等 |
| DenseNet | 2017 | 每层连接所有前面层(密集连接) | Dense Block、特征复用、减少参数 | 参数更少、梯度流动更好,但显存占用高 | 图像分类、小样本学习 |
| MobileNet v1 | 2017 | 轻量化网络,适用于移动端 | 深度可分离卷积(Depthwise Separable Conv) | 参数少、速度快,精度略低于大型模型 | 移动端图像分类、实时检测 |
| MobileNet v2 | 2018 | 引入倒残差结构和线性瓶颈 | Inverted Residual + Linear Bottleneck | 比v1更高效,适合嵌入式设备 | 移动端、边缘计算 |
| EfficientNet | 2019 | 复合缩放(Compound Scaling)统一缩放深度/宽度/分辨率 | MBConv模块、基于EfficientNet-B0自动缩放 | 精度与效率平衡最佳之一 | 通用图像任务,资源受限场景 |
| ResNeXt | 2017 | “分组卷积 + 并行路径”思想(基数cardinality) | 分组卷积(Grouped Conv)、残差连接 | 在相同FLOPs下性能优于ResNet | 图像分类、特征提取 |
| Xception | 2017 | 极致使用深度可分离卷积 | 将Inception模块替换为深度可分离卷积 | 参数更少、性能优于Inception v3 | 图像分类 |
📊 Transformer 与 QKV 机制核心知识点
| 概念/组件 | 说明 | 关键公式/结构 | 面试常见问题/要点 |
|---|---|---|---|
| Transformer | 2017年提出,完全基于注意力机制的序列建模架构,取代RNN/CNN | Encoder-Decoder结构,含多头注意力、FFN、残差连接、LayerNorm | 为何不用RNN?并行性好、长程依赖建模强 |
| Self-Attention | 计算序列中每个元素与其他元素的相关性 | Attention(Q,K,V)=softmax(QKTdk)V\text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)VAttention(Q,K,V)=softmax(dkQKT)V | 为什么除以dk\sqrt{d_k}dk?防止点积过大导致梯度饱和 |
| Q (Query) | 查询向量,表示当前token在寻找什么信息 | Q=XWQQ = XW^QQ=XWQ,WQW^QWQ为可学习权重 | Q来自当前token,用于“主动查询”其他位置 |
| K (Key) | 键向量,表示每个位置可被查询的“标识” | K=XWKK = XW^KK=XWK | K与Q点积衡量匹配度 |
| V (Value) | 值向量,包含实际要提取的信息内容 | V=XWVV = XW^VV=XWV | 注意力权重作用于V,决定“读取什么” |
| QKV 来源 | 均由输入嵌入 XXX 线性变换得到,共享输入但投影不同 | WQ,WK,WV∈Rdmodel×dkW^Q, W^K, W^V \in \mathbb{R}^{d_{\text{model}} \times d_k}WQ,WK,WV∈Rdmodel×dk | 三者维度通常相同(dk=dvd_k = d_vdk=dv),但可不同 |
| Scaled Dot-Product Attention | 标准注意力计算方式 | 缩放因子 dk\sqrt{d_k}dk,softmax归一化 | 与加性注意力对比?点积更快,适合高维 |
| Multi-Head Attention | 并行多个注意力头,捕获不同子空间信息 | Concat(head1,...,headh)WO\text{Concat}(\text{head}_1, ..., \text{head}_h)W^OConcat(head1,...,headh)WO,其中 headi=Attention(QWiQ,KWiK,VWiV)\text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V)headi=Attention(QWiQ,KWiK,VWiV) | 头数一般为8或16;为何多头?增强表达能力 |
| 位置编码 (Positional Encoding) | 引入序列顺序信息(因无RNN) | 使用正弦/余弦函数或可学习编码 | 为何不用RNN的位置信息?Transformer本身无序 |
| QKV 的物理意义类比 | 类似“检索系统”:Q是查询请求,K是数据库索引,V是返回内容 | — | 面试高频类比题 |
| 计算复杂度 | Self-Attention 为 O(n2⋅d)O(n^2 \cdot d)O(n2⋅d),n为序列长度 | 相比CNN/RNN,长序列开销大 | 为何长文本难处理?引出稀疏注意力、Longformer等改进 |
| QKV 是否共享权重? | 通常不共享(WQ,WK,WVW^Q, W^K, W^VWQ,WK,WV独立),但某些变体(如ALiBi、某些压缩模型)可能共享 | — | 共享会降低表达能力,但节省参数 |
📊 正则化、归一化等关键辅助训练技术
| 技术类别 | 方法名称 | 核心思想 | 关键公式/操作 | 作用/优点 | 缺点/注意事项 | 面试高频考点 |
|---|---|---|---|---|---|---|
| 正则化(Regularization) | L1 正则 | 在损失函数中加入权重的绝对值和 | Ltotal=L+λ∑∣wi∣1\mathcal{L}_{\text{total}} = \mathcal{L} + \lambda \sum |w_i|_1Ltotal=L+λ∑∣wi∣1 | 产生稀疏解,特征选择 | 收敛慢,不可导点需特殊处理 | L1 vs L2:稀疏性、解的特性 |
| L2 正则(权重衰减) | 加入权重的平方和 | Ltotal=L+λ∑wi2\mathcal{L}_{\text{total}} = \mathcal{L} + \lambda \sum w_i^2Ltotal=L+λ∑wi2 | 防止过拟合,平滑权重 | 不产生稀疏,所有权重都保留 | 与优化器中 weight_decay 的关系 | |
| Dropout | 训练时随机“关闭”部分神经元 | 每层以概率 ppp 置零神经元,测试时缩放输出 | 近似集成学习,减少神经元共适应 | 对小模型可能欠拟合;RNN中需谨慎使用 | 为何测试时不 dropout?如何缩放? | |
| Early Stopping | 监控验证集性能,提前终止训练 | 当验证损失连续若干轮不下降则停止 | 简单有效防过拟合 | 依赖验证集划分,可能早停 | 与正则化的关系?是否算正则? | |
| 数据增强(Data Augmentation) | 通过对输入变换生成新样本 | 图像:旋转、裁剪、翻转;文本:同义词替换等 | 增加数据多样性,提升泛化 | 增强方式需合理,避免语义破坏 | CV/NLP 中的典型方法 | |
| 归一化(Normalization) | Batch Normalization (BN) | 对一个 batch 的特征做归一化 | x^=x−μBσB2+ϵ\hat{x} = \frac{x - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}x^=σB2+ϵx−μB, y=γx^+βy = \gamma \hat{x} + \betay=γx^+β | 加速训练、缓解内部协变量偏移、允许更高学习率 | batch size 小时效果差;推理需滑动均值/方差 | BN 在训练/测试的区别?为何有效? |
| Layer Normalization (LN) | 对单个样本的所有特征归一化 | 沿特征维度计算均值/方差 | 适用于 RNN/Transformer,不受 batch size 影响 | 在 CNN 中效果不如 BN | 为何 Transformer 用 LN 而非 BN? | |
| Instance Normalization (IN) | 对单个样本的每个通道单独归一化 | 常用于图像生成(如风格迁移) | 去除图像对比度等 instance-specific 信息 | 不适合分类任务 | 与 BN/LN 的区别? | |
| Group Normalization (GN) | 将通道分组后归一化 | 介于 LN(1组)和 IN(C组)之间 | 在小 batch 下优于 BN | 需调组数超参 | COCO 目标检测常用 | |
| 其他辅助技术 | Gradient Clipping | 限制梯度范数防止爆炸 | if ∣g∣>τ, then g←g⋅τ∣g∣\text{if } |g| > \tau, \text{ then } g \leftarrow g \cdot \frac{\tau}{|g|}if ∣g∣>τ, then g←g⋅∣g∣τ | RNN/Transformer 训练稳定 | 仅缓解梯度爆炸,不解决根本原因 | 何时使用?与初始化关系? |
| Weight Initialization | 合理初始化权重(如 Xavier、He) | Xavier: Var(w)=2nin+nout\text{Var}(w) = \frac{2}{n_{in} + n_{out}}Var(w)=nin+nout2;He: 2nin\frac{2}{n_{in}}nin2 | 避免梯度消失/爆炸,加速收敛 | 激活函数决定初始化方式 | ReLU 用 He,tanh 用 Xavier | |
| Label Smoothing | 软化 one-hot 标签 | ysmooth=(1−ϵ)y+ϵKy_{\text{smooth}} = (1 - \epsilon) y + \frac{\epsilon}{K}ysmooth=(1−ϵ)y+Kϵ | 防止模型过于自信,提升泛化 | ϵ\epsilonϵ 通常取 0.1 | 与交叉熵损失结合使用 |
📊 训练中的核心模块:损失函数、优化器、学习率调度器
| 模块类别 | 名称/方法 | 适用任务 | 核心公式/机制 | 优点 | 缺点/注意事项 | 面试高频考点 |
|---|---|---|---|---|---|---|
| 损失函数(Loss Function) | Cross-Entropy Loss | 分类(尤其是多类) | L=−∑yilog(y^i)\mathcal{L} = -\sum y_i \log(\hat{y}_i)L=−∑yilog(y^i) | 与 softmax 配合良好,梯度稳定 | 对错误预测惩罚大,可能受类别不平衡影响 | 与 KL 散度关系?为何不用 MSE? |
| Binary Cross-Entropy (BCE) | 二分类 / 多标签 | L=−[ylog(y^)+(1−y)log(1−y^)]\mathcal{L} = -[y \log(\hat{y}) + (1-y)\log(1-\hat{y})]L=−[ylog(y^)+(1−y)log(1−y^)] | 适用于 sigmoid 输出 | 同样受不平衡影响 | 多标签 vs 多分类损失区别? | |
| Focal Loss | 类别极度不平衡分类 | L=−α(1−y^)γlog(y^)\mathcal{L} = -\alpha (1-\hat{y})^\gamma \log(\hat{y})L=−α(1−y^)γlog(y^) | 降低易分样本权重,聚焦难例 | 需调 γ,α\gamma, \alphaγ,α 超参 | RetinaNet 中提出,解决正负样本不均衡 | |
| MSE (L2 Loss) | 回归 | L=1n∑(y−y^)2\mathcal{L} = \frac{1}{n}\sum (y - \hat{y})^2L=n1∑(y−y^)2 | 光滑、可导 | 对异常值敏感 | 与 MAE 对比?梯度特性? | |
| MAE (L1 Loss) | 回归 | L=1n∑∣y−y^∣\mathcal{L} = \frac{1}{n}\sum |y - \hat{y}|L=n1∑∣y−y^∣ | 对异常值鲁棒 | 梯度不连续(在0点) | 为何 L1 产生稀疏解? | |
| Huber Loss | 回归(兼顾 MSE/MAE) | 分段函数:误差小时用 MSE,大时用 MAE | 鲁棒且可导 | 需设定阈值 δ\deltaδ | 何时使用? | |
| Triplet Loss | 度量学习、人脸识别 | L=max(0,d(a,p)−d(a,n)+α)\mathcal{L} = \max(0, d(a,p) - d(a,n) + \alpha)L=max(0,d(a,p)−d(a,n)+α) | 学习嵌入空间距离 | 难样本挖掘关键 | anchor/positive/negative 选择策略? | |
| 优化器(Optimizer) | SGD | 通用 | w←w−η∇Lw \leftarrow w - \eta \nabla \mathcal{L}w←w−η∇L | 简单、理论扎实 | 收敛慢,易陷局部极小/鞍点 | 基础,常作为对比基准 |
| SGD with Momentum | 通用 | v←βv+∇L, w←w−ηvv \leftarrow \beta v + \nabla \mathcal{L},\ w \leftarrow w - \eta vv←βv+∇L, w←w−ηv | 加速收敛,抑制震荡 | 需调动量 β\betaβ(常0.9) | 物理意义:模拟惯性 | |
| Adam | 通用(尤其深度学习) | 自适应学习率,结合 Momentum + RMSProp | 收敛快,对超参不敏感 | 可能泛化略差于 SGD;需 warmup(尤其 Transformer) | 偏差校正?β1,β2\beta_1, \beta_2β1,β2 含义? | |
| RMSProp | 非稳态目标 | 按参数自适应学习率(基于梯度平方滑动平均) | 适合非平稳目标 | 较少单独使用 | Adam 的组成部分 | |
| AdamW | 带权重衰减的 Adam | 将 L2 正则(权重衰减)与 Adam 梯度更新解耦 | 更正确的正则化,泛化更好 | 默认推荐用于现代训练 | 与 Adam + L2 的区别? | |
| 学习率调度器(LR Scheduler) | Step Decay | 通用 | 每隔固定 epoch,η←η⋅γ\eta \leftarrow \eta \cdot \gammaη←η⋅γ | 简单有效 | 需预设衰减步长 | 常用于 CV |
| Exponential Decay | 通用 | ηt=η0⋅γt\eta_t = \eta_0 \cdot \gamma^tηt=η0⋅γt | 平滑衰减 | 衰减过快可能早停 | — | |
| Cosine Annealing | 通用 | ηt=ηmin+12(ηmax−ηmin)(1+cos(TcurTmaxπ))\eta_t = \eta_{\min} + \frac{1}{2}(\eta_{\max} - \eta_{\min})(1 + \cos(\frac{T_{cur}}{T_{max}}\pi))ηt=ηmin+21(ηmax−ηmin)(1+cos(TmaxTcurπ)) | 平滑下降+重启可跳出局部最优 | 需设周期 TmaxT_{max}Tmax | 常与 warm restart 结合(SGDR) | |
| Linear Warmup + Decay | NLP / Transformer | 初期线性增大学习率,再衰减 | 解决训练初期不稳定问题 | Transformer 训练标配 | 为何需要 warmup?Adam 初始方差大 | |
| ReduceLROnPlateau | 通用 | 当验证指标停滞时降低学习率 | 自适应调整 | 依赖验证集,可能延迟 | 监控指标选择? | |
| 组合实践 | — | — | — | — | — | 面试常问:你项目中用的什么组合?为什么? |
📊 分类与回归任务的常见评估指标
| 任务类型 | 指标名称 | 定义/公式 | 适用场景 | 优点 | 缺点/注意事项 | 面试高频考点 |
|---|---|---|---|---|---|---|
| 分类任务 | Accuracy(准确率) | TP+TNTP+TN+FP+FN\frac{TP + TN}{TP + TN + FP + FN}TP+TN+FP+FNTP+TN | 类别均衡的多类分类 | 直观、易理解 | 类别不平衡时失效(如99%负样本) | 为何不平衡时不看 Accuracy? |
| Precision(精确率) | TPTP+FP\frac{TP}{TP + FP}TP+FPTP | 关注“预测为正的有多少是真的” | 适用于 FP 代价高(如垃圾邮件) | 忽略 FN | P-R 权衡? | |
| Recall(召回率 / Sensitivity) | TPTP+FN\frac{TP}{TP + FN}TP+FNTP | 关注“所有正样本中找出了多少” | 适用于 FN 代价高(如疾病诊断) | 忽略 FP | 与 Precision 的 trade-off | |
| F1-Score | 2⋅Precision⋅RecallPrecision+Recall2 \cdot \frac{\text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}}2⋅Precision+RecallPrecision⋅Recall | 二分类,尤其不平衡 | 平衡 P 和 R 的调和平均 | 仅考虑正类,多类需 macro/micro | Macro-F1 vs Micro-F1 区别? | |
| AUC-ROC | ROC 曲线下面积(TPR vs FPR) | 评估模型整体排序能力 | 对类别不平衡鲁棒,阈值无关 | 在极度不平衡时可能过于乐观 | AUC 高但 Precision 低?为何? | |
| PR-AUC | Precision-Recall 曲线下面积 | 正样本少或关注正类时 | 比 ROC 更敏感于不平衡 | 不常用作默认指标 | 何时用 PR-AUC 而非 ROC-AUC? | |
| Confusion Matrix | 四格表:TP, TN, FP, FN | 所有分类任务 | 提供完整错误分析 | 需人工解读 | 是其他指标的基础 | |
| Log Loss(交叉熵) | −1N∑[yilog(y^i)+(1−yi)log(1−y^i)]-\frac{1}{N}\sum [y_i \log(\hat{y}_i) + (1-y_i)\log(1-\hat{y}_i)]−N1∑[yilog(y^i)+(1−yi)log(1−y^i)] | 评估概率输出质量 | 惩罚错误置信预测 | 对异常预测敏感 | 与 Accuracy 的区别? | |
| 回归任务 | MSE(均方误差) | 1n∑(yi−y^i)2\frac{1}{n}\sum (y_i - \hat{y}_i)^2n1∑(yi−y^i)2 | 通用回归 | 可导、数学性质好 | 对异常值敏感 | 为何不用 MAE?梯度特性? |
| RMSE(均方根误差) | MSE\sqrt{\text{MSE}}MSE | 通用回归 | 与目标同量纲,可解释 | 同样对异常值敏感 | 与 MSE 关系? | |
| MAE(平均绝对误差) | 1n∑∣yi−y^i∣\frac{1}{n}\sum |y_i - \hat{y}_i|n1∑∣yi−y^i∣ | 通用回归,尤其含异常值 | 对异常值鲁棒 | 梯度不连续(优化稍难) | L1 vs L2 损失对应指标? | |
| MAPE(平均绝对百分比误差) | $\frac{100%}{n}\sum \left | \frac{y_i - \hat{y}_i}{y_i}\right | $ | 业务指标(如销量预测) | 无量纲,便于跨序列比较 | |
| R²(决定系数) | 1−∑(yi−y^i)2∑(yi−yˉ)21 - \frac{\sum (y_i - \hat{y}_i)^2}{\sum (y_i - \bar{y})^2}1−∑(yi−yˉ)2∑(yi−y^i)2 | 评估模型解释方差比例 | 取值 [−∞,1],1 表示完美 | 负值表示比均值还差 | R² 高是否一定好? | |
| 多分类扩展 | Macro-Averaging | 对每个类单独计算指标后取平均 | 所有类别同等重要 | 平衡看待小类 | 忽略类别大小 | 与 Micro 的区别? |
| Micro-Averaging | 全局统计 TP/FP/FN 后计算指标 | 大类主导或关注总体性能 | 等价于 Accuracy(对 F1) | 小类影响小 | Micro-F1 = Accuracy?仅在多标签? |
📊 训练中常见问题及解决方法
| 问题类型 | 表现现象 | 根本原因 | 解决方法 | 补充说明 | 面试高频考点 |
|---|---|---|---|---|---|
| 过拟合(Overfitting) | 训练 loss 低,验证 loss 高;训练准确率高,验证准确率低 | 模型太复杂 / 数据太少 / 噪声多 / 训练过久 | • 增加数据(数据增强) • 正则化(L1/L2、Dropout) • 简化模型(减少层数/神经元) • Early Stopping • Batch Normalization • Label Smoothing |
过拟合 ≠ 训练误差低,关键看泛化差距 | 如何判断?与正则化的关系? |
| 欠拟合(Underfitting) | 训练 loss 高,验证 loss 也高;训练/验证准确率都低 | 模型太简单 / 特征不足 / 学习率不当 / 训练不足 | • 增加模型容量(更深/更宽) • 改进特征工程 • 调整学习率(增大) • 延长训练轮数 • 检查数据预处理是否合理 |
欠拟合通常比过拟合更容易诊断 | 与模型容量、优化的关系? |
| 梯度消失(Vanishing Gradient) | 网络深层梯度接近0,参数几乎不更新,训练停滞 | 激活函数饱和(如 sigmoid/tanh)+ 深层网络连乘小值 | • 使用 ReLU 等非饱和激活函数 • 残差连接(ResNet) • 合理初始化(Xavier/He) • 使用 LN/BN 稳定分布 • 使用 LSTM/GRU(RNN 场景) |
常见于 RNN 和非常深的 CNN/MLP | 为何 ReLU 能缓解?残差连接原理? |
| 梯度爆炸(Exploding Gradient) | 梯度极大,loss 突然 NaN 或剧烈震荡 | 深层网络连乘大值(尤其 RNN) | • Gradient Clipping(裁剪梯度范数) • 合理初始化(如 Xavier) • 使用 LN/BN • 降低学习率 • 使用 LSTM/GRU(RNN) |
梯度裁剪是标准做法(如设阈值 1.0) | Clipping 是治标还是治本? |
| 训练不收敛 / loss 不下降 | loss 长期不变或震荡无趋势 | • 学习率过高/过低 • 数据标签错误 • 网络结构 bug(如维度不匹配) • 激活函数/损失函数不匹配 |
• 检查数据和标签 • 调整学习率(尝试 1e-3, 1e-4) • 使用学习率 warmup • 梯度检查(是否为 0 或 NaN) • 简化模型做 sanity check |
“先过拟合一个小数据集”是调试黄金法则 | 如何做训练 sanity check? |
| Loss 为 NaN / Inf | loss 突然变成 NaN | • 学习率过大 • 梯度爆炸 • 数据含 NaN/Inf • 激活函数不稳定(如 softmax 输入过大) |
• 检查输入数据 • 降低学习率 • 加 Gradient Clipping • 在 log-sum-exp 中加数值稳定项 |
softmax 常用 logsumexp(x)=c+log∑exi−c\text{logsumexp}(x) = c + \log\sum e^{x_i - c}logsumexp(x)=c+log∑exi−c | 数值稳定性技巧? |
| 验证性能波动大 | 验证指标震荡剧烈 | • batch size 太小 • 验证集太小 • 数据未 shuffle 或分布不一致 |
• 增大 batch size • 确保训练/验证分布一致 • 多次运行取平均 • 使用滑动平均(EMA)模型 |
小数据集上常见 | EMA 是什么? |
| 模型性能卡在随机水平 | 准确率 ≈ 随机猜测(如 10 类分类 ≈10%) | • 标签错位(label mismatch) • 网络未有效学习(如全零初始化) • 优化器配置错误 |
• 打印部分预测 vs 真实标签 • 检查数据 pipeline • 用小数据集过拟合测试 |
“能过拟合 10 个样本吗?”是关键测试 | 调试流程? |
📊 数据集划分与验证方法
| 概念/方法 | 定义与作用 | 划分比例(典型) | 优点 | 缺点/注意事项 | 面试高频考点 |
|---|---|---|---|---|---|
| 训练集(Training Set) | 用于模型参数学习(拟合) | 60%–80%(视数据量而定) | 提供学习信号,驱动优化 | 不能用于评估泛化性能 | 必须与验证/测试集独立 |
| 验证集(Validation Set) | 用于超参数调优、模型选择、早停判断 | 10%–20% | 无偏估计模型在未见数据上的表现(用于开发阶段) | 数据量小时估计不稳定 | 不参与训练,但影响模型选择 |
| 测试集(Test Set) | 用于最终评估模型泛化能力 | 10%–20% | 模拟真实部署性能,仅用一次 | 泄露会导致评估乐观(数据泄露) | 绝对不能用于训练或调参 |
| 三者关系 | 训练 → 调参(用验证集) → 最终评估(用测试集) | — | 保证评估客观性 | 混淆验证/测试会导致过拟合“测试集” | 测试集只能用一次! |
| Hold-Out 验证 | 简单划分:固定训练/验证/测试集 | 如 70%/15%/15% | 简单高效,适合大数据 | 小数据时验证结果方差大 | 数据量大时首选 |
| K 折交叉验证(K-Fold CV) | 将训练数据分为 K 份,轮流用 K-1 份训练、1 份验证,重复 K 次 | K=5 或 10(常用) | 充分利用数据,评估更稳定 | 计算开销大(需训练 K 次) | 小数据集(如 <10k 样本)推荐使用 |
| 分层 K 折(Stratified K-Fold) | 保证每折中各类别比例与原数据一致 | — | 解决类别不平衡下的划分偏差 | 仅适用于分类任务 | 分类任务默认用分层 K 折 |
| 时间序列划分 | 按时间顺序划分(如前80%训练,后20%测试) | 不能随机打乱 | 符合实际预测场景(未来预测过去) | 无法用标准 K 折(会泄露未来信息) | 时间序列严禁随机划分 |
| 留一法(LOO) | K = N(N 为样本数),每样本单独作验证集 | — | 无偏估计,数据利用率最高 | 计算极昂贵,方差大 | 仅用于极小数据集(如 N<50) |
| 嵌套交叉验证(Nested CV) | 外层评估模型性能,内层调超参 | 如 5×5 嵌套 | 避免超参选择导致的评估偏差 | 计算成本极高 | 用于严谨科研或小数据高可靠评估 |
| 注意事项 | • 测试集必须完全隔离 • 验证集用于开发阶段决策 • 数据划分需保持分布一致(如图像按类别、文本按主题) |
— | 防止数据泄露 | 常见错误:用测试集调参、划分时未分层、时间序列打乱 | “你项目中怎么划分数据的?”是高频问题 |
📊 PyTorch 与 TensorFlow 核心区别对比
| 对比维度 | PyTorch | TensorFlow | 说明/面试要点 |
|---|---|---|---|
| 开发公司 | Meta(原 Facebook) | — | |
| 编程范式 | 动态图(eager execution 默认) | 静态图(TF 1.x)→ 动态图为主(TF 2.x + eager) | PyTorch 始终以动态图为核心,调试更直观;TF 2.x 向 PyTorch 靠拢 |
| 易用性与调试 | 类似 Python 原生,可直接 print、debug | TF 1.x 调试困难;TF 2.x 改善,但仍略复杂 | PyTorch 更受研究人员欢迎,上手快 |
| 计算图构建 | 即时执行(define-by-run) | TF 1.x:define-and-run(需 Session) TF 2.x:默认 eager,可 @tf.function 转静态图 |
动态图灵活,静态图部署高效 |
| 部署能力 | TorchScript、ONNX、LibTorch(C++) | TensorFlow Serving、TensorFlow Lite(移动端)、TF.js、SavedModel | TensorFlow 在生产部署生态更成熟,尤其移动端和边缘设备 |
| 分布式训练 | torch.distributed,支持 DDP、FSDP 等 |
tf.distribute.Strategy(如 MirroredStrategy) |
两者均支持多卡/多机,PyTorch 灵活,TF 配置更封装 |
| 社区与生态 | 研究界主流(多数论文开源用 PyTorch) | 工业界应用广泛(尤其 Google 系产品) | CV/NLP 顶会论文 >80% 使用 PyTorch |
| 可视化工具 | TensorBoard(兼容)、Weights & Biases | TensorBoard(原生深度集成) | 两者都可用 TensorBoard |
| 自动微分 | autograd:灵活,支持高阶导数 |
GradientTape(TF 2.x):需显式记录操作 |
PyTorch 自动微分更“隐形”,更符合直觉 |
| 模型保存/加载 | torch.save() / torch.load()(保存 state_dict 或整个模型) |
SavedModel(推荐)、HDF5(旧) | SavedModel 包含结构+权重+计算图,适合部署 |
| 移动端/嵌入式 | 支持较弱(通过 LibTorch 或 ONNX 转换) | TensorFlow Lite 专为移动端优化,生态完善 | TF 在端侧部署优势明显 |
| 版本演进 | 保持简洁,API 稳定性较好 | TF 1.x → TF 2.x 变动巨大,造成历史包袱 | 很多老项目仍卡在 TF 1.x |
| 典型使用场景 | 学术研究、快速原型、实验迭代 | 工业部署、大规模生产系统、移动端 | “研究用 PyTorch,上线转 TensorFlow”曾是常见流程(现可通过 ONNX 互通) |
| 与 ONNX 兼容性 | 原生支持导出 ONNX | 支持导出 ONNX(但部分算子兼容性问题) | ONNX 成为跨框架部署桥梁 |
| 一句话总结 | PyTorch 在灵活性和研究友好性上占优 | TensorFlow 在部署和生产生态上更强 |
📊 完整训练流程
| 阶段 | 核心步骤 | 关键组件/操作 | 说明 |
|---|---|---|---|
| 1. 数据准备 | • 定义 Dataset • 使用 DataLoader |
• Dataset:封装数据与标签的索引逻辑• DataLoader:提供 batch、shuffle、num_workers |
支持自定义数据读取;训练集通常 shuffle,验证/测试集不 shuffle |
| 2. 模型构建 | • 继承 nn.Module• 定义 __init__ 和 forward |
• 层(如 nn.Linear, nn.Conv2d)• 激活函数、归一化等模块 |
模型结构在 forward 中定义计算流程;参数自动注册 |
| 3. 设备配置 | • 指定 device(CPU/GPU) • 模型与数据移至 device |
• model.to(device)• data.to(device) |
支持多 GPU(如 DataParallel 或 DistributedDataParallel) |
| 4. 训练配置 | • 损失函数 • 优化器 • 学习率调度器 |
• loss_fn = nn.CrossEntropyLoss()• optimizer = torch.optim.AdamW(...)• scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(...) |
损失函数与任务匹配;优化器管理参数更新;调度器动态调学习率 |
| 5. 训练循环 | • 多轮(epoch)迭代 • 每轮遍历 DataLoader • 前向传播 → 计算 loss → 反向传播 → 优化器更新 |
• optimizer.zero_grad()• loss.backward()• optimizer.step()• scheduler.step()(通常每 epoch) |
必须清零梯度;反向传播自动计算梯度;更新后可选梯度裁剪 |
| 6. 验证/评估 | • 在验证集上评估 • 关闭梯度( torch.no_grad()) |
• 不更新参数 • 计算指标(如 accuracy、F1) |
节省显存、加速;用于早停或模型选择 |
| 7. 模型保存 | • 保存 checkpoint | • 通常保存 state_dict(模型权重)• 可选保存 optimizer、scheduler、epoch 等 |
推荐保存 state_dict 而非整个模型,更灵活 |
| 8. 测试评估 | • 在测试集上最终评估 • 仅执行一次 |
• 使用最佳模型(如验证集最优) • 报告最终指标 |
测试集绝不参与任何训练或调参决策 |
| 9. 可选增强实践 | • 梯度裁剪(如 nn.utils.clip_grad_norm_)• 混合精度训练(AMP) • EMA(指数移动平均)模型 |
• 防止梯度爆炸 • 加速训练、节省显存 • 提升泛化 |
常用于大模型或不稳定训练场景 |
📊 一个 Epoch 内训练循环的关键步骤
| 步骤 | 操作 | 目的/说明 | 面试关注点 |
|---|---|---|---|
| 1. 遍历 DataLoader | 按 batch 顺序(或 shuffle 后)读取数据 | 将整个训练集划分为多个 mini-batch 进行迭代 | batch size 影响内存、梯度估计方差和收敛稳定性 |
| 2. 数据移至设备 | 将 input 和 target 移到 GPU/CPU | 确保计算设备一致 | 若未正确迁移,会报错或默认在 CPU 运行 |
| 3. 模型设为训练模式 | model.train() |
启用如 Dropout、BatchNorm 的训练行为 | 关键:BN 使用 batch 统计量,Dropout 随机失活 |
| 4. 清零梯度 | optimizer.zero_grad() |
清除上一个 batch 累积的梯度 | 必须执行,否则梯度会累加导致错误更新 |
| 5. 前向传播 | output = model(input) |
计算模型预测 | 自动构建动态计算图(用于反向传播) |
| 6. 计算损失 | loss = loss_fn(output, target) |
衡量预测与真实标签的差距 | 损失函数需与任务匹配(如分类用 CrossEntropy) |
| 7. 反向传播 | loss.backward() |
自动计算所有可训练参数的梯度 | PyTorch 的 autograd 机制自动完成 |
| 8. (可选)梯度裁剪 | torch.nn.utils.clip_grad_norm_(...) |
防止梯度爆炸(尤其 RNN/Transformer) | 常用于序列模型或大学习率场景 |
| 9. 参数更新 | optimizer.step() |
根据优化器规则(如 Adam)更新权重 | 执行实际的参数调整 |
| 10. (可选)学习率调度 | scheduler.step()(部分调度器每 batch 调) |
动态调整学习率 | 多数调度器每 epoch 调,但如 OneCycleLR 每 batch 调 |
| 11. 记录指标 | 累计 loss、accuracy 等 | 用于监控训练过程 | 通常在每个 batch 或定期打印/写入日志 |
| 12. 重复 | 进入下一个 batch,重复步骤 2–11 | 直到遍历完所有训练 batch | 一个 epoch = 1 次完整遍历训练集 |
📊 模型部署框架对比:PyTorch、TensorFlow、ONNX、TensorRT
| 框架/格式 | 类型 | 主要用途 | 部署优势 | 部署局限 | 转换能力(是否可互相转换) | 面试高频考点 |
|---|---|---|---|---|---|---|
| PyTorch | 深度学习框架 | 训练 + 推理(原生) | • 灵活、研究友好 • 支持 TorchScript(静态图) • LibTorch(C++)支持部署 |
• 原生推理性能一般 • 移动端/嵌入式支持弱于 TF |
→ ONNX(官方支持) → TorchScript(内置) ✗ 不能直接转 TensorFlow/TensorRT |
TorchScript 是什么?为何部署常用 ONNX 中转? |
| TensorFlow | 深度学习框架 | 训练 + 工业级部署 | • TensorFlow Serving(服务端) • TensorFlow Lite(移动端/嵌入式) • TF.js(浏览器) • SavedModel 格式标准化 |
• TF 1.x/2.x 兼容问题 • 动态控制流部署复杂 |
→ ONNX(通过 tf2onnx) → TensorFlow Lite(内置) → TensorRT(通过 TF-TRT 或 ONNX) |
SavedModel vs HDF5?TF Lite 优化手段? |
| ONNX (Open Neural Network Exchange) | 开放模型格式 | 跨框架模型交换中间表示 | • 统一格式,解耦训练与部署 • 支持 150+ 算子 • 被 TensorRT、OpenVINO、CoreML 等广泛支持 |
• 复杂控制流(如动态 shape、循环)支持有限 • 自定义算子需手动实现 |
✓ PyTorch → ONNX(原生) ✓ TensorFlow → ONNX(tf2onnx) ✓ ONNX → TensorRT / OpenVINO / CoreML 等 |
ONNX 是部署桥梁;是否支持动态 shape? |
| TensorRT | NVIDIA 推理优化引擎 | GPU 高性能推理(NVIDIA) | • 层融合、精度校准(FP16/INT8) • 内存优化、内核自动调优 • 延迟和吞吐极致优化 |
• 仅支持 NVIDIA GPU • 构建引擎耗时 • 对非标准算子支持有限 |
✓ ONNX → TensorRT(官方 parser) ✓ TensorFlow → TensorRT(TF-TRT 或 via ONNX) ✓ PyTorch → TensorRT(需先转 ONNX) |
为何要 INT8 量化?构建 engine 和推理分离? |
| 标准部署流程 | PyTorch/TensorFlow → ONNX → TensorRT/OpenVINO/TFLite |
📊 PyTorch 转 ONNX:torch.onnx.export 要点
| 参数 | 类型/默认值 | 作用说明 | 面试/实践注意事项 |
|---|---|---|---|
model |
torch.nn.Module |
要导出的模型(需处于 eval() 模式) |
导出前务必 model.eval(),避免 Dropout/BatchNorm 训练行为 |
args |
tuple 或 Tensor |
模型 forward 的输入示例(dummy input) |
必须与实际推理输入 shape/type 一致;支持多输入(tuple) |
f |
str 或文件对象 |
输出 ONNX 文件路径(如 "model.onnx") |
— |
export_params=True |
bool |
是否保存训练好的权重 | 通常为 True;若为 False,则为无权重结构图 |
opset_version=11 |
int(常用 11~17) |
ONNX 算子集版本 | 关键:版本太低可能不支持新算子(如 GELU、LayerNorm);太高可能部署端不兼容 |
do_constant_folding=True |
bool |
是否执行常量折叠优化 | 推荐 True,可减小模型体积、提升推理速度 |
input_names |
list[str] |
输入节点名称(如 ["input"]) |
便于后续推理时绑定输入;多输入需对应 args 顺序 |
output_names |
list[str] |
输出节点名称(如 ["output"]) |
同上,方便部署时读取输出 |
dynamic_axes |
dict 或 None |
定义动态维度(如 batch、seq_len) | 关键:支持变长输入,例如:{"input": {0: "batch", 1: "seq"}, "output": {0: "batch"}}表示 batch 和 seq_len 可变 |
verbose=False |
bool |
是否打印导出过程信息 | 调试时可设为 True,查看计算图结构 |
training=torch.onnx.TrainingMode.EVAL |
枚举 | 控制导出时模型状态 | 通常用 EVAL;若需导出训练图(极少用),设为 TRAINING |
keep_initializers_as_inputs=False |
bool |
是否将参数作为输入 | ONNX 1.7+ 推荐 False,避免输入数量爆炸 |
📊 经典手撕公式
| 类别 | 公式名称 | 核心公式 | 关键说明 | 面试考察点 |
|---|---|---|---|---|
| 损失函数 | 交叉熵损失(多分类) | L=−∑i=1Cyilog(y^i)\mathcal{L} = -\sum_{i=1}^C y_i \log(\hat{y}_i)L=−∑i=1Cyilog(y^i) 其中 y^=softmax(z)\hat{y} = \text{softmax}(z)y^=softmax(z) |
yyy 为 one-hot 标签,zzz 为 logits | 常与 softmax 联合推导梯度 |
| 二元交叉熵 | L=−[ylog(σ(z))+(1−y)log(1−σ(z))]\mathcal{L} = -[y \log(\sigma(z)) + (1-y)\log(1-\sigma(z))]L=−[ylog(σ(z))+(1−y)log(1−σ(z))] | σ(z)=11+e−z\sigma(z) = \frac{1}{1+e^{-z}}σ(z)=1+e−z1 | 推导梯度时体现“预测误差”形式 | |
| MSE | L=12(y−y^)2\mathcal{L} = \frac{1}{2}(y - \hat{y})^2L=21(y−y^)2 | 常带 12\frac{1}{2}21 便于求导 | 梯度为 (y^−y)(\hat{y} - y)(y^−y),简洁 | |
| 激活函数 | Sigmoid | σ(z)=11+e−z\sigma(z) = \frac{1}{1 + e^{-z}}σ(z)=1+e−z1 σ′(z)=σ(z)(1−σ(z))\sigma'(z) = \sigma(z)(1 - \sigma(z))σ′(z)=σ(z)(1−σ(z)) |
输出 (0,1),梯度在两端饱和 | 梯度消失典型例子 |
| ReLU | ReLU(z)=max(0,z)\text{ReLU}(z) = \max(0, z)ReLU(z)=max(0,z) 导数:1z>01_{z>0}1z>0 |
简单高效,缓解梯度消失 | 不可导点(z=0)通常设导数为0 | |
| Softmax | softmax(zi)=ezi∑jezj\text{softmax}(z_i) = \frac{e^{z_i}}{\sum_j e^{z_j}}softmax(zi)=∑jezjezi | 输出概率分布,常用于多分类 | 重点:与交叉熵联合求导得 y^i−yi\hat{y}_i - y_iy^i−yi | |
| 梯度推导 | Softmax + Cross-Entropy 梯度 | ∂L∂zi=y^i−yi\frac{\partial \mathcal{L}}{\partial z_i} = \hat{y}_i - y_i∂zi∂L=y^i−yi | 极其重要!简洁且数值稳定 | 面试必考:推导过程(链式法则) |
| 线性层梯度 | z=Wx+bz = Wx + bz=Wx+b ∂L∂W=∂L∂zx⊤\frac{\partial \mathcal{L}}{\partial W} = \frac{\partial \mathcal{L}}{\partial z} x^\top∂W∂L=∂z∂Lx⊤ |
权重梯度 = 上游梯度 × 输入转置 | 理解矩阵求导维度匹配 | |
| 优化器 | SGD | W←W−η∇WLW \leftarrow W - \eta \nabla_W \mathcal{L}W←W−η∇WL | 最基础更新规则 | — |
| Momentum | v←βv+∇Lv \leftarrow \beta v + \nabla \mathcal{L}v←βv+∇L W←W−ηvW \leftarrow W - \eta vW←W−ηv |
引入动量项加速收敛 | 物理类比:惯性 | |
| Adam | mt=β1mt−1+(1−β1)gtm_t = \beta_1 m_{t-1} + (1-\beta_1) g_tmt=β1mt−1+(1−β1)gt vt=β2vt−1+(1−β2)gt2v_t = \beta_2 v_{t-1} + (1-\beta_2) g_t^2vt=β2vt−1+(1−β2)gt2 m^t=mt/(1−β1t)\hat{m}_t = m_t/(1-\beta_1^t)m^t=mt/(1−β1t), v^t=vt/(1−β2t)\hat{v}_t = v_t/(1-\beta_2^t)v^t=vt/(1−β2t) W←W−ηm^t/(v^t+ϵ)W \leftarrow W - \eta \hat{m}_t / (\sqrt{\hat{v}_t} + \epsilon)W←W−ηm^t/(v^t+ϵ) |
自适应学习率 + 动量 | 需知偏差校正(m^t,v^t\hat{m}_t, \hat{v}_tm^t,v^t) | |
| 归一化 | BatchNorm | x^i=xi−μBσB2+ϵ\hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}x^i=σB2+ϵxi−μB yi=γx^i+βy_i = \gamma \hat{x}_i + \betayi=γx^i+β |
μB,σB2\mu_B, \sigma_B^2μB,σB2 为 batch 统计量 | 训练用 batch 统计,推理用滑动平均 |
| 注意力机制 | Scaled Dot-Product Attention | Attention(Q,K,V)=softmax(QK⊤dk)V\text{Attention}(Q,K,V) = \text{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)VAttention(Q,K,V)=softmax(dkQK⊤)V | 缩放防止点积过大 | 为何除 dk\sqrt{d_k}dk?梯度稳定性 |
| Multi-Head Attention | Concat(head1,...,headh)WO\text{Concat}(\text{head}_1, ..., \text{head}_h) W^OConcat(head1,...,headh)WO 其中 headi=Attention(QWiQ,KWiK,VWiV)\text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V)headi=Attention(QWiQ,KWiK,VWiV) |
并行多头,增强表达能力 | 头数 h 通常为 8 或 16 | |
| 正则化 | Dropout | 训练时:y=x⋅m/(1−p)y = x \cdot m / (1-p)y=x⋅m/(1−p) 其中 m∼Bernoulli(1−p)m \sim \text{Bernoulli}(1-p)m∼Bernoulli(1−p) |
测试时不做 dropout(或 scale) | 本质是集成学习近似 |
| 评估指标 | F1-Score | F1=2⋅Precision⋅RecallPrecision+RecallF1 = 2 \cdot \frac{\text{Precision} \cdot \text{Recall}}{\text{Precision} + \text{Recall}}F1=2⋅Precision+RecallPrecision⋅Recall | Precision = TP/(TP+FP), Recall = TP/(TP+FN) | 调和平均,对不平衡数据敏感 |
| AUC-ROC | 基于 TPR vs FPR 曲线下面积 | TPR = Recall, FPR = FP/(FP+TN) | 阈值无关,评估排序能力 |
📊 模型压缩和轻量化等技术
| 技术类别 | 方法名称 | 核心思想 | 关键步骤/公式 | 优点 | 缺点/挑战 | 面试高频考点 |
|---|---|---|---|---|---|---|
| 知识蒸馏(Knowledge Distillation) | 经典蒸馏(Hinton et al., 2015) | 用大模型(Teacher)指导小模型(Student)学习 | 损失 = α·Soft CE(𝑠𝑡𝑢𝑑𝑒𝑛𝑡, 𝑡𝑒𝑎𝑐ℎ𝑒𝑟) + (1−α)·Hard CE(𝑠𝑡𝑢𝑑𝑒𝑛𝑡, 𝑙𝑎𝑏𝑒𝑙) Soft CE 使用高温 softmax:pi=ezi/T∑jezj/Tp_i = \frac{e^{z_i/T}}{\sum_j e^{z_j/T}}pi=∑jezj/Tezi/T |
• 提升小模型精度 • 利用 teacher 的“暗知识” |
• 需训练 teacher • 温度 T 和 α 需调参 |
为何用高温 softmax?logits vs 概率? |
| 自蒸馏(Self-Distillation) | 同一模型不同层或不同阶段互蒸 | 如深层监督浅层 | 无需额外 teacher | 效果通常弱于经典蒸馏 | — | |
| 剪枝(Pruning) | 非结构化剪枝 | 移除权重矩阵中不重要的单个权重(设为0) | • 基于权重绝对值/梯度 • 迭代剪枝 + 微调 |
压缩率高、理论精度保持好 | 需专用稀疏硬件加速,普通 GPU 无加速 | 与结构化剪枝区别? |
| 结构化剪枝 | 移除整个通道、层或头(如 CNN 通道、Transformer head) | • 基于 L1-norm of channel • Taylor expansion 估计重要性 |
可直接在通用硬件加速 | 精度损失通常大于非结构化 | 为何工业界偏好结构化? | |
| 量化(Quantization) | 训练后量化(PTQ) | 训练完成后将 FP32 权重/激活转为 INT8/INT4 | xint=round(x/s)+zx_{\text{int}} = \text{round}(x / s) + zxint=round(x/s)+z (s: scale, z: zero-point) |
无需重训练,部署快 | 精度损失较大(尤其低比特) | 对称 vs 非对称量化? |
| 量化感知训练(QAT) | 训练中模拟量化误差 | 插入伪量化节点(fake quant) | 精度接近 FP32 | 需重新训练,流程复杂 | 为何 QAT 比 PTQ 精度高? | |
| 轻量化架构设计 | 深度可分离卷积(Depthwise Separable Conv) | 将标准卷积分解为空间卷积 + 通道卷积 | 参数量从 DK2⋅M⋅ND_K^2 \cdot M \cdot NDK2⋅M⋅N 降至 DK2⋅M+M⋅ND_K^2 \cdot M + M \cdot NDK2⋅M+M⋅N | 大幅减少计算量和参数 | 精度略降 | MobileNet 核心模块 |
| 倒残差结构(Inverted Residual) | 先升维 → DWConv → 再降维 | 用于 MobileNetV2 | 提升非线性表达能力 | — | 为何“倒”?传统残差是降维再升维 | |
| ShuffleNet + Channel Shuffle | 分组卷积 + 通道混洗 | 减少计算量同时增强组间信息交互 | 适合极低算力设备 | 设计复杂 | — | |
| 其他技术 | 低秩分解(Low-Rank Factorization) | 将权重矩阵近似为低秩矩阵乘积 | W≈U⋅VW \approx U \cdot VW≈U⋅V, rank r≪min(m,n)r \ll \min(m,n)r≪min(m,n) | 减少存储和计算 | 分解后需微调,收益有限 | — |
| 神经架构搜索(NAS) for Efficient Models | 自动搜索高效结构(如 EfficientNet) | 基于 FLOPs/latency 约束优化 | 性能-效率帕累托最优 | 计算成本极高 | EfficientNet 的复合缩放是什么? |
📊 梯度相关知识
| 概念 | 核心要点 | 关键公式/机制 | 常见问题/面试考点 |
|---|---|---|---|
| 梯度(Gradient) | 损失函数对模型参数的偏导数,指示参数更新方向 | ∇θL=[∂L∂θ1,…,∂L∂θn]\nabla_\theta \mathcal{L} = \left[ \frac{\partial \mathcal{L}}{\partial \theta_1}, \dots, \frac{\partial \mathcal{L}}{\partial \theta_n} \right]∇θL=[∂θ1∂L,…,∂θn∂L] | 梯度指向损失上升最快方向,优化器沿反方向更新 |
| 反向传播(Backpropagation) | 利用链式法则高效计算梯度 | ∂L∂x=∂L∂y⋅∂y∂x\frac{\partial \mathcal{L}}{\partial x} = \frac{\partial \mathcal{L}}{\partial y} \cdot \frac{\partial y}{\partial x}∂x∂L=∂y∂L⋅∂x∂y | 为什么需要反向传播?比数值微分高效(O(n)O(n)O(n) vs O(n2)O(n^2)O(n2)) |
| 梯度消失(Vanishing Gradient) | 深层网络中梯度逐层趋近于0,导致浅层几乎不更新 | 多个 <1<1<1 的导数连乘:(σ′)L→0(\sigma')^L \to 0(σ′)L→0(如 sigmoid) | 常见于 RNN 和深 MLP;解决:ReLU、残差连接、初始化 |
| 梯度爆炸(Exploding Gradient) | 梯度逐层指数增长,导致参数剧烈震荡或 NaN | 多个 >1>1>1 的导数连乘(如未约束的 RNN) | 解决:梯度裁剪(Gradient Clipping)、LSTM、合理初始化 |
| 梯度裁剪(Gradient Clipping) | 限制梯度范数防止爆炸 | 若 ∣g∣2>τ|\mathbf{g}|_2 > \tau∣g∣2>τ,则 g←g⋅τ∣g∣2\mathbf{g} \leftarrow \mathbf{g} \cdot \frac{\tau}{|\mathbf{g}|_2}g←g⋅∣g∣2τ | 常用于 RNN、Transformer;阈值 τ\tauτ 通常设为 1.0 |
| 梯度检查(Gradient Check) | 用数值微分验证反向传播实现是否正确 | 数值梯度:f(θ+ϵ)−f(θ−ϵ)2ϵ\frac{f(\theta + \epsilon) - f(\theta - \epsilon)}{2\epsilon}2ϵf(θ+ϵ)−f(θ−ϵ) | 现代框架(PyTorch/TensorFlow)自动求导,极少手动实现,故少用 |
| 局部梯度 vs 全局梯度 | 局部:某一层的偏导;全局:从 loss 到该层的完整链式导数 | 全局梯度 = 局部梯度 × 上游梯度 | 理解计算图中“上游梯度”传递机制 |
| 梯度为零/NaN 的可能原因 | • 学习率过大 • 激活函数饱和(如 ReLU 死亡) • 数据含 NaN • 损失函数设计错误 |
ReLU 死亡:输入恒负 → 梯度恒为0 | 如何诊断?打印中间层输出、梯度范数 |
| 梯度方差(Variance) | 小 batch 导致梯度估计噪声大 | Var(∇Lmini-batch)∝1/B\text{Var}(\nabla \mathcal{L}_{\text{mini-batch}}) \propto 1/BVar(∇Lmini-batch)∝1/B | batch size 越大,梯度越准但内存开销大 |
| 梯度累积(Gradient Accumulation) | 模拟大 batch:多次前向/反向后才更新 | 累积 kkk 步梯度,等效 batch size 扩大 kkk 倍 | 显存不足时的常用技巧 |
| 雅可比矩阵 & 海森矩阵 | 雅可比:输出对输入的导数;海森:损失对参数的二阶导 | 海森矩阵 Hij=∂2L∂θi∂θjH_{ij} = \frac{\partial^2 \mathcal{L}}{\partial \theta_i \partial \theta_j}Hij=∂θi∂θj∂2L | 二阶优化(如牛顿法)理论基础,但计算昂贵 |
| 梯度流(Gradient Flow) | 梯度在网络层间的传播状态 | 可通过 torch.autograd.grad 或 hook 监控 |
用于分析 ResNet 为何有效(梯度直达浅层) |
📊 正向传播与反向传播
| 项目 | 正向传播(Forward Propagation) | 反向传播(Backward Propagation) |
|---|---|---|
| 定义 | 输入数据从输入层经过隐藏层传递到输出层,计算预测值的过程 | 根据损失函数对模型参数的梯度,从输出层反向逐层计算梯度的过程 |
| 目的 | 计算模型输出和损失值 | 计算损失对每个参数的梯度,用于参数更新 |
| 计算顺序 | 从输入 → 输出(前向) | 从输出 → 输入(反向) |
| 依赖机制 | 依赖模型当前参数和输入数据 | 依赖正向传播构建的计算图(动态或静态)和链式法则 |
| 关键操作 | 矩阵乘法、激活函数、归一化等 | 链式法则(Chain Rule)、梯度累加 |
| 是否需要计算图 | 否(仅数值计算) | 是(需记录操作以反向求导) |
| 时间复杂度 | O(n)O(n)O(n),与网络层数和参数量成正比 | O(n)O(n)O(n),通常约为正向传播的 2–3 倍 |
| 内存消耗 | 仅需保存各层输出(用于反向) | 需保存中间激活值(除非 checkpointing) |
| PyTorch 行为 | output = model(x) 自动构建动态计算图 |
loss.backward() 触发自动微分(autograd) |
| 常见误区 | 误认为正向传播包含损失计算(实际包含) | 误认为反向传播更新参数(实际只计算梯度,optimizer.step() 才更新) |
| 面试高频问题 | • 正向传播输出什么? • 是否需要保存中间结果? |
• 反向传播的数学基础?(链式法则) • 为什么反向传播比数值微分高效? • 计算图是如何构建和释放的? |
📊 经典与轻量化CNN网络核心模块对比
| 网络/模块名称 | 核心思想/结构 | 关键特点 | 优势 | 面试常见问题 |
|---|---|---|---|---|
| ResNet(残差网络) | 引入残差块(Residual Block):y=F(x)+xy = F(x) + xy=F(x)+x,其中 F(x)F(x)F(x) 为残差函数 | - 使用跳跃连接(skip connection) - 解决深层网络的梯度消失/退化问题 - 典型结构:两层/三层卷积 + BN + ReLU |
- 可训练上百甚至上千层 - 提升准确率同时降低训练难度 |
- 残差连接为什么有效? - 如果输入输出维度不同如何处理?(答:使用1×1卷积升维/降维) |
| DenseNet(密集连接网络) | 密集块(Dense Block):每一层都与前面所有层直接连接,特征重用 | - 特征图拼接(concat)而非相加 - 每层输入为前面所有层输出的拼接 - 使用**过渡层(Transition Layer)**降维 |
- 参数更少 - 特征复用强,缓解梯度消失 - 更强的正则化效果 |
- DenseNet为什么参数少? - 与ResNet的区别?(答:concat vs add,特征复用方式不同) |
| 深度可分离卷积(Depthwise Separable Conv) | 分为两步: 1. Depthwise Conv:每个通道独立卷积 2. Pointwise Conv:1×1卷积融合通道 |
- 大幅减少计算量和参数 - 常用于MobileNet、Xception等轻量化网络 |
- 计算效率高(约为标准卷积的 1/N+1/DK21/N + 1/D_K^21/N+1/DK2,N为通道数) - 适合移动端部署 |
- 和标准卷积计算量对比? - 为什么能减少参数? |
| MobileNetV1 | 基于深度可分离卷积构建 | - 引入**宽度乘子(Width Multiplier)和分辨率乘子(Resolution Multiplier)**控制模型大小 | - 轻量、高效 - 适合实时应用 |
- 如何控制模型复杂度? |
| MobileNetV2 | 提出倒残差结构(Inverted Residual Block): 1×1升维 → DW Conv → 1×1降维 + 残差连接(仅当输入输出维度一致时) |
- 使用ReLU6激活函数 - 升维后提取特征,避免信息丢失 |
- 更适合低维输入 - 在小模型上表现优于V1 |
- 为什么叫“倒残差”? - 为什么升维后再做DW? |
| ShuffleNet | 使用组卷积(Group Conv) + 通道重排(Channel Shuffle) | - 减少计算量 - 通道重排增强组间信息交互 |
- 极低FLOPs下保持精度 - 适合极轻量场景 |
- 通道重排的作用? - 与MobileNet区别? |
📊 新技术概览
| 技术方向 | 技术名称 | 核心思想/机制 | 关键优势 | 典型应用/代表模型 | 面试关注点 |
|---|---|---|---|---|---|
| 大模型架构 | Mixture of Experts (MoE) | 将模型划分为多个“专家”子网络,每输入仅激活部分专家 | 在不显著增加计算量前提下扩展模型容量 | Mixtral、DeepSeek-MoE、Google GLaM | - 如何实现稀疏激活? - 训练稳定性挑战? |
| 高效训练 | Low-Rank Adaptation (LoRA) | 冻结主干权重,通过低秩矩阵微调适配下游任务 | 显存占用低、可插拔、多任务共享 | LLM微调(如LLaMA+LoRA) | - 为什么低秩有效? - 与全参数微调对比? |
| 推理优化 | KV Cache Quantization | 对注意力机制中的Key/Value缓存进行量化(如4-bit) | 显著降低推理显存与延迟 | LLM在线服务(vLLM、TensorRT-LLM) | - 量化对生成质量影响? - 如何保持精度? |
| 生成式AI | Diffusion Models(扩散模型) | 通过逐步去噪从随机噪声生成数据 | 生成质量高、训练稳定 | Stable Diffusion、DALL·E 2、Sora(视频) | - 与GAN对比优劣? - 采样速度瓶颈? |
| 多模态 | Vision-Language Pretraining (VLP) | 联合训练图像与文本编码器,对齐语义空间 | 支持跨模态理解与生成 | CLIP、BLIP、Flamingo、GPT-4V | - 如何对齐图文? - 零样本迁移原理? |
| 具身智能 / AI Agent | AI 智能体(AI Agent) | 具备感知→规划→调用工具→执行闭环能力 | 自主完成复杂任务 | AutoGPT、Meta Toolformer、DeepSeek-R1 Agent | - 如何实现工具调用? - 记忆与反思机制? |
| 模型压缩 | 知识蒸馏(Knowledge Distillation) | 用大模型(教师)指导小模型(学生)学习软标签 | 小模型获得接近大模型性能 | DistilBERT、TinyLLM | - 软标签 vs 硬标签? - 温度参数作用? |
| 自监督学习 | Contrastive Learning(对比学习) | 拉近正样本对、推开负样本对,学习不变表示 | 无需标签,适合预训练 | SimCLR、MoCo、DINO | - 正负样本如何构建? - InfoNCE损失? |
| 神经架构搜索 | NAS(Neural Architecture Search) | 自动搜索最优网络结构(如通过强化学习、可微方式) | 减少人工设计成本 | EfficientNet、Once-for-All | - 可微NAS(DARTS)原理? - 搜索效率问题? |
| 绿色AI / 低算力模型 | 本地化大模型(On-Device LLM) | 模型小型化+量化+硬件协同设计,支持端侧运行 | 隐私安全、低延迟、离线可用 | DeepSeek-R1、Phi-3、Gemma | - 如何在消费级GPU/CPU运行7B模型? - GGUF/AWQ等格式区别? |
更多推荐
所有评论(0)