大模型微调技术方法综述
在深度学习领域,微调(Fine-tuning)是改进预训练模型性能的关键技术。随着开源大模型的日益增多,掌握微调基础知识对于在实际工作中应用这些模型至关重要。除了 ChatGPT,许多预训练模型均可通过微调适应特定任务。
综述了大模型微调的核心技术,涵盖全参数微调、提示微调(Prompt/Prefix/P-tuning)、低秩适应(LoRA)及人类反馈强化学习(RLHF)。详细介绍了各方法的原理、适用场景及优缺点,并补充了 DeepSpeed 分布式训练优化方案。通过对比分析,为不同资源条件下的模型适配提供选型指导,旨在帮助开发者高效完成垂直领域模型的训练与部署。

在深度学习领域,微调(Fine-tuning)是改进预训练模型性能的关键技术。随着开源大模型的日益增多,掌握微调基础知识对于在实际工作中应用这些模型至关重要。除了 ChatGPT,许多预训练模型均可通过微调适应特定任务。
全参数微调是将预训练模型的所有层都参与训练,以适应新的任务。这种方法通常能获得最佳的性能表现,但计算成本和显存占用极高,需要大量的 GPU 资源。
目前常用的策略包括前三种。简单来说,模型参数好比大学生在大学学到的通用知识,而微调则是毕业后从事特定行业工作,需要学习具体的工作内容来产出成果。
Prompt tuning 是参数高效性微调(PEFT)中实现最简单的方法之一。它固定模型的前馈层参数,仅更新部分 embedding 参数即可实现低成本微调。
经典的 Prompt tuning 不涉及对底层模型的任何参数更新,侧重于精心制作输入提示或模板。主要结构利用了一个 prompt encoder(BiLSTM+MLP),将一些伪提示(pseudo prompt)先 encode(离散 token)再与 input embedding 进行拼接,同时利用 LSTM 进行重参数化(Reparameterization)加速训练,并引入少量自然语言提示的锚字符(Anchor)进一步提升效果。
然而,P-tuning v1 存在两个显著缺点:任务不通用和规模不通用。在一些复杂的自然语言理解(NLU)任务上效果较差,且预训练模型的参数量不能过小。
Prefix Tuning 针对不同的模型结构设计不同模式。以自回归模型为例,不再使用 token 作为前缀,而是直接使用参数作为前缀。例如一个 l×d 的矩阵 P 作为前缀,但直接使用这样的前缀效果不稳定,因此使用一个 MLP 层重参数化并放大维度 d。除了在 embedding 层加入这个前缀之外,还在其他的所有层都添加这样一个前缀。最后微调时只调整前缀的参数,大模型的参数保持不变。保存时只需要为每个任务保存重参数的结果即可。
V2 版本基于 P-tuning 和 Prefix-tuning 技术,引入了 Deep Prompt Encoding 和多任务学习等策略进行优化。
实验表明,仅精调 0.1% 参数量,在 330M 到 10B 不同参数规模的 LM 模型上,均取得和 Full Fine-tuning 相比肩的性能。
P-tuning v2 的主要改进包括:
总而言之,P-tuning v2 是将 Prefix-tuning 应用到 NLU 任务上的一种方法。由于每层插入了 token,增大了模型训练的改变量,更加适用于小一点的模型。
LoRA 的本质是对所有权重矩阵套了一层'壳',这些壳会对原来的预训练权重矩阵进行加减使其更加适合下游任务。其假设前提是预训练语言模型具有低的'内在维度',因此在模型适配下游任务的过程中,权重更新也应该具有低的'内在秩'。
在对大语言模型进行微调的公式可以简化为: $$W = W_0 + \Delta W$$ 其中 $W$ 是微调后的矩阵权重,$W_0$ 是预训练的权重,$\Delta W$ 是通过微调而更新的梯度。将 $\Delta W$ 变换为两个矩阵相乘: $$\Delta W = BA$$ 在里面引入了秩 $r$,$r \ll \min(d, k)$。在训练过程中 LoRA 会冻结预训练权重 $W_0$,只训练 $A$ 和 $B$,减少了需要训练的参数的量。一般来讲,对于 LoRA 微调模型来讲 $r$ 设置的越大其微调效果会越好。
LoRA 算法的核心思想是将原始矩阵分解为两个低秩矩阵的乘积形式。具体地,LoRA 算法会首先对原始矩阵进行 SVD 分解,得到矩阵 $A=U\Sigma V^T$,然后取 $U$ 的前 $k$ 列和 $V$ 的前 $k$ 行,得到低秩矩阵 $X$ 和 $Y$,近似矩阵 $A_k = X \cdot Y$。
最终得到的权重文件会是各层的 $BA$,在推理时需要计算 $W = W_0 + BA$。该方法的好处如下:
一般在使用 LoRA 去对模型进行微调的时候需要注意的参数就两个:r 和 lora_target_modules。前者决定了构造的矩阵的秩的大小,后者模块的具体名称需依据不同的模型决定。
RLHF 的思想是使用强化学习的方式直接优化带有人类反馈的语言模型,使得语言模型能和复杂的人类价值观对齐。RLHF 是一项涉及多个模型和不同训练阶段的复杂概念,一般分为三步:
使用上文提到的数据集进行模型微调,预训练一个语言模型 (LM)。这一步可以用额外的文本或者条件对这个 LM 进行微调,例如 OpenAI 对'更可取'的人工生成文本进行了微调。虽然使用了昂贵的增强数据,但这并不是 RLHF 必须的一步。
RM 的训练是 RLHF 区别于旧范式的开端。这一模型接收一系列文本并返回一个标量奖励,数值上对应人的偏好。关于训练文本方面,RM 的提示 - 生成对文本是从预定义数据集中采样生成的,并用初始的 LM 给这些提示生成文本。关于训练奖励数值方面,需要人工对 LM 生成的回答进行排名。起初可能会认为应该直接对文本标注分数,但是由于标注者的价值观不同导致这些分数未经过校准并且充满噪音。通过排名可以比较多个模型的输出并构建更好的规范数据集。一种成功的方式是对不同 LM 在相同提示下的输出进行比较,然后使用 Elo 系统建立一个完整的排名。
目前多个组织找到的可行方案是使用策略梯度强化学习算法、近端策略优化 (Proximal Policy Optimization, PPO) 微调初始 LM 的部分或全部参数。因为微调整个 10B~100B+ 参数的成本过高,相关工作参考低秩适应 LoRA。PPO 算法是一种信赖域优化算法,它使用梯度约束确保更新步骤不会破坏学习过程的稳定性。
DeepSpeed 是微软的大规模分布式训练工具,专门用于训练超大模型。其具有的 3D 并行同时解决了训练万亿参数模型的两个基本挑战:显存效率和计算效率。因此,DeepSpeed 可以扩展至在显存中放下最巨大的模型,而不会牺牲速度。
使用 DeepSpeed+Zero 的结合方式就可以实现全参数的微调。DeepSpeed ZeRO-2 主要用于训练,ZeRO-3 后也可用于推理,因为它允许在多个 GPU 上加载大型模型。在 Python 中,Accelerate 库提供了简单的 API,使我们可以在任何类型的单节点或分布式节点上运行。
示例配置中需要提前知道梯度累积步骤 gradient_accumulation_steps 和梯度累积计算逻辑。
为了更清晰地选择微调方法,以下是对比总结:
| 方法 | 参数量变化 | 显存需求 | 训练速度 | 适用场景 |
|---|---|---|---|---|
| Full Fine-tuning | 100% | 高 | 慢 | 数据充足,资源充裕,追求极致性能 |
| Prompt Tuning | <1% | 低 | 快 | 简单任务,快速原型验证 |
| Prefix Tuning | <1% | 低 | 快 | 序列生成任务,多任务学习 |
| LoRA | ~1% | 中 | 较快 | 垂直领域微调,资源受限,推荐首选 |
| RLHF | 可变 | 高 | 慢 | 对齐人类价值观,安全合规要求高 |
大模型微调技术正在快速发展,从全参数微调到低秩适应,再到强化学习对齐,每种方法都有其独特的优势和应用场景。开发者应根据实际业务需求、数据规模和硬件资源,灵活选择合适的微调策略。随着技术的演进,参数高效微调(PEFT)将成为主流,降低大模型落地的门槛。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online