LLaMA-Pro 技术解析
摘要
本文介绍了一种名为 LLaMA-Pro 的新型后预训练方法,旨在增强大型语言模型(LLMs)在特定领域的性能,同时保持其原有的通用能力。该方法通过在 Transformer 架构中增加深度来扩展模型,在不牺牲原有性能的前提下,显著提升模型在编程、数学和一般语言任务中的表现。LLaMA-Pro 基于 LLaMA2-7B 构建,并引入了指令版 LLaMA-Pro-Instruct,在各种基准测试中达到了先进性能。
现有微调方法的局限性
传统的微调方法如指令调优(Instruction Tuning)和参数高效调优(Parameter-Efficient Fine-Tuning, PEFT,例如 LoRA)虽然有效,但存在一定缺陷:
- 指令调优:通常需要大量高质量的指令数据,计算资源消耗较高,且难以保证输出质量的一致性。
- 参数高效调优:如 LoRA 等方法虽能降低计算成本,但在预训练后应用时,可能导致模型在适应新领域过程中损失部分原有的通用知识。
LLaMA-Pro 核心架构
LLaMA-Pro 的核心思想是在现有的 LLM 中添加额外的 Transformer 块以增加模型深度。这些新增的块在初始化时被设置为零,并在特定领域的语料库上进行微调。这种设计使得模型能够在学习新知识的同时,避免对原有知识的遗忘。
架构流程
- 基础模型选择:从一个经过大规模未标注语料库预训练的大型语言模型开始,获得强大的通用能力。文中以 LLaMA2 为例。
- 骨干扩展:采用块扩张策略,使用特定领域语料库对扩展的身份块进行微调,同时冻结从基础模型继承的原始块。
- 指令跟随:通过约 80M tokens 的监督指令微调(Supervised Instruction Tuning),进一步增强模型理解和执行人类指令的能力。

如图 (a) 所示,模型从预训练阶段开始;(b) 展示了骨干扩展过程,身份块被堆叠在原始组之上,经过后预训练的模型可继续用于指令调优。
具体实现细节
1. 模型扩展机制
在现有的 LLaMA 模型中,每组 Transformer 块之后添加一个 Identity Block(身份块)。这些块在初始化时被设置为零,以确保模型在扩展后的初始状态下保持相同的输出行为。
2. 分组与复制
将原始模型的 Transformer 块分成多个组。对于每个组,创建原始块的上层副本(即身份块),并将其堆叠在原始组之上。该过程逐层进行,以保持 Transformer 模型的结构特性。
3. 身份块定义
身份块被定义为恒等函数,即对于任何输入,身份块输出的值与输入相同。这确保了在添加新块后,模型的输出行为不会发生突变。
4. 权重初始化
新添加的块中的线性层被初始化为零,以实现身份映射。这样,在训练初期,这些新块不会影响模型输出,随着训练进行,它们可以学习新的知识,而不会影响或覆盖原有的知识。
5. 微调策略
在添加新块之后,只对新增的块进行微调,而保持原始的块冻结。这种策略确保模型在增强特定领域能力的同时,不会牺牲其原有的通用能力。
6. 训练优化
使用 domain-specific 的语料库对扩展后的模型进行微调。在此过程中,只更新新添加的块,而原始的块保持不变,从而最大化效率并减少灾难性遗忘。


