Reading Notes: MiniCPM Technical Report
date
May 5, 2025
slug
minicpm-report
status
Published
tags
NLP
summary
type
Post
TL; DR
- 提出了一个小语言模型(Small Language Models)架构的设计(小词表;输入输出 projection 共享;deep-and-thin 设计;group query attention)
- 提出了一个 scalable 的训练方法,主要是借助了文章中提出的 WSD 学习率调度器
- 训练得到的模型族 MiniCPM (1 - 2 B)在同尺寸模型取得 sota 效果,并且在一些 benchmark 上取得和更大尺寸(7B, 13B)的模型取得相近表现。
Cosine Learning Rate Scheduler
从一个初始的学习率 开始,按照余弦函数衰减到 ,之后不再变化:
根据过往研究的经验结果表明,T 设置为训练的总步数往往带来最优的训练结果,在 minicpm 的文章中作者也验证了这一点。

WSD Learning Rate Scheduler
本文提出了一种新的学习率调度器 WSD LRS, WSD LRS 将学习率调度分为三个阶段:
- Warmup: 学习率从初始逐渐上升到目标稳定学习率,这个是和其他调度器一样的标准步骤。训练刚开始的时候 warmup 有助于探索。
- Stable:保持恒定学习率。
- Decay:以某个单调递减函数衰减至目标最小学习率。


文中介绍了对 WSD 做的一些实验分析,主要观察到以下现象:
- loss 在 decay 阶段迅速下降(左图),并且最终可以达到余弦衰减的水平。
- 10% 的 tokens 用来 decay 已经足够,而 2.5% 则不足(左图)
- 使用 WSD LRS (在一定实验条件范围内)能够实现有效的 data scaling (右图):在 WSD 下,通过 data scaling,小模型可以在 reasonable 的更多数据上(~4x)超过更大的模型。
Scalability of WSD LRS
文中提到的 WSD LRS 带来的 scalable 的训练方法,个人认为这里主要分两个方面:
- 对于模型尺度的 scalability(随着模型变大并不因这个方法带来额外的开销)
- 对于数据尺度的 scalability
带来这两个优点的核心原因是使用 WSD LRS 使得扩展数据时对之前的 checkpoint 的复用更加容易:
- 考虑在余弦调度器下,已经在一个数据规模上训练得到了 checkpoint,想要扩展数据规模。由于余弦调度器衰减的过程和总步数有关,因此加入新数据之后只能重新开始调度学习率,相当于是用之前的 checkpoint 做初始化进行了新的训练。
- 考虑 WSD 调度器,如果扩展了数据,只需要取衰减之前的 checkpoint,然后继续训练,由于处于 stable 阶段,这个接入是无缝的,这两次训练可以认为是一次,只是中间断开了,在概念上是连续的。
这样直接的好处是在扩展数据时,如果有 m 个数据规模要尝试,只需要一路练下去就行,对于要尝试的数据规模把对应时间的 checkpoint 单独拿出来 decay,总的成本被一次在最大数据规模上训练的成本 bound 住;如果是其他调度器,则需要独立进行 m 次实验。
Two Stage Pre-training
基于在 WSD LRS 上观察到的现象,本文还提出了一种两阶段的训练策略:
- stable 阶段正常进行预训练
- decay 阶段除了在预训练数据上,也加入一部分多样的高质量的 SFT 数据(也就是指令数据)
这么做的 motivation 个人理解是:既然在 decay 阶段 loss 下降很快,那利用这个阶段先去部分逼近 SFT 的数据分布,后续 SFT 之后可能会有更好的效果。
实验评估表明这种两阶段的预训练配合上后续的 alignment 能够产生更好的 chat model.