ai学习笔记(十一)
本次主要分享一下指令微调与对齐技术,从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. 数据准备:收集高质量标注数据,包含输入指令和期望输出;
- 2. 模型初始化:加载预训练模型参数;
- 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

步骤拆解:
-
训练一个奖励模型(Reward Model)
-
收集人类偏好数据:给模型同一个问题的多个回答,让人工标注员排序(哪个更好)。
-
用这些排序数据训练一个奖励模型,这个模型能够自动给任意回答打分,分数越高表示越符合人类偏好。
-
-
用强化学习微调模型(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“: “...“}】}`特点:支持多轮对话场景,格式灵活,适用于复杂交互需求的模型训练。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)