模型简介
模型特点
模型能力
使用案例
🚀 大语言模型的成对奖励模型(PairRM)来自LLM-Blender
Pairwise Reward Model (PairRM) 是一种用于大语言模型(LLM)的评估工具,它以指令和一对输出候选作为输入,为每个候选输出打分,以衡量它们的相对质量。该模型可以用于对候选输出列表进行排序,也可以作为LLM评估器,在本地环境中高效评估LLM的质量。此外,PairRM还可以通过 best-of-n sampling
来增强解码效果,以及用于进一步调整指令微调的LLM。
项目链接
🚀 快速开始
新闻
简介
成对奖励模型(PairRM)将指令和一对输出候选作为输入,并为每个候选输出提供一个分数,以衡量它们的相对质量。PairRM可用于对候选输出列表进行(重新)排序,因此可以用作LLM评估器,在本地环境中高效评估LLM的质量。PairRM还可用于通过 best-of-n sampling
(即对N个采样输出进行重新排序)来增强解码效果。此外,还可以使用PairRM通过基于人类反馈的强化学习(RLHF)方法进一步对齐指令微调的LLM。
与分别对每个候选输出进行编码和评分的其他奖励模型不同,PairRM会同时处理一对候选输出,并进行并排比较,以识别它们之间的细微差异。此外,PairRM基于microsoft/deberta-v3-large
,因此非常高效,模型大小仅为0.4B。我们在六个不同的人类偏好数据集上训练了PairRM(更多信息请见此处)。
PairRM是LLM-Blender项目的一部分(ACL 2023)。请参阅我们的论文以了解更多信息。
安装
- 首先安装
llm-blender
pip install git+https://github.com/yuchenlin/LLM-Blender.git
- 然后加载PairRM:
import llm_blender
blender = llm_blender.Blender()
blender.loadranker("llm-blender/PairRM") # 加载PairRM
使用示例
基础用法
# 用例1:根据指令比较/排序输出候选
# 对候选响应列表进行排序
inputs = ["hello, how are you!", "I love you!"]
candidates_texts = [["get out!", "hi! I am fine, thanks!", "bye!"],
["I love you too!", "I hate you!", "Thanks! You're a good guy!"]]
ranks = blender.rank(inputs, candidates_texts, return_scores=False, batch_size=1)
# ranks 是一个排名列表
# ranks[i][j] 表示输入 i 的候选 j 的排名
"""
ranks -->
array([[3, 1, 2], # 这意味着 "hi! I am fine, thanks!" 排名第1,"bye" 排名第2,"get out!" 排名第3。
[1, 3, 2]], # 这意味着 "I love you too"! 排名第1,"I hate you!" 排名第3。
dtype=int32)
"""
高级用法
# 直接比较两个候选响应
inputs = ["hello!", "I love you!"]
candidates_A = ["hi!", "I hate you!"]
candidates_B = ["f**k off!", "I love you, too!"]
comparison_results = blender.compare(inputs, candidates_A, candidates_B)
# comparison_results 是一个布尔值列表,其中 comparison_results[i] 表示
# 对于输入 i,候选 A[i] 是否优于候选 B[i]
# 示例: comparison_results[0] --> True
# 比较两个多轮对话
conv1 = [
{
"content": "hello",
"role": "USER"
},
{
"content": "[assistant1‘s response 1]",
"role": "ASSISTANT"
},
...
]
conv2 = [
{
"content": "hello",
"role": "USER"
},
{
"content": "[assistant2's response 1]",
"role": "ASSISTANT"
},
...
]
comparison_results = blender.compare_conversations([conv1], [conv2])
# comparison_results 是一个布尔值列表,其中每个元素表示 conv1 中的所有响应是否整体优于 conv2
# 用例2:Best-of-n 采样(解码增强)
# Best-of-n 采样,也称为拒绝采样,是一种通过选择奖励模型排名最高的响应来提高响应质量的策略
# (更多信息请参阅 [OpenAI WebGPT 第3.2节](https://arxiv.org/pdf/2112.09332.pdf) 和 [OpenAI 博客](https://openai.com/research/measuring-goodharts-law))。
# 使用 PairRM 进行 Best-of-n 采样是一种非常简单的方法,只需对推理代码进行少量更改即可改进您的 LLM:
# 加载模型
import llm_blender
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("HuggingFaceH4/zephyr-7b-beta")
model = AutoModelForCausalLM.from_pretrained("HuggingFaceH4/zephyr-7b-beta", device_map="auto")
system_message = {"role": "system", "content": "You are a friendly chatbot."}
# 格式化输入
inputs = ["can you tell me a joke about OpenAI?"]
messages = [[system_message, {"role": "user", "content": _input}] for _input in inputs]
prompts = [tokenizer.apply_chat_template(m, tokenize=False, add_generation_prompt=True) for m in messages]
# 传统生成方法
input_ids = tokenizer(prompts[0], return_tensors="pt").input_ids
sampled_outputs = model.generate(input_ids, do_sample=True, top_k=50, top_p=0.95, num_return_sequences=1)
print(tokenizer.decode(sampled_outputs[0][len(input_ids[0]):], skip_special_tokens=False))
# --> 输出可能是一个糟糕的情况,例如非常短的输出,例如 `Sure`
# 使用 PairRM 进行 best-of-n 采样
blender = llm_blender.Blender()
blender.loadranker("llm-blender/PairRM") # 加载排名器检查点
outputs = blender.best_of_n_generate(model, tokenizer, prompts, n=10)
print("### Prompt:\n", prompts[0])
print("### best-of-n generations:\n", outputs[0])
# --> 输出将更加稳定,并且始终优于单次采样,例如:
"""
Sure, here's a joke about OpenAI:
Why did OpenAI decide to hire a mime as their new AI researcher?
Because they wanted someone who could communicate complex ideas without making a sound!
(Note: This is a joke, not a reflection of OpenAI's actual hiring practices.)
"""
# 用例3:基于人类反馈的强化学习(RLHF)
# PairRM 已经在各种高质量、大规模的带有人类偏好注释的数据集上进行了训练,
# 并且在极小的模型尺寸(0.4B)下表现出与人类偏好的高度相关性,接近 GPT-4 的性能。
# PairRM 将以更高效、更有效的方式帮助未来的 LLM 对齐。
# 通过 `blender.compare()` 函数,您可以将 PairRM 应用于流行的 RLHF 工具包,例如 [trl](https://huggingface.co/docs/trl/index)。
# 🔥 查看我们的示例 Jupyter 笔记本用法的更多详细信息:[`blender_usage.ipynb`](https://github.com/yuchenlin/LLM-Blender/blob/main/blender_usage.ipynb)
详细文档
统计信息
上下文长度
PairRanker类型 | 源最大长度 | 候选最大长度 | 总最大长度 |
---|---|---|---|
pair-ranker (我们的上一版本) | 128 | 128 | 384 |
PairRM (本模型) | 1224 | 412 | 2048 |
性能
PairRM已经在各种高质量、大规模的带有人类偏好注释的数据集上进行了训练,并且在极小的模型尺寸(0.4B)下表现出与人类偏好的高度相关性,接近GPT-4的性能。
我们在以下数据集上进行了成对比较测试:
所有以下结果均以成对比较准确率(一致性)报告。
Auto-J成对测试数据性能
模型 | 总结 | 示例 | 代码 | 改写 | 创意写作 | 功能写作 | 交流 | NLP | 总体 |
---|---|---|---|---|---|---|---|---|---|
闭源模型 | |||||||||
ChatGPT | 33.3 | 40.3 | 36.6 | 31.6 | 48.2 | 40.4 | 47.6 | 45.8 | 42.7 |
Claude -2 | 30.6 | 36.1 | 41.7 | 34.2 | 48.1 | 42.5 | 40.6 | 48.5 | 42.4 |
GPT -4 | 59.7 | 51.4 | 69.2 | 58.3 | 66.7 | 60.4 | 58.3 | 65.2 | 61.9 |
开源模型 | |||||||||
SteamSHP | 33.3 | 29.2 | 26.7 | 33.3 | 40.7 | 31.3 | 51.4 | 51.9 | 40.6 |
PandaLM | 29.2 | 33.3 | 31.7 | 23.3 | 43.5 | 32.9 | 44.8 | 48.9 | 38.9 |
LLaMA -2-Chat -13B | 20.8 | 27.8 | 19.2 | 20 | 31.5 | 27.5 | 35.8 | 31.8 | 29 |
Vicuna -13B-v1.5 | 30.6 | 23.6 | 35 | 28.3 | 36.1 | 37.5 | 45.5 | 39.8 | 37.3 |
WizardLM -13B-v1.2 | 22.2 | 20.8 | 32.5 | 19.2 | 28.7 | 25.4 | 29.2 | 33 | 27.8 |
LLAMA -2-chat -70B | 34.7 | 33.3 | 36.7 | 35.8 | 51.4 | 54.2 | 47.2 | 47.7 | 45.9 |
AUTO -J (13b) | 45.8 | 38.9 | 59.2 | 47.5 | 54.6 | 57.1 | 58 | 57.6 | 54.8 |
UltraRM (13b) | 56.94 | 43.06 | 55.0 | 53.33 | 67.13 | 64.17 | 56.25 | 59.85 | 59.85 |
PairRM (0.4b) | 56.94 | 52.78 | 58.33 | 55.83 | 61.57 | 59.17 | 57.64 | 62.5 | 59.05 |
HHH-Alignment和MT-bench人类判断
评估器大语言模型 | HHH对齐 | MT-bench人类判断 | ||||
---|---|---|---|---|---|---|
帮助性 | 无害性 | 诚实性 | 其他 | 总平均 | 人类偏好 | |
随机 | 50 | 50 | 50 | 50 | 50 | 34.26 |
斯坦福NLP奖励模型 | 69.49 | 60.34 | 52.46 | 51.16 | 58.82 | 44.79 |
近似奖励模型 | 74.58 | 67.24 | 78.69 | 86.05 | 76.02 | 49.9 |
LLaMA2 -CHAT 7B | 66.1 | 81.03 | 70.49 | 74.42 | 72.85 | 51.78 |
LLaMA2 -CHAT 13B | 74.58 | 87.93 | 55.74 | 79.07 | 73.76 | 52.34 |
LLaMA2 -CHAT 70B | 66.1 | 89.66 | 67.21 | 74.42 | 74.21 | 53.67 |
LLaMA2 -CHAT 13B+粗略调整 | 68.74 | 68.97 | 65.57 | 67.44 | 67.42 | 46.89 |
GPT -3.5-TURBO -0613 | 76.27 | 87.93 | 67.21 | 86.05 | 78.73 | 57.12 |
PROMETHEUS 7B | 69.49 | 84.48 | 78.69 | 90.7 | 80.09 | 55.14 |
PROMETHEUS 13B | 81.36 | 82.76 | 75.41 | 76.74 | 79.19 | 57.72 |
UltraRM (13B) | 86.44 | 79.31 | 81.97 | 88.37 | 83.71 | 56 |
PairRM (0.4B) | 84.75 | 84.48 | 80.33 | 90.7 | 84.62 | 59 |
GPT -4-0613 | 91.53 | 93.1 | 85.25 | 83.72 | 88.69 | 63.87 |
虽然PairRM是一个基于DeBERTa的极小模型(0.4B),但其成对比较一致性性能接近GPT-4的性能!
这归因于两个原因:
- 我们的PairRM专门设计了用于成对比较的模型架构,通过双向注意力机制(更多详细信息请参阅LLM-blender论文)
- 它在高质量、大规模的人类偏好注释数据上进行了训练(请参阅此Hugging Face页面上的训练数据集列表)
技术细节
PairRM专门设计了用于成对比较的模型架构,通过双向注意力机制来识别候选输出之间的细微差异。此外,它基于 microsoft/deberta-v3-large
模型,因此在计算效率上表现出色。在训练过程中,PairRM使用了六个不同的人类偏好数据集,这些数据集涵盖了各种类型的文本,包括总结、示例、代码、改写、创意写作、功能写作等。通过在这些数据集上进行训练,PairRM能够学习到人类对不同类型文本的偏好,从而更好地评估候选输出的质量。
引用与致谢
如果您在研究中使用了PairRM,请引用LLM-blender。
@inproceedings{llm-blender-2023,
title = "LLM-Blender: Ensembling Large Language Models with Pairwise Comparison and Generative Fusion",
author = "Jiang, Dongfu and Ren, Xiang and Lin, Bill Yuchen",
booktitle = "Proceedings of the 61th Annual Meeting of the Association for Computational Linguistics (ACL 2023)",
year = "2023"
}
许可证
本项目采用MIT许可证。



