自然语言处理: 第二十五章 LLM 预训练监督微调阶段 tricks

预训练和微调分别是大模型进行通用知识学习和领域自适应知识的迁移学习的过程。本文通过结合本人和一些“炼丹大神”的经验介绍微调和预训练的一些经验。




一. LLM的预训练tricks

  1. 使用“base”模型进行继续预训练(而不是“chat”模型),“base”模型的能力是最好的,因为还没有进行人类价值观的对齐训练。
  2. 缩放定律(Scaling law)是非常重要的,Scaling law不仅适用于LLM的预训练,也适用于有监督微调阶段的训练。
  3. 对于预训练过程的超参数设置(Batch size / 学习率)应当参考来自其他论文或者先前工作的一些设置。
  4. 继续预训练需要百万,千万甚至上亿的tokens训练语料,过少的训练语料不支持进行预训练工作。
  5. 多阶段的继续预训练可能是非常有用的,具体可参考Ziya2的工作。
  6. 词表扩充通常是不必要的,除非你的语种真的属于小语种或者语种发生了与原tokenizer模型发生了根本性改变。


二. LLM的监督微调tricks

微调是指在已经预训练好的大型语言模型基础上,使用特定的数据集进行进一步的训练,使模型适应特定任务或领域。微调主要目的是,完成知识注入、指令对齐。

在大模型应用中,指令微调已成为预训练大模型在实际业务应用最重要的方式。许多垂直领域模型,都是在预训练模型的基础上,通过针对性的指令微调,可以更好地适应最终任务和对齐用户偏好。在进行指令微调的时候,会将Instruction(指令) 以及对应的answer拼接成文本(在拼接过程中一般会加入【USER】、【BOT】等角色,同时会加入开始、结束的special token,这样可以转换成一个chat式任务)。将拼接文本采用预训练任务的方式进行自回归预测,和预训练的区别在于loss的计算,同样使用Cross-Entropy作为loss,在指令微调的时候只会计算answer部分,Instruction部分通过设置ignore_index隐掉。在上面的案例中,我们只会计算 “【BOT】:” 之后的loss。

<bos_token>【USER】:将下列内容翻译成英语:{待翻译文本}【BOT】:


微调方法分为全参数微调(Full Fine-tuning)、部分参数微调(Repurposing)典型全微调方法的如:SFT,部分微调的方法包括:LoRA、Adapter、Prefix-tuning、P-tuning、Prompt-tuning 、Freeze-tuning等。

如果在资源充足的情况下,建议使用SFT进行全量微调。部分参数微调的方法不稳定,在有的场景下效果不理想。

  1. 数据质量非常重要,GPT-4是一个很好的数据标注工具。制造数据应当有现实的数据支持,全部的生成数据将促使“幻觉”问题的出现。对于微调样本质量评估,一般需要评估样本多样性、answer质量。
  2. 如果你的微调数据很小(例如几百条),可以使用“chat”模型进行监督微调,较大的微调数据可以使用“base”模型进行监督微调。
  3. 为了保持模型的一些原有能力,在监督微调阶段仍然需要融入一些通用的监督数据,而且通常情况下,通用监督数据数量是多于领域监督数据的(例如在训练医疗LLM时需要混合比医疗数据更多的通用监督数据)。
  4. QLoRA有时候表现比LoRA的微调效果表现更好。
  5. 监督微调过程通常不是为了给LLM注入更多知识,而是激活模型的对话能力,学习新知识通常在预训练阶段完成。如果不得不在监督微调阶段注入新知识,那么对于一条知识,则需要对应几十条不同的监督数据构造才能注入到LLM这条知识。
  6. 监督微调阶段没有最好的参数设置,这个过程需要多次的实验设置最好的参数。


2.1 训练模式选择

在进行领域任务的SFT的时候我们通常会有以下训练模式进行选择,根据领域任务、领域样本情况、业务的需求我们可以选择合适的训练模式。

  • 模式一:基于base模型+领域任务的SFT;

  • 模式二:基于base模型+领域数据 continue pre-train +领域任务SFT;

  • 模式三:基于base模型+领域数据 continue pre-train +通用任务SFT+领域任务SFT;

  • 模式四:基于base模型+领域数据 continue pre-train +通用任务与领域任务混合SFT;

  • 模式五:基于base模型+领域数据 continue pre-train(混入SFT数据) +通用任务与领域任务混合SFT;

  • 模式六:基于chat模型+领域任务SFT;

  • 模式六:基于chat模型+领域数据 continue pre-train +领域任务SFT

2.1.1 有关于continue pre-train

大模型的知识来自于pre-train阶段,如果你的领域任务数据集与pre-train的数据集差异较大,比如你的领域任务数据来自公司内部,pre-train训练样本基本不可能覆盖到,那一定要进行continue pre-train。如果你的领域任务数据量较大(token在1B以上),并只追求领域任务的效果,不考虑通用能力,建议进行continue pre-train,并且更建议全量微调。

