前言
LongAlign: A Recipe for Long Context Alignment of Large Language Models
这是一个由清华 ChatGLM 团队提出的长上下文指令微调数据、模型训练、评测方案一条龙。主要包括:
- 长文数据集:从九个来源收集长序列,通过 Self-Instruct 用 Claude 2.1 构建的一个长指令遵循数据集,10000条,长度在8k到64k之间,10%中文数据。
- 长文训练:通过 packing 和 sorted batching 策略加速不同长度分布数据的 sft 效率。
- packing:将序列打包到最大长度后再将它们分派到GPU。然而因为包含不同数量序列的 pack 在最终 loss 计算中被赋予了相等的权重,所以损失平均计算存在偏差。为了减轻这种偏差,我们提出了一种损失加权策略,以平衡不同序列对 loss 的贡献。
- sorted batching:排序批处理方法,将长度相似的序列组合在一起,以减少批内空闲时间。
- 训练了三个模型 (rope调整、继续与训练等过程见实验部分):
- ChatGLM3-6B → LongAlign-6B-64k
- Llama-2-7B → LongAlign-7B-64k
- Llama-2-13B → LongAlign-13B-64k
- 长文评测基准:由博士生们标注搞了个 LongBench-Chat 长文基准测试,评估长度为10k-100k的模型能力,包含40个英文任务+10个中文任务。它涵盖了指令遵循能力的多个方面,如推理、编码、摘要和多语言翻译等长上下文。用 GPT-4 标注参考答案,结合一些少样本评分示例给LLM生成的响应打分。
附录里还整了个活,为了测试模型在长文 OOD(Out-Of-Distribution)场景的能力,作者把这篇论文本身送给了模型,“从专业审稿人的角度,指出本文的优点和缺点” 和 “用 Rap 来讲述这篇论文”,作者是懂整活的😂。
Github:https://github.com/THUDM/LongAlign
数据集:https://huggingface.co/datasets/THUDM/LongAlign-10k
论文:https://arxiv.org/abs/2401.18058
介绍
大型语言模型(LLMs)具有大的上下文窗口,有助于完成诸如长文本摘要、长文本和代码问答等任务(Bai et al., 2023a)。现有的构建长上下文LLMs的工作主要集中在上下文扩展上,即位置编码扩展和对长文本的继续预训练(Chen et al., 2023a; Xiong et al., 2023; Peng et al., 2023)。在这项工作中,我们关注长上下文对齐,即通过指令微调LLMs来处理超长Query。然而缺数据、训练效率低、没有一个强大的benchmark,于是有了这篇work。
除了前面简介中的主要工作之外,还有几个有趣发现:
- 数据量和多样性的影响:长指令数据量和多样性显著影响对齐模型处理长上下文的能力,影响最终性能高达30%。
- 长指令数据的好处:长指令数据的数量对长上下文任务的性能有积极影响,同时不会损害模型处理短上下文的能力。
- 训练策略的有效性:采用的打包和排序批处理策略可以加速训练100%以上,而不会牺牲性能。此外,提出的损失加权技术提高了10%长上下文性能。
相关工作
关于长文模型(Long Context Scaling)
当前的长文本扩展方法可以分为两类:
- 在更长序列上进行微调或继续预训练。著名的微调方法位置插值等通常涉及位置编码扩展和对更长序列的持续预训练。
- 不需要微调。采用滑动窗口注意力或邻近标记压缩等技术来处理长文本中的注意力计算中的位置O.O.D.问题。虽然即插即用,但仍然无法与经过微调的方法相匹配。
关于长文数据(LLM Alignment)
- Xiong et al. (2023) 提出了一种通过连接短指令数据生成长指令数据的方法,但他们的数据集和模型权重并未开源。
- 尽管Chen et al. (2023b) 提供了他们的长指令数据集LongAlpaca-12k,并使用LoRA (Hu et al., 2022) 进行了高效的微调,但缺乏对数据和训练方法影响的深入讨论和比较分析。
我们的工作旨在通过调整数据、训练方法,并在广泛的任务上评估对齐模型,找到在全注意力下对长文本进行监督(全参数)微调的最佳解决方案。
LongAlign 详情
一. 数据:长文SFT数据集构建
长指令数据通常涉及长篇的上下文材料,如书籍、百科、论文、长代码,并伴随着需要根据材料进行摘要、推理或计算的任务 Query。在构建过程中,我们首先从9个不同的来源收集长文章和文档,然后我们使用Claude 2.1(Anthropic, 2023)根据给定的长上下文生成任务和答案,如图2所示。
9个来源包括:
- Arxiv(学术论文):开放获取,任何人都可以自由下载。
- Books3(书籍):来自The Pile,目前没有授权下载。
- C4 数据集(各类文章):公开可用的数据集,带有ODC-BY许可。
- CLUECorpus2020(各类中文文章):由Xu等人(2020)从CommonCrawl语料库中提取的中文实例。
- CommonCrawl 语料库(各类文章):公开可用的数据集,任何人都可以自由下载。
- Github(代码库):开放获取,任何人都可以自由下载。
- Stack Exchange(问答网站):可自由下载,采用CC BY-SA许可。
- Wikipedia(百科全书):提供免费访问,采用CC BY-SA许可。
- WuDaoCorpora(各类文章):开放获取的数据集。
为了促进生成任务的多样性,我们将任务类型描述纳入提示中,例如用于总结、信息提取、推理等任务。通过这种方法,我们为10k长文本创建了任务和答案,总共产生了10k个监督数据实例,其中10%是中文。这些数据采样时长度范围从8k到64k,长度用中文字符的更高压缩率的ChatGLM3-6B tokenizer计算出来的。而且对更长的文章进行了上采样(采的比例高一些),以确保长文数据平衡。
用 Claude 构造数据时用的 Prompt(基本都是根据上文提出5个xxx问题):
二. 训练:长文训练策略(打包和排序)
已知 LLM SFT 在训练期间,指令和响应通常被串联形成一个序列 [ x , y ] [x, y] [x,y] ,然后通过自回归语言模型 π π π 处理,以最大化概率 P π ( y ∣ x ) P_{\pi}(y|x) Pπ(y∣<