https://hrl.boyuai.com/chapter/intro
https://karpathy.github.io/2016/05/31/rl/
策略梯度定理推导:
用一个表格(Q表)记录在不同状态下采取各个动作所能得到的潜在回报。
这一算法的关键是学习的目标设置:将『采取该行动后得到的奖励 + 采取动作后的新状态下的最大Q值(无论将来再采用哪种动作)』作为在原状态下实施对应行动后的Q值的目标值,即,\(r_{s\_new} + \gamma Q_{s\_new}\)。
- 第二项为什么要用『采取动作后的新状态下的最大Q值』:
- 本质是模型使用方式决定的。因为模型在最终使用时,输出的动作就是对应Q值最大的。从最终状态往前倒推,实施的即为一串Q值最大的动作序列,为保证模型从任一状态开始都能最大概率地导向最优状态,设计某一状态下任一动作的Q值时,便需要将后续大概率采取的一系列动作也考虑进来。
| notation | 含义 |
|---|---|
| s | 当前状态 |
| a | 动作 |
| Q表 | 在各个状态s下采取各个动作a得到的Q值组成的表 |
| Q(s0, a0) | 在状态s0下采取动作a0得到的Q值 |
| Q(s0) | 在状态s0下采取某个动作a所能得到的最大Q值 |
| r | 奖励,通过设置不同状态对应不同奖励从而求得任务所需的Q表 |
Q表更新(学习)规则: \[ Q_{s_0, a_0} = Q_{s_0, a_0} + \alpha [(r_{s_1} + \gamma Q_{s_1}) - Q_{s_0, a_0}] \] 其中 \(\gamma\) 为未来奖励的衰减率,\(\alpha\) 为学习率,对其做递归展开得(设 \(\alpha = 1\) ): \[ \begin{align*} Q_{s_0, a_0} &= Q_{s_0} \\ &= r_{s_1} + \gamma Q_{s_1} \\ &= r_{s_1} + \gamma (r_{s_2} + \gamma Q_{s_2}) \\ &= r_{s_1} + \gamma r_{s_2} + \gamma^2 r_{s_3} + \dotso \end{align*} \]
故 \(\gamma\) 越大,对未来考虑越多。
用神经网络来实现Q表的功能,解决状态取值为连续值的问题。
将采取动作后的回报值作为DNN预估值,相当于多个目标的回归任务,目标个数即为全部的动作个数。

训练细节:
详见demo(DQN/run) 。
理论上来说,DQN的设计会天然存在Q值高估问题:本质是DQN设计的label计算逻辑导致的正向误差累积。
可以从任一状态开始往前倒推来理解。假设在某一状态下采取任一动作后的Q值均为0(或者相差无几),若target_model在某一动作上存在微弱高估,执行max操作后,\(r_{s\_new} + \gamma Q_{s\_new}\) 即为偏高的label,online_model可能会估得偏低可能会偏高,估得偏低时不会出现什么特别的影响,而一旦估得比偏高的label更高时,执行target_replace_op后,target_model也会估得更高;状态往前推,因为通过max操作选label,高估的信息便会继续往前传递,逐渐累加。对于动作空间较大的任务,DQN 中的过高估计问题会非常严重,造成 DQN 无法有效工作的后果。
实际表现会是什么样子:TODO(模型输出的Q值出现大于预设分布最大值的情况?这又怎么影响实际应用的有效性的呢?)
Double DQN的解决方案:在计算label时,max操作和Q值操作不用同一个网络(target_model),而分别用两个网络(max用online_model,Q值用target_model),从而缓解正向误差累积问题。
有很多任务,在部分场景中,Q值只受当前状态影响,无论采取什么动作,期望回报区别不大。比如避障任务中没有障碍的场景,承接条数识别任务中承接与否无所谓的用户。
模型预估两部分,价值函数V(不考虑动作,可以理解为预估的是在某一状态下采取任一动作后Q值的均值),和优势函数A(预估的是在某一状态下采取该动作后的Q值 相较于 采取任一动作后Q值 的优势)(若样本为动作a1,该样本是否更新其它动作对应的优势函数部分?)。即将原目标 \[ Q^{online\_model}_{s} = r_{s\_new} + \gamma \max{Q^{target\_model}_{s\_new}} \] 中的Q值计算改为两个输出值的计算: $$ Q^{online_model}{s} = V^{online_model}{s} + A^{online_model}_{s} \
Q^{target_model}{s_new} = V^{target_model}{s_new} + A^{target_model}{s_new} \[ 对于建模不唯一性的问题(对于同样的Q值,如果将V值加上任意大小的常数C,再将所有A值减去C,则得到的Q值依然不变,这会导致训练的不稳定性),通过在计算Q值时再减去一项优势函数的最大值,从而调整最优动作的优势函数值为0,由此确保V值建模的唯一性=max(Q)(TODO 有待理解。。。): \] Q^{online_model}{s} = V^{online_model}{s} + (A^{online_model}{s} - ) \
Q^{target_model}{s_new} = V^{target_model}{s_new} + (A^{target_model}_{s_new} - ) $$
另外,通过用两个目标的方式来去学习也可以解建模不唯一性的问题(待尝试)。
价值函数: \[ V^{online\_model}_{s} = td\_target \] 和优势函数: \[ A^{online\_model}_{s} = td\_target - V^{online\_model}_{s} \] 其中 $$ td_target = r_{s_new} + \
Q^{target_model}{s_new} = V^{target_model}{s_new} + A^{target_model}_{s_new} $$ 这里td_target依然采用max的方式去做,会不会有问题?
DQN 状态可以达到无限,但输出的是已设定的各个动作的Q值(潜在回报值),故动作数量依然是有限的(有几个输出神经元便是所能采取的动作数量);通过直接输出动作的值而不是某个动作后的回报值的方法,可使得输出动作达到无限,这种方法称为 Policy Gradient。
通过奖励的设置,来去改变回传的梯度的大小(也可以理解为label的置信度),这也是叫PG的原因。
与DQN的本质区别:DQN学的是各个动作后的回报值,PG学的是下一个动作(动作取值 如移动的偏移值,或 动作id的概率)。即如果都是面对离散动作空间的话,PG是在解分类问题,DQN是在解回归问题(类比 PG在做时长满意分类,DQN在做观看时长回归)。

