本次主要分享一下指令微调与对齐技术,从SFT到RLHF详解。

1. 指令微调(SFT)

指令微调是在预训练模型的基础上,通过“问答”形式的数据集,让模型学会如何遵循人类的指令进行对话。

基础模型仅具备文本续写能力,通过指令微调可使其理解并执行具体任务指令,实现从“续写“到“对话“的能力跃迁。典型如GPT-3到ChatGPT的进化过程。

核心目标:让模型准确理解并执行用户指令,例如根据指令生成特定格式的文本或完成特定任务。

以Llama-3-8B模型为例:

向Base版本提问“法国的首都是哪里?“可能生成“法国的首都是巴黎,它是欧洲重要的文化中心。..“等补充性文本;

而Instruct版本会直接回答“巴黎“,并停止生成。两者差异凸显指令优化对模型交互方式的关键影响。

指令微调目的参数高效微调(PEFT)手段,常用的参数高效微调种类如下:

1.1 添加小型网络层类微调

这类方法冻结原模型,在原模型内部插入少量可训练的参数,通过训练这些“插件”来适配新任务。

a. Adapter(适配器)

  • 核心思想:在Transformer的层之间插入小型神经网络模块(通常是“降维→非线性→升维”的结构)。升维降维要从计算效率、表达能力、以及信息整合三方面去看。

  • 工作方式

    • 冻结原始大模型的所有参数。

    • 在每个Transformer层后面串联一个Adapter模块。

    • 训练时只更新Adapter模块里的几百万个参数。

    • Adapter模块的输出与输入通过残差连接相加,确保原始特征能够直接传递,避免信息丢失。

  • 优点:效果接近全量微调,模块化好,不同任务可以训练不同的Adapter,切换任务只需换模块。

  • 缺点:推理时增加了层数,会带来额外的延迟(因为要串行计算Adapter)。

b.  LoRA(Low-Rank Adaptation,低秩适应)

  • 核心思想这是目前最主流、最常用的方法。它认为微调过程中的权重变化量(ΔW)是“低秩”的,可以用两个小矩阵的乘积来近似。

  • 工作方式

    • 冻结原模型的权重矩阵 W(如 1024×1024)。

    • 在旁边添加两个小矩阵 A(1024×r)和 B(r×1024),其中 r 通常为 4、8、16。

    • 前向传播时:h=Wx+BAx。

    • 训练时只更新 A和 B。

  • 优点

    • 显存占用极小(无需存储优化器状态给原模型参数)。

    • 没有推理延迟(可以将 W+BA 合并回原权重,与全量微调速度一致)。

    • 便于切换任务(只需保存几MB的A、B权重文件)。

  • 缺点:当 r 设置过小时,表达能力受限;对某些极度复杂的任务可能不如全量微调。

1.2 优化输入提示类微调

这类方法不修改模型内部,而是通过修改或添加输入端的“提示词”来引导模型。

a. Prompt Tuning(提示调优)

  • 核心思想:在输入前面加上一段“可学习的虚拟Token”,让模型跟着这些软提示走。

  • 工作方式

    • 将输入 x 变成 [P1,P2,...,Pn,x]。

    • 这些 Pi 不是具体的文字,而是可以直接在嵌入层(Embedding)中训练的向量。

    • 训练时只更新这些虚拟Token的向量,原模型完全冻结。

  • 优点:参数量极小(通常只有几MB),非常适合超大规模模型(如100B以上)。

  • 缺点:对小模型效果不太稳定,需要模型本身具备较强的上下文学习能力。

b. Prefix Tuning(前缀调优)

  • 核心思想:Prompt Tuning 的升级版。它不仅在前缀加入可学习向量,还把这些向量插入到每一层Transformer的Key和Value中。

  • 工作方式

    • 不仅修改输入层的嵌入,在每一层的注意力机制中,都在键(Key)和值(Value)前面拼接一组可训练的前缀向量。

    • 这相当于给每一层都加了一个“前置指令”,对模型的控制力更强。

  • 优点:效果通常优于Prompt Tuning,尤其适合生成任务。

  • 缺点:由于需要干预每一层的计算,推理时会占用一定的额外显存,且部署稍复杂。

c. P-Tuning

  • 核心思想:可以看作是 Prompt Tuning 的变体,主要解决离散提示(人工写的提示)不稳定的问题。

  • 工作方式

    • 它认为连续提示(Virtual Token)之间不是孤立的,应该存在依赖关系。

    • 它使用一个小的LSTM或MLP(多层感知机)来生成这些虚拟Token的表示,让提示之间更连贯。

    • 主要用于解决自然语言理解任务(如分类、命名实体识别),在GLUE等榜单上效果很好。

  • 注意:P-Tuning v2 后来借鉴了Prefix Tuning的思想,也做到了在每一层插入提示,性能大幅提升。

1.4 指令微调流程

指令微调核心流程包括以下三点:

  1. 1. 数据准备:收集高质量标注数据,包含输入指令和期望输出;
  2. 2. 模型初始化:加载预训练模型参数;
  3. 3. 微调训练:通过反向传播调整模型参数,最小化预测输出与标注数据的差异。

指令微调严格地控制答案长度、格式要求、字段顺序。

1.5 损失掩码(Loss Masking)

损失掩码用来告诉模型:在计算损失时,哪些位置需要学习,哪些位置应该忽略

损失计算策略:仅在“回答“部分计算损失,避免指令部分对模型训练的干扰,提升模型输出质量。

