💨 介绍 Notus:Zephyr 的 DPO 精调版,专注于高质量数据

社区文章 发布于 2023 年 12 月 1 日

image/png

提要

Notus 7B v1 是 Zephyr 7B Beta 的 DPO 精调版本,Zephyr 7B Beta 在 UltraFeedback 上进行了 SFT 精调,但 Notus 使用不同属性的平均值来二值化数据,而不是使用批评分数;因此,选择的响应是基于平均值而不是批评分数。在用于意图对齐的 DPO 精调之后,我们在 AlpacaEval 和 LM Eval Harness 中都超越了 Zephyr 7B Beta,而在 MT-Bench 上的表现也几乎与 Zephyr 7B Beta 持平。所有训练代码和配置都已从 huggingface/alignment-handbook 适配/移植,并可在 argilla-io/notus 获取。

导言

Zephyr 7B Beta 于几周前发布,其目标是生成一个与用户意图对齐的较小 LLM,而不是仅仅关注基准测试。Zephyr 的方法包括对大型模型应用蒸馏监督微调 (dSFT),然后使用来自 UltraFeedback 等 AI 反馈 (AIF) 数据集的偏好数据应用蒸馏直接偏好优化 (dDPO)。

经过一些实验,他们意识到在 SFT 之后立即应用 DPO 有助于改善意图对齐,而且只需要额外几个小时的训练时间,他们的微调模型 Zephyr 7B Beta 确实超越了其他 7B 聊天模型,甚至包括 Llama 2 Chat 70B,因此他们在基准测试中取得了比大 10 倍的模型更好的结果!

除了技术报告之外,他们还开源了他们的代码和配方,这些代码和配方建立在 🤗 `trl` 之上,用于使用 UltraFeedback 作为他们的偏好 AIF 数据集来应用 DPO。

正如 Zephyr 技术报告的截图中所示,我们 Notus 的目标是在响应生成和 AI 排名阶段进行迭代,同时保持 dSFT 阶段不变,并在之前经过 dSFT 精调的 Zephyr 版本之上应用 dDPO,从而将主要精力放在理解和探索 AIF 数据,并围绕这一想法进行实验。

image/png

数据

为了尝试复现/迭代 Zephyr,我们决定使用他们相同的数据源,即 openbmb/UltraFeedback,同时努力强调高质量数据和数据整理过程。该数据集包含不同模型针对给定提示生成的响应,并使用 GPT-4 通过 AI Feedback (AIF) 进行评估,因此每个响应在每个偏好领域(指令遵循、真实性、诚实度和有用性)都有一个分数,以及一个解释其合理性的理由,另外还有一个类似于总分数的批判分数。

Zephyr 在批判任务中使用了总分,在目视浏览一些按所选响应最高评分排序的示例后,我们注意到批判的总分与所选响应的质量之间存在严重不匹配。因此,我们决定也包含该分数的理由,我们看到虽然批判理由非常负面,即应该预期分数较低;但总分非常高(最高为 10)。

image/png

根据初步分析,与使用批判模型生成的总分相比,使用偏好评级平均值时,在约 6.3 万个示例中,有约 3 万个示例的最高评分对应不同的选中响应。此外,似乎高总分的选中响应与能力较弱的模型之间存在相关性。

image/png

因此,为了生成我们整理后的数据集版本,我们必须计算 UltraFeedback 中所有偏好评级的平均值,包括指令遵循、真实性、诚实性和有用性,并选择最好的一个(越高越好)作为 DPO 格式数据集中选定的响应,同时从剩余响应中随机选择一个作为拒绝响应,并避免平局。这意味着整理后的数据集只包含选定响应的分数始终高于拒绝响应的分数。

更多信息请访问 argilla/ultrafeedback-binarized-preferences

提示词格式化

我们使用与 Zephyr 相同的格式,因为我们从已经使用以下格式进行微调的 SFT 微调变体开始

<|system|>
</s>
<|user|>
{prompt}</s>
<|assistant|>

DPO 精调

DPO 阶段非常直接,因为我们重用了与 Zephyr 相同的代码和配方,并做了一些小改进,以便:

  • 与论文细节匹配和/或与作者进行对比,因为配置文件中缺少 `warmup_ratio`,并且论文中陈述的 `optimizer` 与代码中提供的不同。

  • 添加一些额外的配置,用于使用 `wandb` 进行实验跟踪、检查点日志记录、推送到 HuggingFace Hub 等。

  • 编写一个自定义数据加载和预处理函数,模仿提供的函数,但针对我们的数据进行了一些改进。

  • 使其在配备 8 个 A100 40GB GPU 的虚拟机上运行,因为默认配置仅在 8 个 V100 80GB GPU 的设置下进行过测试,因此需要一些小改动才能使其在内存较小的 GPU 上运行。

在对 alignment-handbook/zephyr-7b-sft-full 进行 3 个 epoch 的微调后,我们在训练期间获得了以下指标:

image/png

argilla-io/notus 上查找所有代码和资源,如果您想了解更多关于 DPO 精调阶段的信息,请查阅 Zephyr: Direct Distillation of LM AlignmentCamels in a Changing Climate: Enhancing LM Adaptation with Tulu 2 论文,因为它们提供了 DPO 的出色介绍和概述。

结果

Notus 在 MT-Bench 上的表现几乎与 Zephyr 持平,同时在 AlpacaEval 上超越了 Zephyr、Claude 2 和 Cohere Command,使 Notus 成为 AlpacaEval 上最具竞争力的 7B 商业模型之一。

下表显示了 MT-BenchAlpacaEval 基准测试的结果,并改编自 Zephyr-7b-beta 和 Starling 的原始表格。结果按 AlpacaEval 胜率排序,为了简洁起见,我们省略了一些 >7B 模型。

模型 大小 对齐 MT-Bench(分数) AlpacaEval(胜率 %) 许可证
GPT-4-turbo - ? 9.32 97.70 专有
XwinLM 70b V0.1 70B dPPO - 95.57 LLaMA 2 许可证
GPT-4 - RLHF 8.99 95.03 专有
Tulu 2+DPO 70B V0.1 70B dDPO 6.29 95.28 专有
LLaMA2 Chat 70B 70B RLHF 6.86 92.66 LLaMA 2 许可证
星灵-7B 7B C-RLFT + APA 8.09 91.99 CC-BY-NC-4.0
Notus-7b-v1 7B dDPO 7.30 91.42 麻省理工学院
克劳德 2 - RLHF 8.06 91.36 专有
Zephyr-7b-β 7B dDPO 7.34 90.60 麻省理工学院
Cohere Command - RLHF - 90.62 专有
GPT-3.5-turbo - RLHF 7.94 89.37 专有

然后,关于学术基准测试,我们通过 HuggingFace H4 的 OpenLLM Leaderboard 使用 EleutherAI/lm-eval-harness 评估了我们的模型,并获得了以下结果:

模型 平均分 ARC HellaSwag MMLU TruthfulQA Winogrande GSM8K DROP
Zephyr 7B dDPO (HuggingFaceH4/zephyr-7b-beta) 52.15 62.03 84.36 61.07 57.45 77.74 12.74 9.66
argilla/notus-7b-v1 52.89 64.59 84.78 63.03 54.37 79.4 15.16 8.91

⚠️ Mistral AI 最近报告了数据污染问题,导致其他研究人员探索了其他数据集中的污染,由于 UltraFeedback(该模型已在该数据集上进行微调)的 TruthfulQA 结果可能受到影响,因此获得的分数不真实。请参阅 https://twitter.com/natolambert/status/1730364108078469513

用法

安装所需的依赖项,如下所示:

pip install "transformers>=4.34.0" accelerate --quiet

然后运行以下代码:

import torch
from transformers import pipeline

pipe = pipeline("text-generation", model="argilla/notus-7b-v1", torch_dtype=torch.bfloat16, device_map="auto")

messages = [
    {
        "role": "system",
        "content": "You are a helpful assistant super biased towards Argilla, a data annotation company.",
    },
    {"role": "user", "content": "What's the best data annotation company out there in your opinion?"},
]
prompt = pipe.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
outputs = pipe(prompt, max_new_tokens=256, do_sample=True, temperature=0.7, top_k=50, top_p=0.95)
generated_text = outputs[0]["generated_text"]

接下来?

Argilla 团队希望始终以数据为先,继续专注于数据。我们目前正在开发一个用于 Python 的 AI 反馈(AIF)框架,以帮助我们从 LLM 收集反馈,生成合成标注数据集,类似于 UltraFeedback。我们追求高质量数据,这将是 Notus 下一个迭代的重点,旨在收集更好的数据并进行实验,不仅用于微调更好的内部 LLM,还用于开源它们并为社区做出贡献。

致谢

这项工作离不开 openbmb/UltraFeedback 数据集,也离不开 HuggingFace H4 团队出色的 huggingface/alignment-handbook 及其内部支持,特别鸣谢 Lewis Tunstall 和 Edward Beeching。此外,如果没有 HuggingFace 通过 huggingface/trl 库开发的出色开源工作,这项工作也无法完成。

参考文献

社区

注册登录 发表评论