AI学习笔记整理(64)——大模型对齐方法

大模型对齐(Alignment)是使模型的输出更符合人类意图、偏好和价值观的关键步骤。当前主流的对齐方法主要包括以下几种,它们在复杂度、资源需求和效果上各有特点。

‌1.RLHF(基于人类反馈的强化学习)‌

人类反馈强化学习(Reinforcement Learning from Human Feedback, RLHF),这是早期且效果显著的方法,被用于训练 InstructGPT 和 ChatGPT。它包含三个阶段:

  • 监督微调(SFT)‌:首先,使用一个包含大量"指令-期望输出"对的高质量数据集,对预训练好的基础语言模型进行微调。这一步使模型学会理解并执行人类的指令,为其后续的对齐打下基础。‌
  • 奖励模型(RM)训练‌:这是RLHF的核心环节。收集大量人类对模型生成的多个回复进行偏好排序的数据(例如,人类判断哪个回复更好、更安全、更有帮助)。利用这些偏好数据,训练一个独立的‌奖励模型‌(Reward Model)。这个模型的任务是学习预测人类对任何给定回复的偏好程度,并为其打一个分数。‌
  • 强化学习优化(PPO)‌:将经过监督微调的模型视为一个"策略"(Policy)。使用强化学习算法(最常用的是‌近端策略优化‌,PPO)来优化这个策略。在训练过程中,模型生成回复,奖励模型会为这些回复打分。强化学习算法的目标是最大化模型生成回复的预期奖励(即让奖励模型打高分),同时通过一个KL惩罚项来防止模型的策略与原始的监督微调模型偏离太远,从而保持模型的稳定性和泛化能力。‌

简而言之,RLHF通过"人类评估 -> 训练奖励模型 -> 用奖励模型指导模型优化"的闭环,让模型学会"讨好"人类的偏好。‌

RLHF 的痛点

RLHF 能达到较高的对齐质量,但训练过程复杂,需要同时维护多个模型副本,显存开销大,对算力要求极高。‌

RLHF 效果强,但也很"重":

  • 流程复杂:要三步训练,特别是强化学习(PPO)部分非常难调;
  • 不稳定:奖励模型噪声会导致训练不收敛;
  • 成本高:每次都要采样、评估、梯度更新,计算量巨大;
  • 不可控性:有时候模型会学会"讨好"奖励模型,而非真正遵循人类偏好(Reward Hacking)。

    强化学习的基本概念
    要理解RLHF,首先需要了解强化学习(Reinforcement Learning, RL)的基本概念。强化学习是一种通过与环境互动来学习最优行为的机器学习范式。
    强化学习系统通常包含以下核心组件:
  • 智能体(Agent):执行动作并从环境中学习的实体
  • 环境(Environment):智能体所处的外部环境,能够接收智能体的动作并返回状态和奖励
  • 状态(State):环境在某一时刻的表示
  • 动作(Action):智能体可以执行的行为
  • 奖励(Reward):环境对智能体动作的反馈信号
  • 策略(Policy):智能体从状态到动作的映射函数

强化学习的目标 是学习一个最优策略π*,使得智能体在与环境交互过程中获得的累积奖励最大化:

价值函数与策略梯度

在强化学习中,常用的优化方法包括基于价值函数的方法(如Q-learning)和基于策略梯度的方法。对于大语言模型的RLHF,策略梯度方法更为常用,因为它能够直接优化策略,而不需要显式地学习价值函数。

策略梯度方法的核心思想是通过调整策略参数,使得累积奖励的期望增加。

人类反馈的类型

在RLHF中,常见的人类反馈类型包括:

  1. 比较反馈(Comparative Feedback):人类评估者对多个模型输出进行比较,指出哪个更好
  2. 评分反馈(Rating Feedback):人类评估者为模型输出分配一个数值评分
  3. 纠正反馈(Corrective Feedback):人类评估者直接修改或提供更好的输出
  4. 偏好排序(Preference Ranking):人类评估者对多个输出进行排序

RLHF的数学模型

RLHF可以看作是传统强化学习的一个扩展,其核心区别在于奖励信号的来源。在RLHF中,我们首先训练一个奖励模型(Reward Model, RM)来预测人类的偏好,然后使用这个奖励模型来指导策略的优化。

