当前位置: 首页 > article >正文

大厂面试题备份20250131

20250131

模型压缩怎么做?除了知识蒸馏

模型压缩是为了减少深度学习模型的计算和存储需求,提高推理效率。除了知识蒸馏,常见的模型压缩方法包括:

1. 剪枝(Pruning)

  • 非结构化剪枝(Unstructured Pruning):去掉权重较小的个别参数(稀疏化)。
  • 结构化剪枝(Structured Pruning):剪掉整个神经元、卷积核或通道,提高硬件加速效率。
  • 门控剪枝(L0 Regularization, Lottery Ticket Hypothesis):训练过程中使用L0正则化或寻找子网络。

2. 量化(Quantization)

  • 权重量化(Weight Quantization):把32-bit浮点数转换为8-bit、4-bit或更低的整数,提高存储和计算效率。
  • 激活量化(Activation Quantization):对中间激活值进行低比特表示。
  • 后训练量化(PTQ, Post-Training Quantization):训练完后量化,如TensorRT、TensorFlow Lite等工具支持。
  • 量化感知训练(QAT, Quantization-Aware Training):在训练时模拟量化误差,效果更优。

3. 低秩分解(Low-Rank Approximation)

  • SVD分解(Singular Value Decomposition):对权重矩阵进行低秩近似分解,减少计算量。
  • Tensor分解(CP分解, Tucker分解):对高维张量进行分解,如CP-decomposition、Tucker decomposition。

4. 算子融合(Operator Fusion)

  • 将多个连续的算子(如BatchNorm + Conv, Conv + ReLU)合并,减少计算开销。

5. 模型架构优化

  • 设计更轻量的网络,如MobileNet、EfficientNet、ShuffleNet。
  • 使用深度可分离卷积(Depthwise Separable Convolution)、分组卷积(Grouped Convolution)、动态卷积(Dynamic Convolution)等高效算子。

6. 剪枝 + 量化 + 知识蒸馏的组合方法

  • 例如Tencent NCNN、Facebook's QNNPACK、Google EdgeTPU等,都会结合多种方法进一步优化推理速度。

如果你的目标是特定硬件优化(如手机、边缘设备、服务器),可以选择合适的工具链,比如:

  • TensorRT(NVIDIA GPU)
  • TVM / Apache MLC(通用加速)
  • TensorFlow Lite(移动端)
  • OpenVINO(Intel CPU/FPGA)
  • ONNX Runtime(通用优化)

对不定长的序列怎么处理,pad

1. Padding(填充)

适用于批处理(batch training/inference),使所有序列长度一致。

1.1. 固定长度填充(Padding to Max Length)
  • 选择一个最大序列长度 max_len,然后对所有序列:
    • 短序列填充(padding):使用特殊标记(如<PAD>,或者数值 0)补齐。
    • 长序列截断(truncation):超过 max_len 的部分裁剪掉。

📌 适用场景

  • NLP 任务(LSTM, Transformer等)。
  • CNN 处理文本(如TextCNN)。
  • 需要固定形状的输入(如TensorRT优化)。

📌 缺点

  • 过长的 max_len 浪费计算资源。
  • 过短的 max_len 会截断信息,损失精度。

2. Masking(掩码)

padding 会带来无意义的填充数据,为了让模型忽略填充部分,我们使用 masking

  • 在 NLP 任务中(Transformer, BERT 等),通常使用 Attention Mask
  • 在 RNN 任务(LSTM/GRU)中,可以使用 PackedSequence 来跳过填充。

📌 适用场景

  • Transformer、BERT等使用 attention_mask 避免关注 <PAD>
  • LSTM/GRU 处理变长序列时使用 PackedSequence

3. Bucketting(动态分批)

如果 padding 过多,计算效率会下降,可以使用 bucket 分组:

  • 按序列长度分成多个批次(buckets),每个 bucket 内的序列长度接近。
  • 例如,长度 [5, 10, 20] 可能分成 3 组,分别处理。

📌 适用场景

  • 需要减少 padding 计算浪费的 NLP 任务。
  • Transformer、LSTM 训练时提高效率。

📌 缺点

  • 实现较复杂,可能增加 batch 之间的不同步性。

4. Sliding Window(滑动窗口)

对于超长序列,可以分片处理:

  • 固定窗口(Fixed Window):取 max_len 长度的子序列。
  • 滑动窗口(Sliding Window with Overlap):滑动窗口并添加重叠部分,减少截断信息损失。

