领域模型训练

背景

  1. 什么是领域模型?
  2. 领域模型为什么需要专门做 post-pretrain 训练,alignment 阶段不够吗?

简单来说,领域模型 / 专家模型 就是在某一个专业领域性能特别好的模型,可能包括法律、医学、教育、role-play 等等。一般来说,领域模型比较重要的环节是 RAG,我们需要有一个特别高精的检索库,来辅助模型做一些专业的回答。这也就是说,做好 sft 和 ppo 似乎就可以了?

其实,这么想也基本正确,因为大部分领域模型所处理的任务场景,80% 都是模型的通用能力能 cover 的。以法律大模型为例,“判断是否是法律问题、总结律师发言重点、提取法官判决结果等等?” 类似的问题基本任何一个开源模型 + 几百条 sft 语料都能做的不错。

然而,领域模型的要求的准确率是远远大于 80% 的,而剩下的那 20% case 恰恰又是 sft 无论如何也做不好的。

“张三犯抢劫罪,张三买了苹果,张三杀了个人,张三睡觉,张三挪用公款,……,张三寻衅滋事李四。” 请概括张三触犯的法条?

以上面这个 case 为例,我们的通用模型大概率是会把“寻衅滋事”当做一个动作来看待,而不会把它视为一个违法行为,进而导致概括错误。可如果连这种简单 case 都调用 RAG 的话,那么显然成本高的有些过分了,何况这种情况还很难检索准确。

因此,post-pretrain 的目的便是让模型尽可能的去认识这个领域的专有名词,知道某些词汇就是这个领域的专有名词,进而让 attention 给到这些 token 一些更大的权重。法律模型需要见过所有的法律法规、医学模型需要见过所有的症状和药品名词,以此类推。

然而,大量的 paper 已经证明:续训模型的过程,大概率是“学了新的,忘了旧的”的过程。这也就是说,你提高模型在领域知识上的认知能力的同时,往往它也在丢失通用能力。前面也说了,我们有 80% 的场景时需要通用能力来覆盖的。因此,我们更加靠谱的目标是:在 post-train 阶段学习领域知识的同时,尽最大可能去避免模型的通用能力损失。(贪不了一点,大模型有太多的工作需要 trade-off)

Post-Train

如果你的 base_model 是自己训的,那后面不用看了。使用退火前的 checkpoint,沿用 pretrain 阶段的训练数据,使用类似于“91开”的数据配比去混合领域数据续训,训完再退火,然后这个工作就完成了!

pretrain 知识回顾

emm,还往下读,应该都是没有自己 model 的同学了,咱们继续探讨!

pretrain 最重要的几个东西:数据,学习率,优化器!

  • 数据就不多说了,质量为王,记得去重!
  • 学习率:模型的更新幅度,size越大的模型,特征空间越大、表达能力和学习能力越强,因此学习率也应该小一点(做个假设,模型 size 无限大,有无数的神经元,那么它完全可以启用没用到的神经元来学习新知识,这样就避免了遗忘旧知识这个现象的发生)。
  • 优化器:Adam 的基础知识我就不谈了,这里只强调一点,模型的优化方向是“历史动量”和“当前数据 grad”共同决定的。也就是说,不管当前数据多 bad,优化器都会限制你做出太大幅度的更新,梯度裁剪/梯度正则类似。因此,基本可以认为我们的模型具有一定的抗噪能力。

目前,大家基本都默认使用如下三个步骤进行 pretrain:

  • warmup:在训练过程中,将学习率慢慢提高。(可以这么理解,你的模型还没有积攒足够的动量去抗噪,太大的学习率容易造成不可逆的影响)
  • linear / constant / cosine decay:维持稳定的学习率,或者缓慢衰减的学习率。
  • Anneal:用小学习率去学高精数据,IFT数据,逻辑数据,去提高通用逻辑能力能力和打榜能力。

(llama 和 面壁 都明确提出了退火阶段带来的能力提升)

post-pretrain 数据储备

基础知识我们回顾完了,现在开始准备数据。说句丑话,如果你没有领域模型的高精数据,也没打算去爬数据和洗数据,那神仙难救,个人建议换个方向去研究 。

好,我们已经有了领域高精数据。那 common 数据和数据配比怎么搞呢?

先说数据质量,post-pretrain 不用那么精细,我们的目标是通用能力不下降,而不是通用能力大幅度提升。qwen2 的技术报告明确指出,训了 12T 数据的模型与训了 7T 数据的模型,基本没有提升。也就说,额外的 5T 数据仅仅是因为质量稍有下降(论文里说卡的阈值更小),就没有带来任何收益。

我们大概率拿不到比 qwen2、llama3 的 pretrain 阶段质量更好的数据,因此我个人觉着不要太执着于做一份特别干净的 pretrain 数据了,你怎么洗数据都很难带来明显收益。

这里推荐几个开源数据集,感觉基本够用了!

英文 Fineweb:https://huggingface.co/datasets/HuggingFaceFW/fineweb-edu英文 pile:https://huggingface.co/datasets/EleutherAI/pile中文 SkyPile:https://huggingface.co/datasets/Skywork/SkyPile-150B中文 CCI:https://huggingface.co/datasets/BAAI/CCI2-Data代码 the-stack-v2:https://huggingface.co/datasets/bigcode/the-stack-v2-train-smol-ids

再说数据配比,llama3 和面壁智能明确给出了他们的数据配比,基本就是一个结论:代码很重要,英文很重要(即使是中文模型也应该保证英文语料的比例,有些 paper 认为模型的 general knowledge 基本来自于英文语料,中文更多的是对齐作用)。

这里给出不权威的个人建议:中英五五开,代码不能少,领域占比看算力。(根据个人需求和个人喜好,可以提高英文比例,如果有质量较好的 math 数据或逻辑数据,也添加一些)

发表评论