LLM预训练数据策略(一)
【本文已在同名 微信公众号 / 知乎 / 个人博客linsight.cn 上线】
Code-Based English Models Surprising Performance on Chinese QA Pair Extraction Task
时间:2024年1月
TL;DR
在“基于中文文档生成QA”的生成任务上,使用多个规模相同/相近的LLM进行实验。结果发现,代码模型效果比通用模型更好,并且英文模型表现出了优异性能。
任务 & 数据
1、任务
基于中文的文档,给出中文QA数据。下面是一个样例:

2、数据
(1)训练数据
从wiki和新闻文章中获取的 143,846 个文档,每个文档有相应的问答对。
这些数据来自开放的人工标注数据集。
(2)评测数据
测试集由 300 个internet technology相关的private文档组成。来自于实际业务中收集的hard case。
训练数据和评测数据的domain很不同,这就要求模型有比较强的泛化能力。
指标 & 实验
1、指标
文中使用了5个细粒度的指标:
- Coverage Analysis:使用 ROUGE - L
来评估summary在多大程度上涵盖了源文本中呈现的信息。ROUGE - L
值越高,表示模型输出的覆盖率越好。
- Hallucination Analysis of Answers:定义了content creation
rate(CCR)(不过文中没有给出具体定义),代表模型产生幻觉的倾向。CCR
分数越高,表明幻觉越严重。
- Completeness Analysis of Answers:定义了average text coverage
ratio(COV)(同样没有给出具体定义)。COV
指的是在所有结果中,输出文本与输入文本的最长公共子串的平均比值。这个比值反映了输出文本对输入文本内容的平均使用程度。COV
分数越高,表示输出文本对输入文本的复制保真度越高。
- Reject Capability Analysis:定义了模型的reject
capability(REJ)(同样没有给出具体定义),它表明模型是否知道何时拒绝完成任务(训练和测试数据中包含一些无法用于生成有效QA的文档,需要模型拒绝)。REJ
分数越高,表明模型更好地辨别哪些材料更值得进行知识生成任务。
- Summarize Capability Analysis:定义了text extraction aggregation
count(TEAC)(同样没有给出具体定义),用来代表模型的总结能力。TEAC分数越高表示模型从内容整体中多个地方提取信息的能力越强,即提取的信息更复杂。同时还定义了longest
increasing subsequence ratio(LISR),表示模型保持一致性的能力,LISR
分数越高,表明知识提取行为更有序。
还有一个EXPERTS指标,是用其他LLM对生成结果进行打分。
2、实验
论文具体做了以下四个实验。实验用的基模型都是预训练模型,没有经过对齐。
(1)Code-based LLMs better than other LLMs
比较了code model与非code model在QA数据微调后各种指标上的性能差异,发现code model在 EXPERTS 等方面通常优于其他LLM,而在幻觉、泛化和拒绝等方面也有显著增强,如下表所示:

(2)Less Domain Knowledge, Better Performance
把 DeepSeek-code-6.7B 和 Code Llama-7B 拉出来看,发现Code Llama-7B整体上更好一些。而根据二者透露的信息,DeepSeek-code-6.7B所用的中文数据比例应该是远高于Code Llama-7B的。

DeepSeek-code-6.7B 的主要问题是容易出现幻觉。这可能说明,在预训练数据中包含大量的中文通用数据,更容易导致模型出现幻觉问题。
(3)A Moderate Amount of Chinese is Better
Code Llama的词表中,中文的token很少。如果加入8076个中文token,并使用词表中其他相关token的平均值初始化这些新加入的token,那么在一些维度上有一些提升,比如TEAC和CCR。如果是对这些新加入的token进行随机初始化,效果则差很多。


文中认为加入一定量的中文知识能够提升效果。不过个人认为这里也有可能是训练量太少,随机初始化没有能够收敛。利用平均值初始化新token可以加速收敛。
(4)QLoRA fails to replicate the effects
使用 QLoRA 对 Code Llama-7B 模型进行两种方法(scaling 和 noscaling)的训练,发现无论哪种 QLoRA 方法,在该任务下都无法获得与全参数微调相同的效果。

EXPERTS得分的差距非常大。
小结
感觉整个实验应该说indicate了一个事情:训练语言(中文、英文)之间的差距,比训练任务的的差距更小。如果一个模型在英文上具备了很好的摘要能力,那么这个摘要能力比较容易迁移到中文上;而如果一个中文模型在预训练中没有得到任何摘要相关能力的训练,那么想要这个模型获得摘要能力,那么难度会比前面语言上的迁移更大。
因此,想要在复杂任务上获得好效果,就应该拆解复杂任务所需的基本能力,然后在训练数据中加入支持相应能力的数据。比如agent能力,需要调用接口,总结多方信息,那么上游的代码数据、长文总结、阅读理解应该都对agent能力有帮助。
RHO-1: Not All Tokens Are What You Need
时间:2024年4月
TL;DR
论文的主要思想是“Not all tokens in a corpus are equally important for language model training”。文中提出Selective Language Modeling (SLM)的方法,通过仅选择部分有效的token参与继续预训练,能够在提升收敛速度(5x-10x)的同时,获得更好的效果。

左边是常规的Causal Language Modeling (CLM),右边是这里改进的Selective Language Modeling (SLM)。
分析
1、token粒度脏数据
预训练数据中存在着像下图这种,包含部分低质量token的数据。这些数据难以通过文档级别的过滤来处理,因为如果把过滤阈值卡得太严的话,可能会误伤很多正常数据。而如果直接移除这些token,又可能影响正常的训练。

2、数据分布不一致
预训练的数据分布通常和下游的任务的数据分布不一致,直接把所有token一视同仁进行预训练,可能会有很多对下游无效的训练。
Selective Language Modeling (SLM)
首先看下训练过程中token的loss变化情况。从OpenWebMath数据集中抽15B的数据,训练Tinyllama-1B,然后每训练1B
token保存一次checkpoint。然后用一个包含约320,000个token的validation
set,跑出所有checkpoint的token-level
loss。发现这些token根据训练过程loss的变化可以分成4类:
- persistent high loss (H→H),约11%
- increasing loss (L→H),12%
- decreasing loss (H→L),26%
- consistent low loss (L→L),51%
各个类型的loss变化如下图(a)

和我们设想的不同,随着训练进行,loss减小的token占比只占全量数据的1/4。L→L和H→H类型的token在训练过程中都呈现强烈的震荡状态。实际上,部分H→L类型的token的loss下降过程也并不平滑。
下图把这些震荡的token用橙色标记出来

发现有相当部分其实可以算是噪音,这和前面分析的一致:存在token粒度脏数据,会影响训练。
那么基于上面的这些分析和实验:
If we can select the appropriate tokens for the model to focus on during training, we may be able to stabilize the trajectory of the model’s training and enhance its efficiency.
受document-level filtering中使用reference mode的启发,文中提出 token-level data selection的pipeline,也就是Selective Language Modeling (SLM)。
SLM有3个step:

- step 1:在高质量数据集上训练reference
model;这个高质量数据集的分布反映我们想要的下游任务分布
- step 2:用reference model获得将要使用的预训练数据集上的token-level
loss
- step 3:正式的训练中,只使用LM和RM间excess loss较大的token进行学习
RM模型的训练使用标准的cross-entropy loss。训练好的RM对预训练数据进行打分,按如下计算:
\[\mathcal{L}_{\mathrm{RM}}(x_i)=-\log
P(x_i|x_{<i})\]
excess loss则是当前训练的模型,和RM之间的打分差:
\[\mathcal{L}_\Delta(x_i)=\mathcal{L}_\theta(x_i)-\mathcal{L}_\mathrm{RM}(x_i)\]
正常的causal模型训练是对所有token的loss取平均训练的:
\[\mathcal{L}_{\mathrm{CLM}}(\theta)=-\frac1N\sum_{i=1}^N\log P(x_i|x_{<i};\theta)\]
SLM的训练则是基于excess loss,只选择每个训练batch中,excess loss处于top k%(token selection ratio)的token进行训练:
\[\mathcal{L}_{\mathrm{SLM}}(\theta)=-\frac1{N*k\%}\sum_{i=1}^NI_{k\%}(x_i)\cdot\log P(x_i|x_{<i};\theta)\]
\[\begin{aligned}&I_{k\%}(x_i)=\begin{cases}1&\text{if }x_i\text{ ranks in the top }k\%\text{ by }\mathcal{L}_\Delta(x_i)\\0&\text{otherwise}\end{cases}\end{aligned}\]
实验
设置
在数学领域和通用领域进行继续预训练,实验SLM的效果。
1、RM Training
- mathematical
RM:使用0.5B的高质量数学数据,这些数据包括来自GPT-4的生成数据和人工处理获得的数据(《Metamath:
Bootstrap your own mathematical questions for large language
models》,《Key-pointdriven data synthesis with its enhancement on
mathematical reasoning》;《Mammoth: Building math generalist models
through hybrid instruction tuning》,《Exploring the mystery of
influential data for mathematical reasoning》)
- general RM:使用1.9B开源训练数据
- 训练3个epoch
- 1B模型和7B模型的lr分别是5e-5和1e-5
- cosine decay schedule
- 1B模型和7B模型的max length分别为2048和4096
- RM模型和继续预训练的模型使用相同的初始化
2、Pretraining Corpus
在数学领域,使用包含14B token的OpenWebMath (OWM) 数据集;而在通用领域,则是把SlimPajama、StarCoderData和OpenWebMath按6:3:1混合得到80B的训练数据集。
3、Pretraining Setting
数学领域:
- 基于Tinyllama-1.1B和Mistral-7B继续预训练
- lr分别为8e-5和2e-5
- batch size = 1M
通用领域:
- 基于Tinyllama-1.1B继续预训练
- lr = 1e-4
- batch size = 1M
token selection ratio:
- Tinyllama-1.1B:60%
- Mistral-7B:70%
4、Baseline Setting
和SLM作为对比,分别用同样的数据进行常规的继续预训练,作为baseline:
- Tinyllama-CT
- Mistral-CT
还有其他一些效果比较好的同规模预训练模型,包括Gemma、Qwen1.5、Phi-1.5 、DeepSeekLLM、DeepSeekMath、CodeLlama、Mistral、Minerva、Tinyllama、 InternLM2-Math和LLemma等。还有几个SFT模型:MAmmoTH和ToRA。
效果对比
各个预训练模型在Few-shot CoT reasoning的效果如下:

RHO-1-Math-1B相比Tinyllama-CT有16.5%的提升,而7B模型则有10.4%的提升。1B模型在训练多几个epoch之后还能进一步提升。
而相比其他业界知名的模型,RHO-1基本上也能达到同一水准,但是训练所用的数据量相比这些模型则减少许多。
Tool-Integrated Reasoning的效果也做了对比:

相比预训练,SFT后RHO-1的收益没有那么大,但还是有提升。
而在通用数据上训练的模型,在各个benchmark的对比如下:

也都有稳定的提升,其中代码和数学类提升最大。
Self-Reference
前面的实验有一个前提,就是RM模型是用和下游任务比较分布相关的数据训练的。那么如果没有和下游任务分布相关的数据,是否还可以使用SLM来获得提升呢?
论文认为RM模型打分的关键并不是和下游任务的分布对齐,而是要把noisy数据过滤掉,因此尝试用两个不同的scoring function来打分:一个就是上面用的reference loss score function(\(\mathcal{L}_\Delta(x_i)\)),另一个是information entropy score function:
\[\mathcal{H}_{\mathbf{RM}}(x_i)=-\sum_{k=1}^VP(t_k|x_{<i})\log P(t_k|x_{<i})\]
V是词表大小。
如果一个token的information entropy score越大,那么说明在这个context下它的不确定性越大。
不使用下游任务分布相关的数据,而仅用预训练数据,采用不同的score function,用SLM方法训练,结果如下:

无论用哪个score function,仅用预训练数据训练RM也可以获得提升。如果选择使用reference loss score function和information entropy score function的交集token进行训练,效果更好。
其他
1、Token Select Ratio
在1B模型上实验不同的token select ratio:

结果表明在60%~70%的效果最好。
2、训练了什么token
RM模型在一段文本上选择的token如下:

而在训练过程中选择的token有什么变化呢?4个checkpoint,分别是训练0%、33%、66%和100%时,这4个阶段在同一段文本下,选择用于训练的token如下,token选择的preference从高到低分别用深蓝、浅蓝、黑色橙色和深橙色标记出来:

小结
仅选择重要度高的token进行训练,在成本上来说比较高,可以尝试用于预训练的第二甚至第三阶段。
Reuse, Don’t Retrain: A Recipe for Continued Pretraining of Language Models
时间:2024年7月
TL;DR
一套针对general abilities的LLM继续预训练的指南,包括数据分布的设计,和lr schedule的设置。在一个15B(先经过8T数据的预训练)验证,在下游benchmark平均有9%的提升。实验结果适用于100B~1T数据量的继续训练。
以往的一些工作主要是垂域的:
- 《Simple and scalable strategies to continually pre-train large
language models》
- 《 Investigating continual pretraining in large language models:
Insights and implications》
- 《Continual pre-training of language models》
- 《Towards continual knowledge learning of language models》
实验设置
预训练
现在的模型很多都在万亿(1T)/十万亿(10T)级数据量上训练。为了得到一个使用可靠的效果,论文先用一个15B参数模型,在8T的数据上进行实验。8T的预训练数据分布如下:

继续预训练
在实际场景中,我们通常没有太多的新数据用于继续预训练,因此继续预训练绝大部分所用数据就是来自上面的8T数据集。在这个基础上,加入了2.8B的QA数据集。
QA数据有助于模型更好地抽取已经学到的知识(《Physics of language models: Part 3.1, knowledge storage and extraction》)。
QA数据集的分布如下:

模型
- 15B参数:3.2B embedding参数,12.5B非 embedding参数
- 32层
- hidden size = 6144
- 48个注意力头
- RoPE
- quared ReLU activations
- vocabulary size = 256k
- no bias terms
- tied embedding weight
- GQA,8个KV头
- pretrain sequence length = 4096
- 在训练的前5%token,batch size逐渐从384增大到1152
- cosine learning rate schedule
- warmup = 16B token
- lr = 4.5e-4 --> 4.5e-5
- AdamW,beta_1 = 0.9,beta_2 = 0.95,weight decay = 0.1
在继续预训练中,只有lr会改变,其他都不变。
评测
评测数据集包括:
- MMLU
- Hellaswag
- MGSM(Multilingual Grade School
Mathematics):用于多语言评估,具体报告西班牙语、日语和泰语这三种分别代表高、中、低资源语言的子集的平均准确率。
- HumanEval的 Python 代码生成任务:在 pass@1
设置下评估模型的编码能力。
继续预训练Recipe
1、先在原预训练数据分布的基础上,提升高质量数据的比重进行训练,之后再切换到包含QA数据的数据集
2、lr从预训练阶段的min_lr开始,按cosine annealing decay到min_lr / 100
3、数据分布的切换要在min_lr / 5的时候进行
实验
这里提到一点:发现在继续预训练时,是否加载预训练阶段的optimizer参数影响并不大。
预训练模型在评测数据集上的平均accuracy为48.9。
数据分布
1、QA数据
如果把想要学习的新知识放在继续预训练的前面,模型会更容易学到(lr更大),但是同时也可能因此带来训练的不稳定性。为此使用了三种数据进行实验:
- 纯使用预训练数据
- 纯使用QA数据
- 先使用预训练数据,然后混入10%的QA数据
三种策略的效果如下:

使用第三种策略效果有比较大的提升。
2、general blend实验
把initial blend称之为general blend(GB),把后面包含QA的数据分布成为QA blend(QB)。那么GB用什么分布最好呢?
假设最优的GB是注重高质量数据和模型薄弱的领域的数据,且不会大幅偏离预训练分布。实验不同GB分布下的效果:
- Reweight Domains:对预训练数据中的不同领域进行重新加权。
- Pretraining w/ High Quality Web:在预训练数据中使用高质量的 Web
数据。
- No Web:去除预训练数据中的 Web 数据。
- Upweight Non Web w/ High Quality Web:提高非 Web
数据的权重,并使用高质量的 Web 数据。
每种分布都训练300B数据,然后对比效果:

Upweight Non Web with High Quality虽然没有达到最高平均准确率,但在所有任务中最稳定地取得了较高分数,因此被选为后续实验的 GB。

3、QA blend实验
使用三种QA分布:

在训练250B的GB数据后,进行QB的训练:

同时强调STEM和Chat数据的分布效果最好。
最终的训练方案是,先训练权重修改后的GB数据,然后把QB数据混合到GB数据中。
lr schedule
对比3个lr的decay设置,结果是decay到1%的继续预训练的lr时是最好的:

切换分布的时间
从GB切换到QB分布,应该在什么时候进行?结果如下:

可以看到切换的时间点选择对结果的影响还是比较大的。
小结
算是一次实验记录,不过不是很够完善,解释得也不够清楚。可以作为实验参考吧。
博客:http://www.linsight.cn/
知乎:Linsight
微信公众号:Linsight
【推荐文章】
- MoE:
MoE模型的前世今生
DeepSeek-V2和MLA
昆仑万维-SkyworkMoE
成本10w刀的JetMoE
MoE的top-p
routing
对MoE模型的一些观察
从dense到MoE -- sparse
upcycling
MoE路由--expert choice
routing
- 端侧模型:
苹果智能系统模型--AFM
MiniCPM
适合移动设备的语言模型--MobileLLM
phi系列模型
Gemma2
苹果的OpenELM
bilibili的index-1.9B
- 预训练:
长文详解--LLM高效预训练(一)
Llama3.1--预训练要点一览
Qwen2技术报告
Yi技术报告-划重点看细节
InternLM系列模型
GLM4报告的一些技术点
从Yuan2.0到Yuan2.0-M32
从loss视角理解大模型涌现能力
- 数据:
预训练数据处理--长度分解
- 长上下文:
LLM长上下文的问题
解锁大模型长上下文能力
大模型推理窗口-从有限到无限大
- 推理加速:
大模型推理加速-投机解码
大模型推理加速-MEDUSA
- 对齐:
Llama3.1--post-training要点一览
模型平均 -- model
soup
大模型偏好对齐-DPO
大模型偏好对齐-ODPO
大模型偏好对齐-simPO
大模型偏好对齐-IPO
- Transformer:
理解Attention:从起源到MHA,MQA和GQA
LLM的重复生成和ICL
transformer中normalization的二三事
从代码实现看normalization-到底做了什么
稀疏注意力计算:sliding
window attention
理解LLM位置编码:RoPE
RoPE的远距离衰减
- 项目应用:
一个模型支持智能助手系统
- 大模型算法题:
(1)、 (2)、 (3)、 (4)、 (5)、 (6)、 (7)、 (8)、 (9)
Reference
【1】Code-Based English Models Surprising Performance on Chinese QA
Pair Extraction Task https://arxiv.org/abs/2401.10286
【2】RHO-1: Not All Tokens Are What You Need
https://arxiv.org/abs/2404.07965
【3】Reuse, Don’t Retrain: A Recipe for Continued Pretraining of
Language Models https://arxiv.org/abs/2407.07263