TRL 文档

日志记录

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

日志记录

由于强化学习算法在历史上一直难以调试,因此特别注意日志记录非常重要。默认情况下,TRL 的训练器,如 PPOTrainerGRPOTrainer,会将大量相关信息保存到支持的实验跟踪器中,例如 Weights & Biases (wandb) 或 TensorBoard。

初始化时,将 report_to 参数传递给相应的配置对象(例如,PPOConfig 用于 PPOTrainer,或 GRPOConfig 用于 GRPOTrainer)。

# For PPOTrainer
ppo_config = PPOConfig(
    # ...,
    report_to="wandb"  # or "tensorboard"
)

# For GRPOTrainer
grpc_config = GRPOConfig(
    # ...,
    report_to="wandb"  # or "tensorboard"
)

如果你想使用 TensorBoard 记录日志,你可能还需要指定日志目录,例如,通过向配置对象(如 PPOConfigGRPOConfig)添加 logging_dir=PATH_TO_LOGS

PPO 日志记录

以下是对数据中记录的指标的简要解释

  • eps: 跟踪每秒的片段(episode)数。
  • objective/kl: 当前策略和参考策略之间的平均库尔贝克-莱布勒(KL)散度。
  • objective/entropy: 策略的平均熵,表示策略选择动作的随机性。
  • objective/non_score_reward: 来自非分数相关来源的平均奖励,基本上是 beta * kl.sum(1),其中 beta 是 KL 惩罚系数,kl 是每个词元的 KL 散度。
  • objective/rlhf_reward: 平均 RLHF 奖励,即 score - non_score_reward
  • objective/scores: 由奖励模型/环境返回的平均分数。
  • policy/approxkl_avg: 连续 PPO 策略之间的平均近似 KL 散度。请注意,这与 objective/kl 不同。
  • policy/clipfrac_avg: 被裁剪的策略更新的平均比例,表示策略更新被限制以防止大幅度变化的频率。
  • loss/policy_avg: 平均策略损失,表示策略的表现如何。
  • loss/value_avg: 平均价值损失,表示预测价值与实际奖励之间的差异。
  • val/clipfrac_avg: 被裁剪的价值函数更新的平均比例,类似于 policy/clipfrac_avg,但针对的是价值函数。
  • policy/entropy_avg: 训练期间策略的平均熵,表示策略动作的多样性。
  • val/ratio: 当前策略概率与旧策略概率的平均比率,提供了策略变化程度的度量。
  • val/ratio_var: val/ratio 的方差,表示策略变化的可变性。
  • val/num_eos_tokens: 生成的序列结束(EOS)词元的数量,可以表示完整响应的数量。
  • lr: 优化器当前使用的学习率。
  • episode: 训练过程中的当前回合数。

关键值

在训练过程中会记录许多值,以下是最重要的几个

  1. objective/scores: 由奖励模型/环境返回的平均分数。
  2. objective/rlhf_reward: 平均 RLHF 奖励。这是 RLHF 训练的最终目标。如果训练按预期进行,该指标应持续上升。
  3. objective/non_score_reward: 来自非分数相关来源(例如 KL 惩罚)的平均奖励。

以下是一些有助于监控稳定性的参数(当这些参数发散或崩溃到 0 时,请尝试调整变量)

  1. loss/value_avg: 平均价值损失。当训练不顺利时,它会飙升或变为 NaN。
  2. val/ratio: 当前策略概率与旧策略概率的平均比率。这个数字应该在 1.0 左右浮动。如果这个 ratio 太高(例如 2.0 或 1000.0)或太小(例如 0.1),则意味着连续策略之间的更新过于剧烈。
  3. policy/clipfrac_avgpolicy/approxkl_avg: 如果 val/ratio 太高,ratio 将被裁剪,导致 policy/clipfrac_avgpolicy/approxkl_avg 也变高。
  4. objective/kl: 平均 KL 散度。它应该保持正值,并且理想情况下不要太大,以使策略不会偏离参考策略太远。

GRPO 日志记录

以下是对 GRPO 训练器数据中记录的指标的简要解释

  • num_tokens: 迄今为止在训练过程中处理的输入令牌总数。