通常CPT开始的阶段会出现一段时间的loss上升,随后慢慢收敛。




2.1.2 是选择chat模型 还是base模型

如果你有一个好的base模型,在base模型基础进行领域数据的SFT与在chat模型上进行SFT,效果上差异不大。

基于chat模型进行领域SFT,会很容导致灾难性遗忘,在进行领域任务SFT之后,模型通用能力会降低,如只追求领域任务的效果,则不用考虑。

如果你的领域任务与通用任务有很大的相关性,那这种二阶段SFT会提升你的领域任务的效果。如果你既追求领域任务的效果,并且希望通用能力不下降,建议选择base模型作为基座模型。在base模型上进行多任务混合训练,混合训练的时候需要关注各任务间的数据配比




2.1.2 是选择chat模型 还是base模型
  • 在资源允许的情况下,如只考虑领域任务效果,我会选择模式二;
  • 在资源允许的情况下,如考虑模型综合能力,我会选择模式五;
  • 在资源不允许的情况下,我会考虑模式六





2.2 训练参数的选择

2.2.1 learning rate

学习率是一个非常重要的参数 ,这很容易理解:如果lr过大,那loss值收敛会更困难,旧能力损失的会更大;如果lr过小,那可能难以学到新知识。SFT数据集不是特别大的情况下,建议设置较小学习率,一般设置为pre-train阶段学习率的0.1左右,如在pre-train阶段的学习率为9e-5,则SFT学习率设置为9e-6。在10万SFT样本上,采用与pre-train一样的学习率,发现loss一直不收敛,在调低学习率至原来0.1之后,loss在两个epoch之后就收敛。

并且batch size做相应缩放。通常lr缩放倍数为batch size倍数的开方。例如batch size增大4倍,学习率对应扩大2倍即可。

2.2.2 warmup_ratio

通常pre-train训练的warmup_ratio 0.01~0.015之间,也有人建议 epoch * 1%左右。例如pre-train阶段一般只训一个epoch,则ratio是0.01;SFT通常3个epoch,ratio对应为0.03。

warmup-steps在2000左右。在SFT的时候,建议使用更小的ratio,因为相较于pre-train,SFT样本非常小,较小warmup_ratio可以使模型收敛更平滑。但如果你的学习率设置较大,那可以增大你的warmup_ratio,两者呈正相关。


#### 2.2.3 Epoch Epoch设置可以根据loss收敛情况设置,如果SFT样本较少,可以设置较大epoch,在较小的epoch上loss会不收敛,指令都很难遵循。较大epoch会容易导致过拟合,但过拟合要优于欠拟合。如果SFT样本数量较多,如在十万以上,一般2个epoch即可收敛。





更多的实验 tricks 请参考CareGPT:GitHub - WangRongsheng/CareGPT: CareGPT (关怀GPT)是一个医疗大语言模型,同时它集合了数十个公开可用的医疗微调数据集和开放可用的医疗大语言模型,包含LLM的训练、测评、部署等以促进医疗LLM快速发展。Medical LLM, Open Source Driven for a Healthy Future.

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
LLM(Language Learning Model)是一个基于预训练模型的自然语言处理框架,可以用于各种NLP任务,如文本分类、命名实体识别、情感分析等。下面是LLM模型的本地部署及微调流程: 1. 下载预训练模型 LLM模型基于预训练模型,可以通过Hugging Face官网下载预训练模型。选择相应的模型并下载到本地。 2. 安装LLM 可以使用pip命令安装LLM,命令如下: ``` pip install llm ``` 3. 加载预训练模型 使用LLM的load方法加载预训练模型,代码示例如下: ```python from llm.modeling import LLMForSequenceClassification model = LLMForSequenceClassification.from_pretrained('path/to/pretrained_model') ``` 4. 微调模型 使用LLM的train方法微调模型,代码示例如下: ```python import torch from llm.data import TextDataset, TextDataLoader from llm.training import LLMTrainer train_dataset = TextDataset('path/to/train_data', model.tokenizer) train_loader = TextDataLoader(train_dataset, batch_size=32, shuffle=True) optimizer = torch.optim.Adam(model.parameters(), lr=5e-5) trainer = LLMTrainer(model, optimizer) trainer.train(train_loader, epochs=3) ``` 5. 保存微调后的模型 使用LLM的save_pretrained方法保存微调后的模型,代码示例如下: ```python model.save_pretrained('path/to/fine_tuned_model') ``` 以上就是LLM模型的本地部署及微调流程。需要注意的是,在微调模型时,需要准备好训练数据,并且调整好超参数,以达到最佳的微调效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曼城周杰伦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值