义父,想问下为啥train_ppo代码中有五个模型? #600
-
|
我看标准的PPO训练中 此外还有一个东西 一个题外话 太菜了。。。 求义父救救 |
Beta Was this translation helpful? Give feedback.
Replies: 6 comments 2 replies
-
|
标准PPO也需要旧策略算 ratio。
只是用 log 域计算更稳不会爆数,所以看起来是先 sum 再除,数学等价。 |
Beta Was this translation helpful? Give feedback.
-
|
义父你太好了!!! |
Beta Was this translation helpful? Give feedback.
-
|
不对啊 义父 我看trl的PPOTrainer内部 这个old就是用ref解决的呀 然后我看论文公式 也是用同一个 不需要单独拉一个呀 @jingyaogong |
Beta Was this translation helpful? Give feedback.
-
|
"old就是用ref解决的" no! Line 725-726、759-761、以及 这可不是ref算出来的ratio 两种方式本质上完全一样,只不过
单纯实现的权衡不同,本质都是同一个等价的旧策略,但绝不是ref。此外只是对于一个26M的模型,所谓显存的占用可以忽略,代价就是重算一次forward 贴近trl的实现,4个模型反而代码会臃肿、可读性和可理解性会降低...例如: |
Beta Was this translation helpful? Give feedback.
-
|
太感谢了,果然是我的水平不足,确实两边都用了old 但是这就引发了我一个新的问题 果然还是太菜了。。。 在trl中 KL 是通过 在minimind中 得到的,我们用的是kl_ref而不是kl 即 new - ref 然后我去问了下cluade和gpt 他们给的回复都是 是说这个kl是用来早停的? 那这个我就不是很理解了 那不就是说trl中的实现有问题??? |
Beta Was this translation helpful? Give feedback.
-
|
都对,KL 用的地方不同: trl:kl = -(ref - current),加到 reward 里(rewards = -kl_coef * kl + scores)是经典 PPO-penalty 做法(reward最大化意味着current - ref最小化) minimind:kl_ref = current - ref,加到 loss 里(loss = policy_loss + kl_coef * kl_ref)更直接的正则化(一样追求current - ref最小化) 至于 kl = (actor_logp - old_logp).mean() 不难看出单纯用来打日志(train_ppo.py#206,214),看每步策略变化多大,不参与训练,也没所谓早停,所谓"用于早停"是另一种实现方式(adaptive KL),但 minimind 和 trl 没用过。 最原始标准 (PPO-Clip) 压根没有 KL,纯靠 Clip 卡更新 |
Beta Was this translation helpful? Give feedback.
标准PPO也需要旧策略算 ratio。
actor_old_model就是每隔几步把当前actor_model的权重拷过去,专门用来提供old_logp。kl_ref当前策略和参考模型ref_model的 KL,别离最初的参考策略太远”的额外约束。只是用 log 域计算更稳不会爆数,所以看起来是先 sum 再除,数学等价。