prompt batch -> actor.forward -> reward model -> critic.forward
- 重要性采样:使用一次采样,进行多次更新,在尽可能高效率使用样本的前提下,尽可能的修正老策略与新策略的偏差
- 裁剪(常用),KL约束:现在新旧策略的偏移,防止梯度爆炸或者坍塌
- 概率比
rt(θ)=πθold(at∣st)πθ(at∣st)
π:策略
θ:参数
a:动作
s:状态
t:时间
个人理解:新旧策略在同一状态下决策的相对差异
- 裁剪目标
LCLIP(θ)=Et[min(rt(θ)A^t,clip(rt(θ),1−ϵ,1+ϵ)A^t)]
L:损失函数
Et:对时间步t时的重要性采样结果的期望
A^t:当前时间步的优势函数
ϵ:裁剪系数
个人理解:用裁剪可以限制更新步长,既不要太大也不要太小,保证稳定性
- 优势函数:
- GAE(广义优势估计,Generalized Advantage Estimation)
AGAE(at,st)=∑l=0∞(γλ)lδt+l
δt=rt+γV(st+1)−V(st)
γ:折扣因子
r:奖励值
l:延迟的步数
λ:控制TD的偏差与方差
λ=1:相当于蒙特卡洛回报,即保留了每一个时间步的TD
λ=0:相当于单步TD
0<λ<1:保留了每一个时间步的TD,但是每一个TD有着不同的权重
- 值函数回归
Lvalue=21(Vθ(st)−R^t)2
Vθ(st):t时状态为时的价值函数,由一个mlp拟合
- 熵正则化(鼓励探索)
H(πθ)=Et[−∑απθ(α∣st)logπθ(α∣st)]
注:说白了就是求信息熵取平均值
- 总损失
LPPO=LCLIP(θ)−c1Lvalue+c2H(πθ)
就是一批数据
- 使用主干网络对每一条数据生成回复,并逐步保存每一个token的logits作为logπold
作用:用于打分获取奖励值,分数用于上述公式构造损失函数,将奖励值r存入bufferi以供后续训练使用
构造:一个mlp
位置:接在骨干网络最后一层
优点:泛化能力强
缺点:需要大量有标注数据,可解释性差,稳定性差,计算需要资源多
使用具体规则奖励,如编辑距离,重复度等
优点:计算简单迅速,可解释性强,稳定性强,
缺点:泛化能力差,仅在特定场景下有效
作用:用于拟合骨干网络的价值函数,计算出优势函数,存入buffer,供后续训练使用
构造:一个mlp
位置:接在骨干网络左右一层
使用buffer里面保存的数据反复训练模型,几轮后重新采样
graph TD
Inputs--> b[Backbone network]
b --(optional)--> reward
b --> crtirc
{
role: user,
content: <完整上下文/包含用于区分角色的特殊token>
}
solution: <模型回答正例或正例组>:用于reward function
如果有内容错误或者解释不清楚,请联系本人进行修改。vx: m1197501753