大模型面试题目及答案
1. 全量微调大模型时大概需要多少显存?
显存的需求大致可以通过以下公式计算:
显存需求 = 3 × 模型参数 + 激活值+ 梯度 + 优化器状态 = 6 * 模型参数
模型参数 = 参数数量 × 字节/参数
- 模型参数:每个参数占用4字节(FP32),或者2字节(FP16)。
- 激活值:前向传播中产生的中间激活值。
- 梯度:反向传播中计算的梯度。
- 优化器状态:如Adam优化器会存储每个参数的动量和平方梯度。
举例:以LLaMA-13B模型为例(13亿参数),假设使用FP16进行微调
模型参数 = 26GB(13亿参数 × 2字节/参数)
总显存需求 = 模型参数 × 6 ≈ 26GB ×6 = 156GB
2.微调大模型时候,怎么选择基座模型?
- 选择BERT模型:BERT模型是一种Encoder-only架构,适合处理理解类任务,当任务以文本理解为主,如分类、标注、问答提取等,需要更准确的语义理解和文本分类时。
- 选择LLaMA、ChatGLM类大模型:LLaMA和ChatGLM属于Decoder-only或Encoder-Decoder架构,当任务需要生成文本、处理长上下文或进行复杂的多轮对话时。
3.进行有监督微调(SFT),为什么模型能力反而变差?
1. 数据偏移(Data Shift):在微调过程中使用的数据集与基座模型在预训练阶段接触到的数据分布存在差异。
解决方法:数据增强,通过扩展微调数据集,增加数据的多样性,使其更接近预训练数据的分布。
2. 过拟合(Overfitting):当微调数据集相对较小时,或者模型的参数数量较大,模型可能会在微调数据上表现得非常好,但在未见过的数据上表现不佳。
解决方法:使用正则化技术(如L2正则化、Dropout)或者残差连接来限制模型的复杂度,防止模型在微调数据上过度拟合。
3.SFT 指令微调数据格式及构建 SFT 指令微调数据的步骤
指令微调数据的格式通常采用JSON或JSONL(每行一个JSON对象)格式。每个数据样本通常包括以下几个字段:
- Instruction: 用户输入的指令或问题。
- Input: (可选)指令或问题的背景信息或上下文。
- Output: 模型应该生成的输出或响应。
例如:假设要微调一个模型来执行简单的数学问题求解任务,数据集可能如下:
[
{
"instruction": "Solve the following problem.",
"input": "What is 5 + 3?",
"output": "The answer is 8."
},
{
"instruction": "Solve the following problem.",
"input": "What is 12 - 4?",
"output": "The answer is 8."
}
]
-
确定任务和领域:
首先需要明确模型的具体应用场景,比如问答、文本总结、翻译等。 -
收集数据:
- 指令生成: 根据模型任务,生成各种类型的指令。这些指令应该涵盖任务的不同方面和难度。
- 输入数据收集: 如果任务需要上下文(例如对话系统),需要为每个指令收集相应的输入数据。
- 标注输出: 根据指令和输入,人工标注或自动生成理想的输出。
-
数据格式化:
将数据整理为统一格式(如JSONL),确保每个数据样本都包含指令、输入(如果有)和输出。 -
数据清洗和质量检查:
- 检查数据的一致性和质量,确保输出与指令的要求一致。
- 过滤掉不符合要求的数据样本,确保数据的多样性和代表性。
-
分割数据集:
将数据集划分为训练集、验证集和测试集,通常采用8:1:1的比例。 -
训练和微调:
使用构建的SFT数据对预训练模型进行微调。在训练过程中,使用验证集评估模型的性能,调整超参数以优化模型表现。
4.如何缓解模型在领域数据训练后“灾难性遗忘”或“领域偏差”?
- 使用混合数据训练
在训练过程中同时使用领域特定数据和通用数据,这样可以使模型在学习领域知识的同时保持通用能力。具体方法包括:- 联合训练:在每个训练步骤中,混合领域数据和通用数据进行训练。
- 阶段性训练:在训练初期使用通用数据进行预训练,然后在后期阶段逐步引入领域数据进行微调。
- 正则化方法
正则化技术可以帮助防止模型过度拟合领域特定数据,从而保持通用能力。常见的正则化方法包括:- L2 正则化:在损失函数中添加权重衰减项。
- Dropout:在训练过程中随机丢弃一部分神经元,以提高模型的鲁棒性。
5.在进行SFT时,基座模型Chat 或者Base如何选择?
-
Chat 模型适合对话类任务的SFT。
-
Base 模型适合非对话类任务或你希望有更大灵活性和更少偏见的SFT。
-
如果任务是对话、问答或需要互动的任务,选择Chat模型通常是更优的选择,因为它已经在对话任务上有了基础,你可以节省微调成本并获得更好的性能。
-
如果任务是非对话类的任务(如情感分类、机器翻译、文本摘要等),或者你希望模型能完全专注于新的任务,选择Base模型会更灵活,不会受到之前任务微调的影响。
-
如果你有大量数据,并且希望模型在特定领域中表现突出,Base模型也可以成为一个更好的选择,因为它提供了一个“干净”的起点,没有任何任务偏见。