
微调 LLM 时遇到的 5 个问题及解决方案
图片来源:编辑 | Midjourney
微调仍然是适应通用预训练大语言模型(LLM)(也称为基础模型)以服务于更专业、高价值下游任务的基石技术,即使零样本和少样本方法日益流行。通过在特定领域数据上定制模型参数,从业者可以提高准确性、专业推理能力和更相关的输出。虽然这是提高模型在特定应用性能的有利方法,但在这个过程中也并非没有可能遇到的问题。
本文介绍了在微调过程中可能遇到的五个问题以及如何解决它们。
1. 灾难性遗忘
虽然听起来可能很可怕,但这个问题确实会发生。当一个正在微调的LLM在接触新数据时,会丢失部分先前学到的语言能力,这就是灾难性遗忘。这个问题通常是由神经网络内部层在学习新信息过程中覆盖旧参数或权重的倾向引起的。在领域特定数据上进行微调时,LLM甚至可能牺牲其广泛的语言技能来获得狭窄的专业知识,这可能会有问题。
好消息是:存在诸如“rehearsal”方法和弹性权重巩固(EWC)之类的技术,它们有助于缓解这个问题,例如,通过在微调过程中定期向模型展示来自原始数据集的样本。
以下是“rehearsal”在实践中可能的样子的一个简单示例。
1 2 3 4 5 6 7 8 |
# 问题 1:使用rehearsal混合原始数据和微调数据 import random original_data = [...] # 令牌化样本列表 fine_tune_data = [...] # 令牌化领域特定样本列表 mixed_dataset = original_data[:500] + fine_tune_data # 简单的rehearsal样本 random.shuffle(mixed_dataset) # 随机化样本顺序 |
2. 训练数据质量问题
用于微调的数据质量低或存在偏见,可能导致LLM性能下降和偏见加剧。模型可能会继承训练数据中的缺陷,如不一致或事实错误。由于微调通常使用比预训练小得多的数据集,这些有问题的数据示例对正在微调的模型影响更大。
解决此问题的方法是实施严格的数据整理、清理和质量检查流程,并进行数据增强,以获得多样化、平衡、无偏见且高质量的数据集。
以下是使用EWC进行参数冻结的简单伪代码示例。
1 2 3 4 |
# 问题 2:使用弹性权重巩固(EWC)计算并冻结重要参数 fisher_info = compute_fisher_information(model, original_data) apply_ewc_penalty(model, fisher_info, lambda=0.4) |
请注意,Fisher信息用于识别哪些参数对先前的任务最关键,从而使EWC在微调期间能够选择性地阻止更改它们。
3. 计算成本
微调LLM时最普遍的问题可能是,尽管使用的数据集远小于用于预训练通用LLM的那些庞大数据集,但该过程仍然需要大量的计算资源,特别是对于拥有数百万到数十亿参数的大型模型。例如,微调最先进的LLM的成本可能高达数千美元,从而极大地限制了较小组织进行实验和获得微调能力。
诸如LoRA(低秩自适应)和前缀微调之类的参数高效微调方法被提出,以在获得合理的微调结果的同时,部分降低这种密集的资源需求。
这是使用LoRA进行参数高效微调(PEFT)的代码片段。
1 2 3 4 5 6 7 8 9 10 11 12 |
# 问题 3:使用LoRA进行参数高效微调 from peft import LoraConfig, get_peft_model lora_config = LoraConfig( r=8, lora_alpha=32, target_modules=["c_attn"], lora_dropout=0.05, ) lora_model = get_peft_model(model, lora_config) |
4. 过拟合
在影响所有机器学习和深度学习模型的经典问题中,过拟合也存在于LLM微调的领域:当模型过度记忆训练样本,未能从中学习到可泛化的模式时,就会发生这种情况,这会严重限制其在实际场景中的有效性,因为模型会接收到从未见过的新数据。
诸如早期停止、dropout和其他正则化策略等对抗深度神经网络过拟合的技术,可以帮助防止LLM微调过程中的这种常见问题。
以下是在Trainer中使用早期停止来防止过拟合的示例。
注意:我们将假设已经有一个现有的model
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# 问题 4:在Trainer中使用早期停止防止过拟合 from transformers import Trainer, TrainingArguments, AutoModelForCausalLM, AutoTokenizer training_args = TrainingArguments( output_dir="outputs/", num_train_epochs=10, per_device_train_batch_size=4, evaluation_strategy="steps", eval_steps=200, save_steps=500, load_best_model_at_end=True, ) trainer = Trainer( model=model, args=training_args, train_dataset=mixed_dataset, eval_dataset=fine_tune_data, ) |
5. 对齐挑战
这个问题涉及到确保模型在微调后遵守人类价值观并避免有害结果的挑战。微调有时会无意中破坏在预训练期间牢固建立的对齐属性,导致微调后的模型在某些领域可能会生成不当甚至不道德的语言。
幸运的是,诸如基于人类反馈的强化学习(RLHF)和Constitutional AI之类的技术,在帮助LLM与人类和伦理方面保持对齐方面被证明是有用的。
总结与后续步骤
总之,有效的微调需要平衡适应新领域与保留先前能力、解决数据问题、控制成本、防止过拟合以及确保对齐。
问题 | 描述 | 缓解措施 |
---|---|---|
灾难性遗忘 | 模型在新的数据上微调时会丢失先前学到的语言能力 | Rehearsal方法;弹性权重巩固(EWC) |
训练数据质量问题 | 低质量或有偏见的数据会降低性能并加剧偏见 | 严格的数据整理、清理、增强 |
计算成本 | 微调仍然需要大量的计算和成本,限制了实验 | 参数高效方法,如LoRA;前缀微调 |
过拟合 | 模型会记忆训练样本,无法泛化到未见过的数据 | 早期停止;dropout;正则化 |
对齐挑战 | 微调可能会破坏对齐,导致有害或不道德的输出 | RLHF;Constitutional AI;安全过滤器 |
作为后续步骤,从业者应该
- 通过在原始和特定领域的基准上进行评估来监控灾难性遗忘
- 建立强大的数据管道以进行持续的数据整理和增强
- 尝试参数高效方法(LoRA、前缀微调)以降低计算量和成本
- 在训练过程中应用早期停止和正则化以保持泛化能力
- 集成RLHF或Constitutional AI工作流程以确保对齐
暂无评论。