网站后台管理程序下载/下载百度官方网站

网站后台管理程序下载,下载百度官方网站,本人做静态网站开发,北京哪个公司做网站文章目录 什么是GRPO群组形成(Group Formation):让大模型创建多种解决方案偏好学习(Preference Learning):让大模型理解何为好的解答组内相对优势 优化(optimization): 让大模型从经验中学习(learning from experience)目标函数 GRPO算法的伪码表示GRPO算法的局限与…

文章目录

  • 什么是GRPO
    • 群组形成(Group Formation):让大模型创建多种解决方案
    • 偏好学习(Preference Learning):让大模型理解何为好的解答
      • 组内相对优势
    • 优化(optimization): 让大模型从经验中学习(learning from experience)
      • 目标函数
    • GRPO算法的伪码表示
    • GRPO算法的局限与挑战
  • 代码实现
    • GRPO训练参数配置
    • GRPO训练器
      • token对数概率计算
      • 奖励矩阵计算
      • 组内优势计算
      • 计算损失函数
  • 案例实战:使用TRL库实现GRPO训练文本生成模型
  • 推荐阅读
  • REF

什么是GRPO

GRPO(Groupwise relative policy optimization)群组相对策略优化是deepseek提出的一种RLHF(基于人类反馈的强化学习)技术。首次提出是在DeepSeekMath中,RL被证明在SFT阶段后能有效提升LLM的数学推理能力。
在GRPO提出之前,有两种流行的RLHF技术被广泛用于大模型的对齐过程中,分别是PPO和DPO。

群组形成(Group Formation):让大模型创建多种解决方案

GRPO算法的第一步非常直观,类似于学生尝试多种解法去解决同一个问题。对于给定的prompt,让大模型尝试生成多种解答(attempt)来解决同一个问题(通常4、8或16种的不同解答)。不同的解答示例如下图所示。
在这里插入图片描述

偏好学习(Preference Learning):让大模型理解何为好的解答

与其他的RLHF方法需要一个单独的奖励模型(reward model)不同,GRPO方法可以使用任何函数或模型来评估LLM解答(Solution)的质量。例如,可以使用一个长度函数作为评估器来奖励模型生成更简短的解答,或是使用一个数学求解器,来奖励模型生成更准确的数学解答方案。
评估过程会从多个角度来衡量大模型生成解答方案的质量,包括:
1)最终答案是否正确;2)答案是否按指定的格式输出(如XML标签格式正确性);3)推理过程与提供的答案是否一致。

组内相对优势

这种处理方式的巧妙之处还在于评分机制,GRPO不是简单的给出绝对分数,而是对每个组内的奖励进行归一化处理。它采用了一个简单但有效的方法来计算组内相对优势:

