一、引言

1.1 微调的定义

大语言模型(LLM)的预训练与微调是大语言模型的两个重要阶段。

  • 预训练是指在大规模文本数据上训练大型语言模型,以学习文本数据的统计规律和语言知识。
  • 预训练的目的是让模型学习到丰富的语言知识,提高模型的泛化能力。
  • 微调则是指在预训练的基础上,通过在特定任务上进行有监督的微调,使模型适应特定任务的需求。
  • 微调的目的是让模型适应特定任务的数据分布,提高模型在特定任务上的性能。

1.2 大语言模型的阶段

以下是对预训练、持续预训练、微调、上下文学习等概念的对比:

阶段 数据 基础模型 目标 备注
从头开始预训练(Pre-Training from Scratch) 无监督,大量未标注数据 Transformer等基础模型,随机初始化权重 从头开始训练模型 如GPT、LlaMa
持续预训练(Further/Continuous Pre-Training) 无监督,来自于新领域(如金融、法律、医疗等)的未标注数据 预训练模型 学习新领域的知识 某些场景下,该方法也被称为无监督微调(Unsupervised Fine-Tuning)
微调(Fine-Tuning) 有监督,针对特定任务或领域的标注数据 预训练模型 适应特定任务的数据分布 如文本生成、聊天对话等任务
上下文学习(In-context Learning) 无需在特定数据集上训练 无需调整模型参数 根据给予模型的特定上下文来指导模型行为 实际上就是提示工程

1.3 微调的分类

个人认为,可以从两个角度对微调进行分类:微调调整的参数规模和微调的方法。这两种分类方法不是完全独立的,因为不同的微调方法也可以调整不同规模的参数。

1.3.1 根据参数调整规模分类

参数调整规模 概述 适用场景 备注
全量微调(Full Fine-Tuning,FFT) 调整模型的全部参数,训练成本较高 当新任务与预训练任务差异较大,或者想要充分利用新任务数据集时,选择全量微调 灾难性遗忘:用特定训练数据去微调可能会把这个领域的表现变好,但也可能会把原来表现好的别的领域的能力变差
参数高效微调(Parameter Efficient Fine-Tuning,PEFT) 只对部分参数进行训练,降低训练所需硬件开销 适用于新任务与预训练任务相似的场景 如LoRA、QLoRA等方法

1.3.2 根据微调方法分类

微调方法 概述 备注
监督微调(Supervised Fine-Tuning,SFT) 使用针对目标任务的标注数据集进行微调,如标注数据由成对的输入和输出数据组成。输入是提供给LLM的Prompt,输出是期望LLM生成的结果 如指令微调
基于人类反馈的强化学习微调(Reinforcement Learning with Human Feedback,RLHF) 利用人类的反馈训练LLM,通过强化学习的方式,将人类反馈引入到微调中,使得大模型生成的结果更加符合人类的期望 如PPO、DPO等方法

有关两种分类方法的关系,说明如下:

  • PEFT实际上是一种微调方法,一种用于降低微调任务所需硬件成本的算法,可以类比剪枝算法、量化技术
  • 监督微调、RLHF则是针对如何具体进行微调任务的策略
  • RLHF中的每个步骤,如SFT、训练RM、强化学习策略等都可以使用PEFT来降低硬件成本

二、参数高效微调

2.1 背景知识

  1. 条件语言模型概率的原理
  • 我们希望最大化输入序列 $X=(x_1, x_2, \ldots, x_T)$ 生成目标序列 $Y=(y_1, y_2, \ldots, y_T)$ 的条件概率。

  • 而条件语言模型的目标是通过最大化序列 $Y$ 的条件概率来优化模型参数:

$$ P(Y \mid X; \theta) = \prod_{t=1}^T P(y_t \mid y_{<t}, X; \theta)$$

  • 其中,$y_{<t} = (y_1, y_2, \ldots, y_{t-1})$表示$y_t$之前的所有输出词。
  1. 损失函数的定义
  • 使用交叉熵损失函数衡量模型生成的序列与真实序列之间的差异,损失函数$\mathcal{L}(\theta)$定义为:

$$\mathcal{L}(\theta) = -\sum_{t=1}^{T} \log P(y_t \mid y_{<t}, X; \theta)$$

  1. 微调的目标——最小化损失函数
  • 微调的目标是通过梯度下降法最小化损失函数,从而更新模型参数$\theta$:

$$\theta = \theta - \eta \nabla_\theta \mathcal{L}(\theta)$$

  • 其中,$\eta$是学习率,$\nabla_\theta \mathcal{L}(\theta)$是损失函数相对于模型参数的梯度。
  1. 最大化对数似然
  • 由于交叉熵损失函数等价于最大化对数似然,等价地,微调可以看作是最大化条件语言模型概率的对数似然:

$$\theta^* = \arg\max_{\theta} \sum_{(X, Y) \in \mathcal{D}} \log P_\theta(Y \mid X; \theta)$$

2.2 微调所需显存组成

以LlaMa-3.1-8B模型为例(即80亿参数)

组成 概述 计算
Model Parameters(模型参数) 存储参数所需的内存=模型参数总数*每个参数的大小(通常以字节为单位) 8B×2字节(16位)= 16 GB
Optimizer States(优化器状态) AdamW优化器会额外存储梯度和动量;Optimizer States的空间需求=需要更新的参数量*每一个参数需要多少空间储存Optimizer State 约为模型参数的4倍
Gradients(梯度) 计算损失相对于模型参数的梯度 大小与模型参数相当
Activation Cache(中间层输出缓存) 在训练期间,计算并缓存Activations(每层的输出)以进行反向传播;Activation Cache所需的内存=层数*每层激活大小*批量大小 约为模型参数的2倍

