70B大模型训练秘方③:1000次超参数优化实验的发现
今年6月,大模型公司Imbue依托它们自主构建的基础设施,从零起步,成功训练出一个70B参数的模型,其在相关推理任务上的卓越表现远零样本GPT-4o。在《70B大模型训练秘方① :数据集创建与评估》一文中,他们分享了用于模型评估的数据集,包含11个公共数据集的高质量子集,以及一套用于代码理解的原始问题。重点分享了为什么选择这些特定的数据集,以及数据创建过程和实际数据集的详细信息。在《从裸机到70B
今年6月,大模型公司Imbue依托它们自主构建的基础设施,从零起步,成功训练出一个70B参数的模型,其在相关推理任务上的卓越表现远零样本GPT-4o。
在《70B大模型训练秘方① :数据集创建与评估》一文中,他们分享了用于模型评估的数据集,包含11个公共数据集的高质量子集,以及一套用于代码理解的原始问题。重点分享了为什么选择这些特定的数据集,以及数据创建过程和实际数据集的详细信息。
在《从裸机到70B大模型②:基础设施设置与脚本》一文中,他们分享了一套适用于搭建所需基础设施的端到端指南:从搭建初始集群、安装操作系统,直至训练过程中实现错误的自动纠正。此外,他们还分享了为确保主机健康而自主开发的大量基础设施脚本。
本文是Imbue团队训练70B大模型三部曲系列的第三篇。通过使用他们提出的超参数优化器CARBS,他们在首次尝试时将该系统规模扩展到70B参数,同时保持训练过程中的最小不稳定性,且并未出现损失激增的情况,而这对小型团队尝试新型模型架构来说是一个巨大的风险来源。
(本文由OneFlow编译发布,转载请联系授权。原文:https://imbue.com/research/70b-carbs/)
来源 | Imbue团队
翻译|张雪聃、林心宇、刘乾裕
OneFlow编译
题图由SiliconCloud平台生成
1
引言
今天,我们正式发布了一款高效的超参数优化器——CARBS(https://github.com/imbue-ai/carbs),这款优化器能够帮助研究者更便捷地将小规模实验扩展至大规模模型。
为训练一个70B参数的语言模型,我们在较小规模的模型上进行了大量实验。这些实验有两个目标:一是为大规模模型的训练选择最佳超参数,二是预测大规模模型的性能表现。
小规模实验中存在一个主要挑战:由于训练过程中噪音以及语言模型的复杂性,我们难以在小规模模型的基准测试结果上得出对大规模模型仍具参考意义的结论。由此,我们开发了一种敏感度较高(即便模型参数小于 300M 也能产生有意义的结果)且可重复(相同训练流程能够得到相同结果)的评估指标。
之后,我们用这个指标结合CARBS(具备成本感知的超参数调优算法),在小规模实验中针对数十个超参数进行了上千次实验调优。尽管部分超参数(例如数据混合比例)在从小规模实验扩展到大规模模型时可以保持不变,但对于其他超参数(例如学习率、注意力头数量或多层感知机(MLP)宽度)则不适用。由于CARBS可以为不同成本生成最优值,我们能够基于Pareto集中观测结果来推断在扩展训练规模时每个超参数的调整方式。由此,我们可以准确预测最终模型的性能表现。
2
评估指标的开发
自Transformers问世以来,预训练语言模型的评估方式经历了显著变化。BERT主要通过单独微调预训练模型以应对不同的文本分类任务进行评估;GPT-2则主要使用不同数据集上的困惑度来进行衡量;而GPT-3展示了较大模型可以通过零样本或少样本提示在上下文中完成许多分类任务,从而无需额外微调。这些上下文学习(ICL)基准测试至今仍然流行,用于评估预训练模型的性能。然而,在使用监督微调和强化学习(RL)方法,在与闭源模型进行比较时,情况变得有些复杂。此外,还有一种评估大语言模型的新选项:使用Elo排名(由人类或大语言模型作为评审员)来对语言模型生成的文本进行评价。我们将讨论自己在使用这些不同评估指标评估小规模和大规模模型时的实践经验。
ICL评估:补全与多选
首先,我们考虑了无需微调即可进行的评估方式。
由于语言模型被训练用于预测下一个词,因此可以采用类似LAMBADA的任务来评估语言模型是否能够准确预测某个段落的下一个单词。LAMBADA选取的段落能够让人类评估者轻松推断出最后一个词。
(LAMBADA的单词补全任务。语言模型在给定上下文(左侧)后使用下一词的概率来判断模型是否做出了正确的预测)
虽然单词预测是一种检验语言模型基本能力的好方法,但它无法捕捉我们期望语言模型所具备的许多其他能力。比如,如果我们希望语言模型能够很好地补全句子,而不仅仅是预测下一个单词,那么可以采用HellaSwag(https://arxiv.org/abs/1905.07830) 数据集,该数据集要求语言模型在四个选项中找到最合适的句子结尾。可以将各词的概率相乘来比较每个句子的概率,以判断模型的选择。
(HellaSwag的多词元补全任务。语言模型通过将每个词元的概率相乘来判断句子整体概率,并以此判断模型是否选择了正确的答案)
然而,这种方法可能会受到一些噪音和偏差的影响。如果“正确”的生成结果中有一个单词被语言模型认为概率很低,那么该生成结果的得分就会降低,尽管类似且语法正确的补全可能会被认为是高概率的。此外,较长的生成结果会因为需要选择更多的单词而受到惩罚,得分也会更低。对答案长度进行归一化以调整完成概率是一种常见解决方案,但并未解决其中的根本性挑战。
根本问题在于语言模型无法看到四个备选句子,也无法在这些句子间有效地表达概率。解决该问题的一种方法是将数据集转换成多选题的形式,即将“补全”转化为答案的字母(例如,A、B、C或D)。
(多选题形式下的HellaSwag。此时,补全仅为单一词元,因此模型能够更合理地表达其概率)
由于答案的字母位于所有补全之后,模型可以基于完整的上下文来分配答案字母的概率。但可惜的是,由于这种格式并不符合典型的训练数据格式,即便是较大规模模型的表现也不太理想。
ICL评估与微调
我们发现,使用多选题的形式能够为语言模型提供所有必要的上下文,使其能够通过简单的下一个词预测来回答复杂问题。然而,我们也发现,无论是小模型还是大模型,它们对所有可能的正确答案(有效答案)的预测概率都很低。(如图中“A/B/C/D”的概率分布所示)。当被迫在候选答案间做选择时,小模型对第一个答案“A”有非常强的偏好(见图中“A 选项比例”)。我们认为这可能与提示词设置或“A”是一个完整单词而“B”不是有关,但即便在我们随机化字母顺序并加入少样本提示后,这一现象依然存在。
(RACE数据集上Llama 2 7B和70B模型在微调前后的对比)
我们尝试了许多其他技术,包括将字母随机化、添加诸如 “[answer] A [/answer]” 之类的标签,以及使用逐点互信息校正(https://arxiv.org/pdf/2104.08315),但也未能找到一种能在70亿参数模型规模下给我们提供强烈信号的度量标准。
因此,未经微调时,我们所测试的Llama 2 7B模型的性能与随机网络基本相同。查看交叉熵结果可知,其表现较差,远不及随机性能(四个选项时随机性能为1.2),且较大模型的表现劣于较小模型。
我们意识到,为了对预训练语言模型进行评估,我们需要对其进行微调。我们尝试了在单个评估数据集以及将所有数据集放在一起进行微调,发现性能非常相似(见下表)。
这使我们得以深入探究语言模型的能力。答案仅在各答案选项之间均匀分布,而不会涉及其他词元,因此我们能够信任模型输出的概率。针对评估数据集进行微调所获取的内容远超表面形式;相比之下,在包含极其简单问题和答案的虚拟数据集上进行微调,其效果则差得多。
答案的交叉熵、准确率与困惑度
当我们从小型语言模型中获取到一致的结果后,便开始思考如何报告和汇总这些结果。虽然准确率更易于解释,但是正确答案词元的交叉熵也许能更早地反映出在难题上的学习情况(https://arxiv.org/abs/2304.15004)。
如果我们正在使用正确答案交叉熵,那为何不在相关文档集上直接使用困惑度(perplexity)呢?我们之前提到过一个原因,那就是当文档包含一些单词选项,而模型对这些选项赋予的概率较低时,困惑度可能会出现较大波动。而且,在整个文档上计算困惑度,并不能捕捉到我们通过评估任务想要测试的知识。最后,困惑度的度量结果最终会与分词方式的选择相关联,而我们是希望对分词方式进行单独评估的。
为何不进行生成式评估?
我们最终想要构建的语言模型不应仅仅局限于回答多项选择题。那我们为何没有对模型生成结果进行评估呢?这里的模型生成结果既包括通过思维链(CoT)提示来回答问题的结果,也涵盖通过大型语言模型评判器得到的结果。一方面,参数量小于10亿的模型在生成任务方面往往表现欠佳,所以要判断哪个糟糕输出结果更好实在具有挑战性。
更为重要的是,我们认为,用于改进输出结果的微调过程与预训练过程是相互独立的。如果预训练模型的特性更为优越,那么经过微调和人类反馈强化学习(RLHF)之后的生成结果会更理想。这种针对单一词元的微调能够更直接地探究预训练模型的特性,而生成式评估由于在模型之上进行微调和强化学习(RL)的特性,会带有大量的噪声。
数据集与权重
我们依据数据集规模、质量以及与推理和编码任务的相关性等标准,对47个不同的评估数据集进行了考量。我们所选用的评估数据集(包含权重与数据集规模)如下所示。我们从每个数据集中预留1000个数据用于验证,1000个用于测试集,其余的数据用于微调。
以下是有关相关数据集的一些说明:
- 代码理解(CodeComprehension):我们创建了一个大型的关于Python代码生成相关问题的数据集,该数据集混合了代码评估和完形填空式(cloze-style)任务。由于它是我们的衡量指标中唯一与编码相关的数据集,所以它的权重被大幅提高。我们将在Hugging Face平台上发布该数据集。
- GSM8K。该数据集不含多项选择选项,所以其评估对我们而言是个挑战。为生成错误但看似合理的答案,我们构建了一个处理流程,对所运用的数学运算进行变换,并且改变原始问题中用于运算的数字。请注意,我们在求解这个数据集时进行了微调与评估,并未使用任何思维链,这就使其成为目前我们评估指标里最具挑战性的数据集。
- ARC:我们发现这些问题与我们最感兴趣的问题相似,因此相应地提高了它的权重。我们只纳入了美国学术研究竞赛挑战(ARC Challenge)数据集。
- WinoGrande、HellaSwag和BoolQ:我们发现这些公开数据集的质量较低,因此相应地降低了它们的权重。
- MMLU:我们没有选用这个数据集,因为我们发现在我们的设定下,这些问题对于较小的模型来说太难解决了。
创建专用的预留数据集
我们将上述指标用于所有的验证集。我们还做了大量工作来创建干净、高质量的测试集,相关内容我们在此处进行阐述。
3
使用CARBS来调优和扩展大型语言模型
我们开发了CARBS(https://arxiv.org/pdf/2306.08055),借此在扩展深度学习模型的同时对超参数进行调整。CARBS是一种具备成本感知的局部贝叶斯搜索算法。其原理是:随着模型数据量与参数数量的增加,最优超参数通常会平滑变动。这让我们得以开展众多低成本实验,这些实验能够直接预测高成本实验中的最优超参数值。我们之前写过一篇深入的博客文章(https://imbue.com/research/carbs/)来讲解CARBS的工作原理。在此,我们将回顾在较小规模(参数为3亿-30亿的模型)下开展的部分CARBS实验,然后展示在扩展模型时我们是如何精确预测性能的。
调整数据组合
我们最初的研究与预训练的最优数据组合有关。我们对11个不同数据集的权重进行了调整,同时也对我们的Common Crawl数据的三个过滤参数进行了调整:一个困惑度(perplexity)过滤器、一个垃圾邮件过滤器以及一个综合质量过滤器。困惑度过滤器基于KenLM语言模型。垃圾邮件过滤器和综合质量过滤器使用基于在源分布的标记文档上训练的二元fastText分类器的分数,来回答 “这个文档是垃圾邮件吗?” 以及 “这个文档包含连贯的正文吗?” 这样的问题。因为我们想要准确了解当我们在大规模数据受限的情况下数据组合和过滤器的表现,所以我们根据模型大小对每个数据集进行了截断。因此,一个具有N十亿参数的模型将只能看到N/100的训练样本。
我们还为模型使用了三个扩展参数:头(heads)的数量、层(layers)的数量和多层感知机(MLP)的隐藏维度。我们把头(head)的维度固定为128,并为数据设置了一个参数:用于训练的词元数量。我们还对预训练和微调学习率以及训练批次大小(batch size)进行了调整,总共21个调优参数。
每个实验的规模都小到足以在单个节点上进行训练,这样我们就能并行开展80个实验。为了模拟将更大规模的实验扩展到更多节点这一过程,我们添加了若干与模型大小成比例的梯度累积步骤。下图中的黑色曲线表示生成的帕累托前沿(pareto front),黑色勾勒出帕累托有效点。每个点的颜色代表CARBS运行各实验的顺序:从紫色开始,渐变为洋红色,以黄色表示最近进行的实验。
预训练各种模型后,使用CARBS选择的超参数得到最小验证交叉熵。每个点代表一个预训练实验,共进行了超过1400次实验。带有黑色边框的点位于帕累托前沿。较浅颜色的点是在训练后期由CARBS收集的。帕累托前沿展示了模型的一致性扩展。
每个数据参数的结果如下所示。在这些图表中,每个点代表一个实验,纵轴(y轴)表示一个搜索变量,横轴(x轴)表示实验运行所花费的时间。点的颜色表示在我们的评估集上微调后的交叉熵。帕累托(Pareto)点集再次用黑色勾勒出来。一条黑色虚线拟合到帕累托点集上。彩色线条表示根据潜在的高斯过程模型得出的性能恒定曲线。对于数据集权重而言,该权重是相对于通用爬取(Common Crawl)数据的,所以数值为1表示该数据集的一个轮次(epoch)对应Commen Crawl数据的一个轮次。
由CARBS运行的每种数据混合实验的单独参数图。每个数据点代表一个完整的预训练实验。该点的颜色表示在对实验进行微调后的验证交叉熵。曲线展示了CARBS(在改变y轴所示参数时)所使用的高斯过程模型的预测结果。以黑色勾勒的点位于帕累托前沿(Pareto front)上,黑色虚线是对这些点的线性拟合。
以下是这些实验得出的结论
- 质量和垃圾信息过滤器似乎没什么用处。然而,困惑度过滤器在成本处于范围中间的实验中表现出显著效用。更大规模的消融实验表明,这种过滤器对提高性能并无实际帮助,因此这可能是在调优过程中发现的虚假相关性。
- 非Python代码似乎并未显著提升性能。尽管Python问题在评估中约占40%的权重,Python代码表现仅与Common Crawl数据相当。书籍和维基百科显然是目前为止最有价值的数据来源。令人惊讶的是,非英语版的维基百科与英语版维基百科一样有用,甚至帮助更大。
- 其他结构化、高质量的数据在这一设置下并未表现出显著优势。StackExchange(图中标记为QA的问答数据)、法律和arXiv数据的混合比例略低于Common Crawl。这些数据集可能过于复杂,使得较小模型难以充分利用。
扩展实验
确定数据混合比例后,我们进行了一系列参数固定的实验,重点是扩展到更大规模的模型。实验中,我们根据模型大小成比例地增加了节点数量,以找到能够充分利用整个集群资源的超参数。
由于CARBS通过运行时间来评估不同运行的性能,因此确保集群中各运行的InfiniBand性能一致非常重要。有关我们为确保性能一致性所做工作的详细信息,请参阅我们的另一篇博客文章。
我们总共使用了七个调优参数:三个模型尺寸参数、词元数量、两个学习率和批次大小。由于各运行占用的节点数量不同,我们能够并行运行约30个不同的实验。
预训练各种模型后,通过CARBS选择缩放超参数的最小验证交叉熵。每个点代表一个预训练实验,进行了400多个实验。带有黑色边框的点位于帕累托前沿。较浅颜色的点是在训练后期由CARBS收集的。帕累托前沿展示了模型的一致扩展性。
每个扩展实验的参数图由CARBS运行。每个数据点代表一个完整预训练实验。圆点的颜色表示实验微调后的验证交叉熵。曲线表示CARBS在变化y轴所示参数时使用高斯过程模型的预测。带有黑色边框的圆点位于帕累托前沿,黑色虚线是对这些点的线性拟合。
这些图表展示了一个不寻常的特征:在较大规模(较高成本)下有一组运行出现了损失峰值,导致性能较差。通过查看参数预测,我们可以确定这种性能不佳更有可能归因于模型宽度,而非学习率。
有趣的是,模型收敛到了比通常具有相同参数数量网络更窄、更深的结构。这与之前研究结果一致(https://arxiv.org/abs/2109.10686) ,该研究指出,在相同损失下,窄而深的网络比浅而宽的网络具有更好微调性能。
在扩展实验中,每个参数的词元数及其帕累托集拟合结果以黑色虚线表示。虽然平均值接近Chinchilla的“经验法则”(20个词元/参数),但正斜率暗示,在我们的假设下,大模型可能需要训练更多的参数才能达到计算最优。
另一个有趣的发现是每个参数对应的最优词元数。我们发现,在实验范围内,这一最优值略有增加(见黑色虚线)。需要注意的是,我们的方法与Chinchilla在几个重要方面有所不同:我们明确地将机器数量与模型大小一起扩展,从而改变了批处理规模。我们测量的是微调性能,而非训练损失。尽管我们的数据涵盖了广泛的成本范围,但Chinchilla在更高参数数量的模型上进行了更多的训练(最高达10B参数)。我们认为,这组实验提供了一个较弱的信号,但确实值得进一步研究。
7B-和70B-参数实验
我们的目标是训练一个与Llama 2 70B相同规模的模型。因此,我们设定了70B参数和2T词元的目标。在进行全规模实验的过程中,我们选择先训练一个7B参数的模型,使用200B词元。我们利用上述扩展实验的结果对Llama的部分参数进行了更新,特别是转向了更深更窄的网络结构,并提高了学习率。
当我们把7B模型的性能与CARBS实验中接近帕累托拟合线的实验性能一起绘制,并与训练所用计算量进行对比时,我们发现指数拟合能够准确预测我们训练的70B参数模型的性能表现。
CARBS实验性能与训练时间时间之间的幂律拟合,能够很好地外推到我们最终70B参数运行的性能。
进一步微调
在上述所有实验中,除了学习率外,我们使用了相同的微调参数。我们发现,通过减少批处理规模并再次使用CARBS对微调超参数进行优化,可以将我们的指标性能从0.192提高到0.169。
微调imbue 70B模型时的最小验证交叉熵。每个点代表一个微调实验,黑色点位于帕累托前沿。性能在大约1.5个轮次(epoch)后开始变差。
最优微调配置是使用微调数据进行一个轮次的训练。更多轮次实际上会损害性能:在进行一个轮次微调时,如果总体训练轮次更长,性能会变差。这表明学习率调度(在整个训练过程中使用余弦衰减)对于充分利用微调数据非常重要。
尽管总体性能较差,但微调后的Imbue 70B模型在大多数评估数据集上的性能与Llama 2 70B相当。这主要归因于几个较难的任务(如GSM8K和ARC),这些任务若能在预训练中看到更多特定领域的数据或许会更有益。有关Imbue模型性能与其它模型的详细对比分析,请参阅我们的评估博客。
我们微调后的70B模型的性能基于CARBS指标中使用的各种数据集。
4
总结
训练大规模模型需要做出许多超参数选择,包括数据权重、过滤参数、网络规模参数和学习率调度。为了支持小规模实验,我们开发了一个灵敏的指标,该指标使我们能够在小规模语言模型(参数小于1B)之间进行可靠的比较,同时使用与大规模模型相同的评估指标。这意味着,我们能够开展更多的实验,为大规模训练中即将使用的完全相同的训练数据和评估目标找到最优超参数。
我们将这一指标与成本感知超参数优化器CARBS结合,以预测模型在扩展时最优超参数的变化。在这一过程中,我们发现了一些意外结果,例如每个参数的词元数呈上升趋势,这些结果可能值得进一步研究。从我们的小规模实验进行外推,准确预测了我们70B参数模型的性能。
由于训练现代大型语言模型(LLMs)的高昂成本,研究人员在选择超参数时通常较为保守,倾向于使用之前已确立的数值。通过发布指标和CARBS优化器的详细信息,我们希望其他人能够更充分探索参数空间。我们希望这也能对新型架构的扩展提供帮助,因为在这些架构中,大型模型的可行超参数可能完全未知。
其他人都在看
让超级产品开发者实现“Token自由”
邀请好友体验SiliconCloud,狂送2000万Token/人
邀请越多,Token奖励越多
siliconflow.cn/zh-cn/siliconcloud
更多推荐
所有评论(0)