LLM常见问题(微调部分)

大语言模型(LLMs)微调

1. 如果想要在某个模型基础上做全参数微调,究竟需要多少显存?

这个问题首先需要了解 BF16FP16 , BF16 是对 FP32 单精度浮点数截断数据,即用 8bit 表示指数,7bit 表示小数。FP16 半精度浮点数,用 5bit 表示指数,10bit 表示小数。与单精度相比,采用 BF16/FP16 吞吐量可以翻倍,内存需求可以减半。这两者精度上差异不一样,BF16 可表示的整数范围更广泛,但是尾数精度较小FP16 表示整数范围较小,但尾数精度较高。通常微调用 bf16,推理用 fp16,当在模型大小为 XB 且参数精度为半精度,推理所需显存约为 X 的两倍,而全参数微调所需显存约为推理所需显存的四倍,包括模型推理(一倍)、梯度(一倍)、优化器(两倍),也就是 X 的八倍。

2. 为什么SFT之后感觉LLM傻了?

  1. 数据分布偏差:在 SFT 过程中,采用的微调数据集可能与模型在预训练期间所接触的数据存在较大差异,可能会削弱模型的表现,这种分布的不一致可能会导致模型在应对新任务时做出错误或不精确的预测。
  2. 标注异常:在微调数据集中可能存在标注错误或标签不精确的情况(即使质量较低的数据集很少也会对模型产生负面影响)。这类不准确的标签可能会对模型的性能造成不利影响,使得模型表现出不合逻辑或错误的行为。
  3. 过度拟合现象:如果用于微调的数据集规模较小,或者模型的参数量过于庞大,可能会导致模型对微调数据集过拟合,从而使得模型在新样本上的表现力下降。这种过度拟合的问题可能使得模型对微调数据集中的特定实例过分敏感,而不能有效地推广到新的、更广泛的数据上。
  4. 数据集多样性不足:用于微调的数据集可能没有足够的多样性,未能覆盖模型在执行新任务时可能遇到的各种输入类型。这种多样性的缺失可能会导致模型在遇到与微调数据集显著不同的新输入时,表现出困惑或做出错误的决策。

3. SFT 指令微调数据如何构建?

  1. 原始数据采集:需要收集与目标任务相关的原始数据。可以涵盖了从对话实例、分类项到生成任务的数据样本,具体依据目标任务而定。要注意保证数据集既具备足够的代表性也要有广泛的多样性,这对于增强模型的泛用性至关重要。通常我们需要训练模型的对话能力,因此我们就要考虑多收集单轮对话和多轮对话的数据集。
  2. 数据标注:对采集到的原始数据执行打标操作,给予每一个数据样本恰当的标签或是目标输出。打标的形式将基于您的具体任务而定,可能包括分类标签、文本生成内容或是对话反应等。保障打标工作的精确性与一致性。
  3. 数据集分割:对已打标的数据执行分割,以便区分出训练集、验证集和测试集。通常将大量数据指定为训练用途,取一小部分进行模型性能验证,以最终评估模型泛化性能。
  4. 数据预处理:针对任务需求对数据进行必要的预处理步骤。这可能包括文本清理、分词处理、去除无用词汇、词根提取等操作。确保最终的数据格式满足模型输入的规范,同时将数据转换成适合模型训练的格式。

4. 领域模型 Continue PreTrain 数据选取?

  1. 收集垂直领域数据:首先搜集与目标专业领域密切相关的数据,可以包括网络爬虫获取数据、特定行业文档或企业内部的信息资源等。这类数据能够丰富模型的专业知识库和语言理解能力,进而提升模型在该领域的性能表现。
  2. 领域专家参与打标:可以让领域专家对相关数据进行精确筛选和打标。这一步骤涉及各类任务,如类别归纳、实体识别、关系提取等,旨在为模型训练提供精确无误的监督数据。
  3. 使用伪标签:在无法获得领域专家支持或数据打标成本较高时,可以利用自动化技术生成伪标签。例如,运用已预训练的模型对特定领域数据作出预测,并将这些预测结果作为伪标签用于进一步训练。通常会通过 ChatGPT 生成相关数据进行知识蒸馏。
  4. 保证数据均衡:在选择数据时,要关注数据的平衡性,不仅要灌输垂直领域的数据,还应该添加一定比例的通用领域数据。对于样本量不足的类别,可考虑应用数据增强或过采样技术,以实现数据量的平衡。

