Q:当前大模型能力为啥还能提升?
LLama3 405B 技术报告看,大模型之所以能力仍在快速提升,主要驱动力有三个:
- 首先就是不断扩大模型和数据规模(Scaling Law)。
- 一个是越来越强调数据质量的作用,各种数据筛选方法和工具越来越多,保证质量是第一位的
- 不断增加数学、逻辑、代码这种能够提升大模型理性能力的数据配比比例,包括在预训练阶段(增加预训练数据此类数据比例,且在预训练后面阶段来上采样此类数据,就是说同样数据多执行几遍,以增加其对模型参数影响的权重)和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都明确提出了退火阶段带来的能力提升:
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 最重要的几个东西:数据,学习率,优化器!
- 数据就不多说了,质量为王,记得去重!
- 学习率:模型的更新幅度,size越大的模型,特征空间越大、表达能力和学习能力越强,因此学习率也应该小一点(做个假设,模型 size 无限大,有无数的神经元,那么它完全可以启用没用到的神经元来学习新知识,这样就避免了遗忘旧知识这个现象的发生)。
- 优化器:Adam 的基础知识我就不谈了,这里只强调一点,模型的优化方向是“历史动量”和“当前数据 grad”共同决定的。也就是说,不管当前数据多 bad,优化器都会限制你做出太大幅度的更新,梯度裁剪/梯度正则类似。因此,基本可以认为我们的模型具有一定的抗噪能力。
目前,大家基本都默认使用如下三个步骤进行 pretrain:
- warmup:在训练过程中,将学习率慢慢提高。(可以这么理解,你的模型还没有积攒足够的动量去抗噪,太大的学习率容易造成不可逆的影响)
- linear / constant / cosine decay:维持稳定的学习率,或者缓慢衰减的学习率。
- Anneal:用小学习率去学高精数据,IFT数据,逻辑数据,去提高通用逻辑能力能力和打榜能力。
Q:大模型预训练的数据配比是啥?
Llama3 和面壁智能明确给出了他们的数据配比,基本就是一个结论:代码很重要,英文很重要(即使是中文模型也应该保证英文语料的比例,有些 paper 认为模型的 general knowledge 基本来自于英文语料,中文更多的是对齐作用)。
个人建议:中英五五开,代码不能少,领域占比看算力。(根据个人需求和个人喜好,可以提高英文比例,如果有质量较好的 math 数据或逻辑数据,也添加一些)
面壁智能数据配比:
Llama3数据配比:
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。