完成数据预处理之后,需要设计合适的调度策略来安排这些多来源的数据,进而用于训练大语言模型。通常来说,数据调度(Data Scheduling)主要关注两个方面:各个数据源的混合比例以及各数据源用于训练的顺序(称为 数据课程,Data Curriculum)。具体的数据调度示意图可以参考下图。
由于不同数据源与大语言模型某些特定能力的学习具有紧密的联系,因此设置合适的数据混合比例非常重要。数据混合通常在数据集合层面上设置(即整个预训练数据的整体分布),也可以在不同训练阶段采用不同的混合数据比例。在预训练期间,将根据混合比例从不同数据源中采样数据:数据源的权重越大,从中选择的数据就越多。进一步,可能会对每个数据源的全部数据进行上采样或下采样,以创建特定的数据混合集合作为预训练数据。
上图展示了目前一些代表性的大语言模型的数据混合配比情况。作为其中 的一个代表性模型,LLaMA 的预训练数据主要包括超过 80% 的网页数据、来自 GitHub 和 StackExchange 的 6.5% 代码密集型数据、4.5% 的书籍数据,以及来自 arXiv 的 2.5% 科学数据,这个数据配比成为了训练大语言模型的一个重要参考。根据这个比例,网页数据在现有预训练数据占据了较大的比重,为大语言模型提供了丰富的世界知识。此外,也可以为实现不同的目的来设计特定的数据混合配比。例如,专业的代码模型 CodeGen 大幅增加了代码数据的比例。值得注意的是,即使是在这样的专业模型中,依然需要混合一定的网页数据来提供或者保留通用的语义知识。
在实践中,数据混合通常是根据经验确定的,下面汇总了几种常见的数据混合策略。增加数据源的多样性,为了提升大语言模型的整体能力,增加数据源异质性(即包括多样化的数据源)能够有助于改进大语言模型在下游任务中的综合表现。进一步,为了研究不同数据源的影响,一些研究工作构建了消融实验,通过逐一移除每个数据源并用其余数据源对大语言模型进行预训练进行效果评估。因此,在收集预训练数据时,需要注意引入数据多样性更高的数据源,如包含网页数据、各类型书籍、代码数据等。
优化数据混合,除了手动设置数据混合配比外,还可以使用可学习的方法来优化数据组成,以改善模型的预训练效果。例如,可以根据目标下游任务来选择特征空间相似的预训练数据,或对下游任务性能可以产生正面影响的数据。为了减少对于目标任务的依赖,DoReMi首先使用给定的初始领域权重训练一个小型参考模型,然后在每次迭代过程中,使用当前的领域权重计算得到数据比例,用其训练另一个小型代理模型。然后通过比较两个模型损失值的差距,对该域数据的采样权重进行优化。具体来说,对于代理模型“未较好习得的”数据域,所分配的域权重将会被增加。最后,通过多轮迭代,代理模型最终的域权重将被应用于大语言模型训练。此外,一个更为简单的实践方法是,训练几个具有不同数据混合配比的小型语言模型,并选择获得最理想性能的数据混合配比。然而,这个方法的一个假设是,如果以类似的方式训练,小模型会在模型能力或行为上与大模型相似,这在实际中可能并不总是成立。
优化特定能力,大语言模型的模型能力在很大程度上取决于数据选择和配 比,可以通过增加特定数据源的比例来增强某些对应的模型能力。例如,可以通过使用更多的数学文本和代码数据来增强大语言模型的数学推理和编程能力,而增加书籍数据的比例可以提高模型捕捉文本长程依赖关系的能力。为了增强大语言模型的特定能力(如数学和编码),或开发专用的大语言模型,一种常见的方法是采用多阶段训练方法,例如可以在连续两个阶段分别安排通用数据和任务特定数据。这种在多个阶段使用不同来源或比例的数据的训练方法也被称为“数据课程”。
除了设置有效的数据混合配比外,在训练过程中对于预训练数据的顺序进行合适的安排也比较重要。具体来说,数据课程是指按照特定的顺序安排预训练数据进行模型的训练。例如,从简单/通用的数据开始,逐渐引入更具挑战性/专业化的数据。更广泛地说,它可以指训练期间在不同阶段使用不同的数据源混合配比。为了设定合适的数据课程,一种实用方法是基于专门构建的评测基准监控大语言模型的关键能力的学习过程,然后在预训练期间动态调整数据的混合配比。
由于预训练阶段需要耗费大量的计算资源,目前针对数据课程的研究工作主要集中在继续预训练(Continual Pre-training)这一方面。如专业化的编程大语言模型(例如 CodeLLaMA)或具有长上下文建模能力的大语言模型(例如LongLLaMA)。相关研究表明,为了学习某些特定的技能,按照技能依赖顺序编排对应数据集的学习方法(例如,基本技能 → 目标技能)比直接在相关的特定语料库上学习效果更好。与机器学习中的课程学习方法相似,数据课程的思想已经被广泛应用于模型预训练。下面将以三种常见能力为例,介绍具体的数据课程在继续预训练中的应用。
代码能力,为了提高大语言模型的代码生成能力,研究人员基于 LLaMA开发了 CodeLLaMA,能够更为有效地执行代码任务。采用的数据为:2T 通用词元 → 500B 代码密集型词元。这里,使用符号“→”来表示数据课程中的数据顺序,指的是大语言模型首先用 2T 网页数据词元进行训练,随后用 500B 代码数据词元训练。CodeLLaMA 还提供了一个面向 Python 语言的特定代码大模型,即 CodeLLaMA-Python,采用了如下的数据训练课程:2T 通用词元 → 500B 代码相关的词元 → 100B Python 代码相关的词元。
数学能力,Llemma 是一个具有代表性的数学大语言模型,有效提升了通用大语言模型的数学能力。它选择 CodeLLaMA 作为基座模型,进一步在包含科学论文、数学和代码的混合数据集合上进行继续预训练。虽然 CodeLLaMA 主要关注编程能力,但是实验表明它在数学基准测试上的表现优于其基础模型LLaMA-2。整体的数据课程为:2T 通用词元 → 500B 代码相关的词元 →50∼200B 数学相关的词元。值得注意的是,Llemma 的继续预训练数据中还包含5%的通用领域数据,这可以看做一种模型能力的“正则化”技术,加强对于原始基座模型通用能力的保持。
长文本能力,长文本理解与生成是大语言模型的一项重要能力。很多研究工作通过继续预训练有效扩展了大语言模型的上下文窗口,主要是针对RoPE 中的位置嵌入编码进行修改。例如,CodeLLaMA 将 LLaMA-2的上下文窗口从 4K 扩展到了 100K,所采用的数据课程为:2.5T 词元,4K 上下文窗口 → 20B 词元,16K 上下文窗口。通过使用这种训练序列长度由短到长的数据课程,能够使模型获得较好的长文本建模能力,同时可以节省长文本模型的训练时间。
数据收集,建议在预训练数据中尽量包含较为多样化的数据来源。除了大规模网页数据外,还可以融入多样化的高质量文本,如代码、书籍、科学论文等。如果希望优化大语言模型的某种特定能力,还可以相应地调整对应数据来源的比例。例如,代码数据可以优化模型的长文本和推理能力;而书籍数据可以增强模型的写作和文学表达能力。除此以外,在特定的应用场景,如 AI4Science,我们可能还需要专门收集与自然科学相关的数据集合。在 YuLan 模型的训练过程中,我们首先收集了大量的来自于网页(Common Crawl)和书籍(Books3 和 Gutenberg)的通用预训练语料;为了增加数据的多样性,也同时收集了如知乎、维基百科等高质量知识密集型语料。在训练后期,为了增加特定任务的能力,还引入了如数学(Proof-Pile)、代码(GitHub)等专用文本数据。
数据清洗,收集好数据后,需要针对原始数据进行精细的数据清洗,这个过程对于提升模型能力是非常重要的。除了进行通用的数据质量过滤以外,还可能需要针对具体的数据特点和应用场景设计专门的清洗规则。例如,对于网页数据需要过滤掉 HTML 标签,仅保留网页文本内容。YuLan 模型的训练针对收集到的数据进行了全面细致的清洗,整个预处理流程涵盖了质量过滤、去重、隐私去除以及词元化等多个关键环节。在质量过滤阶段,首先采用启发式方法进行了文档级别的低质量及有害数据过滤。随后,进行句子级别的过滤,包括对无意义重复句子的删除,以及隐私数据的去除。得到经历过文档级和句子级过滤的数据后,去重阶段采用了高效的 MinHash 算法,在多个数据源之间识别并去除重复数据。数据清洗之后,我们在 LLaMA 的词表基础上加入了在中文预训练数据上得到的 BPE词元,构成了整个 YuLan 模型的词表(词表大小为 51,200),用于对预训练数据进行词元化。
数据调度,当完成数据预处理之后,接下来还需要确定训练大语言模型的数据混合配比以及数据训练顺序。本质上来说,这个过程是在探索数据来源与模型能力之间的潜在关系。为了确定这两种关键策略,一种较为实用的方法是首先使用多个候选策略训练多个小型语言模型,然后从中选择一个最优的训练策略。YuLan 模型的训练也采用这种小模型的代理方法,主要针对不同类型数据(如网页、书籍、代码等)和中英文数据的混合配比进行了测试。为此,我们预训练一个1.3B 的小模型,首先对语言配比进行确定,然后确定不同数据类型配比。具体来说,每次训练时,从各个数据集按照不同配比采样得到 50B 数据,然后从头开始对 1.3B 模型进行预训练,并根据在诸多下游任务的测试效果最终确定中英文语料比例为 1:8。然后,维持该比例不变,并选择 LLaMA 的数据比例作为基础,在其基础上使用控制变量法,每次仅调整某一类型数据的比例进行实验,依旧通过下游任务效果来决定是否采用该新数据比例,进而获得整体的数据混合配比。然而,在训练过程中,YuLan 各项能力出现了不一致的增长速率,例如文本生成能力迅速提升但数学推理能力长期并未出现较好的增长。针对这一问题,我们进一步根据各项能力的测试结果对于数据混合比例进行了手动调整。最终,YuLan 的预训练阶段共使用了 1,680B 词元,其中包括 1,380B 英文数据,280B 中文数据,以及20B 的多语数据。下表展示了 YuLan 模型整个预训练过程中不同类型数据的配比。