大模型预训练技巧

Q:当前大模型能力为啥还能提升?

LLama3 405B 技术报告看,大模型之所以能力仍在快速提升,主要驱动力有三个:

  1. 首先就是不断扩大模型和数据规模(Scaling Law)。
  2. 一个是越来越强调数据质量的作用,各种数据筛选方法和工具越来越多,保证质量是第一位的
  3. 不断增加数学、逻辑、代码这种能够提升大模型理性能力的数据配比比例,包括在预训练阶段(增加预训练数据此类数据比例,且在预训练后面阶段来上采样此类数据,就是说同样数据多执行几遍,以增加其对模型参数影响的权重)和Post-Training阶段(增加此类数据占比,Llama3的经过instruct的模型比仅做预训练模型相比,各种尺寸的效果提升都很大)皆是如此。

目前看,在通用数据快被用完情况下,第三个因素会成为之后大模型进步的主导力量,包括使用数学、逻辑、代码合成数据在Post-Training阶段的应用,目前技术也越来越成熟,其质量和数量会是决定未来大模型效果差异的最关键因素。PS:合成数据其实是模型蒸馏的一种变体,合成数据是更大的模型输出数据作为Teacher,小点的模型作为Student从中学习知识,所以其实本质上是一种模型蒸馏。

Q:如何训练优质小模型?

最近半年小模型在快速崛起,各种开源小模型此起彼伏,且效果也越来越好。

小模型无论是训练成本、推理成本还是对于用户数据隐私保护,相比大模型都有独到的好处。唯一的问题是效果,只要Scaling law成立,就可以推断出小模型效果不会比超大规模模型效果好,否则就直接反证了Scaling law是不成立的

所以小模型的关键点在于:在模型规模大小受限的情况下,如何通过其它技术手段来不断提升模型效果,最好的结局是小模型尺寸比最大模型小很多倍,但是效果逐步逼近最大模型的效果,两者差距越来越小。

这样美好的结局会出现么?目前看有极大可能会达成这一目标。从最近一年的技术进展来看,有三个关键因素不断提升小模型效果:

1. 增加预训练数据的数量和质量

为了打破Optimal Chinchilla Law,需要在保证数据质量的前提下显著增加数据量。这是一个已经验证有效的方法。去年初,一些模型(例如pythia和Llama 1)严格遵循这个法则,导致相同规模的模型效果远不如那些大量增加数据的模型。后来,通过猛加数据,小模型的效果就越来越好。

2. 模型蒸馏

从开源角度来看,这个武器相对较新,而且我判断用蒸馏来提升小模型效果的能力非常强大。所谓“蒸馏”,就是说在预训练阶段小模型作为Student,大模型作为Teacher,Teacher告诉Student更多信息来提升小模型效果。

原先小模型预训练目标是根据上文context信息正确预测Next Token,而蒸馏则改成Teacher把自己做相同上下文做Next Token预测的时候,把Token词典里每个Token的生成概率都输出来,形成Next Token的概率分布,这就是Teacher交给Student的额外附加信息,小模型从原先的预测Next Token改为预测Next Token的概率分布,要求和Teacher输出的分布尽量一致,这样就学到了Teacher的内部信息。

Gemma 2采用模型蒸馏对于小版本模型提升非常明显。Llama 3技术报告貌似没有看到采用这个技术,但是在宣传页里到处暗示你应该拿405B模型作为Teacher去蒸馏自己的小模型,无疑这会是很有效提升小模型能力的新武器。感觉其它模型在这里没有足够的重视,而之后这应该成为普及方案。而研究怎样的蒸馏方法是最好的会是一个重要研究领域。

3. 退火数据(Annealing Data)

退火数据概念由Llama 3技术报告提出,但实际上去年已有许多模型采用类似方法,只是名称不同。核心理念是,在预训练的最后阶段,对高质量数据(如数学、逻辑、代码数据)进行上采样,增加其影响。尽管LLama 3技术报告中指出这一方法对405B模型效果有限,但对8B小模型在逻辑和代码能力方面有明显提升。

根据现有资料分析,推断模型蒸馏和退火数据可能存在“反规模效应”,即小模型参数规模越小,这两种技术的正面影响越大。因此,在研发小模型时,需特别关注引入这两项改进。如果三个技术手段同时使用,接近最强大模型能力的小模型是可行的,其实还有另一个重要因素,即Post-Training阶段合成数据的影响,对各个尺寸模型都适用。

综合来看,小模型通过增加训练数据量和质量、模型蒸馏及退火数据这三个“武器”,有望逐步逼近大型模型的效果。

Llama3.1和面壁的MiniCPM都明确提出了退火阶段带来的能力提升:
Description

Q:退火训练怎么做?

退火本身怎么做:小学习率 + 高精数据。基本每一个开源模型的技术报告,都会详细指出自己的退火数据配比。