2.3 全量微调及其问题

  • 在微调过程中模型加载预训练参数进行初始化,并通过最大化条件语言模型概率进行参数更新$\theta_0 + \Delta\theta$。
  • 学习到的参数增量$\Delta\theta$的维度和预训练参数$\theta_0$的维度一致,即$|\Delta\theta| = |\theta_0|$。
  • 如果预训练参数规模很大,则部署微调任务所需的资源也将很大。

2.4 LoRA

  • 如何减少需要学习的参数量

  • 低秩分解

    • 类比Aghajanyan等人的研究结果,假设权重的更新也具有较低的“固有秩”:

      $$h = Wx = W_0x + \Delta Wx = W_0x + BAx$$

      $W_0$是预训练模型的原始权重矩阵,$x$是输入向量,$\Delta W$是对预训练权重进行调整后的增量矩阵,$B$和$A$是低秩分解的矩阵

    • 若$W_0 \in \mathbb{R}^{d \times k}$,则可以构造$B \in \mathbb{R}^{d \times r}$,$A \in \mathbb{R}^{r \times k}$,且$r \ll \min(d, k)$

    • 通过低秩分解的过程,达到降维再重建的过程

      假设$W$是$1000 \times 1000$的参数矩阵,令$\Delta W$是$1000 \times 2$的$B$矩阵与$2 \times 1000$的$A$矩阵相乘得到的矩阵,进而使参数量严格降低,只需要原来的$0.4%$,这个「降维再重建」的过程,称为Low Rank Projection(低秩投影)

    • 在训练时,$W_0$被冻结且不再进行梯度更新,而$B$和$A$包含可训练参数

    • 以上便是LoRA方法的基本思想,由Edward J. Hu等人在论文LoRA: Low-Rank Adaptation of Large Language Models中提出

  • LoRA的实现

    • 首先对$A$使用高斯分布初始化,$B$为零矩阵,则初始化时$\Delta W$​为$0$​

2.4 LoRA的改进

  • LoRA改进了哪里?
    • 减少了Optimizer States中需要更新的参数量,进而大大降低了显存消耗
  • QLoRA
    • 4-bit NormalFloat:将预训练模型由16-bit量化为4-bit(加载LLaMa-8B所需显存下降至4GB)
    • Double Quantization
    • Paged Optimizers

2.5 各种方法所需显存对比

Method Precision 7B 13B 30B 70B 110B
Full 16 67GB 125GB 288GB 672GB 1056GB
LoRA 16 15GB 28GB 63GB 146GB 229GB
QLoRA 8 9GB 17GB 38GB 88GB 138GB
QLoRA 4 5GB 9GB 20GB 46GB 72GB

三、监督微调

3.1 指令微调

  • 监督微调的一种常见形式为指令微调(Instruction Fine-Tuning, IFT)

  • 指令微调是监督微调的子集

  • 指令微调的数据集:由(指令,[输入],输出)对组成

  • 专注于通过理解和遵循人类指令来增强大型语言模型的能力和可控性

  • 通过提示工程,提供自然语言指令,微调的效果很大程度上取决于指令的质量

3.2 SFT VS RLHF

  • SFT和RLHF不是完全对立的
    • RLHF一般基于监督微调后的模型进行进一步微调
    • RLHF更倾向于被视为对齐技术——将大模型与人类价值偏好对齐

四、RLHF

4.1 RLHF的基础范式

以下内容摘自论文的摘要:

Making language models bigger does not inherently make them better at following a user’s intent. For example, large language models can generate outputs that are untruthful, toxic, or simply not helpful to the user. In other words, these models are not aligned with their users. In this paper, we show an avenue for aligning language models with user intent on a wide range of tasks by fine-tuning with human feedback. Starting with a set of labeler-written prompts and prompts submitted through the OpenAI API, we collect a dataset of labeler demonstrations of the desired model behavior, which we use to fine-tune GPT-3 using supervised learning. We then collect a dataset of rankings of model outputs, which we use to further fine-tune this supervised model using reinforcement learning from human feedback. We call the resulting models InstructGPT.

  • RLHF的一般范式

    • 预训练模型→进行监督微调SFT→收集人类反馈数据→训练奖励模型→使用奖励模型向强化学习过程提供反馈来微调模型
    • RLHF的研究重点:奖励模型学习、强化学习策略训练

4.2 PPO-RLHF的实现

  • 在RLHF的最初实现中,OpenAI将其提出的基于人类反馈的强化学习应用到大语言模型中,以达到与人类偏好对齐的目的。其中,强化学习算法采用近端策略优化(PPO),为了与后续改进算法区分,此处称为PPO-RLHF

  • 下图是摘自OpenAI官方博客的流程图

    • 首先,如图中第一步,使用人工标注数据集监督微调预训练模型

    • 第二步,收集问答数据,每个问题对应多个答案,并且不同的答案具有不同的评分,据此训练一个奖励模型(Reward Model,RM)

    • 第三步,使用该奖励模型和PPO算法微调模型的策略以最大化奖励值

  • 更详细地,DeepSpeed实现的PPO-RLHF算法框架如下

    • 第一步:监督微调SFT

    • 第二步:根据问答数据集微调预训练模型得到奖励模型RW

    • 第三步

      • RW被用于初始化两个模型,Critic Model和冻结的Reward Model

        其中

      • SFT微调后的模型被用于初始化两个部分,执行决策的Actor Model和冻结的参考模型

        其中

      • 指数移动平均(EMA):可以选择基于EMA的检查点进行最终评估

      • 混合训练:将预训练目标(即下一个单词预测)与PPO目标混合,以防止在像SQuAD2.0这样的公开基准测试中的性能损失