本文目录
1 LLaMa 2:开源微调的聊天大语言模型
(来自北京华为诺亚方舟实验室)
1.1 背景:大语言模型在端侧部署受限
1.2 网络架构探索:分词器
1.3 网络架构探索:架构调整
1.4 训练策略探索:权重继承
1.5 训练策略探索:多轮训练
1.6 模型 PanGu-π Pro
太长不看版
本文探索的问题是如何为端侧设备设计适合的 "小" 的大语言模型。由于端侧设备算力和显存的限制,迫切需要设计出满足要求且高性能的 "小" 的大语言模型。然而大语言模型的训练本身就很复杂,有许多优化细节在之前鲜有探索。
在本文中,作者基于 1B 参数的 "小" 的大语言模型探索了3点:网络架构、参数初始化和优化策略。得出4点对小模型有帮助的结论,它们分别是:
作者在 1.6T 的多语言语料库上训练了 PanGu-π-1B Pro 和 PanGu-π-1.5B Pro。PanGu-π-1B Pro 相比于 PanGu-π-1B,在基准数据集上产生了 8.87 的平均改进。而 PanGu-π-1.5B Pro 更是超越了一系列更大的模型,验证了其卓越的性能,比如性能优于 Qwen1.8B[1],参数减少了 16.67%。
本文得出了哪些结论
1) 网络架构:
直接使用大模型的分词器 (tokenizer) 会引入冗余参数,导致计算开销增加。通过去除低频词汇表来简化分词器可以提高模型的效率。
模型架构的配置 (比如模型深度、宽度,以及 FFN 中的和扩展率) 对最终性能有显着影响。深度是影响小型语言模型性能的主要因素,更深的模型通常以更低的推理速度实现更高的性能。
2) 参数继承:
从大模型中继承参数有助于提高性能和加快收敛速度。而且,参数也有重要性,比如作者观察到模型开始和结束附近的层通常比中间的层更重要。而且,在每一层中,采用数据驱动的,可学习的方式的效果更好。
3) 模型优化:
与较大的模型相比,更小的模型会面临更为严重的数据遗忘问题。多轮训练技术是一个被证明了有利于记忆增强的方案。本文作者提出了一种样本选择策略来减轻与多轮训练的成本。此外,还研究了小模型 Batch size 与学习率的关系。
使用以上所有改进,本文最终训练出 PanGu-π-1B Pro 和 PanGu-π-1.5B Pro 两个 "小" 的大语言模型,中间结果如下图1所示。作者在各种基准上进行评估,包括检查,知识,推理和理解,PanGu-π-1.5B Pro 的平均得分为 56.49,优于 Qwen-1.8B,得分为 55.04。
图1:PanGu-π Pro 的探索过程的结果。PanGu-π-1B Pro 相比于 PanGu-π-1B,在基准数据集上产生了 8.87 的平均改进,PanGu-π-1.5B Pro 的性能优于 Qwen1.8B,参数减少了 16.67%
1 PanGu-π-Pro:重新思考 "小" 的大语言模型的优化和架构
论文名称:Rethinking Optimization and Architecture for Tiny Language Models
论文地址:
https//arxiv.org/pdf/2402.02791.pdf
代码链接:
https//github.com/YuchuanTian/RethinkTinyLM
1.1 背景:大语言模型在端侧部署受限
以 ChatGPT 为代表的大语言模型 (Large Language Models, LLM) 有可能彻底改变人与计算机之间的交互,在各种自然语言任务中展示了令人印象深刻的性能。除了 GPT 系列[2]的模型之外,还有一些开源的 PaLM[3],LLaMA[4]等模型架构和训练的权重都是开源的语言模型。除此之外,也有很多大语言模型都使用了类似的架构和训练策略,比如 Baichuan[5],Qwen[1],Yi[6],Skywork[7]等等。清洁的训练数据不断增加,大语言模型的性能也在不断提升。虽然许多研究已经成功地训练了各种高性能语言模型,但是:一方面,探索大语言模型的训练策略方面的努力却比较少,即大量的工作都聚焦于收集和清理数据。另一方面,大模型的训练需要大量的计算资源,这就使得广泛探索的优化策略变得不切实际。
而且,大模型的实现需要非常高的内存和计算资源,限制了它们在各种场景中的实际适用性。比如使用 FP32 数据类型存储时,具有 175B 参数的 GPT-3 需要大约 700GB 的内存。尽管 7B 参数的模型占用内存相对较少,但这个资源要求对于移动设备 (例如手机) 上的部署不切实际。
1.2 网络架构探索:分词器 (Tokenizer)
探索实验数据集:从预训练的数据集中随机抽样 50B 个 token,中文和英文语料的比例相等。
模型:LLaMA-like 架构,1B 参数。
分词器用于将原始自然语言映射到适合大语言模型处理的 tokens,每个 token 代表一个单词、子词、字符或符号。多语言标记器通常具有较大的词汇表来涵盖各种语料库。分词器一般有一个很大的词汇表来覆盖各种语料库。对于小的模型来讲,词汇表的大小也不可忽视了。Qwen-7B,Baichuan2-7B 和 PanGu-π-7B[8]的词汇表大小分别是 151936, 125696, 100883。它们头部和嵌入层的参数占总参数的 16.12%、13.72%、10.91%。PanGu-π-1B 模型有 12 层,使用相同词汇表,参数就占了总参数的 36.8%,如下图2所示。
图2:模型主体和分词器的参数比例。(a) 原始 PanGu-π-1B 模型,不使用紧致分词器。(b) 改进的 PanGu-π-1B 模型,使用紧致分词器
这种分布导致将参数分配给词汇表示而不是主体,这可能会限制模型的整体表示能力。因此,就要对小模型的分词器进行压缩,以降低其参数在整个模型中的比例。
而且,作者也发现了分词器中存在大量冗余。按照从 PanGu-π 模型继承的 100K 词汇量的词汇表的 tokenizer 进行分析,作者对一个包含了大约 1.6T 标记的大型语料库的频率分析,结果如下图3所示。
图3:Top-k 词汇表的累积频率分析结果:97.86% 的数据可以通过一个小于 48k 的分词器表示
可以看到,前 Top-48K 的词汇,占据了所有训练语料库的 97.86%。作者实验了6种词汇表尺寸:{8k, 16k, 32k, 48k, 72k, 100k},其累积频率分别为 78.68%, 87.24%, 94.49%, 97.86%, 99.84% 和 100%。也就是说,语料库里面超过 50% 的词汇是冗余的,因为这些词汇在整个语料库中出现的累计频率不足 3%。因此,可以把低频的词汇删除,减小词汇表的大小,给正儿八经模型的参数腾出空间。
实验结果如下图4所示。当使用 48K 的词汇表时,嵌入和头部层构成了 1B 模型参数的 18.07%,平均性能最佳,然后是词汇量为 32K 的模型。
图4:性能与分词器数量的关系。PEHF 代表 Embedding 和 Head 占模型总参数量之比
但是,使用过小的词汇表会导致性能下降。例如,使用覆盖不到 70% 语料库的 8K 分词器,该模型在 C3 和 ARC-E 数据集上表现出低于标准的性能。作者的建议是使用覆盖范围超过语料库 90% 的分词器,同时确保 Embedding 和 Head 层的参数比例保持在 20% 以下。
1.3 网络架构探索:架构调整
下面作者探索 LLM 的架构细节,包括:深度,宽度,FFN 的扩展率对 1B 大小的语言模型的性能的影响。评价的指标包括下游任务的性能以及解码速度,评价的方法是使用随机初始化的模型,实用2个 tokens 的前缀,解码 510 个新 tokens 的端到端推理速度。速度在单个 NVIDIA V100 GPU 上进行了测试,Batch Size 为 20,使用 FP16。
调整深度和宽度的结果如下图5所示。可以发现,更深的小模型表现出更好的性能,但代价是推理速度也降低了。随着模型深度的增加,几乎所有三个基准的性能都有所提高。但是性能提升效应递减。所以,作者建议在分词器大小为 48K 的情况下,将深度设置为 20 层。
图5:改变 1B 尺寸模型的深度和宽度的性能以及速度结果,速度的衡量标准是 tokens per second
如图6所示是改变 FFN 扩展率以及宽度的结果。当深度固定时,可以看到不同扩展率的推理速度都是十分接近的。当 EP Rate 为 1 时,性能很差。EP Rate 最终选定为 2.77。
图6:改变 1B 尺寸模型的 FFN 扩展率和宽度的性能以及速度结果,速度的衡量标准是 tokens per second
为了进一步研究深度、宽度和扩展率之间的相互作用,作者对大约 30 个不同的参数配置进行采样,同时保持 1B 参数的模型大小,并在包含 5B tokens 的进一步精简数据集上进行训练。实验结果如图7所示,可以发现,深度对于下游任务的影响较高。Spearmanr 相关系数达到 0.528。相比之下,FFN 扩展率与模型的性能没有明显的线性关系。
图7:模型深度,宽度,和 FFN 扩张率与性能的关系
经过本节的探索,最终的模型配置如图8所示。
图8:不同大小的模型配置
1.4 训练策略探索:权重继承
随机初始化参数
当从头开始训练模型时,参数通常使用正态分布
进行初始化。很多大语言模型精心设计了
的值,比如将其改为随层数变化,比如 GPT-2
为所有线性层参数使用了
的 scale,其中
为层数。InternLM
仅将相同的尺度应用于一些特殊的线性层参数。这几种策略的结果如图9所示。最终作者选择了为所有的层使用恒定标准差的正态分布。
图9:不同参数初始化的实验结果,其中恒定标准差方法的表现最好
从大模型继承参数
同时,小模型的参数也可以直接从大模型中继承得到。与小模型相比,大模型通常有更多的层具有更多的神经元。作者首先选择重要的层,然后识别所选层中的关键神经元。
首先需要识别出大语言模型中,对最终性能比较关键的层。作者在 LLaMA2-7B, LLaMA2-13B, InternLM-7B 和 PanGu-π-7B 这几个模型上进行了实验。在推理阶段,故意去跳过一些特定的层并评估性能下降。可以跳过1层,2个连续的层,以及3个连续的层。实验结果如图10所示。X 轴表示跳过的层索引,而 Y 轴表示性能。
图10:不同的模型在跳过1层,2层,和3层时的性能
从上图中可以得到一些有趣的结论:浅层,尤其是初始2到3层,在从输入序列中提取特征方面起着关键作用。删除这些层会在下游任务上产生显着的性能下降。深层的效果也差不多。只有中间层对于结果的影响是最小的。在参数继承时,这些层可以被删掉。
在某一层中,可以通过各种指标识别重要的参数,其中最重要的神经元参数被用作小模型的初始化参数。那么衡量参数重要性的方式有很多,其中比较知名的是 \ell_1\ell_1 和 \ell_2\ell_2 范数等等。作者这里尝试了4种方法从 PanGu-π-7B 模型中选择关键参数作为权重尺寸较小的 1B 模型的初始值,结果如图11和12所示。
图11:不同权重继承方式的结果
图12:不同权重继承方式的训练曲线
与随机初始化的基线模型相比,使用权重继承策略初始化的每个小模型都会收敛到相对较低的损失。作者最后建议用可学习的策略继承模型参数。
1.5 训练策略探索:多轮训练
作者首先探索了 Batch Size 对于模型性能的影响,使用下式
来调节学习率,其中默认的
和
分别为
和
。实验结果如图13所示。可以看到在大多数情况下,小于
的 Batch Size 是保证模型性能的安全范围。
图13:不同 Batch Size 和学习率的实验结果
多轮训练策略
现有的方法通常只对语言模型训练一轮,即所有数据都只用于更新模型1次,那么就造成模型的参数没有能够完全收敛。在大型语料库上学习可能会受到灾难性遗忘的影响。而对于小模型来讲,有限的模型容量很容易使得遗忘问题加剧。继续训练可以进一步减小训练损失。
作者进行了一个简单的实验来验证遗忘问题。由于 training loss 的计算过程与模型参数相关,那么到了训练后期的 training loss 相对较低,也就意味着此时的模型参数对应了更低的 training loss。因此,作者在训练之前把训练数据均匀分成 8 份,并计算训练过程中每一部分的平均 loss value 的值,使用的模型是 PanGu-π-1B。
图14:使用 PanGu-π-1B 模型,每个 Batch 里面的平均 loss 的值
更高的 loss 意味着先前的知识已经严重遗忘掉了。因此,有必要对模型进行多轮训练,以弥补遗忘的知识。
为了减小训练的代价,作者提出了一种用于多轮训练的简单的数据精炼策略。考虑到一些训练样本很难拟合,因此需要更进一步的训练。下图15所示是下一轮训练的采样率
与性能的关系,
意味着不使用多轮训练,即只训练 1 轮。也可以看得出来更高的采样率可以获得更强的性能,同时当采样率超过