输入格式为`【Instruction, Answer】`,损失函数仅作用于`Answer`部分,确保模型专注学习回答生成能力。

概念 作用
损失掩码 指定哪些 token 参与损失计算,哪些忽略
常用实现 labels 中设为 -100 来忽略
预训练 忽略 [PAD] 位置
SFT 只计算 assistant 部分的损失,忽略用户输入
效果 防止模型学习无关内容,提升指令遵循能力

微调数据质量大于数量

2. 人类偏好对齐

为什么需要对齐?

经过指令微调(SFT)后的模型,已经能够以对话形式回答问题,但它仍然存在几个核心问题:

  • 缺乏价值判断:模型不知道什么是“有帮助的”“诚实的”“无害的”。它会一视同仁地学习训练数据中的所有回答风格,包括那些冗长、敷衍甚至有害的内容。

  • 暴露不良偏好:SFT 数据中可能隐含了标注者的偏见,或者模型在预训练阶段学到了互联网上的不良内容。

  • 难以覆盖所有情况:SFT 只能通过有限的标注数据教会模型“格式”,但无法穷举所有场景下的“好坏标准”。

2.1 对齐目标

对齐(Alignment)旨在使模型输出符合人类价值观,3H原则包括:

Helpful:有用性(提供准确信息)

Harmless:无害性(避免有害内容)

Honest:诚实性(不编造事实)

例如,ChatGPT通过RLHF训练将有害输出降低了72%。

常见的对齐框架有RLHF和DPO。

2.2 RLHF

步骤拆解

  1. 训练一个奖励模型(Reward Model)

    • 收集人类偏好数据:给模型同一个问题的多个回答,让人工标注员排序(哪个更好)。

    • 用这些排序数据训练一个奖励模型,这个模型能够自动给任意回答打分,分数越高表示越符合人类偏好。

  2. 用强化学习微调模型(PPO)

    • 将 SFT 后的模型作为初始策略。

    • 让模型生成回答,奖励模型给出分数作为反馈。

    • 使用 PPO(Proximal Policy Optimization) 算法更新模型参数,目标是最大化奖励模型的分数。

    • 同时加入一个 KL 散度约束,防止模型偏离 SFT 模型太远(避免模型为了高分而“走火入魔”)。

优点:效果稳定,是目前公认效果最好的对齐方法。
缺点:流程复杂(需要训练奖励模型 + 强化学习),训练不稳定,资源消耗大。

KL散度

KL散度,全称是 Kullback-Leibler 散度,也叫相对熵。可以把它理解为衡量两个概率分布之间差异程度的一种“距离”。简单记住:“用 Q 去描述 P,平均会损失多少信息”,就能抓住它的核心含义。

2.3 DPO

DPO 是近年来兴起的简化方案,它绕过了“训练奖励模型 + 强化学习”的两步走,直接用一个公式将偏好数据转化为损失函数。

核心思想

  • RLHF 本质上是在优化一个目标函数,DPO 通过数学推导发现,这个优化过程可以用直接对比偏好数据(比较回答对(y_i, y_j)的优劣的交叉熵损失来代替,无需显式训练奖励模型。

优点

  • 实现简单,训练稳定,代码改动小

  • 资源消耗远低于 RLHF(只需要 SFT 级别的显存)

  • 效果在多个基准上接近甚至超越 RLHF

缺点

  • 理论上不如 RLHF 灵活(例如无法方便地加入额外的约束)

3. 对齐与 SFT 的关系

维度 SFT(指令微调) 对齐(RLHF / DPO)
训练数据 指令-回答对(单一答案) 偏好对比数据(答案A > 答案B)
学习目标 模仿标准答案的格式和内容 学会区分好坏,优化偏好分数
核心能力 学会“如何回答” 学会“什么回答更好”
效果表现 能回答问题,但可能冗长、不安全 更符合人类偏好,更安全、更精炼

一个形象的比喻

  • SFT 像是让一个学生做大量的标准答案抄写练习,他学会了答案的格式,但不知道为什么这个答案比那个好。

  • 对齐 像是让学生看大量“好答案 vs 坏答案”的对比,并告诉他为什么好,让他逐渐形成判断力。

4. 微调框架与数据格式

4.1 主流框架

LLaMA-Framework:提供WebUI支持,用户界面友好,配置选项丰富。支持多种主流模型和数据集,包括LLaMA、ChatGLM等。典型应用场景为一站式微调平台,特别适合初学者快速上手和研究人员进行实验验证。

Axolotl:采用YAML配置文件驱动,提供高度灵活的微调方案。拥有活跃的开源社区支持,持续更新优化。主要面向需要深度定制微调流程的开发者,支持LoRA、QLoRA等先进技术。

Hugging Face TRL:由Hugging Face官方推出的Transformer强化学习库。提供完整的RLHF(强化学习人类反馈)实现,与Transformers库深度集成。适合需要实现对话模型精细调优的企业级用户。

4.2 数据集格式

Alpaca格式:结构:`{“instruction“: “...“, “input“: “...“, “output“: “...“}`特点:简单直观的设计,特别适合单轮问答或单一任务场景,便于快速实现和调试。

ShareGPT格式:结构:`{“conversations“: 【{“from“: “human“, “value“: “...“}, {“from“: “gpt“, “value“: “...“}】}`特点:支持多轮对话场景,格式灵活,适用于复杂交互需求的模型训练。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