补全

  • completions/mean_length: 所有生成的补全的平均长度(包括那些未以 EOS 令牌结尾的)。
  • completions/min_length: 所有生成的补全中的最小长度。
  • completions/max_length: 所有生成的补全中的最大长度。
  • completions/clipped_ratio: 在达到最大生成长度之前未以 EOS 令牌结尾的补全的比例(即它们被截断了)。
  • completions/mean_terminated_length: 仅那些成功以 EOS 令牌结尾的补全的平均长度。
  • completions/min_terminated_length: 以 EOS 令牌结尾的补全中的最小长度。
  • completions/max_terminated_length: 以 EOS 令牌结尾的补全中的最大长度。

奖励

  • rewards/{reward_func_name}/mean: 从特定的、命名的奖励函数获得的平均奖励(例如,rewards/my_custom_reward/mean)。这将为每个使用的奖励函数记录。
  • rewards/{reward_func_name}/std: 来自特定的、命名的奖励函数的奖励的标准差。
  • reward: 经过分组归一化(优势)后,(可能加权且如果 args.scale_rewards 为 true 则归一化)奖励的总体平均值。
  • reward_std: 在分组归一化以计算优势*之前*的(可能加权的)奖励的标准差。

策略和损失指标

  • kl: 当前策略与参考策略之间的平均库尔贝克-莱布勒(KL)散度。仅当 betaGRPOConfig 中的 KL 系数)不为零时记录此项。
  • entropy: 在生成的补全中,令牌预测的平均熵。
  • 如果使用 Liger GRPOLoss (use_liger_loss: True in GRPOConfig)
    • clip_ratio: 策略更新中,概率比率根据 GRPO 损失的 epsilon 边界被裁剪的比例。
  • 如果使用标准 GRPOLoss (use_liger_loss: False)
    • clip_ratio/low_mean: 概率比率 r_t(θ) 在下界 1 - epsilon_low 被裁剪的实例的平均比例(当优势为负且比率低于该界限时发生)。
    • clip_ratio/low_min: 在批次/进程中观察到的 clip_ratio/low_mean 的最小比例。
    • clip_ratio/high_mean: 概率比率 r_t(θ) 在上界 1 + epsilon_high 被裁剪的实例的平均比例(当优势为正且比率高于该界限时发生)。
    • clip_ratio/high_max: 在批次/进程中观察到的 clip_ratio/high_mean 的最大比例。
    • clip_ratio/region_mean: 概率比率在下界或上界被裁剪的实例的平均比例。

关键 GRPO 值

在 GRPO 训练期间,监控这些值以了解性能和稳定性

  1. reward: 这是主要目标。它反映了策略正在实现的(分组归一化的)奖励。在成功的训练中,它通常应该增加。
  2. kl: 如果 beta > 0,它会跟踪与参考模型的差异。密切关注它以确保策略不会偏离太远,这可能导致不稳定。
  3. clip_ratio/* (Liger 损失的 clip_ratio 或标准损失的更详细的 clip_ratio/... 指标): 这些指标表明策略更新被 GRPO 裁剪机制约束的频率。非常高的值可能表明策略试图进行过于剧烈的改变(可能是由于大的优势或过高的学习率),或者 epsilon 裁剪范围过于严格。
  4. completions/clipped_ratio: 这里的高比率表明模型经常生成被 max_completion_length 截断的补全,而不是自然地以 EOS 令牌结束。这可能表明在学习序列终止方面存在问题,或者 max_completion_length 太短。
  5. rewards/{reward_func_name}/mean: 监控单个奖励函数的平均值可以帮助诊断模型正在学习或在哪些期望行为方面遇到困难,特别是在使用多个奖励源时。
  6. entropy: 衡量策略在其动作选择中的不确定性,较高的熵表明更多的探索。熵的崩溃意味着策略变得过于自信和确定性,通常为时过早。这会通过减少探索和使更新过于偏颇来阻碍学习。稳定但非零的熵通常是策略保持灵活性并继续探索的标志。
< > 在 GitHub 上更新