大模型中的强化学习实战1——大语言模型研究06

作者: 引线小白-本文永久链接:httpss://www.limoncc.com/post/47f9ae3708f426c0/
知识共享许可协议: 本博客采用署名-非商业-禁止演绎4.0国际许可证

摘要: 本文意在理清RLHF代码实战的关键问题。若有错误,请大家指正。
关键词: RLHF,GRPO,REINFORCE+++

一、DeepSeek-R1推理模型的复现浪潮

基于人类反馈的强化学习在deepseek-r1模型横空出世后,deepseek-r1的开源引发了大家都争先恐后的的复现浪潮。unsloth的基于Llama 3.1 8B Instruct[^1]、UC伯克利研究团队的DeepScaleR[^2]、huggingface的openR1[^3]、mini-deepseek-r1[^5]、TinyZero[^6]、simpleRL-reason[^7]、RAGEN[^8]、oat-zero[^9]、李飞飞的s1[^12]、Qwen 0.5b on GRPO[^15],国内的:皓天[^4]、skydownacai[^10]、Logic-RL[^11]。这是截止2025年2月11日16:30前的数据,如果还有遗漏欢迎大家补充。

浏览下来的一个初步观感:复现项目大多基于huggingface的trl、OpenRLHF两个项目,还有手动自己写trainer。对于分布式训练,一般都是基于Ray和deepspeed。他们大都采用的蒸馏部分数据sft+RL的方式。

2025年推理模型必将大行其道,在实战层面系统性掌握大模型下的强化学习十分必要。这也是笔者写这个系列文章的原因。先说一个简单的规划:

RLHF代码-初见01

  • 回顾PPO的代码实现,并介绍相关核心流程与概念
  • 理顺一些关键trick的理论基础与考量
  • GRPO与PPO的不同
  • REINFORCE+++

RLHF代码-实战02

  • OpenRLHF的REINFORCE+++实战
  • OpenRLHF的GRPO实战
  • trl的GRPO的实战

RLHF代码-s1的学习02

  • s1模型的数据工程
  • s1的测试时扩展计算方法
  • 如何构建自己的领域模型

二、RLHF实现的核心流程

2.1、损失函数

我们先回顾一下PPO的损失函数,笔者将以PPO损失函数为例,通过OpenRLHF代码核心逻辑来说明大模型中强化学习实现的核心流程。这里为什么不是通过trl的PPO或者GRPO,因为OpenRLHF代码非常优雅简洁,不像trl抽象太多;然后大厂都在用。总之OpenRLHF 是一个基于 Ray、DeepSpeed 和 HF Transformers 构建的高性能 RLHF 框架。用就对了。

$$\begin{align}
\mathcal{L}_{\textit{PPO}}(\bm{\theta})
&=\mathbb{E}_{q\sim \rho(Q),\bm{o}\sim \pi_{\bm{\theta}_\text{old}}}\frac{1}{|\bm{o}|}\sum_{t=1}^{|\bm{o}|}\bigg[\min\left[\frac{\pi_{\bm{\theta}}(o_t\mid q,o_{:t})}{\pi_{\bm{\theta}_\text{old}}(o_t\mid q,o_{:t})},\mathrm{\text{clip}}\left[\frac{\pi_{\bm{\theta}}(o_t\mid q,o_{:t})}{\pi_{\bm{\theta}_\text{old}}(o_t\mid q,o_{:t})},1-\epsilon,1+\epsilon\right]\right]\cdot A_{\pi}(q,o_t)\bigg]
\end{align}$$

其中

  • 数据集: $\mathcal{D}=\{(q_i,\bm{o}_i)\}_{i=1}^n$, 来自旧策略 $\pi_{\bm{\theta}_\text{old}}$的采样
  • 优势函数估计:
    $\hat{A}_t(k)=\delta_t + \gamma\lambda\hat{A}_{t+1}(k-1)$
    $\delta_t = r_t + \gamma v_{\bm{w}}(s_{t+1}) - v_{\bm{w}}(s_t)$
    $r_t=\pi_{\bm{\theta}_{\textit{rm}}}(q,o_{:t})-\beta \mathbb{KL}\big[\pi_{\bm{\theta}} ||\pi_{\bm{\theta}_\textit{ref}}\big]$
    $\displaystyle \mathbb{KL}\big[\pi_{\bm{\theta}} ||\pi_{\bm{\theta}_\textit{ref}}\big] = \log \frac{\pi_{\bm{\theta}}(o_t\mid q,o_{:t})}{\pi_{\bm{\theta}_\textit{ref}}(o_t\mid q,o_{:t})}$
  • 符号说明: 价值模型 $v_{\bm{w}}$、 奖励模型 $\pi_{\bm{\theta}_{\textit{rm}}}$、 策略模型 $\pi_{\bm{\theta}}$、 参考模型 $\pi_{\bm{\theta}_\textit{ref}}$

如果你对理论不熟悉,可以参考笔者以前的文章[^13]:大模型中的强化学习——大语言模型研究05

PPO强化学习中的策略学习,且是异策略。策略训练的核心目标在于最大化生成响应所获价值的期望。在大模型强化学习中价值已经用优势估计取代,也是就带基线的策略梯度, 其训练架构涉及四个功能模块:
奖励模型:提供细粒度反馈信号
策略模型(演员模型):持续优化的核心主体
参考模型:实施正则化约束
价值模型(评论模型)(可选):通过价值函数估计提升训练稳定性

2.2、Trainer整体循环

下面来理解 $\displaystyle \mathbb{E}_{q\sim \rho(Q),\bm{o}\sim \pi_{\bm{\theta}_\text{old}}}\frac{1}{|\bm{o}|}\sum_{t=1}^{|\bm{o}|}$的代码实现,即采样到底是如何实现的。一般机器学习的trainer中最外层一般叫epoch /ˈiːpɒk/, 在强化学习中叫做episode /ˈepɪsəʊd/。表示每个训练周期。是策略模型和价值模型参数更新的总步数。它直接控制策略优化的频率,是平衡经验收集(探索:Exploration)和策略优化(利用:Exploitation)的关键参数。PPO训练循环中有两个关键环节探索利用

在整体层面理解OpenRLHF代码[^14]数据集流动路径的核心是给出各种 batch_size的解释:

  • 1、首先有一个高质量、多样性丰富、难度覆盖广泛的提示数据集 $\mathcal{D}=\{q_i\}_{i=1}^n$。或者带上参考答案的 $\mathcal{D}=\{(q_i,\bm{o}_i^{ref})\}_{i=1}^n$也可。对这个数据集遍历 episodes 遍。
  • 2、随机从数据集中取出 rollout_batch_size // world_size 个数据, 即从提示数据集中滚出多个数据探索(Exploration)。rollout_batch_size这词翻译为 滚出批量 还是比较形象的。 其中world_size这参数指的个GPU数量,来自torch的distributed.get_world_size()。个人理解滚出批量这个参数主要来调节数据处理的速度。
  • 3、有了滚出批量的数据, 下面就开始探索,即经验收集。在经验收集阶段会按照 micro_rollout_batch_size: 微滚出批量 的大小来收集经验。为什么不是按照 滚出批量 来收集呢?因为在经验收集阶段要依次调用策略模型 $\pi_{\bm{\theta}}$、 参考模型 $\pi_{\bm{\theta}_\textit{ref}}$、 价值模型 $v_{\bm{w}}$、 奖励模型 $\pi_{\bm{\theta}_{\textit{rm}}}$来计算生成经验数据(状态-动作-奖励序列)奖励、价值、输出概率等指标。需要一个参数来调节资源消耗。
  • 4、有了经验数据后,经验数据会压入 回放缓存 里。这里称之为回放是不恰当的,因为PPO是异策略,在强化学习中的经验回放不是这个意思。不过在大模型强化学习领域,大家都这么叫了。在 回放缓存 中的数据会被重新整理批量大小,变为: micro_train_batch_size, 即是 微训练批量大小,是每次做后向传播的批量大小,等同于deepspeed的train_micro_batch_size_per_gpu。

伪代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for episode in episodes:
for rand_prompts in prompts_data:
# 1. 经验收集阶段
## 1.1 生成数据
# rollout_batch_size: 滚出批量,即从提示数据集中推出多数据探索Exploration
# len(rand_prompts) = rollout_batch_size//world_size
experiences = make_experience_list(rand_prompts)
## 1.2 压入回放缓存
for experience in experiences:
# len(experience) = micro_rollout_batch_size
replay_buffer.append(experience)

# 2. 策略优化阶段
ppo_train(replay_buffer) # 执行PPO更新步骤
2.3、经验收集循环

在经验收集函数中需要做如下操作:

  • 1、扩充提示词书籍扩充 n_samples_per_prompt倍,即扩展倍数是 提示词采样数量,然后按照 微滚出批量生成经验。
  • 2、把目标函数需要的各个量计算出来, 按照公式写即可。

伪代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# make_experience_list.py
# len(rand_prompts) = rollout_batch_size//world_size
prompts = sum([[prompt] * n_samples_per_prompt for prompt in rand_prompts], [])
experiences = []
for i in range(0, len(prompts), micro_rollout_batch_size):
inputs = prompts[i:i + micro_rollout_batch_size]
# 策略模型和参考模型、价值模型都使用推理框架vllm、SGlang实现推理加速
samples = actor_model.generate(inputs)
ref_samples = ref_model.generate(inputs)
kl = compute_kl(samples,ref_samples)
rewards = reward_model.generate(inputs) - kl # 可远程部署调用API
values = critic_model.generate.generate(inputs) #
advantages = estimate_advantages(rewards,values)
# 收集经验
experience= Experience(samples,ref_samples,advantages)
experiences.append(experience)
2.4、策略优化循环

策略优化循环是在 rollout_batch_size//world_size的数据量上进行的,依然是在episodes和prompts_data的循环内。

  • 1、首先会在 滚出批量上学习 max_epochs 遍。
  • 2、接着会在 回放缓存中 按 微训练批量大小 做后向传播
  • 3、当累计 微训练批量大小train_batch_size训练批量大小)后就开始更新梯度。这里的train_batch_size和deepspeed中的train_batch_size是一个意思。具体的操作更新操作在OpenRLHF中是通过DeepspeedStrategy类实现的。

伪代码如下:

1
2
3
4
5
6
7
8
9
10
11
# ppo_train.py
accumulate_train_batch_size = 0
for epoch in max_epochs:
for experience in replay_buffer:
# len(experience) = micro_train_batch_size
loss = ppo.loss(experience)
loss.backward()
accumulate_train_batch_size += micro_train_batch_size
if accumulate_train_batch_size == train_batch_size:
optimizer.step()
accumulate_train_batch_size = 0

2.5、简单总结

通过对探索和利用两个循环的简单回顾,相信已经大致了解了RLHF的基本流程的套路。如果还没看明白,那就多看几遍。下面来解决一个小问题。在总的循环中,经验收集循环到底用了几步?或者问策略优化循环总共用了几步。略作思考,来揭晓答案:

  • 在一个 episode 中策略优化循环用了几步:
    num_update_steps_per_episodes = (len(prompts_data) n_samples_per_prompt // train_batch_size max_epochs)
    策略优化循环总共有几步:
    max_steps = math.ceil(num_episodes * num_update_steps_per_episodes)
  • 在一个 episode 中经验收集循环用了几步:
    num_rollouts_per_episodes = (num_update_steps_per_episodes train_batch_size
    // max_epochs
    // rollout_batch_size
    // n_samples_per_prompt
    )
    = len(prompts_data)
    n_samples_per_prompt // rollout_batch_size * max_epochs

这个问题一般用来计量步骤和收集数据。

三、RLHF关键Trick

这里的Trick中主要参考的(Huang 2024)[^16]和huggingface的PPO的n种实现细节文章[^17]、OpenRLHF[^24]。还有初七大佬的知乎文章[^18]、[^19]、[^20]、[^21]、[^22]。初七大佬提出了REINFORCE+++,融合了PPO的Trick并去掉了价值网络(Jian Hu 2025)[^23],文章中的实验表明比GRPO训练更加稳定。在多个复现R1的项目中都有REINFORCE+++身影。REINFORCE+++使用了如下技术

1、token KL 惩罚
2、PPO-Clip 集成
3、Mini-Batch:
4、奖励标准化和裁剪
5、优势归⼀化

下面按照笔者自己的理解进行了总结:

3.1、常见技巧

对于PPO的的技巧clip[^25] 这里就不在复述。重要性采样也很好理解、使用优势函数提替换动作价值函数也很好理解。这里就不在复述。

3.2、KL惩罚
3.2.1、对于KL是放在奖励函数里面,还是放在外面。

PPO的 $r_t=\pi_{\bm{\theta}_{\textit{rm}}}(q,o_{:t})-\beta \mathbb{KL}\big[\pi_{\bm{\theta}} ||\pi_{\bm{\theta}_\textit{ref}}\big]$和GRPO $\displaystyle \mathcal{L}_{\textit{GRPO}}(\bm{\theta})
=\mathbb{E}_{q\sim \rho(Q),\{\bm{o}_i\}_{i=1}^G\sim \pi_{\bm{\theta}_\text{old}}}\\
\frac{1}{G}\sum_{i=1}^G
\frac{1}{|\bm{o}_i|}\sum_{t=1}^{\bm{|\bm{o}_i|}}
\bigg[\min\left[\frac{\pi_{\bm{\theta}}(o_{i,t}\mid q,o_{i,:t})}{\pi_{\bm{\theta}_\text{old}}(o_{i,t}\mid q,o_{i,:t})},\mathrm{\text{clip}}\left[\frac{\pi_{\bm{\theta}}(o_{i,t}\mid q,o_{i,:t})}{\pi_{\bm{\theta}_\text{old}}(o_{i,t}\mid q,o_{i,:t})},1-\epsilon,1+\epsilon\right]\right]\cdot A_{\pi}(q,\bm{o}_i)-\beta \mathbb{\hat{KL}}\big[\pi_{\bm{\theta}} ||\pi_{\bm{\theta}_\textit{ref}}\big]\bigg]$的做法都能解释的通,其实实质其实是一个贝叶斯推断[^26], 不想看文献,可以看笔者的写的[^27]介绍文章。不过加入奖励函数里面控制粒度更细。训练应该更加稳定。但是皓天大佬用REINFORCE+++复现时候加入KL约束会限制模型探索空间[^28]。皓天大佬的文章很有启发性,指出在base模型变强以后,其实现有的RL算法在规则奖励上应该都能work。更加应该探索如何基于强base模型来优化RL算法。不应拘泥于原来RL训练不稳定,难训练这种传统观念。

下面还是略微来解释一下KL的作用实质到底是什么:
一开始我们通过语料训练了一个预训练模型 $\pi_{\text{PT}}$,然后有得到一个 $\pi_{\text{SFT}}$模型,接下来通过RLHF我们要得到一个 $\pi_{\text{RLHF}}$的模型。这其实是什么?是不断调整分布的过程,或者说是语言模型不断调整信念的过程。

符号说明$\mathcal{D}=\{(x_i,y_i)\}$,其中 $x_i$表示指令, $y_i$是预训练的语言模型的输出。 $\pi(y\mid x)$是从指令到输出的概率分布。

1、首先一开始有一个在大规模语料上训练的语言模型 $\pi_0(y\mid x)$, 目前它表现欠佳,它的世界和人类的世界差别有点大,说起话来前言不搭后语。
2、好了现在有一个对话语料 $\mathcal{D}=\{(x_i,y_i)\}$,这个对话预料的特点就是真实反应了人类世界的情况,或者说基于此我们能生成一个评分函数 $r(x,y)$这个函数能给语言模型基于指令 $x$生成的 $y$打分。既然如此不如这样思考

$$\begin{align}
q(r\mid y,x )\propto \exp\bigg(\frac{1}{\beta}r(x,y)\bigg)
\end{align}$$

给定 $x,y$对评分 $r$附上一个信念或者概率 $q$,这里的 $\beta$是一个信念可调整的超参数。比较是个比较主观的东西,加个可调整参数来调节,以便让大多数人满意。

3、现在的问题就变成了如何根据初始模型 $\pi_0(y\mid x)$和人类的评分信念 $q(r\mid y,x )$来调整模型参数 $\theta$得到一个新的模型 $\pi_{\theta}(y\mid x)$

如果说 $\pi_0(y\mid x)$是先验分布,那么人类的评分信念 $q(r\mid y,x )$就是似然函数,于是我们可以构造一个后验分布

$$\begin{align}
\pi_{\text{KL-RL}}(y\mid x, r)
\propto q(r\mid y,x )\pi_0(y\mid x)
=\exp\bigg(\frac{1}{\beta}r(x,y)\bigg)\pi_0(y\mid x)
\end{align}$$

或者加上归一参数或者说证据$Z(y,x,r)$
$$\begin{align}
\pi_{\text{KL-RL}}(y\mid x, r) = \frac{1}{Z}\exp\bigg(\frac{1}{\beta}r(x,y)\bigg)\pi_0(y\mid x)
\end{align}$$
其中 $\displaystyle Z(y,x,r)=\int \exp\bigg(\frac{1}{\beta}r(x,y)\bigg)\pi_0(y\mid x)dy$

现在我们是无法直接得到 $\pi_{\text{KL-RL}}(y\mid x, r)$,计算证据$Z(y,x,r)$计算是巨大的。但是我们可以让一个分布接进它,或者最好的方式就是就地取材微调 $\pi_0(y\mid x,\theta)$得到 $\pi_{\theta}(y\mid x)$使得它接近。 我们的后验$\pi_{\text{KL-RL}}(y\mid x, r)$,这样我们就得到了对齐后的模型。我们自然就使用到了计算分布相似度的 $\mathbb{KL}$散度。于是问题就变为了

$$\begin{align}
-\min_{\theta}\mathbb{KL}\bigg[\pi_{\theta}(y\mid x)\parallel\pi_{\text{KL-RL}}(y\mid x, r)\bigg]
\end{align}$$
不难证明它与RLFT是等价的。

$$\begin{align}
-\min_{\theta}\mathbb{KL}\bigg[\pi_{\theta}(y\mid x)\parallel\pi_{\text{KL-RL}}(y\mid x, r)\bigg]
= \max_{\theta} \mathbb{E}_{(x,y)\sim\pi_{\theta}}\big[r(x,y)\big]-\beta\mathbb{KL}[\pi_\theta \parallel\pi_0]
\end{align}$$

放在奖励函数里面,还是放在优势函数外面。不过是评分信念的不同,在token层级似然函数就是奖励,在优势函数外面就是优势函数。对贝叶斯更新的提供的信息不同、粒度与层次的不同。

3.2.1、什么才是最佳的KL蒙特卡洛采样

实际上无论是那种RL:PPO、GRPO、RLOO、REINFORCE+++,KL散度都不是真KL散度,而只是KL蒙特卡洛采样估计而已。也是说去掉了概率部分,只有log比。那问题就来了,什么才低偏差、低方差的最优估计,J. Schulman[^29]提出了KL $\displaystyle \mathbb{KL}\big[\pi_{\bm{\theta}} ||\pi_{\bm{\theta}_\textit{ref}}\big]$的三种蒙特卡洛估计

$$\begin{align}
k1 &= \log \frac{\pi_{\bm{\theta}}}{\pi_{\bm{\theta}_{\textit{ref}}}}\\\
k2 & = \frac{1}{2}\log^2 \frac{\pi_{\bm{\theta}}}{\pi_{\bm{\theta}_{\textit{ref}}}}\\
k3 &= \log \frac{\pi_{\bm{\theta}}}{\pi_{\bm{\theta}_{\textit{ref}}}}+\frac{\pi_{\bm{\theta}_\textit{ref}}}{\pi_{\bm{\theta}}}-1
\end{align}$$

当 $\pi_{\bm{\theta}}\to +\infty$或者时, log比就会非常大,在做指数exp 就会数值溢出。不妨令 $r=\log \frac{\pi_{\bm{\theta}_{\textit{ref}}}}{\pi_{\bm{\theta}}}$,则有
$$\begin{align}
k1&=-r\\
k2&=\frac{1}{2}r^2\\
k3&=-r+\mathrm{e}^{r}-1
\end{align}$$

取如下分段函数

$$\begin{align}
k_{stable}=\begin{cases}
k_3 &\text{if } r<0\\
\min[k_1,k_3]&\text{if } r\geqslant 0
\end{cases}
\end{align}$$

3.3、优势函数与价值函数的估计

优势函数提替换动作价值函数核心就是添加一个baseline来减少方差。理论依据就是带基线的策略梯度定理。

$$\begin{align}
\nabla_{\bm{\theta}} \mathcal{J}(\bm{\theta})
= \mathbb{E}_{s_t\sim \rho,a_t\sim \pi}\left[\nabla_{\bm{\theta}}\log\pi_{\bm{\theta}}(a_t\mid s_t) \cdot \left(Q_{\pi}(s_t,a_t)-b\right)\right]
\end{align}$$
具体证明与说明可以参加笔者写的文章[^13],总的来说减去一个与状态没有关系量,或者一个变化方向相反的量。既然如此,在优势函数上再做归一化是不是还能减少方差。

$$\begin{align}
\tilde{A}_i = \frac{A_i-mean(A_i)}{std(A_i)}
\end{align}$$
甚至不需要 $std(A)$ 直接这样 $\tilde{A}= A-mean(A)$。不仅在优势函数这一层做,在奖励这个层次也做归一化或者对奖励做裁剪,在理论都能降低方差稳定训练。

$$\begin{align}
r_t = \mathrm{\text{clip}}[r,lower,upper]
\end{align}$$

在PPO中优势函数在使用GAE来估计,这需要奖励模型和状态价值模型计算。想想都非常消耗资源。如果去掉状态价值模型。GRPO的处理方式是对奖励做组归一化

$$\begin{align}
\hat{A}_{i,t}=\hat{A}_{\pi}(q,\bm{o}_{i}) = \frac{r(\bm{o}_{i})-\text{mean}(\bm{R})}{\text{std}(\bm{R})}
\end{align}$$
然后组内的所有token都共享这个优势估计。这个就有点不符合强化学习的马尔可夫链的逻辑了:

$$\begin{align}
s_1\to a_1\searrow_{r_1}\to s_2\to a_2\searrow_{r_2}
\cdots \to S_t \to A_t\searrow_{R_t}\to S_{t+1} \to A_{t+1}\searrow_{R_{t+1}}\cdots S_T \to A_{T}\searrow_{R_{T}}
\end{align}$$

对于结果奖励而言把token都共享这个优势估计,不太科学。初七大佬提出了REINFORCE+++[^23]则是按照REINFORCE的方法做价值函数的蒙特卡洛估计

$$\begin{align}
\hat{Q}_t=r_t + \gamma \hat{Q}_{t+1}
\end{align}$$

即每个轨迹的折扣累积奖励计算如下

$$\begin{align}
\hat{Q}_t=\sum_{k=t}^T\gamma^{k-t}r_k
\end{align}$$

通过递归我们可以把每个token的奖励传递到之前的每个token。

例如,假设有一个序列长度为3, $\gamma=0.9$,奖励 $\bm{r}=[0,0,3]$

$$\begin{align}
Q_2&=3\\
Q_1&=0 +0.93=2.7\\
Q_0&=0+0.9
2.7=0+2.43=2.43\\
\end{align}$$

这要比GRPO给每个token都给相同优势应该是要合理的,GRPO的优势估计已经脱离的强化学习关于(状态、动作、奖励)三元组的马尔科夫链假设。
$$\begin{align}
A_2=A_1=A_0=1.41421356
\end{align}$$

3.4、策略模型参数的指数移动平均EMA

为了进一步稳定训练,还可以使用策略模型参数的指数移动平均

$$\begin{align}
\bm{\theta}^{EMA}_{t+1} = \beta \bm{\theta}^{EMA}_t +(1-\beta) \bm{\theta}_{t+1}
\end{align}$$

其中:
$\bm{\theta}^{EMA}_{t}$: 是时刻(第 t次更新)的策略模型参数。
$\bm{\theta}_t$是t+1次更新后的参数。
$\beta$:衰减率(通常接近 1,如 0.995),控制历史参数的权重。

说白了就是平衡就策略和新策略的参数

3.5、Ring Attention

Ring Attention(Liu, H.2023)[^30]是谷歌提出的用于处理超长序列的高效注意力机制。其核心思想是将输入序列分块分布在多个设备上,通过环形通信传递中间结果(如键值缓存),使每个设备逐步计算注意力而不需全局存储整个序列,从而突破单设备内存限制,支持极长上下文。

在OpenRLFH中有两个关键参数

  • ring_attn_size:环形组设备数,通常等于总设备数(全环)或其因数(多子环)。
  • ring_head_stride:注意力头在环形中的分布间隔,用于负载均衡。例如步长2时,设备0处理头0,2,4…,设备1处理头1,3,5…

四、一个简单评述

1、正如皓天文章[^28]指出的那样在base模型变强以后,实现有的RL算法在规则奖励上应该都能work。探索如何基于强base模型来高效优化RL算法,应该是RLHF发展的下一个重要方向。

2、也许base模型强到一定程度,上述很多trick其实就不太需要了。

3、就目前复现的情况来看,好的奖励规则或者说一个名师的循循善诱的引导似乎那个正确的方向。如何构建这样一个奖励或循循善诱的引导是值得好好思考的一个重大问题。

4、似乎可以参考教师的培养机制,在师范学习、教材和教案基础上构建一个通用的引导模型,可以实时出题那种;或者验证模型是有可能。

5、学习不仅是一个重复的过程,也是先把书读厚,在把书读薄的过程。或者能在人类众多的学习经验中构建起一个更加强大高效的强化学习算法。

6、选择base模型犹如找到好苗子,强化学习犹如是一个因材施教,循循善诱的过程。教废了,还是天才养成记这确实是个问题。

7、解决RLFH代码实践的框架问题,和关键Trick技巧,接下来就是整数据实操了,敬请期待。

最近笔者也弄了一个公众号: limoncc-ai 欢迎关注。

参考文献

[^1]:unslothai https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Llama3.1_(8B)-GRPO.ipynb#scrollTo=R8-SLRUB2gwM

[^2]:deepscaler https://github.com/agentica-project/deepscaler

[^3]:open-r1 https://github.com/huggingface/open-r1

[^4]:皓天 https://zhuanlan.zhihu.com/p/13872128423

[^5]:mini-deepseek-r1 https://github.com/philschmid/deep-learning-pytorch-huggingface/blob/main/training/mini-deepseek-r1-aha-grpo.ipynb

[^6]:TinyZero https://github.com/Jiayi-Pan/TinyZero

[^7]:simpleRL-reason https://github.com/hkust-nlp/simpleRL-reason

[^8]:RAGEN https://github.com/ZihanWang314/RAGEN

[^9]:oat-zero https://github.com/sail-sg/oat-zero

[^10]:skydownacai https://zhuanlan.zhihu.com/p/22517127574

[^11]:Logic-RL https://zhuanlan.zhihu.com/p/21290410831

[^12]:s1 https://github.com/simplescaling/s1

[^13]:limoncc https://limoncc.com/post/c0a3be9c86b2b4cd/

[^14]:OpenRLHF https://github.com/OpenRLHF/OpenRLHF

[^15]:Qwen 0.5b on GRPO https://colab.research.google.com/drive/1bfhs1FMLW3FGa8ydvkOZyBNxLYOu0Hev?usp=sharing

[^16]:Huang, S., Noukhovitch, M., Hosseini, A., Rasul, K., Wang, W., & Tunstall, L. (2024, March 24). The N+ Implementation Details of RLHF with PPO: A Case Study on TL;DR Summarization. arXiv. https://doi.org/10.48550/arXiv.2403.17031

[^17]:huggingface https://huggingface.co/blog/the_n_implementation_details_of_rlhf_with_ppo

[^18]:初七 https://zhuanlan.zhihu.com/p/622134699

[^19]:初七 https://zhuanlan.zhihu.com/p/14888098807

[^20]:初七 https://zhuanlan.zhihu.com/p/18510331097

[^21]:初七 https://zhuanlan.zhihu.com/p/14520940716

[^22]:初七 https://zhuanlan.zhihu.com/p/714364995

[^23]:Hu, J. (2025, January 4). REINFORCE++: A Simple and Efficient Approach for Aligning Large Language Models. arXiv. https://doi.org/10.48550/arXiv.2501.03262

[^24]:Hu, J., Wu, X., Zhu, Z., Xianyu, Wang, W., Zhang, D., & Cao, Y. (2024, November 24). OpenRLHF: An Easy-to-use, Scalable and High-performance RLHF Framework. arXiv. https://doi.org/10.48550/arXiv.2405.11143

[^25]:Schulman, J., Wolski, F., Dhariwal, P., Radford, A., & Klimov, O. (2017, August 28). Proximal Policy Optimization Algorithms. arXiv. https://doi.org/10.48550/arXiv.1707.06347

[^26]:Korbak, T., Perez, E., & Buckley, C. L. (2022, October 21). RL with KL penalties is better viewed as Bayesian inference. arXiv. http://arxiv.org/abs/2205.11275. Accessed 7 December 2023

[^27]:limoncc https://www.limoncc.com/post/bd7e41e00dc8afad

[^28]:皓天 https://zhuanlan.zhihu.com/p/22288441283

[^29]:J. Schulman. Approximating kl divergence, 2020. URL http://joschu.net/blog/kl-approx.html.

[^30]:Liu, H., Zaharia, M., & Abbeel, P. (2023, November 27). Ring Attention with Blockwise Transformers for Near-Infinite Context. arXiv. https://doi.org/10.48550/arXiv.2310.01889


版权声明
引线小白创作并维护的柠檬CC博客采用署名-非商业-禁止演绎4.0国际许可证。
本文首发于柠檬CC [ https://www.limoncc.com ] , 版权所有、侵权必究。
本文永久链接httpss://www.limoncc.com/post/47f9ae3708f426c0/
如果您需要引用本文,请参考:
引线小白. (Feb. 11, 2025). 《大模型中的强化学习实战1——大语言模型研究06》[Blog post]. Retrieved from https://www.limoncc.com/post/47f9ae3708f426c0
@online{limoncc-47f9ae3708f426c0,
title={大模型中的强化学习实战1——大语言模型研究06},
author={引线小白},
year={2025},
month={Feb},
date={11},
url={\url{https://www.limoncc.com/post/47f9ae3708f426c0}},
}

'