我想强调3点:

  • 退火直接能提高刷榜能力!
  • 我们 post-pretrain 的模型,都是做过退火的,也就是说这个模型就像是刚高考完的高三学生,考试能力是人生巅峰!现在不管教他什么知识,他的考试能力都会下降。
  • 你怎么训,模型的打榜能力基本都会下降,所以大家不要太过焦虑这个现象。但做 post-pretrain 之前,一定要构建好 domain 能力的评估集,证明自己的 domain 能力在提升。要不然 common 也降、domain 也降,是钱多闲得慌吗?

Q:什么是领域模型?

领域模型 / 专家模型 就是在某一个专业领域性能特别好的模型,可能包括法律、医学、教育、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)

Q:大模型预训练pretrain的要点是啥?

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

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

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

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

Q:大模型预训练的数据配比是啥?

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

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

面壁智能数据配比:
Description

Llama3数据配比:
Description

Q:领域模型训练的要点是啥?

D-CPT:https://arxiv.org/pdf/2406.01375 这篇 domain scaling law 的论文明确指出“domain能力“和”general 能力“是相互冲突的,也就回归到了我一开始说的:我们的目标不是提高通用能力,而是去损失尽量少的通用能力。

这篇论文的结论都是比较 make sense 的:

  • 小学习率,domain 学得快,通用忘得慢;
  • 大学习率,domain 学得快,但到一定地步后就震荡,毕竟学习能力有限;
  • 不同 size 的模型适合不同的学习率。

Q:模型蒸馏如何做?

“distill”是 BERT 时代非常火的一个技术方案,现在却提及的不太多了,归根到底就是蒸馏对“同源 tokenizer”的要求太硬了。不过同源小模型没有这个顾虑,蒸馏技术就像是为同源小模型的效果强化量身定制的技术方案一样。

先澄清一个概念,目前的大部分论文都把“利用 GPT4 造数据,喂给小模型去训练“叫做蒸馏,这种叫法也没错,不过更准确的叫法应该是”知识蒸馏“:让小模型去学习大模型的知识能力。而传统的“模型蒸馏”,指的是我们不再让模型学习 hard-label,而是 soft-label:

  • hard_label:“台湾属于”,在预测下一个 token 的时候,“中国”的概率是 1,其他所有 token 的概率是 0;
  • soft_label:“台湾属于”,在预测下一个 token 的时候,“中国”的概率是 0.3,“中华”的概率是 0.2,“大陆”的概率是 0.1……

不管从哪个角度考虑,似乎 soft_label 都是蕴含更多信息量可学习的。因此,利用大模型去“模型蒸馏”小模型,很有可能能得到一个能力远高于同等 size 的小模型,Google 的 Gemma 小模型 就应用了这项技术方案。

模型蒸馏之所以在 llm 方向做的少,其实还是因为得不偿失,其对算力和存储的需求较大,与模型的效果提升不成正比。毕竟正常训练学的是 seq_len 个 one_hot label,蒸馏学的是 seq_len * vocab_size 的 logits,一个比较现实的方案是做截断,只取最大的 N 个 token logits 标签进行学习,其他 token 的概率依然视为 0。

参考文献

使用预训练模型进行训练是一种常见的迁移学习方法,它可以加快模型的训练过程并提高性能。下面是一般的步骤: 1. 选择合适的预训练模型:根据你的任务和数据集的特点,选择一个与之相关的预训练模型。通常,有一些常用的预训练模型可供选择,如BERT、GPT、ResNet等。这些模型在大规模数据上进行了训练,并具有强大的特征提取能力。 2. 加载预训练模型:根据所选框架和模型,使用相应的函数或库加载预训练模型。这通常包括模型的架构和参数。 3. 冻结部分参数:为了保留预训练模型的特征提取能力,可以选择冻结一部分或全部参数。冻结的参数将保持不变,不参与梯度更新。 4. 修改输出层或添加新层:根据你的任务需求,修改预训练模型的输出层,或在其之上添加新的层。这样可以根据你的数据集和任务进行微调。 5. 定义损失函数和优化器:根据你的任务类型,选择适当的损失函数和优化器。损失函数用于衡量模型的预测结果与真实标签的差距,优化器用于更新模型的参数以减小损失。 6. 进行训练:使用你的数据集进行训练。根据训练集的大小和计算资源的限制,可以选择使用完整数据集训练,或者使用小批量数据进行训练。 7. 评估和微调:在训练过程中,定期评估模型的性能,并根据评估结果进行微调。你可以尝试不同的超参数设置、数据增强技术等来提高模型的性能。 请注意,使用预训练模型进行训练时,你需要确保数据集与预训练模型的输入格式和范围相匹配。有时可能需要对数据进行预处理或调整模型的输入层来满足要求。 此外,还有一些技巧可以帮助你更好地利用预训练模型,如渐进式解冻参数、使用不同的学习率等。这些技巧可以根据具体情况进行尝试和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值