跳转至

08 - 预训练和微调面试题

预训练和微调面试题图

预训练方法、微调技术、LoRA、QLoRA

📖 章节概述

本章将整理预训练和微调相关的面试题,包括预训练方法、微调技术、LoRA、QLoRA等内容。

🎯 学习目标

完成本章后,你将能够:

  • 掌握预训练的核心方法
  • 了解各种微调技术
  • 理解LoRA和QLoRA的原理
  • 能够回答相关面试题

1. 预训练方法

Q1: 什么是MLM预训练?

解答: MLM(Masked Language Modeling)是BERT使用的预训练方法。

核心思想: - 随机mask输入序列中的部分token - 预测被mask的token - 学习双向上下文表示

优势: - 学习双向表示 - 适合理解任务 - 可以利用上下文信息

Q2: 什么是CLM预训练?

解答: CLM(Causal Language Modeling)是GPT使用的预训练方法。

核心思想: - 自回归预测下一个token - 只能看到之前的token - 学习单向表示

优势: - 适合生成任务 - 自然的语言建模 - 容易实现

Q3: Scaling Law是什么?

解答: Scaling Law描述了模型性能与模型大小、数据量、计算资源之间的关系。

主要发现: 1. 性能与模型大小呈幂律关系 2. 性能与数据量呈幂律关系 3. 性能与计算量呈幂律关系 4. 三者之间存在权衡关系

应用: - 预测模型性能 - 指导模型设计 - 优化资源分配

2. 微调技术

Q4: 全量微调和部分微调的区别?

解答

特性 全量微调 部分微调
参数更新 所有参数 部分参数
数据需求 大量数据 较少数据
计算资源
过拟合风险
适用场景 数据充足 数据有限

Q5: 什么是PEFT?

解答: PEFT(Parameter-Efficient Fine-Tuning)是参数高效微调方法。

核心思想: - 只训练少量参数 - 冻结大部分模型参数 - 大幅减少计算和存储需求

常见方法: 1. LoRA(Low-Rank Adaptation) 2. Adapter 3. Prefix Tuning 4. Prompt Tuning

3. LoRA

Q6: LoRA的原理是什么?

解答: LoRA通过低秩分解来减少可训练参数。

核心思想: - 假设权重更新ΔW是低秩的 - ΔW = BA,其中B和A是低秩矩阵 - 只训练B和A,参数量大幅减少

公式

Text Only
W' = W + ΔW = W + BA

优势: - 参数量少(通常<1%) - 不增加推理开销 - 可以合并到原始权重

Q7: LoRA相比全量微调的优势?

解答: LoRA的优势:

  1. 参数效率:参数量减少99%+
  2. 存储效率:只存储LoRA权重
  3. 训练效率:训练速度快
  4. 推理效率:不增加推理开销
  5. 灵活性:可以轻松切换不同任务

4. QLoRA

Q8: QLoRA相比LoRA的改进?

解答: QLoRA(Quantized LoRA)相比LoRA的改进:

  1. 量化基础模型:将基础模型量化到4位
  2. 低秩适配器:使用LoRA进行微调
  3. 显存大幅降低:显存需求降低约75%

优势: - 可以在消费级GPU上微调大模型 - 精度损失小 - 推理速度不受影响

Q9: 如何选择LoRA的rank?

解答: 选择LoRA rank需要考虑:

  1. 任务复杂度:复杂任务需要更高rank
  2. 数据量:数据多可以尝试更高rank
  3. 计算资源:资源有限选择较低rank
  4. 精度要求:高精度选择较高rank

常见选择: - 小模型(<1B):rank 8-16 - 中模型(1-10B):rank 16-32 - 大模型(>10B):rank 32-64

5. 练习题

基础练习

  1. 实现MLM预训练

    Python
    # TODO: 实现MLM预训练
    class MLMPretraining(nn.Module):
        def __init__(self, model):
            # 你的代码
            pass
    
        def forward(self, input_ids, attention_mask, labels):
            # 你的代码
            pass
    

  2. 实现LoRA层

    Python
    # TODO: 实现LoRA层
    class LoRALayer(nn.Module):
        def __init__(self, in_features, out_features, rank=8):
            # 你的代码
            pass
    
        def forward(self, x):
            # 你的代码
            pass
    

进阶练习

  1. 实现QLoRA

    Python
    # TODO: 实现QLoRA
    class QLoRALayer(nn.Module):
        def __init__(self, base_layer, rank=8):
            # 你的代码
            pass
    
        def forward(self, x):
            # 你的代码
            pass
    

  2. 实现Prefix Tuning

    Python
    # TODO: 实现Prefix Tuning
    class PrefixTuning(nn.Module):
        def __init__(self, model, prefix_length=10):
            # 你的代码
            pass
    
        def forward(self, x):
            # 你的代码
            pass
    

6. 最佳实践

✅ 面试技巧

  1. 理解原理
  2. 深入理解核心概念
  3. 掌握数学公式
  4. 了解设计决策

  5. 代码实现

  6. 准备关键代码
  7. 理解实现细节
  8. 能够解释代码

  9. 对比分析

  10. 对比不同方法
  11. 分析优缺点
  12. 说明适用场景

❌ 避免做法

  1. 死记硬背
  2. 理解核心原理
  3. 掌握关键公式
  4. 灵活应用

  5. 忽视细节

  6. 注意技术细节
  7. 理解设计权衡
  8. 了解最新进展

  9. 缺乏实践

  10. 结合项目经验
  11. 动手实践验证
  12. 积累实战经验

7. 总结

本章介绍了预训练和微调的面试题:

  • 预训练: MLM、CLM、Scaling Law
  • 微调: 全量微调、部分微调、PEFT
  • LoRA: 低秩分解、参数效率
  • QLoRA: 量化基础模型、显存优化

掌握这些知识是面试的关键。

8. 下一步

继续学习09-推理优化面试题,了解推理优化的相关知识。