基于人类反馈的强化学习微调技术:从奖励模型训练到模型微调
立即解锁
发布时间: 2025-09-03 00:28:28 阅读量: 6 订阅数: 18 AIGC 


生成式AI实战:从理论到应用
# 基于人类反馈的强化学习微调技术:从奖励模型训练到模型微调
## 1. 奖励模型的重要性与自定义奖励模型训练的必要性
奖励模型在基于人类反馈的强化学习(RLHF)中起着关键作用,它鼓励模型生成更符合人类偏好的回复,同时抑制非偏好的响应。要确定哪些回复是有用、诚实且无害的,通常需要人类借助诸如SageMaker Ground Truth之类的人工介入管理服务来标记上下文,进而训练自定义奖励模型。
奖励模型通常是一个二分类器,预测正类或负类,常基于像BERT这样的小型语言模型。虽然已有许多用于情感分类或检测有毒语言的二分类器,但如果这些不适合特定用例,就需要训练自定义奖励模型。不过,训练自定义奖励模型是一项劳动密集且成本较高的工作,因此在投入精力之前,应先探索现有的二分类器。
## 2. 收集训练数据集
### 2.1 人工标注数据收集
训练自定义奖励模型的第一步是收集人类关于有用、诚实和无害回复的反馈,这通常通过人工标注员来完成,并且会借助SageMaker Ground Truth等管理服务。在生成式场景中,常要求人类标注员对给定提示的各种完成情况进行排名。例如,标注员可能会收到如下指令:
- 按照对输入提示提供最佳答案的标准对回复进行排名。
- 最佳答案的判断基于答案的正确性和响应的信息量。对于正确性,允许标注员搜索网络。总体而言,根据最有用和无害的回复进行排名,即至少有一定正确性、对提示问题有最低限度的信息提供且语言毒性最低的回复。
- 长答案不一定是最好的。如果简洁连贯的答案至少同样正确且有信息量,那么它们可能比长答案更好。
### 2.2 使用Amazon SageMaker Ground Truth进行人工标注
可以使用Amazon SageMaker Ground Truth让标注员通过拖放式用户界面(UI)对给定提示的完成情况从高到低进行排名。以下是设置并提交任务到SageMaker Ground Truth的代码示例:
```python
import uuid
import json
import boto3
a2i = boto3.client('sagemaker-a2i-runtime')
items = [
{
"prompt":
"""
Chris: Hey Antje, do you like cats?
Antje: I hate cats. I'm allergic to them.
""",
"responses": [
"""
Chris asks Antje if she likes cats.
Antje does not like cats because she is allergic to them.
""",
"""
Chris asks Antje if she likes cats. Antje hates cats.
""",
"""
Antje asks Chris if he likes cats.
Chris loves cats because they are fluffy, cute, and cuddly.
"""
]
}
]
humanLoopName = str(uuid.uuid4())
task = items[0]
inputContent = {"taskObject": task}
augmented_ai_flow_definition_arn = "your_flow_definition_arn"
start_loop_response = a2i.start_human_loop(
HumanLoopName=humanLoopName,
FlowDefinitionArn=augmented_ai_flow_definition_arn,
HumanLoopInput={"InputContent":
json.dumps(inputContent)},
)
loop = a2i.describe_human_loop(HumanLoopName=humanLoopName)
print(f'HumanLoop Status: {loop["HumanLoopStatus"]}')
print(f'HumanLoop Output S3: {loop["HumanLoopOutput"]}')
```
当人类标注员对给定提示的回复进行排名后,排名结果将以JSON字符串的形式存储在S3位置。以下是一个JSON字符串的示例:
```json
{
"humanAnswers": [{
"answerContent": {
"ranking_A": "1", # ranking for completion A (1=best)
"ranking_B": "2", # ranking for completion B
"ranking_C": "3", # ranking for completion C (3=worst)
}
}]
}
```
通过多个标注员重复此过程,可创建一个人类偏好数据集,用于训练奖励模型。但在训练之前,需要将JSON字符串转换为适合训练二分类器的数值格式。
## 3. 准备排名数据以训练奖励模型
收集到人类标注的排名并将其存储为S3中的JSON后,需要将这些数据转换为奖励模型可使用的格式,即预测正奖励(1)或负奖励(0)。例如,对于给定提示的三个可能完成情况A、B和C,标注员可能将A排为第一,B排为第二,C排为第三,即A > B > C。可以将此关系拆分为三个成对比较:A > B、B > C和A > C,并为每对比较中的元素分配0或1,其中1表示更受偏好的完成情况,0表示较不受偏好的完成情况。
| 比较对 | 更偏好完成情况 | 较不受偏好完成情况 | 奖励 [rj, rk] |
| --- | --- | --- | --- |
| A vs B | A | B | [1, 0] |
| B vs C | B | C | [1, 0] |
| A vs C | A | C | [1, 0] |
根据组合数学原理,对于n个完成情况,会生成$C_{n}^2=\frac{n(n - 1)}{2}$个成对比较,每个成对比较都是奖励模型的一行训练数据。生成成对奖励训练数据后,通常需要重新排序数据,使偏好的完成情况位于第一列。以下是一个转换示例:
| 提示 | 完成情况 yj(偏好) | 完成情况 yk(非偏好) | 奖励 [rj, rk] |
| --- | --- | --- | --- |
| Chris: Hey Antje, do you like cats? Antje: I hate cats. I’m allergic to them. | Chris asks Antje if she likes cats. Antje does not like cats because she is allergic to them. | Chris asks Antje if she likes cats. Antje hates cats. | [1, 0] |
| Chris: Hey Antje, do you like cats? Antje: I hate cats. I’m allergic to them. | Chris asks Antje if she likes cats. Antje hates cats. | Antje asks Chris if he likes cats. Chris loves cats because they are fluffy, cute, and cuddly. | [1, 0] |
| Chris: Hey Antje, do you like cats? Antje: I hate cats. I’m allergic to them. | Chris asks Antje if she likes cats. Antje does not like cats because she is allergic to them.
0
0
复制全文
相关推荐