📌 适用场景

  • 处理超长文本(例如BERT通常只能处理512个token)。
  • 语音、视频等长序列任务。

5. Auto-regressive(自回归处理)

对于序列预测(如GPT-3、RNN生成任务),可以逐步生成下一个 token 而不需要 padding

📌 适用场景

  • 语言模型(GPT-3, LLaMA)。
  • 生成任务(Seq2Seq, 机器翻译)。

一个batch的数据长度方差比较大或者大部分pad为0,非常稀疏,排序的时候把等长的排到一块,怎么处理

如果一个 batch 内数据长度方差大,或者 大部分 padding 为 0(稀疏),可以使用 动态分批(Bucketing)排序后分批(Sort & Pack) 来减少 padding 带来的计算开销。以下是几种方法:


1. Sort & Pack(按长度排序+批处理)

💡 思路

  • 先按序列长度排序,让相近长度的样本排在一起。
  • 再按 batch 划分,同一批次的样本长度接近,减少 padding 计算浪费。
  • LSTM/GRU 使用 PackedSequence,避免无效计算。

📌 适用场景

  • 适用于 RNN(LSTM/GRU),但 Transformer 也可以用来减少 padding
  • 尤其适用于 变长文本、时间序列任务

📌 优点

  • 减少 padding 计算浪费,更高效。
  • 适用于 LSTM/GRU 变长输入,避免填充数据的干扰。

📌 缺点

  • 需要额外排序操作,可能会导致训练时 batch 不均衡(影响梯度计算)。

2. Bucketing(动态分批)

💡 思路

  • 按长度区间划分多个 buckets,然后每个 bucket 里 batch 处理,减少 padding
  • 例如,长度 [5, 10, 20] 分成 3 组,这样每个 batch 内序列长度接近。

📌 适用场景

  • NLP(Transformer, BERT)
  • 语音处理(Wav2Vec)
  • 时间序列(变长 sensor data)

📌 优点

  • 减少 padding 计算开销,提高效率。
  • 适用于 Transformer/BERT,减少 attention mask 计算。

📌 缺点

  • 需要手动分 bucket,代码复杂度增加。
  • Bucket 内仍然可能有少量 padding

3. Dynamic Padding(自适应填充)

💡 思路

  • 对每个 batch 选择 max_length 而不是全局 max_len,这样 padding 只影响当前 batch。

📌 适用场景

  • Transformer / CNN 任务
  • 适用于 小 batch,减少 padding 但仍然支持 batch 计算。

📌 优点

  • 相比全局 padding,减少冗余计算
  • 适用于 Transformer、CNN

📌 缺点

  • 仍然会有部分 padding,但比固定 max_len 好。

自回归和自编码的优缺点对比

自回归(Autoregressive, AR)自编码(Autoencoder, AE)是两种不同的模型架构,各自适用于不同的任务。它们的核心区别在于数据的处理方式:

  • 自回归(AR):通过历史数据递归预测下一个数据点,通常用于序列建模、语言建模、时间序列预测等任务。
  • 自编码(AE):学习输入数据的低维表示(编码),然后通过解码器重建输入,通常用于降维、特征学习、异常检测等任务。

🔹 自回归(Autoregressive, AR)

💡 思路

  • 当前时刻的数据依赖于过去的观测值,通过历史信息逐步预测下一个时间步。
  • 生成数据时,按照时间顺序一个一个生成,无法并行化

📌 代表模型

  • 传统AR模型:AR, ARMA, ARIMA(时间序列预测)
  • 深度学习AR模型
    • NLP:RNN, LSTM, GRU, Transformer-Decoder(GPT, BART)
    • 计算机视觉:PixelRNN, PixelCNN(逐步生成图像)
    • 时间序列:WaveNet(音频生成)

✅ 优点

适用于生成任务(文本、语音、时间序列、图像)
可以处理变长输入,适合序列预测
直观的因果关系(因变量仅依赖过去的信息)
易于与注意力机制结合(如 Transformer-Decoder)

❌ 缺点

推理时序列生成是逐步进行的,无法并行化(影响推理速度)
长期依赖问题:RNN、LSTM 在长序列上可能丢失信息(可用 Transformer 解决)
对噪声敏感:前面预测的误差会累积到后面的预测


🔹 自编码(Autoencoder, AE)

💡 思路

  • 将输入压缩成低维编码,然后尝试解码恢复原始输入不依赖时间先后顺序

  • 自编码器的目标是最小化重构误差,通常用于特征学习、降维、数据去噪等任务。

📌 代表模型

  • 基本自编码器(AE):普通 MLP 结构
  • 变分自编码器(VAE):隐空间带有概率分布约束(用于生成任务)
  • 去噪自编码器(Denoising AE):输入加噪音,学习降噪特征
  • 对抗自编码器(Adversarial AE, AAE):结合 GAN 训练隐变量分布
  • Transformer-based AE:BERT(双向 Transformer 自编码结构)

✅ 优点

训练时可以并行化(不像自回归那样依赖前序信息)
适用于无监督学习,可用于降维、异常检测、数据去噪
能学习数据的全局表征(不像 AR 只能建模局部依赖)
适用于静态数据(如图像、表格数据)

❌ 缺点

不适合自回归任务,无法生成有时间依赖关系的序列
隐变量 z 可能难以解释(VAE 试图改进这一点)
可能会丢失重要信息(特别是当编码维度较小时)

 

什么时候用 AR,什么时候用 AE?

用自回归(AR)

  • 语言模型(GPT-3, Transformer-Decoder)
  • 时间序列预测(LSTM, ARIMA)
  • 语音合成(WaveNet)
  • 逐步生成图像(PixelCNN)

用自编码(AE)

  • 图像降维、去噪(Denoising AE)
  • 异常检测(基于重构误差)
  • 生成模型(VAE,用于隐变量建模)
  • 预训练 NLP(BERT, Masked Language Model)

🔹 结合两者:变分自编码器 + 自回归(VAE + AR)

有些模型结合了 自编码器(AE)和自回归(AR),比如:

  • VAE-GPT:VAE 提取全局信息,GPT 生成序列。
  • Hierarchical VAE:VAE 提取长时间依赖特征,AR 生成短时间序列。
  • BERT + GPT:BERT 预训练词表示(AE 方法),GPT 进行自回归生成。

🔹 总结

如果你要做 时间序列预测、文本生成、语音生成用自回归(AR)
如果你要做 降维、特征提取、异常检测、去噪用自编码(AE)
如果你想结合两者,可以考虑 VAE+AR 结构 来既学习表征,又进行序列生成。

怎么把自回归和非自回归的结合起来?

结合自回归(Autoregressive, AR)非自回归(Non-Autoregressive, NAR)的方法,主要是为了兼顾生成质量和推理速度。自回归方法生成质量高但推理慢,而非自回归方法可以并行化生成但可能有信息丢失。以下是几种常见的结合策略:


🔹 1. 混合自回归与非自回归(Hybrid AR-NAR)

💡 思路

  • 先使用 非自回归模型 生成一个初步的结果(粗略预测)。
  • 再用 自回归模型 进行细化或纠正(Refinement)。
  • 这样可以提升推理速度,同时保持较好的生成质量

📌 典型模型

  • Transformer with AR & NAR Decoding(如 Levenshtein Transformer)
  • VAE + AR(VAE-GPT, VQVAE):VAE 生成全局语义信息,GPT 负责局部细化。

📌 示例:Levenshtein Transformer

  • 先用 非自回归方法 生成一个初始序列。
  • 之后用 自回归方法 进行插入、删除或修改。
  • 这样比完全自回归快,又比完全非自回归准确。

📌 适用场景

  • 文本生成(NAT + AR Refinement)
  • 语音生成(VQ-VAE + AR)
  • 时间序列预测(NAR 预测全局趋势,AR 细化局部模式)

🔹 2. 半自回归(Semi-Autoregressive, SAR)

💡 思路

  • 将序列分成小块(chunks),块内并行解码,块间自回归解码。
  • 例如:对 10 个 token,先生成 2 个,然后自回归填充剩下的

📌 典型模型

  • Semi-AR Transformer:每次预测多个 token,而不是一个。
  • BERT2GPT:BERT(非自回归)用于编码,GPT(自回归)用于解码。

🔹 3. 自回归初始化 + 非自回归优化

💡 思路

  • 先用 自回归模型生成一个初始序列(高质量)。
  • 再用 非自回归模型并行优化整个序列

📌 典型模型

  • Mask-Predict(非自回归 + 蒙版优化)
  • Diffusion Model(如 DALLE, Imagen):逐步去噪,而不是严格自回归。

📌 示例:Mask-Predict

  1. 先用 AR 生成一个粗略序列。
  2. 非自回归模型 预测哪些 token 需要修改。
  3. 重新填充这些 token,提升质量。