RLHF的实现流程

参考链接:https://developer.aliyun.com/article/1684041

RLHF是一个多阶段的复杂过程,通常包括以下四个主要步骤:

  1. 预训练模型选择与准备
    • 模型架构与规模:不同的模型架构(如Transformer、GPT、LLaMA等)在RLHF中的表现可能有所不同。模型规模(参数量)也是一个重要考量因素,更大的模型通常具有更强的学习能力,但也需要更多的计算资源。
    • 预训练数据质量:预训练数据的质量对最终模型性能有重要影响。优质的预训练数据应具有多样性、准确性和代表性。
    • 模型准备步骤:
      • 模型加载与配置:加载预训练权重并配置模型参数
      • 分词器设置:确保分词器与模型兼容,并设置适当的特殊标记
      • 设备分配:根据可用硬件资源,将模型分配到合适的计算设备上
  2. 监督微调(Supervised Fine-Tuning, SFT)
    监督微调是RLHF流程的第一步,其目标是让模型学习基本的任务格式和指令遵循能力。
    • SFT数据集构建:SFT数据集通常包含高质量的指令-响应对,这些数据可以来自:人工编写的高质量示例;公开的指令微调数据集(如Alpaca、ShareGPT等);从人类评估者那里收集的示范;通过自指导(Self-Instruct)方法生成的数据
    • SFT实现方法:
      • 数据预处理:格式化数据以适应模型输入要求
      • 模型训练:使用监督学习方法训练模型
      • 模型评估:评估模型在验证集上的性能
      • 模型保存:保存微调后的模型权重
      • 以下是使用HuggingFace Transformers库实现SFT的示例代码:
python 复制代码
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
from datasets import load_dataset

def sft_training(model_name, dataset_path, output_dir):
    # 加载模型和分词器
    model = AutoModelForCausalLM.from_pretrained(model_name)
    tokenizer = AutoTokenizer.from_pretrained(model_name)

    # 加载数据集
    dataset = load_dataset("json", data_files=dataset_path)

    # 数据预处理函数
    def preprocess_function(examples):
        texts = [f"### 指令:\n{instruction}\n### 回答:\n{output}" 
                for instruction, output in zip(examples["instruction"], examples["output"])]
        return tokenizer(texts, truncation=True, max_length=1024)

    # 预处理数据集
    tokenized_dataset = dataset.map(preprocess_function, batched=True)

    # 设置训练参数
    training_args = TrainingArguments(
        output_dir=output_dir,
        learning_rate=2e-5,
        per_device_train_batch_size=4,
        per_device_eval_batch_size=4,
        num_train_epochs=3,
        weight_decay=0.01,
        evaluation_strategy="steps",
        save_steps=500,
        eval_steps=500,
    )

    # 创建训练器
    trainer = Trainer(
        model=model,
        args=training_args,
        train_dataset=tokenized_dataset["train"],
        eval_dataset=tokenized_dataset["test"] if "test" in tokenized_dataset else None,
        tokenizer=tokenizer,
    )

    # 开始训练
    trainer.train()

    # 保存模型
    trainer.save_model(output_dir)

    return model
  1. 奖励模型(Reward Model, RM)训练
    奖励模型是RLHF的核心组件,它负责将人类偏好转换为可用于强化学习的数值奖励信号。
    • 人类偏好数据收集:收集人类偏好数据是训练奖励模型的关键步骤。常见的数据收集方法包括:
      • 比较排序:让人类评估者对多个模型输出进行排序
      • 两两比较:让人类评估者比较两个模型输出,选择更好的一个
      • 评分系统:让人类评估者为模型输出打分(如1-10分)
    • 奖励模型架构设计:奖励模型通常采用与基础语言模型相似的架构,但最后一层被替换为输出标量奖励的层。常见的奖励模型架构包括:
      • 基于分类头的架构:在语言模型顶部添加一个线性层,输出单个标量值
      • 基于对比学习的架构:学习区分好/坏输出的嵌入空间
      • 多任务奖励模型:同时预测多个维度的奖励(如有用性、安全性等)
    • 奖励模型训练方法:训练奖励模型的常用方法是基于比较学习的方法。给定一个输入x和两个输出y1、y2,如果人类评估者认为y1比y2好,我们希望奖励模型满足f(x,y1) > f(x,y2)。
    • 以下是训练奖励模型的示例代码:
