大模型 VS 小模型
首先,我们思考一个问题,为什么 qwen2 基本上是当下最受欢迎的开源模型?说实话,相比于 deepseek、llama、minicpm 这些诚意满满的技术报告,qwen2 的技术报告稍显一些“小家子气”,并没有提及到关键的技术细节。然而,qwen2 提供给开源社区的“全家桶”套餐,又是多长的技术报告也比不上的。对 llm 的研究者来说,用相同 tokenizer,相同的 7T pretrain_data 得到的“一簇小 llm”,其研究价值远远超过 Qwen2-72B 本身!
知乎: https://zhuanlan.zhihu.com/p/714399961
接下来,我们带着两个基本概念进入正文:
- 同源小模型:同 tokenizer,同训练数据下得到的 size 较小的llm
- 小模型:重点在于“小”,推理快或者本身就是分类模型,怎么训的完全无所谓。较小 size 的 llm,BERT,RoBERTa,Xgboost,LR 等等都可以称作小模型
同源小模型是大模型的实验场
scaling law 告诉我们:小模型的性能表现能用来预测大模型的性能表现。这也就是说,大部分情况下,我们是可以通过在同源小模型上做实验,去预测大模型的效果的。
在 pretrain / post_pretrain 阶段有很多需要做实验才能知道答案的问题。怎么样的数据配比最合理,课程学习中哪种学习顺序效果最好,数据的质量是否过关,数据的去重程度是否过关,先训4k、再扩到 32k 和直接训 32k 的效果差异,post_pretrain 的时候怎样调整学习率和数据分布来防止模型断崖式的能力遗忘?……
直接启动大模型的成本实在是在太高昂了,可能训练两三周,loss 曲线才会表现出一点点差异。但我们完全可以在小模型上大胆的训,每天训 100B token,两天就能出一版实验结果。观察 tensorbord 的 loss 曲线,刷 benchmark 打榜,或是做 sft 看效果,总之小模型可以帮助我们快速地敲定 pretrain 阶段使用的数据配置。
在 alignment 阶段,我们也可以去借助小模型和 scaling law 来指导工作。
我要强化模型的某个能力,准备了 N 条训练数据,能让模型达到多大的提升呢?可以看看这份数据在小模型上能有大提升,绘制一条曲线,去预估大模型的性能表现。说的再通俗一点,100B token 能让 0.5B 模型下降 0.2 loss,能让 72B 模型下降 0.1 loss, alignment 数据能让 0.5B 模型提高 x% 的 task 能力,那么大概率这份数据也只能让 72B 模型提升 0.5x % 的 task 能力。
- 已知:Qwen2-0.5B + few shot
- 已知:Qwen2-0.5B + SFT + zero_shot
- 已知:Qwen2-1.5B + few shot
- 已知:Qwen2-1.5B + SFT + zero_shot
- ……
- 已知:Qwen2-72B + few shot
- 预测:Qwen2-72B + SFT + zero_shot
但其实,在 alignment 阶段,小模型的实验指导意义并不是特别强,毕竟小模型的最大优势在于训得快,做实验快。由于 alignment 的数据量不大,我们往往可以直接对目标大模型进行训练来验证结果。这里的指导意义,往往是在我们需要大量数据去强化模型某个能力时才显得有意义,比如代码强化、创作能力增强。
在这里,额外需要强调两个点:
- 小模型需要使用较大的学习率,而大模型学习能力强、特征空间稀疏,往往需要使用较小的学习率;
- 强如 meta,据说也训崩了千亿级别参数的 MOE 模型。换句话说,MOE 的 scaling law 可能还不成熟,或者是 MOE 缺少一个像 llama 一样的能稳定训练的标准结构,其在小模型上的优异表现可能无法复现在大模型上。
大模型是同源小模型的良师
首先,大模型的效果就是同源小模型不可达到的 ceiling,这点毋庸置疑。(实际工作中,知道模型效果的上限,是一件非常有意义的事情)。
除此之外,大模型可以在训练中给到同源小模型极大的帮助。
模型蒸馏
“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,一个比较现实的方案是做 clip,只取最大的 N 个 token logits 标签进行学习,其他 token 的概率依然视为 0)
reward_model
用大模型来充当小模型的 reward_model,目前是一个很流行的做法,而用同源大模型去做 reward_model 则更是一个锦上添花的方案。
与蒸馏不同,蒸馏看中的是两个模型“tokenizer 同源”,reward_model 看中的则是两个模型“pretrain 数据同源”。也就是说,我们的 reward_model 和 policy_model 具有同等的知识量,两个模型的学习成绩虽然不一样,但它们上过的的课程却是一样的。reward_model 会的知识,就是 policy_model 学过的知识:“我学过并且我掌握了,你学过但你没掌握,所以我给你打低分就是合理的。”
虽然在实际工作中,一个同源 reward_model 可能没有 GPT4 这种“天才 reward_model ”带来的效果更好。但其往往能给出更公允的打分,进而避免过多的幻觉产生。这也是 alignment 的一大痛点,模型到底是训过拟合了才答错这个知识,还是压根就没学过这个知识 —— 交给同源大模型来判断。
大模型背后的无数小模型
OK,同源模型的意义我们就谈到这里,后面我们开始谈真正的“小”模型!一个优秀的大模型,无论是在训练阶段,还是线上部署阶段,其背后默默付出的小模型都数不胜数。
数据质量分类器:llama3 和 qwen2 都提到了,他们的 pretrain 训练数据是有得分的,然后通过阈值来找出最高质量的训练数据,开源 pretrain 数据集 fineweb 也提到了他们给数据打分的工作。Good data makes good model performance!李沐大佬在他的视频里说到,llama3 的数据打分器是 RoBERTa,这很合理,效果又好、推理又快的分类模型确实还要看 BERT 家族。
数据 domain 分类器:垂直领域模型的 post_pretrain 工作,往往需要非常精准的数据配比,domain 数据的数据质量也需要非常优质。这也就是说,我们需要一个分类器,去提取海量数据中的 domain 数据,这个分类器最好还能把低质量的 domain 数据也视为非 domain 数据,通常承担这个工作的模型也是 BERT 家族。
线上模型的分类器:众所周知,RAG 模块已经是 llm 的标配,我们总不能让模型自己判断该不该做检索吧?虽然不是不行,但是额外生成“是否RAG”这些 token 会降低系统的响应速度,并且可能降低模型的通用能力(模型学的越多,忘的也越多)。因此,线上模型往往都是前置挂一个小模型,来判别是否需要 RAG,同理也需要判别是否触发 safety,是否触发工具链等。
RAG 模型:这个模型更是重量级,也就是咱们传统的信息检索模型,如何从海量 docs 里面选出最相关的 doc。BGE 是这个工作较为常用的模型。
数据生产模型:
- “小模型 + SFT > GPT4 + zero_shot ”几乎是数据生产阶段最常用的公式了。我们在数据生产阶段往往面临几个困境,GPT4 并不是百分之百按照我们指定的格式进行输出(复杂指令任务尤为明显),GPT4 真的很贵,特别是在生产多轮对话数据的时候。这种情况下,最好的方案就是用一个小模型去学目标 task 的高精数据,让这个小模型过拟合,进而变成一个标准的 task 数据生产器;
- 以 role_play 任务为例,很多场景是需要人不断和 GPT4 聊天来生产高质量的对话数据的,我们的模型做不到 GPT4 那样能准确拿捏角色性格的程度,但扮演一个“多事儿的用户”还是绰绰有余的。训一个聊天模型,让它和 GPT4 聊天来自动化大量生产数据。
这里,我再分享一些个人使用小模型时的 trick:
学会变通,生成模型也可以当判别模型使用。简单来说,如果我们懒得去找一份 BERT 代码去训一个分类器,我们也可以直接训一个 Qwen2-0.5B,让它只会输出 0 和 1,当我们的模型完全过拟合到 0 和 1 的时候,那么所有 token 中便只有 0 和 1 有概率,其他 token 的概率几乎为零。此时,我们用 1 所对应的 token_probability,不就是分类器的打分吗?当然,更优雅的做法是把 pretrain_model 的 lm_head 替换成 reward_model 的 lm_head。
另外,一个优秀的大模型,无论是在训练阶段,还是线上部署阶段,其背后默默付出的小模型都数不胜数。。这句话怎么说呢,是我在训 domain 分类器的时候,发现 Qwen2-1.5B 的准确率和召回率都不如 Qwen2-0.5B 高。在一番讨论和实验分析之后,我认可了大佬同事的观点:模型越大,其学习能力越强,但也意味着其更容易过拟合。
传统机器学习模型做的事情都是特征抽取,去从输入的特征中提取出看不到的特征,像 xgboost 这种还会计算每个特征的重要程度。但由于 llm 的参数量足够大,再加上 decoder_only 的结构,它真的可以做到记住所有的输入特征(decoder_only 是一个纯信息检索结构,它不压缩任何 token 信息,和 BERT 的 CLS 位压缩信息完全是两种做法)。
因此,较大的模型虽然上限更高,但其所依赖的数据质量也更高,如果你的训练数据是有失偏颇的,分布不均衡的,它完全可以记住这些数据的 pattern,而不是从这些 pattern 中抽取共同特征。我的 0.5B 模型效果好于 1.5B 模型大概率就是这种情况:我使用了 4 个数据源作为训练集,但测试集来自于 10 个数据源。
写在最后
诚然,大模型的出现,解决了困扰 nlp 多年的指代消解、多轮理解、对话人设等瓶颈,但小模型的信息压缩、特征抽取等依然是非常有意义的。我们在工作中,还是应该多考虑一下能不能用小模型来解决问题,找找我们的老朋友 BERT,而不是二话不说就打开 GPT4 写 prompt。