A d v a t a g e = ( r e w a r d − m e a n ( g r o u p r e w a r d s ) / s t d ( g r o u p r e w a r d s ) Advatage = (reward- mean(group_rewards)/ std(group_rewards) Advatage=(rewardmean(grouprewards)/std(grouprewards)

这种归一化方法帮助大模型理解,哪些解答方案比同组内其他解答方案更好或更差,而不是简单的反馈绝对得分给大模型。

优化(optimization): 让大模型从经验中学习(learning from experience)

GRPO的最后一步是根据解决方案组的评估结果,指导大模型进行改进。这一过程基于两个主要原则:

  1. 鼓励模型生成更多类似成功案例的解决方案,同时远离效果不佳的方法;
  2. 使用KL散度惩罚作为安全机制,防止模型在训练中一次发生过于剧烈的变化;

这种方法在实践中被证明比传统方法更稳定,原因在于:

  • 同时考虑多个解决方案,而不局限于两两比较;
  • 基于组的归一化有助于避免奖励缩放问题(reward scaling)
  • KL散度惩罚作为安全网,保证模型在学习新知识的同时,不会忘记已经掌握的内容;

总结GRPO的关键创新在于:

  1. 直接从任何函数或模型中学习,消除了对单独奖励模型的依赖。
  2. 基于组的学习方式,比传统的成对比较等方法更加稳定和高效。

目标函数

GRPO算法从旧的策略模型中采样一组输出 o 1 , o 2 , . . . , o G {o_1,o_2,...,o_G} o1,o2,...,oG,并通过下面的目标函数来优化策略模型:
在这里插入图片描述
GRPO的目标函数通过组内相对优势估计替代传统优势函数,并结合PPO的裁剪机制(限制策略更新幅度)和KL散度正则化(约束策略与参考模型的偏离),在最大化奖励的同时确保策略稳定性:

  1. 函数中通过最大化组内相对优势,增加生成优质结果的概率,减少生成劣质结果的概率;
  2. 通过KL散度惩罚项,确保模型策略不会过度偏离参考策略,从而保证优化过程的稳定性。

式中参数注释如下:
θ : 当前策略模型的可学习参数,通过优化目标函数更新 q ∼ P ( Q ) : 从问题分布中采样的输入(如用户指令) G : 每个输入生成的样本数(组内样本数) o i ∼ π θ old ( O ∣ q ) : 旧策略生成的第  i 个输出样本 π θ old : 旧策略模型(生成样本时固定) π θ : 当前策略模型(通过优化更新) O ∣ q : 输入  q 条件下策略生成的输出分布 ∣ o i ∣ : 输出序列  o i 的长度(token数量) t : 序列生成的时间步(第  t 个token位置) A ^ i , t : 组内相对优势(基于组内奖励差值计算) ϵ : 裁剪范围参数(限制策略更新幅度) β : KL散度正则化系数(控制策略与参考模型偏离) D KL ( π θ ∣ ∣ π ref ) : 当前策略与参考模型的KL散度 π ref : 参考模型(如初始SFT模型) \begin{aligned} &\theta &&: \text{当前策略模型的可学习参数,通过优化目标函数更新} \\ &q \sim P(Q) &&: \text{从问题分布中采样的输入(如用户指令)} \\ &G &&: \text{每个输入生成的样本数(组内样本数)} \\ &o_i \sim \pi_{\theta_{\text{old}}}(O|q) &&: \text{旧策略生成的第 }i\text{ 个输出样本} \\ &\pi_{\theta_{\text{old}}} &&: \text{旧策略模型(生成样本时固定)} \\ &\pi_{\theta} &&: \text{当前策略模型(通过优化更新)} \\ &O|q &&: \text{输入 }q\text{ 条件下策略生成的输出分布} \\ &|o_i| &&: \text{输出序列 }o_i\text{ 的长度(token数量)} \\ &t &&: \text{序列生成的时间步(第 }t\text{ 个token位置)} \\ &\hat{A}_{i,t} &&: \text{组内相对优势(基于组内奖励差值计算)} \\ &\epsilon &&: \text{裁剪范围参数(限制策略更新幅度)} \\ &\beta &&: \text{KL散度正则化系数(控制策略与参考模型偏离)} \\ &D_{\text{KL}}(\pi_{\theta}||\pi_{\text{ref}}) &&: \text{当前策略与参考模型的KL散度} \\ &\pi_{\text{ref}} &&: \text{参考模型(如初始SFT模型)} \end{aligned} θqP(Q)Goiπθold(Oq)πθoldπθOqoitA^i,tϵβDKL(πθ∣∣πref)πref:当前策略模型的可学习参数,通过优化目标函数更新:从问题分布中采样的输入(如用户指令):每个输入生成的样本数(组内样本数):旧策略生成的第 i 个输出样本:旧策略模型(生成样本时固定):当前策略模型(通过优化更新):输入 q 条件下策略生成的输出分布:输出序列 oi 的长度(token数量):序列生成的时间步(第 t token位置):组内相对优势(基于组内奖励差值计算):裁剪范围参数(限制策略更新幅度):KL散度正则化系数(控制策略与参考模型偏离):当前策略与参考模型的KL散度:参考模型(如初始SFT模型)
其中​两个超参数:𝜀是PPO机制中的裁剪范围参数,限制策略更新幅度;𝛽是KL散度正则化系数,控制当前策略与参考模型 π r e f π_{ref} πref的偏离程度。

这里的KL散度与传统的KL散度计算方式不同,使用Schulman提出的无偏估计,确保结果是正数:
在这里插入图片描述
式中 o < t o_{<t} o<t表示在时间步 t 之前的所有观测(或输出)序列 。

GRPO算法的伪码表示

DeepSeekMath论文里给出了GRPO迭代优化的步骤:
在这里插入图片描述

基于上述流程,GRPO算法的伪码可表示为:

Input: 
- initial_policy: Starting model to be trained
- reward_function: Function that evaluates outputs
- training_prompts: Set of training examples
- group_size: Number of outputs per prompt (typically 4-16)Algorithm GRPO:
1. For each training iteration:a. Set reference_policy = initial_policy (snapshot current policy)b. For each prompt in batch:i. Generate group_size different outputs using initial_policyii. Compute rewards for each output using reward_functioniii. Normalize rewards within group:normalized_advantage = (reward - mean(rewards)) / std(rewards)iv. Update policy by maximizing the clipped ratio:min(prob_ratio * normalized_advantage, clip(prob_ratio, 1-epsilon, 1+epsilon) * normalized_advantage)- kl_weight * KL(initial_policy || reference_policy)where prob_ratio is current_prob / reference_probOutput: Optimized policy model

GRPO算法的局限与挑战

GRPO算法在实践中也面临一些挑战:

  1. 生成成本。为每个提示词生成多个补全(4-16个)相比只生成一个或两个补全的方法,显著增加了计算需求。
  2. 批量大小限制。需要一起处理一组补全,这可能会限制有效的批量大小,增加训练过程的复杂性,并可能减缓训练速度。
  3. 奖励函数的设计。训练质量在很大程度上依赖于精心设计的奖励函数。设计不佳的奖励可能导致意外行为或优化错误的目标。
  4. 组大小的权衡。选择最优的组大小需要在解决方案的多样性与计算成本之间进行平衡。组内样本太少可能无法提供足够的多样性,而样本太多则会增加训练时间和资源需求。
  5. KL散度调参。找到合适的KL散度惩罚平衡需要谨慎调整——过高会导致模型无法有效学习,过低则可能使其偏离初始能力过远。

代码实现

GRPO训练参数配置

TRL库中将GRPO算法封装为GRPOConfig参数配置器和GRPOTrainer训练器。
这里参考TRL库的源码,给出简化版的代码解读。
将GRPO训练所需参数封装成 GRPOConfig数据类。用@dataclass装饰器将 GRPOConfig定义为一个数据类,并通过field函数为类中的字段指定默认值、默认工厂函数、元数据等。
原代码过长,这里只贴出控制GRPO训练的参数:

@dataclass
class GRPOConfig(TrainingArguments):
# Parameters that control the traininglearning_rate: float = field(default=1e-6,metadata={"help": "Initial learning rate for `AdamW` optimizer. The default value replaces that of ""`transformers.TrainingArguments`."},)beta: float = field(default=0.04,metadata={"help": "KL coefficient. If `0.0`, the reference model is not loaded, reducing memory usage and improving ""training speed, but may be numerically unstable for long training runs."},) # KL散度部分的超参数$\beta$,控制KL散度惩罚项的大小num_iterations: int = field(default=1,metadata={"help": "Number of iterations per batch (denoted as μ in the algorithm)."},)epsilon: float = field(default=0.2,metadata={"help": "Epsilon value for clipping."},) # clip部分超参数,控制裁剪的范围

控制每个奖励函数的权重占比的参数:

reward_weights: Optional[list[float]] = field(default=None,metadata={"help": "Weights for each reward function. Must match the number of reward functions. If `None`, all ""rewards are weighted equally with weight `1.0`."},) # 每个奖励函数的权重占比

TR-DPO论文中提出的控制参考模型动态更新的三个参数, 当前策略模型与旧参考模型的混合比例、是否启用参考模型与当前策略模型的同步机制、参考模型与当前策略模型同步的频率:

## >TR-DPO论文中提出的控制参考模型与当前策略模型同步机制以动态更新的三个参数# 是否启用参考模型与当前策略模型的同步机制sync_ref_model: bool = field(default=False,metadata={"help": "Whether to synchronize the reference model with the active model every `ref_model_sync_steps` ""steps, using the `ref_model_mixup_alpha` parameter."},) # 控制参考模型更新时,当前策略模型与旧参考模型的混合比例# 加权因子alpha控制软更新(soft update);aplha=1时更新方法变为硬更新(hard update),即将参考策略模型替换为当前策略模型ref_model_mixup_alpha: float = field(default=0.6,metadata={"help": "α parameter from the TR-DPO paper, which controls the mix between the current policy and the ""previous reference policy during updates. The reference policy is updated according to the equation: ""`π_ref = α * π_θ + (1 - α) * π_ref_prev`. To use this parameter, you must set `sync_ref_model=True`."},)# 控制参考模型与当前策略模型同步的频率# 每隔 ref_model_sync_steps 步,参考模型会根据 ref_model_mixup_alpha 的规则与当前策略模型进行同步更新。ref_model_sync_steps: int = field(default=512,metadata={"help": "τ parameter from the TR-DPO paper, which determines how frequently the current policy is ""synchronized with the reference policy. To use this parameter, you must set `sync_ref_model=True`."},)

GRPO训练器

将GRPO训练过程封装为一个Trainer的一个子类。

class GRPOtrainer(Trainer):def __init__(self,model,reward_funcs,args,train_dataset,eval_dataset,processing_class,reward_processing_classes,callbacks,optimizers,peft_config,):# Training argumentsself.max_prompt_length = args.max_prompt_lengthself.max_completion_length = args.max_completion_length  # = |o_i| in the GRPO paperself.num_generations = args.num_generations  # = G in the GRPO paper# Multi-stepself.num_iterations = args.num_iterations  # = 𝜇 in the GRPO paperself.epsilon = args.epsilon # $\epsilon$超参数用于梯度clip# Tracks the number of iterations (forward + backward passes), including those within a gradient accumulation cycle.self._step = 0self._buffered_inputs = [None] * args.gradient_accumulation_steps# Initialize the metricsself._metrics = {"train": defaultdict(list), "eval": defaultdict(list)}self.log_completions = args.log_completionssuper().__init__(model=model,args=args,data_collator=data_collator,train_dataset=train_dataset,eval_dataset=eval_dataset,processing_class=processing_class,callbacks=callbacks,optimizers=optimizers,)self.generation_config = GenerationConfig(max_new_tokens=self.max_completion_length,do_sample=True,pad_token_id=processing_class.pad_token_id,temperature=args.temperature,top_p=args.top_p,top_k=args.top_k,min_p=args.min_p,repetition_penalty=args.repetition_penalty,)

token对数概率计算

计算模型生成的每个token的对数概率,以控制模型在训练中的策略更新:

# Get the per-token log probabilities for the completions for the model and the reference model@profiling_decorator # 性能分析def _get_per_token_logps(self, model, input_ids, attention_mask, logits_to_keep):# We add 1 to `logits_to_keep` because the last logits of the sequence is later excludedlogits = model(input_ids=input_ids, attention_mask=attention_mask, logits_to_keep=logits_to_keep + 1).logitslogits = logits[:, :-1, :]  # (B, L-1, V), 排除最后一个 logit: 对应下一个token的预测input_ids = input_ids[:, -logits_to_keep:]logits = logits[:, -logits_to_keep:]return selective_log_softmax(logits, input_ids)  #  计算每个输入token的对数概率

奖励矩阵计算

初始化奖励矩阵后,遍历所有预定义的奖励函数(可灵活定义为pytorch模型或普通python函数),分别计算奖励值后更新奖励矩阵:

 rewards_per_func = torch.zeros(len(prompts), len(self.reward_funcs), device=device) # 初始化奖励矩阵for i, (reward_func, reward_processing_class) in enumerate(zip(self.reward_funcs, self.reward_processing_classes) # 遍历所有的奖励函数):if isinstance(reward_func, nn.Module):  # Module instead of PretrainedModel for compat with compiled modelsreward_func_name = f"reward {reward_func.config._name_or_path.split('/')[-1]}"else:reward_func_name = reward_func.__name__with profiling_context(self, reward_func_name):if isinstance( # 基于pytorch模型计算奖励值reward_func, nn.Module ):  # Module instead of PretrainedModel for compat with compiled modelsif is_conversational(inputs[0]):messages = [{"messages": p + c} for p, c in zip(prompts, completions)]texts = [apply_chat_template(x, reward_processing_class)["text"] for x in messages]else:texts = [p + c for p, c in zip(prompts, completions)]reward_inputs = reward_processing_class(texts, return_tensors="pt", padding=True, padding_side="right", add_special_tokens=False)reward_inputs = super()._prepare_inputs(reward_inputs)with torch.inference_mode():rewards_per_func[:, i] = reward_func(**reward_inputs).logits[:, 0]  # Shape (B*G,)else: # 基于python函数计算奖励值# Repeat all input columns (but "prompt" and "completion") to match the number of generationskeys = [key for key in inputs[0] if key not in ["prompt", "completion"]]reward_kwargs = {key: [example[key] for example in inputs] for key in keys}output_reward_func = reward_func(prompts=prompts, completions=completions, **reward_kwargs)rewards_per_func[:, i] = torch.tensor(output_reward_func, dtype=torch.float32, device=device)

在这里插入图片描述

组内优势计算

根据组内解答数(num_generations),计算组内优势:

		rewards_per_func = gather(rewards_per_func)# Apply weights to each reward function's output and sumrewards = (rewards_per_func * self.reward_weights.to(device).unsqueeze(0)).sum(dim=1)# Compute grouped-wise rewardsmean_grouped_rewards = rewards.view(-1, self.num_generations).mean(dim=1)std_grouped_rewards = rewards.view(-1, self.num_generations).std(dim=1)# Normalize the rewards to compute the advantagesmean_grouped_rewards = mean_grouped_rewards.repeat_interleave(self.num_generations, dim=0)std_grouped_rewards = std_grouped_rewards.repeat_interleave(self.num_generations, dim=0)advantages = (rewards - mean_grouped_rewards) / (std_grouped_rewards + 1e-4)

计算损失函数

在这里插入图片描述

根据deepseek math论文中公式(4), 计算 D K L D_{KL} DKL的无偏估计:

 # 计算参考模型与当前模型之间的KL散度if self.beta != 0.0: # 当KL散度正则项的参数$beta$不为0时ref_per_token_logps = inputs["ref_per_token_logps"]per_token_kl = (torch.exp(ref_per_token_logps - per_token_logps) - (ref_per_token_logps - per_token_logps) - 1) # KL散度的无偏估计,,deepseek math论文中公式(4)

在这里插入图片描述

根据deepseek math 论文中的公式(3),计算损失函数:

 # Compute the lossadvantages = inputs["advantages"]old_per_token_logps = inputs["old_per_token_logps"] if self.num_iterations > 1 else per_token_logps.detach()coef_1 = torch.exp(per_token_logps - old_per_token_logps) # 新旧模型token概率的比值(先取log再取指数便于计算)coef_2 = torch.clamp(coef_1, 1 - self.epsilon, 1 + self.epsilon) #clip截断部分per_token_loss1 = coef_1 * advantages.unsqueeze(1) # 未截断的概率比值计算的损失per_token_loss2 = coef_2 * advantages.unsqueeze(1) # 截断的概率比值计算的损失per_token_loss = -torch.min(per_token_loss1, per_token_loss2) # 损失部分计算,最小化损失(最大化奖励)if self.beta != 0.0:per_token_loss = per_token_loss + self.beta * per_token_kl # deepseek math 论文中的公式(3),GRPO目标函数loss = (per_token_loss * completion_mask).sum() / completion_mask.sum()

记录KL散度平均值:

 # 记录KL散度的平均值if self.beta != 0.0:mean_kl = (per_token_kl * completion_mask).sum() / completion_mask.sum()self._metrics[mode]["kl"].append(self.accelerator.gather_for_metrics(mean_kl).mean().item())

计算截断比例(clip ratio):

 # 计算截断比例is_clipped = (per_token_loss1 < per_token_loss2).float()clip_ratio = (is_clipped * completion_mask).sum() / completion_mask.sum() self._metrics[mode]["clip_ratio"].append(self.accelerator.gather_for_metrics(clip_ratio).mean().item())

案例实战:使用TRL库实现GRPO训练文本生成模型

这里给出一个用GRPO算法,在smoltldr数据集上训练SmolLM135M文本生成模型的demo例子。使用trl、peft库实现GRPO和LORA微调。
数据集介绍
mlabonne/smoltldr 是一个包含短篇小说列表的数据集,由用户 mlabonne 在 Hugging Face 上创建并维护。该数据集主要用于自然语言处理任务,例如文本生成、故事创作等。数据集中的每个样本通常是一个短篇故事,内容可能涵盖多种主题和风格。这些故事经过清洗和格式化,适合用于训练语言模型。SmolLM-135M则是用于文本生成的小模型。

数据和模型加载

import torch
import wandb
from datasets import load_dataset
from peft import LoraConfig,get_peft_model
from transformers import AutoModelForCausalLM,AutoTokenizer
from trl import GRPOConfig,GRPOTrainerwandb.login() # 登录wandb,输入api key,保存训练结果到wandb# 加载huggingface上的数据集
dataset = load_dataset("mlabonne/smoltldr")# 加载huggingface上的模型
model_id = "HuggingFaceTB/SmolLM-135M-Instruct"
model = AutoModelForCausalLM(model_id,torch_dtype = "auto",device_map = "auto",# attn_implementation = "flash_attention_2",attn_implementation = "eager",# GPU不支持flashattention时改用标准注意力
)
tokenizer = AutoTokenizer.from_pretrained(model_id)

LORA微调配置


# 加载PEFT库中的lora配置
lora_config = LoraConfig(task_type = "CAUSAL_LM", # 生成式任务r=16, # 秩为16lora_alpha=32, # 低秩矩阵权重贡献的缩放因子设为32target_modules = "all-linear",# 模型中的线性层应用lora
)
model = get_peft_model(model,lora_config) # 冻结预训练模型的所有参数,根据lora_config在模型中添加低秩矩阵
print(model.print_trainable_parameters()) # 打印模型中可训练参数的数量及占总参数的比例

定义奖励函数


# 定义奖励函数
def reward_len(completions,**kwargs):return [-abs(50-len(completion)) for completion in completions]

GRPO训练参数设置


# GRPO训练参数配置
training_args = GRPOConfig(output_dir="GRPO",run_name="GRPO_experi_0308_01",# wandb保存的实验名称learning_rate=2e-5,per_device_train_batch_size=4,# 批量大小设小一点减少显存占用gradient_accumulation_steps=2, # 梯度累积步数max_prompt_length=512,max_completion_length=96,num_generations=4,# GRPO每组生成的解答数optim="adamW_8bit",num_train_epochs=1,# 训练数据集训练的总轮数bf16=True,report_to=["wandb"],remove_unused_columns=False,# 不移除数据集中未使用的列logging_steps=1,# 每隔一步记录一次日志
)
# 设置训练器
trainer = GRPOTrainer(model=model,reward_funcs = [reward_len],# 自定义的奖励函数agrs=training_args,# GRPO的训练配置train_dataset = dataset["train"],
)

训练模型

# 训练模型
wandb.init(project="GRPO") # 初始化wandb日志环境
trainer.train() # 开始训练

上传训练完成的模型参数


# 保存模型参数,上传到huggingface hub
merged_model = trainer.model.merge_and_unload() # 合并lora权重和预训练权重
merged_model.push_to_hub("<your_username/your_modelname>",private=False) # 模型公开可见

下载训练好的模型参数进行文本生成


prompt = """
# A long document about the CatThe cat (Felis catus), also referred to as the domestic cat or house cat, is a small
domesticated carnivorous mammal. It is the only domesticated species of the family Felidae.
Advances in archaeology and genetics have shown that the domestication of the cat occurred
in the Near East around 7500 BC. It is commonly kept as a pet and farm cat, but also ranges
freely as a feral cat avoiding human contact. It is valued by humans for companionship and
its ability to kill vermin. Its retractable claws are adapted to killing small prey species
such as mice and rats. It has a strong, flexible body, quick reflexes, and sharp teeth,
and its night vision and sense of smell are well developed. It is a social species,
but a solitary hunter and a crepuscular predator. Cat communication includes
vocalizations—including meowing, purring, trilling, hissing, growling, and grunting—as
well as body language. It can hear sounds too faint or too high in frequency for human ears,
such as those made by small mammals. It secretes and perceives pheromones.
"""
messages = [{"role":"user","content":prompt},
]from transformers import pipeline
generator = pipeline("text-generation",model="<your_username/your_modelname>")
generate_kwargs = {"max_new_tokens": 256,"do_sample":True, # 启用采样生成模式"temperature":0.5, "min_p":0.1,
}
generated_text = generator(messages,generate_kwargs=generate_kwargs)
print(generated_text)

训练结果分析
随着模型的学习,奖励函数的奖励值逐渐接近0。这表明模型正在学习生成正确长度的文本。
在这里插入图片描述
在GRPO中,损失函数的初始值为零,然后在训练过程中增加。GRPO中的损失与KL散度(相对于原始策略的上限)成正比。随着训练的进行,模型学会了生成更好地符合奖励函数的文本,导致它与初始策略的偏差越来越大。这种增加的偏差反映在上升的损失值中,实际上表明模型正在成功地适应以优化奖励函数。
在这里插入图片描述


推荐阅读

  • 抱抱脸25年3月更新中的深度推理课程: https://huggingface.co/reasoning-course
  • DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models: https://arxiv.org/pdf/2402.03300

REF

  1. DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models: https://arxiv.org/pdf/2402.03300
  2. https://github.com/huggingface/trl/blob/main/trl/trainer/grpo_trainer.py#L98
  3. https://github.com/huggingface/open-r1/blob/main/src/open_r1/grpo.py
  4. https://open-r1.com/#:~:text=Open%20R1%20is%20an%20open-source%20reproduction%20of%20DeepSeek-R1%2C,MIT%20license%2C%20though%20original%20training%20data%20remains%20proprietary.
  5. DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning https://arxiv.org/abs/2501.12948
  6. https://huggingface.co/learn/nlp-course/en/chapter12/1?fw=pt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/73598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Google Cloud Run 如何实现无服务器(Serverless)部署?

DDoS&#xff08;分布式拒绝服务&#xff09;攻击是黑客常用的一种手段&#xff0c;通过大量恶意流量冲击服务器&#xff0c;导致网站无法访问。针对这种威胁&#xff0c;Cloudflare提供了一整套防护措施&#xff0c;包括流量过滤、速率限制、防火墙规则等&#xff0c;使网站能…

QuickAPI 和 DBAPI 谁更香?SQL生成API工具的硬核对比(一)

最近低代码开发火得不行&#xff0c;尤其是能把数据库秒变API的工具&#xff0c;简直是开发者的救星。今天咱就聊聊两款国内玩家&#xff1a;QuickAPI&#xff08;麦聪软件搞出来的低代码神器&#xff09;和 DBAPI&#xff08;开源社区的硬核作品&#xff09;。这两货都能靠SQL…

网络通信(传输层协议:TCP/IP ,UDP):

Socket是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端&#xff0c;提供了应用层进程利用网络协议交换数据的机制。 网络协议&#xff1a;一台电脑的数据怎么传递给另一台电脑&#xff0c;是由网络协议来规定的 端口号&#…

DeepSeek进阶应用(二):结合Kimi制作PPT(双AI协作教程)

&#x1f31f;引言&#xff1a; DeepSeek作为国产AI大模型&#xff0c;以强大的逻辑推理和结构化内容生成能力著称&#xff0c;擅长根据用户需求生成PPT大纲或Markdown文本&#xff1b;Kimi的PPT助手则能解析结构化内容并套用模板快速生成美观的PPT&#xff0c;两者结合实现“内…

卷积神经网络(知识点)

一、为了使特征图变小&#xff1a; 由两种方法&#xff1a;1.增大步长&#xff1a;卷积的时候不是一次一步&#xff0c;而是一次多步&#xff0c;类似一张图片&#xff0c;在原来的像素基础上&#xff0c;每隔一个取一个像素点。 其中S就是步长 注意&#xff1a;扩大步长不经…

考研系列-408真题计算机网络篇(18-23)

写在前面 此文章是本人在备考过程中408真题计算机网络部分&#xff08;2018年-2023年&#xff09;的易错题及相应的知识点整理&#xff0c;后期复习也常常用到&#xff0c;对于知识提炼归纳理解起到了很大的作用&#xff0c;分享出来希望帮助到大家~ # 2018 1.停止-等待协议的…

六种最新优化算法(TOC、MSO、AE、DOA、GOA、OX)求解多个无人机协同路径规划(可以自定义无人机数量及起始点),MATLAB代码

一、算法简介 &#xff08;一&#xff09;阿尔法进化&#xff08;Alpha Evolution&#xff0c;AE&#xff09;算法 阿尔法进化&#xff08;Alpha Evolution&#xff0c;AE&#xff09;算法是2024年提出的一种新型进化算法&#xff0c;其核心在于通过自适应基向量和随机步长的…

上传本地项目到GitHub

一、在GitHub上创建仓库 1.点击右上角头像–>点击Your repositories 2.点击New 3.创建仓库 网址复制一下&#xff0c;在后面git上传时会用到 二、打开Git Bash 1.cd 进入项目所在路径 2.输入git init 在当前项目的目录中生成本地的git管理&#xff08;当前目录下出现.…

14.使用各种读写包操作 Excel 文件:辅助模块

一 各种读写包 这些是 pandas 在底层使用的各种读写包。无须安装 pandas&#xff0c;直接使用这些读写包就能够读写 Excel 工作簿。可以尽可能地使用 pandas 来解决这类问题&#xff0c;只在 pandas 没有提供你所需要的功能时才用到读写包。 表中没有 xlwings &#xff0c;因为…

ubuntu ollama+dify实践

安装ollama 官网的指令太慢了&#xff0c;使用以下指令加速&#xff1a; export OLLAMA_MIRROR"https://ghproxy.cn/https://github.com/ollama/ollama/releases/latest/download" curl -fsSL https://ollama.com/install.sh | sed "s|https://ollama.com/dow…

spring boot+mybaits多条件模糊查询和分页查询

我们首先写一下多条件的模糊查询&#xff0c;首先在controller里面写一个接口&#xff0c;进行传参&#xff0c;我们这里要注意&#xff0c;之前写修改和增加的时候用的注解都是RequestBody,也就是说&#xff01;前端传过来一个json&#xff0c;数组也行&#xff0c;然后我们后…

HarmonyOS NEXT - 电商App实例四(登录界面)

登录界面是用户进入App的第一步&#xff0c;因此需要简洁明了&#xff0c;同时保持品牌风格的一致性。如&#xff1a;顶部区域为品牌LOGO展示&#xff0c;增加品牌识别度&#xff1b;中间区域为登录表单&#xff0c;包含输入框和按钮&#xff1b;底部区域为其他登录方式、注册入…

图解多头注意力机制:维度变化一镜到底

目录 一、多头注意力机制概述二、代码实现1. pyTorch 实现2. tensorFlow实现 三、维度变化全流程详解1. 参数设定2. 维度变化流程图3. 关键步骤维度变化 四、关键实现细节解析1. 多头拆分与合并2. 注意力分数计算3. 掩码处理技巧 五、完整运行示例六、总结与常见问题1. 核心优势…

2.8滑动窗口专题:最小覆盖子串

1. 题目链接 LeetCode 76. 最小覆盖子串 2. 题目描述 给定字符串 s 和 t&#xff0c;要求找到 s 中最小的窗口&#xff0c;使得该窗口包含 t 的所有字符&#xff08;包括出现次数&#xff09;。若不存在&#xff0c;返回空字符串。 示例&#xff1a; 输入&#xff1a;s &quo…

【数据分析大屏】基于Django+Vue汽车销售数据分析可视化大屏(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅

目录 一、项目背景 二、项目创新点 三、项目功能 四、开发技术介绍 五、项目功能展示 六、权威视频链接 一、项目背景 汽车行业数字化转型加速&#xff0c;销售数据多维分析需求激增。本项目针对传统报表系统交互性弱、实时性差等痛点&#xff0c;基于DjangoVue架构构建…

cyberstrikelab lab2

lab2 重生之我是渗透测试工程师&#xff0c;被公司派遣去测试某网络的安全性。你的目标是成功获取所有服务器的权限&#xff0c;以评估网络安全状况。 先扫一下 ​ ​ 192.168.10.10 ​ ​ 骑士cms 先找后台路径 http://192.168.10.10:808/index.php?madmin&cind…

在 Ubuntu 服务器上使用宝塔面板搭建博客

&#x1f4cc; 介绍 在本教程中&#xff0c;我们将介绍如何在 Ubuntu 服务器 上安装 宝塔面板&#xff0c;并使用 Nginx PHP MySQL 搭建一个博客&#xff08;如 WordPress&#xff09;。 主要步骤包括&#xff1a; 安装宝塔面板配置 Nginx PHP MySQL绑定域名与 SSL 证书…

【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Servlet 3.0 新特性:异步处理与注解配置

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、Servle…

使用 Homebrew 安装 OpenJDK 并配置环境变量

在 macOS 上使用 Homebrew 安装 OpenJDK 是一种简单而高效的方式。本文将使用 Homebrew 安装 OpenJDK&#xff0c;并设置环境变量以便 Java 能够正确运行。 1. 安装 Homebrew 首先&#xff0c;确保你的 macOS 系统已经安装了 Homebrew。如果没有安装&#xff0c;可以通过以下…

【C语言】编译和链接详解

hi&#xff0c;各位&#xff0c;让我们开启今日份博客~ 小编个人主页点这里~ 目录 一、翻译环境和运行环境1、翻译环境1.1预处理&#xff08;预编译&#xff09;1.2编译1.2.1词法分析1.2.2语法分析1.2.3语义分析 1.3汇编1.4链接 2.运行环境 一、翻译环境和运行环境 在ANSI C…