5. 领域数据训练后,通用能力往往会有所下降,如何缓解模型遗忘通用能力?

如果仅仅使用领域数据集进行模型训练,模型很容易出现灾难性遗忘现象,为了解决这个问题通常在领域训练的过程中加入通用数据集。但对于领域数据集和通用数据集应该按照什么比例目前还没有一个准确的答案。如果领域数据集数据量没有那么多时,一般领域数据与通用数据的比例在1:5到1:10之间

6. 领域模型Continue PreTrain ,如何让模型在预训练过程中就学习到更多的知识?

  1. 增大数据收集范围:收集垂直领域数据可以来自互联网、论文、书籍等等多个方面的数据。将这些数据混合在一起进行预训练,可以使得模型在预训练阶段习得足够的专业知识
  2. 大规模数据:使用更大规模的数据进行预训练,可以让模型接触到更多的语言和知识。可以从互联网上爬取大量的文本数据,或者利用公开的语料库进行预训练。
  3. 数据增强:在预训练过程中,可以采用数据增强技术,如随机遮挡、词替换、句子重组等,来生成更多的训练样本。这样可以增加模型的训练数据量,使其能够学习到更多的知识和语言规律。

7. 进行SFT操作的时候,基座模型选用Chat还是Base?

在进行 SFT 时,大模型选用 Chat 还是 Base 作为基座,需要根据SFT的数据量决定。如果数据量小于 10k,建议选用 Chat 模型作为基座进行微调;如果有 100k 的数据,建议在 Base 模型上进行微调。

8. 领域模型微调指令&数据输入格式要求?

指令数据一般为 json 格式,包含 Instruction、Input、Output 三个字段(可以为空),每行一条样本。

Instruction(指令):Instruction 是对模型的输入文本或问题进行进一步说明或约束的指令。它可以是一种特定的格式或标记,用于告诉模型如何处理输入数据,或者提供一些额外的信息,以便模型更好地理解和生成输出。Instruction的作用是为模型提供更准确和具体的指导,以便生成符合预期的文本。Instruction 可以包括要求模型遵循特定的格式、风格或主题,或者指示模型关注某些特定的方面或细节。

Input(输入):Input 是模型实际接收的文本或数据。它由 Prompt 和 Instruction 组成,提供了完整的上下文和指导,用于生成输出。Input 可以包含多个句子或段落,以提供更全面的信息。Input 会被输入到 LLMs 中,用于推理和生成输出。

Response(输出):Response 是 LLMs 生成的输出文本或回答。它是模型对Input的理解和处理结果。 Response 的内容取决于 LLMs 的能力和训练数据,它可以是文本、回答、建议、解释等形式。Response 是模型根据 Input 和 Instruction 生成的,它应该符合 Instruction 的要求,并尽可能准确和有针对性。

9. 领域模型微调领域评测集构建?

领域模型数据集通常通过构建专业知识选择题数据集来进行评测,例如医学领域大语言模型测评数据集 CMB 包含了医师考试、护理考试、医学考研等六类考试的题目。方便对模型的专业领域知识能力进行快速评测。但由于领域模型很有可能语义理解能力较差导致难以理解题目而无法正确作答。另一种方式是构建主观题数据集,模型完成作答后由专业人员根据一定标准进行打分。

10. 领域模型词表扩增是不是有必要的?