python 复制代码
from transformers import AutoModelForSequenceClassification, AutoTokenizer, TrainingArguments, Trainer
from datasets import load_dataset
import torch

def train_reward_model(base_model_name, preference_data_path, output_dir):
    # 加载模型和分词器
    model = AutoModelForSequenceClassification.from_pretrained(
        base_model_name,
        num_labels=1,  # 输出单个标量奖励
        problem_type="regression"
    )
    tokenizer = AutoTokenizer.from_pretrained(base_model_name)

    # 加载偏好数据集
    dataset = load_dataset("json", data_files=preference_data_path)

    # 数据预处理函数
    def preprocess_function(examples):
        # 假设数据格式为{"prompt": "...", "chosen": "...", "rejected": "..."}
        chosen_inputs = tokenizer(
            [f"{prompt}{chosen}" for prompt, chosen in zip(examples["prompt"], examples["chosen"])],
            truncation=True,
            max_length=1024
        )
        rejected_inputs = tokenizer(
            [f"{prompt}{rejected}" for prompt, rejected in zip(examples["prompt"], examples["rejected"])],
            truncation=True,
            max_length=1024
        )

        # 合并数据
        inputs = {
   }
        for key in chosen_inputs:
            inputs[f"{key}_chosen"] = chosen_inputs[key]
            inputs[f"{key}_rejected"] = rejected_inputs[key]

        return inputs

    # 预处理数据集
    tokenized_dataset = dataset.map(preprocess_function, batched=True)

    # 定义对比损失函数
    class RewardModelTrainer(Trainer):
        def compute_loss(self, model, inputs, return_outputs=False):
            # 提取chosen和rejected数据
            chosen_input_ids = inputs.pop("input_ids_chosen")
            chosen_attention_mask = inputs.pop("attention_mask_chosen")
            rejected_input_ids = inputs.pop("input_ids_rejected")
            rejected_attention_mask = inputs.pop("attention_mask_rejected")

            # 获取chosen和rejected的奖励
            chosen_outputs = model(
                input_ids=chosen_input_ids,
                attention_mask=chosen_attention_mask
            )
            chosen_rewards = chosen_outputs.logits.squeeze(-1)

            rejected_outputs = model(
                input_ids=rejected_input_ids,
                attention_mask=rejected_attention_mask
            )
            rejected_rewards = rejected_outputs.logits.squeeze(-1)

            # 计算对比损失
            # 我们希望chosen_rewards > rejected_rewards
            loss = -torch.nn.functional.logsigmoid(chosen_rewards - rejected_rewards).mean()

            return (loss, chosen_outputs) if return_outputs else loss

    # 设置训练参数
    training_args = TrainingArguments(
        output_dir=output_dir,
        learning_rate=1e-5,
        per_device_train_batch_size=4,
        per_device_eval_batch_size=4,
        num_train_epochs=3,
        weight_decay=0.01,
        evaluation_strategy="steps",
        save_steps=500,
        eval_steps=500,
    )

    # 创建自定义训练器
    trainer = RewardModelTrainer(
        model=model,
        args=training_args,
        train_dataset=tokenized_dataset["train"],
        eval_dataset=tokenized_dataset["test"] if "test" in tokenized_dataset else None,
        tokenizer=tokenizer,
    )

    # 开始训练
    trainer.train()

    # 保存模型
    trainer.save_model(output_dir)

    return model
  1. 强化学习优化(通常使用PPO算法)
    在获得奖励模型后,我们使用强化学习算法(通常是PPO)对SFT模型进行进一步优化,使其输出更符合人类偏好。
    • PPO算法原理:近端策略优化(Proximal Policy Optimization, PPO)是一种流行的策略梯度算法,它通过限制策略更新的幅度,确保训练的稳定性。
    • RLHF中的PPO实现:在RLHF中应用PPO时,需要考虑以下特殊因素:
      • 参考模型:通常使用SFT模型作为参考模型,以限制策略偏离
      • KL散度惩罚:为了防止模型输出过于偏离原始分布,通常会添加KL散度惩罚
      • 值函数估计:使用值函数或广义优势估计(GAE)来估计优势函数
      • 混合奖励:可以结合奖励模型的奖励和其他辅助奖励(如长度惩罚)
      • 以下是在RLHF中应用PPO的示例代码:
python 复制代码
from transformers import AutoModelForCausalLM, AutoTokenizer
from trl import PPOTrainer, PPOConfig
from peft import LoraConfig, get_peft_model
import torch

def rlhf_ppo_training(sft_model_path, reward_model_path, dataset_path, output_dir):
    # 加载SFT模型和分词器
    model = AutoModelForCausalLM.from_pretrained(sft_model_path)
    tokenizer = AutoTokenizer.from_pretrained(sft_model_path)

    # 加载奖励模型
    reward_model = AutoModelForSequenceClassification.from_pretrained(reward_model_path, num_labels=1)

    # 可选:使用LoRA进行参数高效微调
    lora_config = LoraConfig(
        r=16,
        lora_alpha=32,
        target_modules=["q_proj", "v_proj"],
        lora_dropout=0.05,
        bias="none",
        task_type="CAUSAL_LM"
    )
    model = get_peft_model(model, lora_config)

    # 加载数据集
    dataset = load_dataset("json", data_files=dataset_path)

    # 设置PPO配置
    ppo_config = PPOConfig(
        model_name=sft_model_path,
        learning_rate=1e-5,
        batch_size=4,
        mini_batch_size=2,
        gradient_accumulation_steps=4,
        optimize_cuda_cache=True,
        early_stopping=False,
        target_kl=0.1,
        kl_penalty="kl",
        seed=42,
    )

    # 定义奖励函数
    def reward_fn(samples, outputs):
        # 将样本和输出格式化为奖励模型的输入
        texts = [f"{sample['prompt']}{output['response']}" for sample, output in zip(samples, outputs)]
        inputs = tokenizer(texts, padding=True, truncation=True, max_length=1024, return_tensors="pt")

        # 移动到正确的设备
        inputs = {
   k: v.to(reward_model.device) for k, v in inputs.items()}

        # 获取奖励
        with torch.no_grad():
            rewards = reward_model(**inputs).logits.squeeze(-1)

        return rewards

    # 创建PPO训练器
    ppo_trainer = PPOTrainer(
        model=model,
        ref_model=None,  # 使用当前模型作为参考
        tokenizer=tokenizer,
        args=ppo_config,
        dataset=dataset["train"],
        data_collator=lambda x: x,
        tokenizer_kwargs={
   "truncation": True, "max_length": 1024},
    )

    # 开始PPO训练
    for epoch in range(3):
        for batch in ppo_trainer.dataloader:
            # 生成响应
            response_tensors = []
            for prompt in batch:
                input_ids = tokenizer(prompt["prompt"], return_tensors="pt").input_ids.to(model.device)
                response = model.generate(
                    input_ids=input_ids,
                    max_new_tokens=128,
                    temperature=0.7,
                    do_sample=True,
                )
                response_tensors.append(response.squeeze())

            # 计算奖励
            texts = [tokenizer.decode(response) for response in response_tensors]
            rewards = reward_fn(batch, [{
   "response": text} for text in texts])

            # 执行PPO步骤
            stats = ppo_trainer.step(batch, response_tensors, rewards)
            ppo_trainer.log_stats(stats, batch, rewards)

    # 保存模型
    ppo_trainer.save_pretrained(output_dir)

    return model

RLHF的完整工作流

将以上四个步骤整合起来,RLHF的完整工作流如下:

预训练模型 → 监督微调(SFT) → 生成候选输出 → 人类偏好标注 → 奖励模型训练 → PPO优化 → 对齐模型

在实际应用中,这一流程可能需要多次迭代,以不断改进模型性能。此外,还需要监控训练过程中的各种指标,如奖励值、KL散度、模型输出质量等,以确保训练的稳定性和有效性。

2.DPO(直接偏好优化)‌

