TRL 文档

日志记录

Hugging Face's logo
加入 Hugging Face 社区

并获得增强型文档体验

开始

日志记录

由于强化学习算法在历史上很难调试,因此务必仔细注意日志记录。默认情况下,TRL PPOTrainer 会将许多相关信息保存到 wandbtensorboard 中。

在初始化时,将这两个选项之一传递给 PPOConfig

config = PPOConfig(
    model_name=args.model_name,
    log_with=`wandb`, # or `tensorboard`
)

如果您想使用 tensorboard 进行日志记录,请将 kwarg project_kwargs={"logging_dir": PATH_TO_LOGS} 添加到 PPOConfig 中。

PPO 日志记录

以下是数据中提供的日志记录指标的简要说明

关键指标需重点关注。我们希望最大化奖励,保持低 KL 散度,并最大化熵

  1. env/reward_mean:从环境中获得的平均奖励。别名 ppo/mean_scores,专门用于监控奖励模型。
  2. env/reward_std:从环境中获得的奖励的标准差。别名 `ppo/std_scores,专门用于监控奖励模型。
  3. env/reward_dist:从环境中获得的奖励的直方图分布。
  4. objective/kl:旧策略和新策略之间的平均 Kullback-Leibler (KL) 散度。它衡量新策略与旧策略的偏差程度。KL 散度用于计算目标函数中的 KL 惩罚。
  5. objective/kl_distobjective/kl 的直方图分布。
  6. objective/kl_coef:目标函数中 Kullback-Leibler (KL) 散度的系数。
  7. ppo/mean_non_score_reward:由 objective/kl * objective/kl_coef 计算的 KL 惩罚,作为优化以防止新策略与旧策略相差过大的总奖励。
  8. objective/entropy:模型策略的熵,由 -logprobs.sum(-1).mean() 计算。高熵意味着模型的行为更加随机,这可能有利于探索。

训练统计信息

  1. ppo/learning_rate:PPO 算法的学习率。
  2. ppo/policy/entropy:模型策略的熵,由 pd = torch.nn.functional.softmax(logits, dim=-1); entropy = torch.logsumexp(logits, dim=-1) - torch.sum(pd * logits, dim=-1) 计算。它衡量策略的随机性。
  3. ppo/policy/clipfrac:PPO 目标中落在剪切范围外的概率比(旧策略 / 新策略)的比例。这可以用来监控优化过程。
  4. ppo/policy/approxkl: 使用 0.5 * masked_mean((logprobs - old_logprobs) ** 2, mask) 计算新旧策略之间的近似 KL 散度,对应于 http://joschu.net/blog/kl-approx.html 中的 k2 估计器。
  5. ppo/policy/policykl: 与 ppo/policy/approxkl 相似,但使用 masked_mean(old_logprobs - logprobs, mask) 计算,对应于 http://joschu.net/blog/kl-approx.html 中的 k1 估计器。
  6. ppo/policy/ratio: 新旧策略比率的直方图分布,用于计算 PPO 目标函数。
  7. ppo/policy/advantages_mean: GAE(广义优势估计)优势估计值的平均值。优势函数衡量了某个动作相对于状态下平均动作的优劣程度。
  8. ppo/policy/advantages: ppo/policy/advantages_mean 的直方图分布。
  9. ppo/returns/mean: TD(λ)回报值的平均值,计算公式为 returns = advantage + values,也是模型性能的另一个指标。更多细节请参考 https://iclr-blog-track.github.io/2022/03/25/ppo-implementation-details/
  10. ppo/returns/var: TD(λ)回报值的方差,计算公式为 returns = advantage + values,也是模型性能的另一个指标。
  11. ppo/val/mean: 值函数的平均值,用于监测值函数的性能。
  12. ppo/val/var : 值函数的方差,用于监测值函数的性能。
  13. ppo/val/var_explained: 值函数的解释方差,用于监测值函数的性能。
  14. ppo/val/clipfrac: 值函数预测值中被裁剪的比例。
  15. ppo/val/vpred: 值函数预测的值。
  16. ppo/val/error: ppo/val/vpred 和回报值之间的均方误差,用于监测值函数的性能。
  17. ppo/loss/policy: 近端策略优化 (PPO) 算法的策略损失。
  18. ppo/loss/value: PPO 算法中值函数的损失。该值量化了函数估计预期未来奖励的程度。
  19. ppo/loss/total: PPO 算法的总损失。它是策略损失和值函数损失的总和。

查询、响应和 logprob 的统计信息

  1. tokens/queries_len_mean: 查询令牌的平均长度。
  2. tokens/queries_len_std: 查询令牌长度的标准差。
  3. tokens/queries_dist: 查询令牌长度的直方图分布。
  4. tokens/responses_len_mean: 响应令牌的平均长度。
  5. tokens/responses_len_std: 响应令牌长度的标准差。
  6. tokens/responses_dist: 响应令牌长度的直方图分布。(Costa:命名不一致,应该为 tokens/responses_len_dist
  7. objective/logprobs: 模型采取的动作的 log 概率的直方图分布。
  8. objective/ref_logprobs: 参考模型采取的动作的 log 概率的直方图分布。

关键值

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

  1. env/reward_meanenv/reward_stdenv/reward_dist:来自“环境”/奖励模型的奖励分布属性。
  2. ppo/mean_non_score_reward: 训练期间平均负 KL 惩罚(显示了参考模型和新策略在步骤中的批次之间的差异)。

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

  1. ppo/loss/value: 当训练不顺利时,它会激增/出现 NaN。
  2. ppo/policy/ratio: ratio 为 1 是一个基线值,意味着根据新旧策略,采样令牌的概率相同。如果比率过高,例如 200,则意味着根据新策略,采样令牌的概率是旧策略的 200 倍。这表明新策略与旧策略差异太大,这很可能会导致过度优化并在以后导致训练崩溃。
  3. ppo/policy/clipfracppo/policy/approxkl: 如果 ratio 太高,ratio 将会被裁剪,从而导致 clipfracapproxkl 也随之升高。
  4. objective/kl: 它应该保持为正值,以确保策略不会偏离参考策略太远。
  5. objective/kl_coef: 使用 AdaptiveKLController 的目标系数。通常在数值不稳定之前会增加。
< > 在 GitHub 上更新