不一定要扩充词表,但有些领域比较特殊,需要扩充词表。

  1. 领域特定词汇:对于目标领域内存在的专有术语或特殊词汇,若这些并不存在标准预训练模型的数据中,扩展词表就是有必要的。将这类特殊术语纳入模型的词库,能够增强模型对这些术语的理解与处理能力。
  2. 领域特定上下文:在特定的领域任务中,一个词的含义可能会由其所处的上下文决定。以医疗领域为例,一个术语在不同情境下可能代表着不同的事物。当领域特定任务中的上下文与预训练模型原训练数据中的上下文存在差异时,词表的扩充就能帮助模型更精确地理解和应对特定领域的上下文。
  3. 训练数据的局限性:由于预训练模型的词库过于庞大,在目标领域的训练资料较为匮乏,词表的扩充就能够辅助模型更有效地借鉴预训练模型中的知识,以优化其在特定领域任务中的表现。

11. 如何训练自己的大模型?

  1. 数据收集和预处理:首先收集与目标任务和领域相关的大规模数据集。这可以包括从互联网上爬取数据、使用公开数据集或者其他途径获得的数据。然后,对数据进行预处理和清洗,包括数据去重、有害数据集去除等。同时将数据集划分为训练集、验证集和测试集。训练集用于模型的训练,验证集用于调整超参数和模型选择,测试集用于最终评估模型的性能。
  2. 模型架构选择:根据任务的特点和目标,选择适合的开源模型架构。目前国内外有较多的开源 LLM 模型可供开发者使用,包括国外的 LLaMa、BLOOM,国内的 ChatGLM、Baichuan,或者其他机构基于开源框架训练得到的模型。可以根据自己的数据量、计算资源、任务需求来选择相应的模型进行微调。
  3. 模型训练和调参:训练包含二次预训练、SFT、RLHF 等方式,同时可以选择是全参数训练或者部分参数训练。确定好训练方式后使用训练集对模型进行训练。训练过程中,需要选择合适的优化器、损失函数和学习率等超参数,并进行适当的调整和优化。
  4. 模型评估和测试:使用测试集对最终训练好的模型进行评估和测试。计算模型的性能指标(流畅性,相关性,完整性和专业性等方面),以评估模型的性能和泛化能力。

12. 训练中文大模型有啥经验?

如果模型在预训练阶段就包含足够的中文如 ChatGLM、Baichuan,可以直接利用其进行微调,如果模型在预训练阶段无中文或者中文数据含量较少的模型如 LLaMa,需要对其 tokenizer 进行修改,添加中文字词,同时进行二次预训练使其充分理解中文再进行 SFT 微调。

13. 指令微调的好处?

  1. 个性化适应:尽管大型预训练模型在广泛的通用数据集上已经培养出了卓越的语言理解与表征能力,但由于对一些专门的任务或领域在预训练阶段较为稀少,模型可能难以理解。于是利用特定任务或领域的数据对这些大模型进行指令微调,使得模型能够更准确地完成特定的任务。
  2. 行为引导:大模型的行为往往不易解释和控制。借助指令微调,我们可以输入特别的指令或设定限制,这样不仅可以引导模型行为,还使其更好地满足特定任务的要求,如在创造性任务中,通过指令导向控制内容的风格和长度等。
  3. 数据效率:大模型训练通常依赖于大量数据,但在一些特定的任务或领域里,关键数据往往不够充足或难以采集。指令微调可以使我们仅利用少量特定任务的数据,结合大型模型的通用数据预训练知识,达到在数据受限的条件下也能够取得优异的性能。
  4. 节省资源:大模型的训练通常耗费巨大的计算资源及时间。通过对这些已训练好的模型进行指令微调,可以避免从零开始训练的大量时间与资源消耗,显著提升训练效率。

14. 预训练和微调哪个阶段注入知识的?

在大模型训练过程中,知识注入主要是在预训练阶段进行的

在预训练阶段,使用大规模的通用数据对模型进行训练,以学习语言知识和表示能力。这一阶段的目标是通过自监督学习或其他无监督学习方法,让模型尽可能地捕捉到数据中的统计规律和语言结构,并生成丰富的语言表示。在预训练阶段,模型并没有针对特定任务进行优化,因此预训练模型通常是通用的,可以应用于多个不同的任务和领域。

