当天给大家带来知乎朋友@ybq一篇对于如何启动畛域模型训练的文章,关键内容是对 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 最关键的几个物品:数据,学习率,优化器!
目前,大家基本都自动经常使用如下三个步骤启动 pretrain:
(Llama3.1和面壁的MiniCPM都明白提出了退火阶段带来的才干优化)
Llama3.1退火论断
MiniCPM退火论断
post-pretrain 数据储藏
基础常识我们回忆完了,如今开局预备数据。说句丑话,假设你没有畛域模型的高精数据,也没计划去爬数据和洗数据,那神仙难救,团体倡导换个方向去钻研 。
好,我们曾经有了畛域高精数据。那 common 数据和数据配比怎样搞呢?
先说数据品质,post-pretrain 不用那么精细,我们的指标是通用才干不降低,而不是通用才干大幅度优化。Qwen2 的技术报告明白指出,训了 12T 数据的模型与训了 7T 数据的模型,基本没有优化。也就说,额外的 5T 数据仅仅是由于品质稍有降低(论文里说卡的阈值更小),就没有带来任何收益。
我们大略率拿不到比 Qwen2、Llama3 的 pretrain 阶段品质更好的数据,因此我团体觉着不要太执着于做一份特意洁净的 pretrain 数据了,你怎样洗数据都很难带来清楚收益。
再说数据配比,Llama3 和面壁自动明白给出了他们的数据配比,基本就是一个论断:代码很关键,英文很关键(即使是中文模型也应该保障英文语料的比例,有些 paper 以为模型的 general knowledge 基原本自于英文语料,中文更多的是对齐作用)。
这里给出不威望的团体倡导:中英五五开,代码不能少,畛域占比看算力。(依据团体需求和团体喜好,可以提高英文比例,假设有品质较好的 math 数据或逻辑数据,也减少一些)
面壁自动数据配比
Llama3数据配比
试验细节
Channel loss
就一句话:做 domain post-pretrain 不看 channel loss,你不如别开 tensorboard。
你就算随机拉一个数据集上来训,大略率也是 loss 缓慢降低的现象,你能失掉啥消息呢?你难道要等训了一周,才去做试验验证数据配比和学习率性能吗?
channel loss:不同数据 channel 各自的 loss。也就是说假定 1 个 batch 有 100 条数据:40条 en,30 条 cn, 20条 code, 10 条 domain,那么就绘制四条不同 channel 的 loss 曲线和一条总的 total loss 曲线。
(题外话,我原本以为 channel_loss 须要在>
channel_loss = {}for step, batch in enumerate(train_dataloader):batch = to_device(batch, device)channel = batch['channel'][0]del batch['channel']outputs = model(**batch)loss = outputs.loss# Update channel lossif channel in channel_loss:channel_loss[channel][0] += loss.item()channel_loss[channel][1] += 1else:channel_loss[channel] = [loss.item(), 1]all_channel_loss = [None for _ in range(world_size)]torch.distributed.all_gather_object(all_channel_loss, channel_loss)merged_channel_loss = {}for lst in all_channel_loss:for k, v in lst.items():if k in merged_channel_loss:merged_channel_loss[k][0] += v[0]merged_channel_loss[k][1] += v[1]else:merged_channel_loss[k] = [v[0], v[1]]for k,v in merged_channel_loss.items():avg_loss = v[0] / v[1] if v[1] != 0 else 0.0print_rank_0("The Channel {} loss is {}".format(k, avg_loss), args.global_rank)# Log channel loss to TensorBoardif dist.get_rank() == 0:writer.add_scalar(f'Loss/channel_{k}', avg_loss, epoch * num_batches + step)channel_loss = {}
Loss 剖析
前面提到过,pretrain 阶段有 warmup,那么 post-pretrain 当然也要有了,要素也很便捷啊。我们用的开源模型并没有提供应我们 checkpoint 对应的“优化器参数”,我们无法取得以前积聚的动量啊。
continue pretrain:
这篇论文讨论了“post-pretrain 模型时,warmup 应该经常使用的数据比例”。同时它也指出,warmup 在训练充沛的时刻是不太关键的。但由于我们无法判别模型是不是训练充沛了,所以还是老诚恳实的做个 warmup 吧。
warmup 比例
敲定 warmup 的数据比例后,选择一个悦目的学习率和数据配比,就去开局训练和观察 channel loss 吧,在最现实状况下,我们等候失掉一个这样的曲线:
联合 loss 曲线,我们再回过头来谈谈数据配比:post-pretrain 阶段最好的数据配比,就是沿用 pretrain 阶段的数据配比,很惋惜,我们无法能失掉到 Qwen、Llama 的 pretrain数据。因此,我们也别纠结数据去重了,大略率我们经常使用的 common 数据是人家曾经训过的,我们尽或许去找品质最高的 common 数据喂给模型就可以了。
不过从 channel loss 上,我们大略率能观察和反推一些物品:
综上,经过观察 loss,多做几组试验,基天性试探出哪个数据配比和哪个开源数据最适宜拿来 post-pretrain。
Scaling law
真的壮士,就应该去钻研 sacling law,这也就是除了Llama、Qwen,我还特意推崇“面壁MiniCPM”的要素,它仿佛是国际惟逐一家不执着于size,而是执着于“sacaling law”的公司。
这篇 domain scaling law 的论文化确指出“domain才干“和”general 才干“是相互抵触的,也就回归到了我一开局说的:我们的指标不是提高通用才干,而是去损失尽量少的通用才干。
D-CPT:
这篇论文的论断都是比拟 make sense 的:
文章再多的内容我就不谈了,感兴味的读者自己拜读一下即可,scaling law 的文章都相对艰涩一些,我还没有齐全读懂,不敢班门弄斧。我援用这篇 sacaling law 论文的关键要素是,一是讴歌一下做 scaling law 的大佬们,二是想表白“学习率真的很关键”这一观念,不要由于大家都在强调数据品质的关键性,就疏忽了炼丹的本钱行。
这里援用我的大佬共事跟我说过的一句话:“你把学习率设成 0 ,那是不是模型怎样训成果都不降低。那依据夹逼准绳,你只需找到一个好学习率,你数据再烂也能训出一个通用才干只降低一丢丢的模型。”
退火
退火自身怎样做,我就不多说了,小学习率 + 高精数据。基本每一个开源模型的技术报告,都会具体指出自己的退火数据配比。
我在这里提到退火,是想强调几个观念:
本文转载自,作者: