LLM中的DPO

DPO算法是从RLHF演化过来的,介绍DPO算法之前,我们先回顾一下RLHF的训练流程,RLHF的训练可以分为两个步骤:

1. 训练 reward model(训练数据是同一个prompt的2个回答,让人或GPT4标注哪个回答更好),reward model会去优化如下的loss: \[\max_{r_\phi} \left\{ \mathbb{E}_{(x, y_{\text{win}}, y_{\text{lose}}) \sim \mathcal{D}} \left[ \log \sigma \left( r_\phi(x, y_{\text{win}}) - r_\phi(x, y_{\text{lose}}) \right) \right] \right\}\]

其中\(r_\phi\)就是reward model用来给回答打分。\(D\)是训练数据集,\(x\)是prompt,\(y_{\text{win}}\)\(y_{\text{lose}}\)分别是好的回答和不好的回答。也就是说,要尽可能让好的回答的得分比不好的回答高,拉大他们之间的差别

2. 用PPO算法来提升模型的得分,使用的loss是: \[\max_{\pi_\theta} \left\{ \mathbb{E}_{x \sim \mathcal{D}, y \sim \pi_\theta(y \mid x)} \left[ r_\phi(x, y) \right] - \beta \mathbb{D}_{\text{KL}} \left[ \pi_\theta(y \mid x) \parallel \pi_{\text{ref}}(y \mid x) \right] \right\}\]

其中\(\pi_\theta\)是我们在训练的LLM,\(\pi_{\text{ref}}\)是训练的初始值。这个loss意思是希望LLM输出的回答的评分能尽可能高,同时\(\pi_\theta\)不要偏离\(\pi_{\text{ref}}\)太多,保证它还能正常做回答,不要训成一个评分很高但是回答乱码的东西。

 

DPO的作者们意识到,后面的这个式子是有显式解的。因为: \[ \begin{align*} &\max_{\pi_\theta} \left\{ \mathbb{E}_{x \sim \mathcal{D}, y \sim \pi_\theta(y \mid x)} \left[ r_\phi(x, y) \right] - \beta \mathbb{D}_{\text{KL}} \left[ \pi_\theta(y \mid x) \parallel \pi_{\text{ref}}(y \mid x) \right] \right\}\\ =&\max_{\pi_\theta} \mathbb{E}_{x \sim \mathcal{D}, y \sim \pi_\theta(y \mid x)} \left[ r_\phi(x, y) - \beta \log \frac{\pi_\theta(y \mid x)}{\pi_{\text{ref}}(y \mid x)} \right]\\ =&\min_{\pi_\theta} \mathbb{E}_{x \sim \mathcal{D}, y \sim \pi_\theta(y \mid x)} \left[ \log \frac{\pi_\theta(y \mid x)}{\pi_{\text{ref}}(y \mid x)} - \frac{1}{\beta} r_\phi(x, y) \right]\\ =&\min_{\pi_\theta} \mathbb{E}_{x \sim \mathcal{D}, y \sim \pi_\theta(y \mid x)} \left[ \log \frac{\pi_\theta(y \mid x)}{\pi_{\text{ref}}(y \mid x) e^{r_\phi(x, y) / \beta}} \right] \end{align*} \] 如果我们归一化一下分母(一个概率分布的和必须为1),即取 \(Z(x) = \sum_y \pi_{\text{ref}}(y \mid x) e^{r_\phi(x, y) / \beta}\) ,也就可以构造出一个新的概率分布: \[\pi^*(y \mid x) = \frac{\pi_{\text{ref}}(y \mid x) e^{r_\phi(x, y) / \beta}}{Z(x)}\] 那么上式变成了: \[ \begin{align*} &\min_{\pi_\theta} \mathbb{E}_{x \sim \mathcal{D}, y \sim \pi_\theta(y \mid x)} \left[ \log \frac{\pi_\theta(y \mid x)}{\pi_{\text{ref}}(y \mid x) e^{r_\phi(x, y) / \beta}} \right]\\ =&\min_{\pi_\theta} \mathbb{E}_{x \sim \mathcal{D}, y \sim \pi_\theta(y \mid x)} \left[ \log \frac{\pi_\theta(y \mid x)}{\pi^*(y \mid x)} - \log Z(x) \right]\\ =&\min_{\pi_\theta} \mathbb{E}_{x \sim \mathcal{D}, y \sim \pi_\theta(y \mid x)} \left[ \log \frac{\pi_\theta(y \mid x)}{\pi^*(y \mid x)} \right]\\ =&\min_{\pi_\theta} \mathbb{E}_{x \sim \mathcal{D}} \mathbb{D}_{\text{KL}} \left( \pi_\theta(y \mid x) \parallel \pi^*(y \mid x) \right) \end{align*} \]

(注意:上面第二步的推导中能消去$\log Z(x)$的原因是因为$\log Z(x)$只和$\pi_{\text{ref}}$、$r_\phi$有关,和我们要优化的$\pi_\theta$没有关系

由于KL散度*在2个分布相等时取最小值,我们得到了这样的结论:RLHF训练希望得到的最优的概率分布就是\(\pi^*\)

简单转换一下\(\pi^*\)的定义式,可以得到: \[r_\phi(x, y) = \beta \log \frac{\pi^*(y \mid x)}{\pi_{\text{ref}}(y \mid x)} + \beta \log Z(x)\] 带入最上面优化\(r_\phi\)的loss,也就有了: \[\max_{\pi^*} \left\{ \mathbb{E}_{(x, y_{\text{win}}, y_{\text{lose}}) \sim \mathcal{D}} \left[ \log \sigma \left( \beta \log \frac{\pi^*(y_{\text{win}} \mid x)}{\pi_{\text{ref}}(y_{\text{win}} \mid x)} - \beta \log \frac{\pi^*(y_{\text{lose}} \mid x)}{\pi_{\text{ref}}(y_{\text{lose}} \mid x)} \right) \right] \right\}\]

也就是说,我们可以直接用这个loss去求最优的\(\pi_\theta\)(下面的这个式子也就是DPO最终的loss): \[\max_{\pi_\theta} \left\{ \mathbb{E}_{(x, y_{\text{win}}, y_{\text{lose}}) \sim \mathcal{D}} \left[ \log \sigma \left( \beta \log \frac{\pi_\theta(y_{\text{win}} \mid x)}{\pi_{\text{ref}}(y_{\text{win}} \mid x)} - \beta \log \frac{\pi_\theta(y_{\text{lose}} \mid x)}{\pi_{\text{ref}}(y_{\text{lose}} \mid x)} \right) \right] \right\}\]

 

我们来对比一下DPO和RLHF的差别:

1. DPO只需要在偏好数据集中就可以训练出最优的策略模型,而RLHF需要训练两步(训练reward模型+用PPO算法优化策略模型),PPO算法实现更简单

2. DPO算法只需要训练actor和ref两个模型,RLHF需要训练actor、ref、critic、reward 4个模型,DPO算法更节约资源

3. DPO算法是纯粹从偏好数据集训练的,对偏好数据集的质量要求更高,而RLHF有从无偏数据集采样优化的过程,泛化性更好一些

 

参考资料

DPO 是如何简化 RLHF 的

dpo 的局限性

 

posted @ 2025-04-23 11:05  AI_Engineer  阅读(135)  评论(0)    收藏  举报