而在微调阶段,使用特定任务的数据对预训练模型进行进一步的训练和调整。微调的目标是将预训练模型中学到的通用知识和能力迁移到特定任务上,提升模型在目标任务上的性能。在微调阶段,可以根据具体任务的需求,调整模型的参数和结构,以更好地适应目标任务的特点。微调通常需要较少的任务数据,因为预训练模型已经具备了一定的语言理解和泛化能力。

15. 想让模型学习某个领域或行业的知识,是应该预训练还是应该微调?

如果想让大语言模型学习某个特定领域或行业的知识,通常建议进行微调而不是预训练

预训练阶段是在大规模通用数据上进行的,旨在为模型提供通用的语言理解和表示能力。预训练模型通常具有较强的泛化能力,可以适用于多个不同的任务和领域。然而,由于预训练模型是在通用数据上进行训练的,其对特定领域的知识和术语可能了解有限。

在微调阶段,可以使用特定领域的数据对预训练模型进行进一步训练和调整,以使模型更好地适应目标领域的特点和需求。微调可以帮助模型更深入地理解特定领域的术语、概念和语境,并提升在该领域任务上的性能。微调通常需要较少的任务数据,因为预训练模型已经具备了一定的语言理解和泛化能力。通过微调,你可以在预训练模型的基础上,利用特定领域的数据进行有针对性的调整,以使模型更好地适应目标领域的需求。

16. 多轮对话任务如何微调模型?

方法一

User1、Assistant1、User2、Assistant2、User3 的文本都视为模型的输入部分,将 Assistant3 的文本视为模型的预测部分,只有 Assistant3 部分的 loss 参与权重更新。

方法一

这种方法的弊端在于,没有充分利用多轮对话的训练数据,Assistant1 和 Assistant2 的内容没有参与模型训练,这部分数据在训练时被浪费了。并且对于很多多轮对话数据而言,中间的 Assitant 回复部分的信息量更丰富详细,最后一个 Assitant 回复部分往往是”谢谢“、”不客气“等诸如此类的较为简短的文本。如果只使用这部分文本训练模型,会严重影响模型的训练效果。

方法二

将一条多轮对话数据,拆分成多条数据。例如将以上示例拆分成如下三条数据。

方法二

相比方法一,方法二能够更加充分利用多轮对话中每一个 Assistant 的回复内容。但是弊端在于,需要将一个包含n轮对话的数据,拆分成n条数据,训练效率降低了n倍,训练方法不高效。

方法三

Firefly 项目训练多轮对话模型时,采取了一种更加充分高效的方法。如下图所示,将一条多轮对话数据拼接之后,输入模型,并行计算每个位置的 loss,只有 Assistant 部分的 loss 参与权重更新,项目地址

方法三

为什么这种做法是可行的?答案在于因果语言模型的 attention mask。以 GPT 为代表的 Causal Language Model(因果语言模型),这种模型的 attention mask 是一个对角掩码矩阵,每个 token 在编码的时候,只能看到它之前的 token,看不到它之后的 token。

所以 User1 部分的编码输出,只能感知到 User1 的内容,无法感知到它之后的文本,可以用来预测 Assistant1 的内容。而 User2 部分的编码输出,只能看到 User1、Assistant1、User2 的内容,可以用来预测 Assistant2 的内容,依此类推。对于整个序列,只需要输入模型一次,便可并行获得每个位置的 logits,从而用来计算 loss。

17. 微调后的模型出现能力劣化,灾难性遗忘是怎么回事?

灾难性遗忘是指在模型微调过程中,当模型在新任务上进行训练时,可能会忘记之前学习到的知识,导致在旧任务上的性能下降。这种现象常见于神经网络模型的迁移学习或连续学习场景中,原因如下:

  1. 数据分布差异:微调过程中使用的新任务数据与预训练数据或旧任务数据的分布存在差异。如果新任务的数据分布与预训练数据差异较大,模型可能会过度调整以适应新任务,导致旧任务上的性能下降。
  2. 参数更新冲突:微调过程中,对新任务进行训练时,模型参数会被更新,导致之前学习到的知识被覆盖或丢失。新任务的梯度更新可能会与旧任务的梯度更新发生冲突,导致旧任务的知识被遗忘。