因为label是直接用的模型输出的action,所以为了避免每条样本的CE都是0,实际操作时选用label的action会引入随机。
与DQN更新的策略不同,DQN可以单步更新参数,而PG只能回合更新。因为虽然label引入了随机,但CE的期望值依然是0,只能用奖励修正loss的期望,故PG只能回合更新(若没完成回合,则所有的动作奖励都是0;除此之外,若即使有奖励值来去修正,但不是同一个回合的样本的话,也会因为随机抽取样本,样本分布发生变化(比如奖励低的资源异常地多),导致效果变差)。
PG方差太大,lr正常设置容易无法收敛,lr往小里设置收敛太慢(PG为啥方差会很大?)
对PG中用于修正loss期望的奖励,用DQN来预估,这样就能解决PG只能回合更新的问题了。PG称为Actor,DQN称为Critic。
Critic的引入为什么能够减少PG的方差?
判断离线模型有变好的指标:
为了继续用DQN的off-policy,且能应对连续action的任务。
相较于DQN主要有三个改动:
PPO 利用 New Policy 和 Old Policy 的比例,限制了 New Policy 的更新幅度,让 Policy Gradient 对稍微大点的学习率不那么敏感。
PPO的关键就两点:
https://zhuanlan.zhihu.com/p/28223597805
以『倒立摆』为例。
训练流程:
样本收集:
备注:
\[ loss = \text{MSE} (\text{CRITIC}(state), td\_target) \]
\[ 其中,td\_target = reward + 0.9 * \text{CRITIC}(next\_state) * (1 - done) \]
\[ loss = -\min{[A * ratio, A * ratio|^{1.2}_{0.8}]} \]
\[ \begin{align} 其中,& ratio = \frac{p_{actionx}}{p_{actionx}^{old}} \\ & A = td\_delta + 0.9 * 0.9 * A_{next} \\ & td\_delta = td\_target - \text{CRITIC}(state) \end{align} \]