📌 适用场景

  • 机器翻译(NAT + AR 纠错)
  • 文本生成(GPT 先生成,BERT 后优化)
  • 图像生成(先用 VQVAE 生成全局结构,再用扩散模型优化)

🔹 4. 隐变量建模(VAE / VQVAE + AR)

💡 思路

  • 用自编码器(AE / VAE / VQVAE)生成全局特征,再用自回归方法填充细节
  • 这样可以既有全局一致性,又有局部精准性

📌 典型模型

  • VQ-VAE + AR(PixelSNAIL, VQVAE-GPT):VQVAE 提供全局结构,AR 生成细节。
  • VAE-GPT:VAE 生成高层语义,GPT 生成具体句子。

📌 示例:VQ-VAE + Transformer

  • 第一步:VQ-VAE 压缩输入数据(提取全局特征)。
  • 第二步:Transformer 以自回归方式解码。

📌 适用场景

  • 图像生成(DALLE, VQVAE-GPT)
  • 音频生成(WaveNet, VQ-VAE + AR)
  • 文本摘要(VAE + GPT)

🔹 5. 结合对抗训练(GAN + AR)

💡 思路

  • 用 GAN 训练一个快速的非自回归生成器,然后用自回归模型来增强对抗训练
  • 例如:
    • 生成器(非自回归) 生成完整序列。
    • 判别器(自回归) 评估该序列是否真实。

📌 典型模型

  • SeqGAN(GAN + LSTM AR 训练)
  • MaskGAN(BERT-style GAN)

📌 适用场景

  • 文本生成(避免 AR 误差累积)
  • 代码生成(优化长文本)
  • 游戏 AI(快速生成行动序列)

🔹 6. 结合 Transformer 的双模式(BERT + GPT)

💡 思路

  • 训练时使用 BERT(非自回归)学习表示,推理时用 GPT(自回归)进行生成。
  • 这样既能并行训练,提高效率,又能自回归生成,保证质量

📌 典型模型

  • BART(BERT 预训练 + GPT 生成)
  • T5(编码器 + 自回归解码器)

📌 适用场景

  • 文本摘要(先编码,后自回归生成)
  • 对话系统(先理解,后生成)
  • 代码补全(理解上下文,补全代码)

怎么理解静态mask和动态mask

静态 Mask(Static Mask) vs. 动态 Mask(Dynamic Mask)

在**深度学习(特别是 Transformer 相关模型)**中,Mask 主要用于控制模型对输入数据的访问方式,防止信息泄露或引导模型学习某些特定模式。静态 Mask 和动态 Mask 是两种不同的 Mask 机制,理解它们的区别有助于优化模型的训练和推理。


🔹 1. 静态 Mask(Static Mask)

💡 定义

  • Mask 在训练前就已经固定,不会随着输入数据的变化而调整。
  • 适用于固定的任务,如语言模型预训练(BERT)、填空任务(Cloze task)、图像掩码等。
  • 相同输入的 Mask 方式始终一致

📌 典型应用

  • BERT(Masked Language Model, MLM):在训练时,随机 Mask 一部分 Token,并在解码时预测这些 Token。
  • 自注意力中的 Padding Mask
    • 在 Transformer 里,填充的 <PAD> Token 需要 Mask 掉,以免影响注意力计算。
    • 例子[Hello, world, <PAD>, <PAD>],其中 <PAD> 部分会被静态 Mask。

  • 这里 [MASK]训练前就固定 下来的,不随数据变化。

📌 优点高效:可以在训练前设定 Mask 规则,不需要额外计算。
稳定:适用于预训练任务,如 BERT 这种基于 Mask 预测的模型。

📌 缺点缺乏灵活性:如果任务需要根据输入情况动态调整 Mask,则静态 Mask 无法适应。
对自回归任务支持不佳:如 GPT 这类序列生成任务,需要随时间步调整 Mask。


🔹 2. 动态 Mask(Dynamic Mask)

💡 定义

  • Mask 不是固定的,而是根据输入数据动态计算
  • 适用于依赖上下文信息的任务,如自回归生成、注意力控制等。
  • 不同输入的 Mask 方式可能不同

📌 典型应用

  • Transformer 解码器中的因果 Mask(Causal Mask)

    • 在自回归模型(如 GPT)中,当前 Token 只能看到之前的 Token,不能看到未来 Token。

  • 解释:第 t 个 Token 只能看到前 t 个 Token,后面的全 Mask 掉。
  • 非自回归生成(NAT, Mask-Predict)

    • 先用一个初始 Mask 生成整个序列(非自回归),再动态 Mask 一部分,逐步优化生成结果。
    • 不同步骤 Mask 规则不同,随着推理过程不断变化。

  • 这里的 Mask 是动态变化的,随时间步扩展。