18. 微调模型需要多大显存?

  1. 全参数微调:当在模型大小为 XB 且参数精度为半精度,推理所需显存约为 X 的两倍,而全参数微调所需显存约为推理所需显存的四倍,包括模型推理(一倍)、梯度(一倍)、优化器(两倍),也就是 X 的八倍。
  2. LoRA 微调:相比于全参数微调,LoRA 占用显存降低约 67.5%。
  3. QLoRA 微调:可在 48GB 显存的显卡上微调 65B 的模型。

19. 大模型LLM进行SFT操作的时候在学习什么?

  1. 任务特定的标签预测:在有监督微调中,模型会根据给定的任务,学习预测相应的标签或目标。通常会将基座模型训练成对话模型。
  2. 垂直领域知识学习:使模型更好地适应目标领域的特点和需求。微调可以帮助模型更深入地理解特定领域的术语、概念和语境,并提升在该领域任务上的性能。
  3. 特征提取和表示学习:微调过程中,模型会通过学习任务相关的表示来提取有用的特征。这些特征可以帮助模型更好地区分不同的类别或进行其他任务相关的操作。

20. 预训练和SFT操作有什么不同

  • 目标预训练的目标是通过无监督学习从大规模的文本语料库中学习语言模型的表示能力和语言知识。预训练的目标通常是通过自我预测任务,例如掩码语言模型(Masked Language Model,MLM)或下一句预测(Next Sentence Prediction,NSP)等来训练模型。有监督微调的目标是在特定的任务上进行训练,例如文本分类、命名实体识别等。在有监督微调中,模型会利用预训练阶段学到的语言表示和知识,通过有监督的方式调整模型参数,以适应特定任务的要求。

  • 数据在预训练阶段,大语言模型通常使用大规模的无标签文本数据进行训练,例如维基百科、网页文本等。这些数据没有特定的标签或任务信息,模型通过自我预测任务来学习语言模型。**在有监督微调中,模型需要使用带有标签的任务相关数据进行训练。**这些数据通常是人工标注的,包含了输入文本和对应的标签或目标。模型通过这些标签来进行有监督学习,调整参数以适应特定任务。

  • 训练方式预训练阶段通常使用无监督的方式进行训练,模型通过最大化预训练任务的目标函数来学习语言模型的表示能力。有监督微调阶段则使用有监督的方式进行训练,模型通过最小化损失函数来学习任务相关的特征和模式。在微调阶段,通常会使用预训练模型的参数作为初始参数,并在任务相关的数据上进行训练。

21. 样本量规模增大,训练出现OOM错

  1. 减少批量大小(Batch Size):将批量大小减小可以减少每个训练步骤中所需的内存量。但较小的批量大小可能会导致训练过程中的梯度估计不稳定,但可以通过增加训练步数来弥补这一问题。
  2. 内存优化技术:使用一些内存优化技术可以减少模型训练过程中的内存占用。例如,使用混合精度训练(Mixed Precision Training)可以减少模型参数的内存占用;使用梯度累积(Gradient Accumulation)可以减少每个训练步骤中的内存需求。
  3. 减少模型规模:如果内存问题仍然存在,可以考虑选择规模更小的模型。虽然这可能会导致模型性能的一定损失,但可以在一定程度上减少内存需求。
  4. 增加硬件资源:可以考虑增加硬件资源,例如更换性能更强显存更大的显卡,或者增加显卡的数量以实现并行训练,减小单卡压力。
  5. 数据处理和加载优化:优化数据处理和加载过程可以减少训练过程中的内存占用。例如,可以使用数据流水线技术来并行加载和处理数据,减少内存中同时存在的数据量

猜你喜欢

转载自blog.csdn.net/YuqingF/article/details/134408441