跳至主要内容

OpenAI 偏好微调:示例指南

了解如何使用 OpenAI 的偏好微调和直接偏好优化,使大语言模型与用户偏好对齐。
· 8分钟 阅读

使用 AI 探索

偏好微调(PFT)是一种长期用于微调大语言模型(LLM)的技术。OpenAI 最近在其“12 天功能发布”活动中将其作为一部分推出。

除了有监督微调(SFT)和强化微调(RFT)之外,PFT 是将大语言模型与用户偏好对齐的另一种方式。

在本文中,我将快速解释偏好微调,并展示如何在 OpenAI 的开发者控制台中以最小成本使用它。

什么是 OpenAI 的偏好微调?

标准有监督微调的目标是在给定特定输入时让模型返回特定输出,而偏好微调(PFT)的重点则在于引导模型生成我们“喜欢”的响应,并避开我们“不喜欢”的响应。

直接偏好优化(DPO)是 PFT 中的标准技术,因其简单高效而作为一种强有力的对齐方法受到欢迎。

与 来自人类反馈的强化学习(RLHF)不同,DPO 不需要复杂的奖励模型来对齐大语言模型(LLM),而是将对齐问题视为对损失函数的“直接”优化。这使得 DPO 更易实现且计算效率更高。

与其他对齐方法一样,DPO 需要的数据集包含针对给定提示的一对“偏好”和“非偏好”响应。在 OpenAI 的 PFT 中,与其他微调方法类似,数据集必须采用JSONL 格式,并具有以下结构:

{
  "input": {
    "messages": [
      {
        "role": "user",
        "content": "Hello, can you tell me how cold San Francisco is today?"
      }
    ],
    "tools": [],
    "parallel_tool_calls": true
  },
  "preferred_output": [
    {
      "role": "assistant",
      "content": "Today in San Francisco, it is not quite cold as expected. Morning clouds will give away to sunshine, with a high near 68°F (20°C) and a low around 57°F (14°C)."
    }
  ],
  "non_preferred_output": [
    {
      "role": "assistant",
      "content": "It is not particularly cold in San Francisco today."
    }
  ]
}

OpenAI 官方 文档建议将 SFT 与 PFT 结合使用,以获得更好的对齐效果。像 PFT 这样的对齐技术通常在模型先基于有监督数据集完成微调后再使用。将 SFT 与 PFT 结合被视为行业标准,也为 OpenAI 所倡导。

如何为偏好微调格式化数据集

在开始之前,我们需要确保数据集符合 OpenAI 偏好微调的格式要求。

创建偏好数据集有多种方式。一种方法是针对不同的temperature、top_k 或system prompt 生成一对 LLM 输出,然后使用另一种(最好是更强大的)LLM,从中选择一个作为“偏好”,另一个作为“非偏好”。

在本教程的演示中,我将从 Hugging Face 下载一个偏好数据集并对其重构。我将使用 argilla/ultrafeedback-binarized-preferences 这一偏好数据集,但我只获取前 50 行。

来自 Hugging Face 的偏好数据集示例。

来自 Hugging Face 的偏好数据集示例。

使用一段 Python 脚本就足以将数据集结构转换为 OpenAI 微调所需的格式,您也可以根据您的应用选择其他做法。

import datasets
import copy 
import json

instance_structure = {
  "input": {
    "messages": [
      {
        "role": "user",
        "content": ""
      }
    ],
    "tools": [],
    "parallel_tool_calls": True
  },
  "preferred_output": [
    {
      "role": "assistant",
      "content": ""
    }
  ],
  "non_preferred_output": [
    {
      "role": "assistant",
      "content": ""
    }
  ]
}

ds = datasets.load_dataset("argilla/ultrafeedback-binarized-preferences", trust_remote_code=True, split="train")
ds_sample = ds.select(range(50)) #select the first 50 rows
ds_list = []
for sample in ds_sample:
  instance = copy.deepcopy(instance_structure)
  instance["input"]["messages"][0]["content"] = sample["instruction"]
  instance["preferred_output"][0]["content"] = sample["chosen_response"]
  instance["non_preferred_output"][0]["content"] = sample["rejected_response"]
  ds_list.append(instance)
  
with open("preference_dataset.jsonl", 'w') as out:
  for json_line in ds_list:
      jout = json.dumps(json_line) + '\\n'
      out.write(jout)

请确保数据集的格式是 jsonl 而非 json。您的文件末尾很可能有一个空行,请务必将其删除。

如何运行 OpenAI 的偏好微调

准备好数据集后,您可以按以下步骤运行偏好微调:

  1. 前往 OpenAI 的控制台。
  2. 找到微调部分并选择Create 以创建新的微调作业。
  3. 选择直接偏好优化作为微调方法。
  4. 上传您的训练数据和验证数据(如果有)。

来自 OpenAI 控制台的微调截图。

OpenAI 允许您指定超参数,但您也可以留空,由系统自动决定。根据数据集规模,训练可能需要一段时间。

结语

直接偏好优化是 OpenAI 微调工具箱中的一项实用新功能,能够让您明确控制模型响应的语气与风格,使其更符合用户偏好。

与 OpenAI 的蒸馏、强化微调和有监督微调相似,偏好微调中您最主要的工作是按 OpenAI 的格式与结构准备数据集,剩下的由其工具来完成:

如需进一步了解,推荐阅读以下资源:

Hesam Sheikh Hassani

作者

Hesam Sheikh Hassani

人工智能硕士生与 AI 技术写作者。我分享最新的 AI 技术见解,让机器学习研究更易理解,并将复杂的 AI 主题加以简化,助您始终走在前沿。

主题