大模型基于人类反馈的微调
时间: 2025-01-13 09:46:49 浏览: 34
### 基于人类反馈的大规模模型微调
大规模语言模型通过基于人类反馈的强化学习(RLHF),可以显著提升其遵循指令的能力和生成质量。这种方法涉及三个主要阶段:初始监督微调、奖励建模以及策略优化。
#### 初始监督微调
在这个阶段,收集一组由人工编写的高质量对话样本作为示范数据集。这些样例通常包括各种类型的查询及其对应的理想回复。随后利用此数据集来初步调整预训练好的大模型参数,使得模型能够模仿专家行为模式[^1]。
```python
def supervised_finetune(model, dataset):
optimizer = AdamW(model.parameters(), lr=5e-6)
for epoch in range(num_epochs):
total_loss = 0
for batch in DataLoader(dataset, shuffle=True):
outputs = model(**batch)
loss = outputs.loss
optimizer.zero_grad()
loss.backward()
optimizer.step()
total_loss += loss.item()
avg_loss = total_loss / len(DataLoader(dataset))
print(f'Epoch {epoch}, Loss: {avg_loss}')
```
#### 创建奖励函数
为了使模型学会识别优质回答的标准,在第二步构建了一个评分系统——即所谓的“偏好模型”。该部分依赖标注者对不同版本的回答给出相对评价,从而形成正负样本对比对。接着训练一个二分类器去预测给定一对输出哪个更好,最终得到连续数值形式表示的优势程度得分[^5]。
```python
class RewardModel(nn.Module):
def __init__(self, base_model_name='bert-base'):
super().__init__()
self.base_encoder = AutoModel.from_pretrained(base_model_name)
def forward(self, input_ids_a, attention_mask_a, input_ids_b=None, attention_mask_b=None):
embd_a = self.base_encoder(input_ids=input_ids_a, attention_mask=attention_mask_a).last_hidden_state[:, 0]
if input_ids_b is not None and attention_mask_b is not None:
embd_b = self.base_encoder(input_ids=input_ids_b, attention_mask=attention_mask_b).last_hidden_state[:, 0]
return torch.sigmoid((embd_a * embd_b).sum(-1)) # Cosine similarity as preference score
else:
return embd_a
```
#### 策略优化
最后一步采用PPO算法或其他适合的方法更新原始LM权重,目的是最大化累积预期回报值。具体来说就是让代理尝试产生一系列可能的动作序列,并依据之前定义好奖惩机制给予相应分数;再根据获得的结果反向传播误差信号完成梯度下降操作直至收敛为止。
```python
from transformers import TrainerCallback
class PpoTrainer(TrainerCallback):
def on_evaluate(self, args, state, control, **kwargs):
rollouts = []
rewards = []
while True:
prompt = get_random_prompt() # Sample random prompts from validation set or elsewhere.
response_options = generate_multiple_responses(prompt=prompt) # Generate multiple responses per prompt.
reward_scores = compute_preference_scores(response_options=response_options) # Use the trained reward model here!
best_response_idx = np.argmax(reward_scores)
selected_action = response_options[best_response_idx]
new_rollout = {"prompt": prompt, "response": selected_action}
rollouts.append(new_rollout)
rewards.extend([reward_scores[i] - max(reward_scores) for i in range(len(response_options))])
if len(rollouts) >= rollout_batch_size:
break
update_policy_with_ppo(policy_network=model, trajectories=rollouts, advantages=rewards)
```
阅读全文
相关推荐


