📌 优点灵活:Mask 方式可以根据当前输入动态调整。
适用于自回归任务:如 GPT、Transformer-Decoder 等模型。

📌 缺点计算量大:需要在每个时间步计算 Mask,会增加计算开销。
实现复杂:需要动态控制 Mask 逻辑,适用于生成任务但不适用于静态任务。

🔹 4. 结合静态 Mask 和动态 Mask

在实际任务中,我们通常结合使用静态 Mask 和动态 Mask,比如:

  • BERT 训练:使用静态 Mask 进行 MLM 任务。
  • GPT 训练:使用动态 Mask 来实现自回归序列生成。
  • NAT 生成:先静态 Mask 部分 Token,然后动态调整 Mask 以优化预测结果。

📌 示例:BART(BERT + GPT 结合)

  1. 编码阶段(静态 Mask)
    • 先用 静态 Mask 随机 Mask 掉一部分 Token 进行编码。
  2. 解码阶段(动态 Mask)
    • 生成时使用 动态 Mask 控制 Token 生成顺序(因果 Mask)。

这样,我们既能利用静态 Mask 进行高效训练,又能利用动态 Mask 进行高质量生成。


🔹 5. 什么时候用哪种 Mask?

用静态 Mask(Static Mask)

  • 训练固定任务(如 MLM,填充 Mask)。
  • 任务对 Mask 方式没有动态变化需求
  • 需要加速计算,避免额外 Mask 计算开销

用动态 Mask(Dynamic Mask)

  • 需要自回归生成(如 GPT,NAT,因果 Mask)。
  • 需要根据输入数据动态调整 Mask(如 Mask-Predict)。
  • 任务的 Mask 方式随时间步或序列位置改变

🔹 总结

如果你的任务是预训练 BERT 或填充 Mask,用静态 Mask更高效。
如果你的任务是文本生成或自回归预测,用动态 Mask更合适。
如果你在做非自回归生成,可以先用静态 Mask 初始化,再用动态 Mask 进行优化!🚀

机器学习,HMM和SVD有了解吗?

2. 数学原理

🔹 HMM(隐马尔可夫模型)

HMM 是基于概率的模型,假设一个系统由**隐状态(Hidden States)观测状态(Observations)**组成。
其基本要素:

  1. 状态转移矩阵 AAA:描述隐状态之间的转移概率。
  2. 观测概率矩阵 BBB:描述在某个隐状态下,生成某个观测值的概率。
  3. 初始状态分布 π\piπ:描述系统开始时的隐状态分布。

HMM 通过前向-后向算法、维特比算法、Baum-Welch 算法进行训练和推理。

🔹 SVD(奇异值分解)


http://www.kler.cn/a/528020.html

相关文章:

  • 【学习笔记】深度学习网络-正则化方法
  • C语言【基础篇】之流程控制——掌握三大结构的奥秘
  • 【python】python基于机器学习与数据分析的手机特性关联与分类预测(源码+数据集)【独一无二】
  • LabVIEW温度修正部件测试系统
  • Android vendor.img中文件执行权问题
  • Linux《基础指令》
  • 深度学习的应用场景及常用技术
  • 回溯首届央视春节联欢晚会
  • C++ -vector的模拟实现
  • ISBN 号码——蓝桥杯
  • Java学习教程,从入门到精通,JDBC中WHERE子句的语法知识点及案例代码(107)
  • jstat命令详解
  • 网站快速收录:如何设置robots.txt文件?
  • AI编程:如何编写提示词
  • 【AI编程助手系列】国产AI编程工具 DeepSeek+Cline+VSCode 快速集成
  • 【Linux系统】进程间通信:共享内存
  • pytorch实现长短期记忆网络 (LSTM)
  • 解决AnyConnect开机自启动问题
  • 解读 DeepSeek 关键 RL 算法 GRPO
  • Day51:type()函数
  • 洛谷P4057 [Code+#1] 晨跑
  • 突破性进展!我国成功研制出新型光子毫米波雷达芯片
  • vue2项目(一)
  • HTTP协议和静态web服务器
  • 对比category_encoders库和sklearn库中的OrdinalEncoder
  • 智联出行公司ZSTL以创新模式,助力中国绿色出行发展