\[ A = reward + \gamma\text{CRITIC}(next\_state) - \text{CRITIC}(state) + \gamma * \lambda * A_{next} \]
#### RLHF中的PPO
https://huggingface.co/blog/zh/the_n_implementation_details_of_rlhf_with_ppo
https://zhuanlan.zhihu.com/p/645225982
尝试了另一条奖励机制设计的路径:
长期奖励:
GRPO的优势值不再用GAE的方式,而是将整个回合的路径全部生成后计算,不再需要计算某个状态下的后续累积回报的期望ValueModel(state):
\[ \begin{align} A_{ep_i,token} &= \frac{r_{ep_i} - \text{mean}(r)}{\text{std}(r)} \\ 优势值 &= 该回合的reward距离所有回合的均值有多少个标准差 \end{align} \]
这种奖励机制设计是在降低奖励预估的难度,从而将更多的算力放在Actor上。ValueModel(state)定位是在所有可能的状态&动作空间上预估的基线(后续累积回报的均值),需要逐action地精准训练;而GRPO是用RewardModel(RewardModel会有listwise的损失函数),对慢模型多次生成的策略路径来打分估算出来的基线,只需要对整个回合的路径打分准确即可。
GRPO-Zero更甚至将RewardModel也去掉,直接用程序/逻辑计算得到其生成结果的reward,即RLVR(verifiable rule);其优点是不容易出现reward hacking问题,但泛化性就会下降,在某些场景(数学推理、编程等)会比较好用。
本质上,PPO的基线是在全样本空间上的回报均值,GRPO的基线是在指定的状态下PolicyModel预估概率偏高的策略空间上的回报均值。对于慢模型采样训练的pipeline,只要能保证策略熵不坍缩,GRPO的基线效率会更高,两个原因,一个是因为它隐含了PolicyModel内部的参数信息(类似于ratio的效果),另一个是因为这种基线的预估任务更简单方差更小。但从根本上来说,PPO的潜力应该比GRPO高,不考虑数据稀疏与算力的情况下,PPO的效果应该会更好。
即时奖励:
除了基于长期奖励(又称结果奖励,outcome reward)的优势函数,还加了基于即时奖励(又称过程奖励,process reward)的优势函数(相应地也需要提前训好一个预估即时奖励的RewardModel,实现verify step by step):
\[ A_{ep_i,token_j} = \frac{r_{ep_i,token_j} - \text{mean}(r)}{\text{std}(r)} \]
其它细节:
为什么采样时还需要用慢模型采样:因为采样的数据分布直接影响了A的数据分布,如果直接用快模型采样,会导致A的数据分布频繁变化,方差过大,难以收敛。
KL散度损失作为一项直接加到了loss上,避免Actor进行奖励攻击(reward hacking)或利用奖励信号中某些与原始模型不兼容的特性,从而保证不丢失撰写连贯语句和遵循指令的能力。
通过LLM在MATH任务上Maj@K和Pass@K指标的对比发现:如果RewardModel不能有效泛化到分布外数据,强化学习将仅能稳定Actor的输出分布, 而非提升其核心能力;更甚至说强化学习将只是在扮演一个数据增强的角色。(这个是限制在基于慢模型采样训练的流程,如果不是,结论可能是另一番样子)
Clip‐Higher:
动态采样:
即时奖励:
过长奖励整形:
在大模型、小模型、预训练模型、指令微调模型上做的各种已知技巧的消融实验(只在数学推理数据集上做的,适配其它场景时需具体情况具体分析,其价值更大的是其分析思路(即对梯度组成的各部分做枚举分析,看其数值分布与变化走势,并尝试通过case-by-case地做归纳总结),而非结论):
最终归纳最有用的两个技巧:
延续GRPO的思路,不仅对优势值做标准化,对ratio也做标准化,进一步提高训练效率和稳定性。
ratio不做标准化存在的问题:
\[ \begin{align} ratio_{回合} &= \exp (\frac{1}{回合长度}\sum_{动作}^{回合}{\log (ratio_{动作})}) \\ &= \prod_{动作}^{回合} \sqrt[回合长度]{ratio_{动作}} \end{align} \]
实际实现为(保证只回传到单个动作对应的梯度流上): \[ ratio_{实际实现} = \text{SG}(ratio_{回合}) \frac{p_{actionx}}{\text{SG}(p_{actionx})} \] TODO:从异步梯度更新的角度来考虑截断机制的价值吗?或者说慢模型采样并通过加权优势函数训练的本质是异步梯度更新吗?待细索
困难样本挖掘的优化思路。
针对reward相同但长度不同的回合,因为NLP任务的性质,回合长度更长的样本对模型来说更容易学到,但从推理效率、计算成本上来说回合更短的生成结果是我们更想要的,故在慢模型采样阶段引入动作效率之类的metic做困难样本挖掘,一个是进一步提高了训练效率,另一个是通过样本挖掘的metic函数实现了更弱一些的偏好对齐。metic可选有:
自适应难度(有点focal loss的意思):通过采样到的所有回合的平均奖励作为该问题的难度(难度的阈值随模型训练动态更新),难度低的只喂给模型少量样本,难度高的喂给模型更多样本。
致命三角(deadly triad):https://zhuanlan.zhihu.com/p/2883455468