偏好微调(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 的偏好数据集示例。
使用一段 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 ) )
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 的偏好微调
准备好数据集后,您可以按以下步骤运行偏好微调:
前往 OpenAI 的控制台。
找到微调部分并选择 Create 以创建新的微调作业。
选择直接偏好优化作为微调方法。
上传您的训练数据和验证数据(如果有)。
OpenAI 允许您指定超参数,但您也可以留空,由系统自动决定。根据数据集规模,训练可能需要一段时间。
结语
直接偏好优化是 OpenAI 微调工具箱中的一项实用新功能,能够让您明确控制模型响应的语气与风格,使其更符合用户偏好。
与 OpenAI 的蒸馏、强化微调和有监督微调相似,偏好微调中您最主要的工作是按 OpenAI 的格式与结构准备数据集,剩下的由其工具来完成:
如需进一步了解,推荐阅读以下资源:
偏好微调(PFT)是一种长期用于微调大语言模型(LLM)的技术。OpenAI 最近在其“12 天功能发布”活动中将其作为一部分推出。
除了有监督微调(SFT)和强化微调(RFT)之外,PFT 是将大语言模型与用户偏好对齐的另一种方式。
在本文中,我将快速解释偏好微调,并展示如何在 OpenAI 的开发者控制台中以最小成本使用它。
什么是 OpenAI 的偏好微调?
标准有监督微调的目标是在给定特定输入时让模型返回特定输出,而偏好微调(PFT)的重点则在于引导模型生成我们“喜欢”的响应,并避开我们“不喜欢”的响应。
直接偏好优化(DPO)是 PFT 中的标准技术,因其简单高效而作为一种强有力的对齐方法受到欢迎。
与 来自人类反馈的强化学习(RLHF)不同,DPO 不需要复杂的奖励模型来对齐大语言模型(LLM),而是将对齐问题视为对损失函数的“直接”优化。这使得 DPO 更易实现且计算效率更高。
与其他对齐方法一样,DPO 需要的数据集包含针对给定提示的一对“偏好”和“非偏好”响应。在 OpenAI 的 PFT 中,与其他微调方法类似,数据集必须采用JSONL 格式,并具有以下结构:
OpenAI 官方 文档建议将 SFT 与 PFT 结合使用,以获得更好的对齐效果。像 PFT 这样的对齐技术通常在模型先基于有监督数据集完成微调后再使用。将 SFT 与 PFT 结合被视为行业标准,也为 OpenAI 所倡导。
如何为偏好微调格式化数据集
在开始之前,我们需要确保数据集符合 OpenAI 偏好微调的格式要求。
创建偏好数据集有多种方式。一种方法是针对不同的temperature、top_k 或system prompt 生成一对 LLM 输出,然后使用另一种(最好是更强大的)LLM,从中选择一个作为“偏好”,另一个作为“非偏好”。
在本教程的演示中,我将从 Hugging Face 下载一个偏好数据集并对其重构。我将使用 argilla/ultrafeedback-binarized-preferences 这一偏好数据集,但我只获取前 50 行。
来自 Hugging Face 的偏好数据集示例。
使用一段 Python 脚本就足以将数据集结构转换为 OpenAI 微调所需的格式,您也可以根据您的应用选择其他做法。
请确保数据集的格式是
jsonl而非json。您的文件末尾很可能有一个空行,请务必将其删除。如何运行 OpenAI 的偏好微调
准备好数据集后,您可以按以下步骤运行偏好微调:
OpenAI 允许您指定超参数,但您也可以留空,由系统自动决定。根据数据集规模,训练可能需要一段时间。
结语
直接偏好优化是 OpenAI 微调工具箱中的一项实用新功能,能够让您明确控制模型响应的语气与风格,使其更符合用户偏好。
与 OpenAI 的蒸馏、强化微调和有监督微调相似,偏好微调中您最主要的工作是按 OpenAI 的格式与结构准备数据集,剩下的由其工具来完成:
如需进一步了解,推荐阅读以下资源: