Notus

认识 Notus-7B:数据策展和开放科学在塑造人工智能的未来方面大有作为

2023 年 12 月 1 日

Álvaro Bartolomé, Gabriel Martín, Daniel Vila Suero

Notus 7B 是一个新的开源 LLM,使用直接偏好优化 (DPO) 和 AIF(AI 反馈)技术进行微调。该模型使用新版本的 Ultrafeedback 数据集进行微调。

遵循数据优先的方法,Notus-7B-v1 和 Zephyr-7B-beta 之间唯一的区别是用于 dDPO 的偏好数据集。

特别是,当我们开始构建 distilabel 时,我们投入时间理解和深入研究 UltraFeedback 数据集。使用 Argilla,我们发现在原始 UltraFeedback 数据集中存在数据问题,导致不良响应获得高分(更多细节请参见训练数据部分)。在策展了数百个数据点后,我们决定使用偏好评分而不是原始的评论 overall_score 对数据集进行二元化,并使用 Argilla 验证了新数据集。

使用偏好评分而不是评论分数,产生了一个新的数据集,其中约 50% 的情况下选择的响应是不同的。使用这个新数据集,我们使用 DPO 微调了 Notus,一个 7B 模型,该模型在 AlpacaEval 基准测试中超越了 Zephyr-7B-beta 和 Claude 2

🙌 如果没有惊人的 Alignment HandbookOpenBMB 发布 Ultrafeedback 数据集,并且基于与 HuggingFace H4 团队富有成果的讨论,这个模型是不可能实现的。特别是,我们使用了 zephyr-7b-beta 的配方,它开箱即用,使我们能够专注于我们最擅长的事情:高质量数据

如果您像我们一样对人类和 AI 反馈之间的协同作用以及 DPO 在改进 LLM 方面的出色表现感到兴奋,请查看 ⚗️distilabel。我们欢迎贡献和早期反馈!

模型总结

数据

让我们从最重要的开始:数据!DPO 和其他 RLHF 方法(如 PPO 的奖励模型)使用一种称为“偏好数据”、“偏好”或“比较”数据集的数据类型。偏好是一组提示和多个响应,指示人类(或 AI)偏好,本质上回答了问题:哪个响应是首选或更合适的。UltraFeedback 是一个惊人的开放偏好数据集,为 Zephyr、Tulu 和现在的 Notus 提供支持。

Notus 使用 openbmb/UltraFeedback 的策展版本,名为 argilla/ultrafeedback-binarized-preferences

在使用 Argilla 的排序和过滤功能(按所选响应的最高评分排序)直观地浏览了一些示例后,我们注意到原始 UF 数据集(和 Zephyr train_prefs 数据集)中的 overall_score 与所选响应的质量之间存在严重不匹配。

通过将评论理由添加到我们的 Argilla 数据集中,我们确认评论理由非常负面,而总体评分却非常高(实际上是最高分:10)。

请参阅下面的屏幕截图,了解此问题的一个示例。

image/png

经过一些快速调查,我们发现了数百个具有相同问题的示例,在 UltraFeedback 仓库上报告了一个错误,并通知了 H4 团队。

在我们努力修复原始数据集(已缩小到约 2K 个问题示例)的同时。我们决定利用多偏好评分,从而促成了 Notus!

下图解释了 Zephyr 和 Notus 使用的数据之间的差异。Zephyr 使用了评论分数,而我们决定使用每个不同偏好方面的平均偏好评分,即:helpfulness(乐于助人程度)、honesty(诚实度)、instruction-following(指令遵循度)和 truthfulness(真实性)。

image/png

重要提示:虽然我们选择在修复数据集时使用评分平均值,但仍然存在一个非常有趣的开放性问题:一旦数据修复,哪种方法效果更好?使用评论分数还是偏好评分?我们非常期待在未来几周内进行此比较,敬请关注!

您可以在 ultrafeedback-binarized-preferences 数据集卡片上找到有关数据集分析和策展的更多详细信息。

性能

聊天基准

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

Notus 在 MT-Bench 上与 Zephyr 保持一致,同时在 AlpacaEval 上超越了 Zephyr 和 Claude 2。使 Notus 成为 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 许可证
Starling-7B 7B C-RLFT + APA 8.09 91.99 CC-BY-NC-4.0
Notus-7b-v1 7B dDPO 7.30 91.42 MIT
Claude 2 - RLHF 8.06 91.36 专有
Zephyr-7b-β 7B dDPO 7.34 90.60 MIT
Cohere Command - RLHF - 90.62 专有
GPT-3.5-turbo - RLHF 7.94 89.37 专有

学术基准

来自 OpenLLM Leaderboard 的结果

模型平均值ARCHellaSwagMMLUTruthfulQAWinograndeGSM8KDROP
Zephyr 7B dDPO (HuggingFaceH4/zephyr-7b-beta)52.1562.0384.3661.0757.4577.7412.749.66
argilla/notus-7b-v152.8964.5984.7863.0354.3779.415.168.91

⚠️ 正如 AllenAI 研究人员指出的那样,UltraFeedback 包含来自 TruthfulQA 数据集的提示,因此我们在该基准测试中展示的结果对于 Notus 和 Zephyr 来说可能都不准确。当我们训练 Notus 时,我们没有意识到这个问题,因此它使用了 TruthfulQA 提示和包含在 UltraFeedback 中的偏好。对于未来的版本,我们将删除 TruthfulQA 提示。

训练细节

训练硬件

我们使用了 Lambda Labs 托管的具有 8 个 A100 40GB 的 VM,但在实验过程中,我们也探索了其他云提供商,例如 GCP。

提示模板

我们使用与 HuggingFaceH4/zephyr-7b-beta 相同的提示模板

使用方法

您首先需要安装 transformersaccelerate,然后您可以运行以下任何一项

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

通过 generate

import torchfrom transformers import AutoModelForCausalLM, AutoTokenizermodel = AutoModelForCausalLM.from_pretrained("argilla/notus-7b-v1", torch_dtype=torch.bfloat16, device_map="auto")tokenizer = AutoTokenizer.from_pretrained("argilla/notus-7b-v1")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?"},]inputs = tokenizer.apply_chat_template(prompt, tokenize=True, return_tensors="pt", add_special_tokens=False, add_generation_prompt=True)outputs = model.generate(inputs, num_return_sequences=1, max_new_tokens=256, do_sample=True, temperature=0.7, top_k=50, top_p=0.95)response = tokenizer.decode(outputs[0], skip_special_tokens=True)

通过 pipeline 方法

import torchfrom transformers import pipelinepipe = 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"]

如果您喜欢这项工作并对数据质量、AIF、LLM 和 NLP 感兴趣,请加入 我们的 discord 并在我们的仓库上留下星星:distilabelargilla