DPO 是一种更简洁高效的替代方案,它‌跳过了显式训练奖励模型的步骤‌。DPO 不用训练奖励模型,也不用强化学习,而是直接在原始语言模型上优化人类偏好。2023 年,Anthropic 提出了 DPO(Direct Preference Optimization),它一出现就成了替代 RLHF 的轻量方案。

  • 其核心思想是:DPO通过数学变换将传统的基于人类反馈的强化学习(RLHF)中的奖励建模和策略优化合并为一个单阶段的分类问题,直接使用标注的偏好数据(如"好答案"和"坏答案")来训练模型。‌‌
  • 相比 RLHF,DPO 只需训练一个模型,训练过程更稳定,显存需求更低,且避免了奖励模型可能存在的偏差或"奖励黑客"问题(如模型为获取高分而生成冗长无用的回答)。
  • 对于中小团队或资源有限的场景,DPO 被认为是当前性价比最高的对齐方法。‌

主要特点

  • 端到端可训练:不需要单独的奖励模型,也不需要强化学习框架,直接基于语言建模损失优化即可,简化了流程。‌‌
  • 计算成本低‌:由于是单阶段训练且无需复杂强化学习迭代,DPO的计算开销较小。‌‌
  • 训练稳定性高‌:避免了策略梯度方差问题,训练过程更稳定。‌‌
    正因如此,现在大多数开源模型都采用 SFT + DPO 流程,既能获得接近 RLHF 的效果,又节省了大部分训练成本。

与RLHF对比

  • 训练流程‌:DPO是单阶段优化,而RLHF需要两阶段(奖励模型训练+强化学习)。‌‌
  • 数据依赖‌:DPO直接依赖标注偏好数据的质量,而RLHF的奖励模型可以部分泛化噪声。‌‌
  • 灵活性‌:DPO的偏好建模相对静态,RLHF支持动态调整奖励函数。‌‌

其核心原理可概括为以下几点:

  • 直接优化目标模型‌:DPO跳过了传统RLHF(基于人类反馈的强化学习)中训练奖励模型和使用PPO(近端策略优化)强化学习的复杂步骤。它直接利用人类标注的偏好数据(即对于同一提示,哪个回答更受青睐)来优化目标模型的参数。 ‌
  • 基于偏好数据的损失函数‌:DPO的数学原理源于对原始偏好对齐优化目标的推导。它将模型参数更新的目标转化为一个可以直接通过监督式微调(SFT)方式实现的损失函数。该损失函数的核心是比较模型对偏好回答(chosen response)和拒绝回答(rejected response)的对数概率差异,并引入一个温度参数β来控制对齐的强度。 ‌
  • 引入参考模型以稳定训练‌:DPO在优化过程中会使用一个参考模型(通常是监督微调SFT后的模型),其作用类似于RLHF中的KL散度惩罚项。这有助于防止训练后的模型参数与参考模型偏离过大,从而避免模型性能退化或输出变得不稳定。 ‌

总而言之,DPO通过一个精巧的数学转换,将复杂的偏好对齐问题简化为一个直接优化问题,显著提高了训练的稳定性和效率。

‌3.KTO(基于心理学的对齐方法)‌

KTO 是一种较新的方法,其设计灵感来源于心理学中的"损失厌恶"理论(即人们对损失的敏感度高于对等量收益的敏感度)。

  • 它使用单条标注数据({问题, 回答, 标签(+1/-1)}),其中 +1 表示"偏好",-1 表示"不偏好"。
  • KTO 在优化时对"不偏好"样本施加更强的惩罚,从而更有效地抑制有害或不相关的行为,同时对"偏好"样本的奖励相对温和。
  • 这种"重罚轻赏"的机制使其在低数据量下也能表现良好,训练门槛更低,适合对安全性要求高但标注数据有限的场景。‌

4.RRHF(基于排序的奖励人类反馈)‌

RRHF 是一种介于监督微调和强化学习之间的方法。

它通过收集来自不同来源(如模型自身、其他大模型、人类专家)的响应,并对这些响应进行排序,然后使用排序损失函数直接优化模型。

与 RLHF 相比,RRHF 不需要复杂的 PPO 算法,通常只需 1-2 个模型,训练更稳定,且在部分基准测试上能与 PPO 性能持平。‌

综上,‌DPO‌ 因其高效与易用性,已成为当前最热门的对齐方案;而 ‌RLHF‌ 仍是性能上限的标杆;‌KTO‌ 和 ‌RRHF‌ 则为不同资源约束下的场景提供了有价值的替代路径。‌

DeepSeek中的强化学习训练

传统大模型的训练依赖海量文本的统计规律学习,本质是模式匹配的"记忆式学习"。例如,GPT系列通过预测下一个单词完成训练,但在需要多步逻辑推导的场景(如数学证明、因果分析)中表现乏力。DeepSeek的核心突破在于将强化学习(Reinforcement Learning, RL)引入模型训练,通过构建"环境-动作-奖励"的闭环,让模型在试错中主动构建推理路径。

DeepSeek的推理训练框架可抽象为马尔可夫决策过程(MDP)模型:

  • 状态(State):当前输入的文本上下文(如待解答的数学题)
  • 动作(Action):模型生成的下一个token或推理步骤
  • 奖励函数(Reward):基于逻辑正确性、连贯性等指标的反馈信号

奖励函数的创新设计:多维度反馈机制

DeepSeek的奖励函数突破了传统"正确/错误"的二元评价,引入分层奖励:

  • 基础奖励:答案的最终正确性(如数学题结果是否匹配)
  • 过程奖励:中间步骤的逻辑合理性(如是否引用已知条件)
  • 效率奖励:推理路径的简洁性(如避免冗余计算)

DeepSeek的强化学习训练框架:三阶段迭代优化
阶段一 :监督微调(SFT)构建基础能力

在强化学习前,DeepSeek首先通过监督微调让模型具备基础的语言理解和生成能力。此阶段使用高质量的推理数据集(如数学证明、逻辑谜题),通过交叉熵损失优化模型参数。

关键技术点:

  • 数据增强:对同一问题生成多种解题路径,增加模型对不同推理方式的适应性
  • 长文本建模:采用Transformer-XL架构处理超长上下文,避免中间步骤丢失

阶段二 :近端策略优化(PPO)实现策略迭代

PPO算法是DeepSeek强化学习的核心,其优势在于平衡探索与利用:

  • 策略网络(Actor):生成推理步骤的候选方案
  • 价值网络(Critic):评估当前状态的价值,指导策略更新

训练流程:

  • 模型根据输入问题生成多个推理路径
  • 价值网络评估各路径的预期奖励
  • 策略网络根据评估结果调整生成概率
  • 重复迭代直至收敛

阶段三 :人类反馈强化学习(RLHF)对齐人类价值观

为避免模型生成"技术正确但不符合常识"的推理(如用物理定律证明魔法存在),DeepSeek引入人类反馈:

  • 偏好排序:让标注员对不同推理路径进行排序
  • 奖励建模:训练一个奖励模型拟合人类偏好
  • 策略优化:基于拟合的奖励函数进一步微调模型
相关推荐
Juicedata5 小时前
JuiceFS 企业版 5.3 特性详解:单文件系统支持超 5,000 亿文件,首次引入 RDMA
大数据·人工智能·机器学习·性能优化·开源
Piar1231sdafa5 小时前
蓝莓目标检测——改进YOLO11-C2TSSA-DYT-Mona模型实现
人工智能·目标检测·计算机视觉
愚公搬代码5 小时前
【愚公系列】《AI短视频创作一本通》002-AI引爆短视频创作革命(短视频创作者必备的能力)
人工智能
lxl13075 小时前
学习C++(5)运算符重载+赋值运算符重载
学习
数据猿视觉5 小时前
新品上市|奢音S5耳夹耳机:3.5g无感佩戴,178.8元全场景适配
人工智能
蚁巡信息巡查系统5 小时前
网站信息发布再巡查机制怎么建立?
大数据·人工智能·数据挖掘·内容运营
AI浩5 小时前
C-RADIOv4(技术报告)
人工智能·目标检测
Purple Coder5 小时前
AI赋予超导材料预测论文初稿
人工智能
Data_Journal5 小时前
Scrapy vs. Crawlee —— 哪个更好?!
运维·人工智能·爬虫·媒体·社媒营销
云边云科技_云网融合5 小时前
AIoT智能物联网平台:架构解析与边缘应用新图景
大数据·网络·人工智能·安全