跳转至

Blog

Deepseek GRPO 中的 KL Divergence

Deepseek R1 发布之后,看到了论文中 RL 的算法用的是 GRPO,而 GRPO 是在之前 Deepseek Math 的论文中被提出来的。GRPO 的目标函数如下:

\[ \begin{aligned} \mathcal{J}_{GRPO}(\theta) &= \mathbb{E}_{[q \sim P(Q), \{o_i\}_{i=1}^G \sim \pi_{\theta_{old}}(O\mid q)]} \frac{1}{G}\sum_{i=1}^G \frac{1}{|o_i|} \sum_{t=1}^{|o_i|} \Biggl\{ \min \Biggl[ \frac{\pi_\theta(o_{i,t} \mid q, o_{i,<t})}{\pi_{\theta_{old}}(o_{i,t} \mid q, o_{i,<t})} \hat{A}_{i,t}, \text{clip}\Biggl( \frac{\pi_\theta(o_{i,t} \mid q, o_{i,<t})}{\pi_{\theta_{old}}(o_{i,t} \mid q, o_{i,<t})}, 1 - \epsilon, 1 + \epsilon \Biggr) \hat{A}_{i,t} \Biggr] \\ &\quad - \beta \, \mathbb{D}_{KL}\left[\pi_{\theta} \parallel \pi_{ref}\right] \Biggr\} \end{aligned} \]

这里我们只看最后的 KL Divergence(KL 散度) 部分。关于最后 KL 散度的实现,论文特别做了说明:

And different from the KL penalty term used in PPO, we estimate the KL divergence with the following unbiased estimator (Schulman, 2020), which is guaranteed to be positive.

\[ \mathbb{D}_{KL}\left[\pi_{\theta} || \pi_{ref}\right] = \frac{\pi_{ref}(o_{i,t}|q,o_{i,<t})}{\pi_{\theta}(o_{i,t}|q,o_{i,<t})}- \log\frac{\pi_{ref}(o_{i,t}|q,o_{i,<t})}{\pi_{\theta}(o_{i,t}|q,o_{i,<t})} - 1, \]

也就是说其使用的 KL Divergence 与 PPO 不同,GRPO 中采用了 Schulman 在博客 中提到的一个无偏估计。论文中使用的是博客中提到的\(k_3\)近似形式。让我们稍微展开一下这里的\(k_3\)近似。

首先 KL 散度的公式如下

\(KL[q,p]=\sum\limits _{x}q(x)\log\frac {q(x)}{p(x)} = E_{x\sim q}[\log\frac {q(x)}{p(x)}]\)

定义

\[ r = \frac{p(x)}{q(x)} \]

那么有

\[ KL[q,p] = k_3 = r - log(r) - 1 \]

因此,论文中的 \(\mathbb{D}_{KL}\left[\pi_{\theta} || \pi_{ref}\right]\) 也可以写成下面由 \(r\) 近似的形式:

\[ \begin{align} \mathbb{D}_{KL}\left[\pi_{\theta} || \pi_{ref}\right] &= \frac{\pi_{ref}(o_{i,t}|q,o_{i,<t})}{\pi_{\theta}(o_{i,t}|q,o_{i,<t})}- \log\frac{\pi_{ref}(o_{i,t}|q,o_{i,<t})}{\pi_{\theta}(o_{i,t}|q,o_{i,<t})} - 1 \\ &= r - log(r) - 1 \\ \end{align} \]

此时,

\[ r = \frac{p(x)}{q(x)} = \frac{\pi_{ref}(o_{i,t}|q,o_{i,<t})}{\pi_{\theta}(o_{i,t}|q,o_{i,<t})} \]

对应地,

\[ q(x) = \pi_{\theta}(o_{i,t}|q,o_{i,<t}) \]
\[ p(x) = \pi_{ref}(o_{i,t}|q,o_{i,<t}) \]

到这里为止,论文中 KL 散度的推导的就完成了,一切都很清晰。后来我又读了几篇关于 KL 散度不对称性的博客,比如这篇Reverse vs Forward KL, 里面提到 Reverse KL Divergence 是类似\(\mathbb{D}_{KL}\left[q_{\phi} || p\right]\)的形式 (这里的\(\phi\)是参数),所以很自然地我认为\(\mathbb{D}_{KL}\left[\pi_{\theta} || \pi_{ref}\right]\)就是 Reverse KL Divergence 的形式...直到我在 Twitter/X 上刷到一个帖子说 GRPO 用的是 Forward KL:

LLM in 2024

Image title
管窥精密机器内部核心组件 (GPT 模型的内部构造 Transformer 部分)
(From bbycroft.net/llm)

我个人对 AI(人工智能)/LLM(Large Language Model, 大语言模型) 是完全祛魅的。即使是在 ChatGPT 问世之后,即使是在 LLM 在各个领域掀起热潮的今天, 我也仍然认为这里并没有什么所谓“智能”的东西——我个人不认为现在的 LLM 会思考,不认为它能真正地创作等等。 我更倾向于将现在的 LLM 看作一个庞大而又精密的机器:庞大到包含几百亿个元件,精密到可以和人类对话并完成各种复杂的任务。 尽管如此,我仍然认为我们正处于一个人工智能的黄金时代,一个 AI 可以大方异彩,可以很大程度上改变我们的未来生活方式的时代!

zhplot: 让 Python 中文做图变得简单

Why

在日常工作的少数的场景,我需要用 Python 画一些包含中文的图,一般为了简单快捷都会使用 matplotlib。 在半分钟写完画图代码后,发现图片的文字部分一堆方框后是真的很无奈... 是的,中文字体的支持并不在很多开源库的考虑范围内,这是事实,在社区搜一下能看到一大把的图片显示中文的 issue。

我本来只是想画个图而已,但是我现在需要去搜索怎么安装中文字体,怎么让这些开源库能够找到自己安装的字体...本来半分钟搞定的事情, 现在怎么都要花个十来分钟去搜索解决方案,并做一系列字体相关的操作。 这种“小而烦”的问题有时候很影响心情,更不用说这种 Context Switch 的带来的原工作节奏扰乱。 解决这个“小而烦”的问题就是 zhplot 项目要达成的目标。

斯坦福小镇 (AI-Town) 系统解读

核心要点

本文解读了斯坦福小镇(AI-Town)项目,重点关注其在生成式代理方面的创新架构设计。 主要包含以下几个关键部分:

  1. 记忆系统(Memory Stream):长期记忆模块
  2. 反思机制(Reflection):高层次推理能力
  3. 计划系统(Planning):行为规划与执行
  4. 评估方法(Evaluation):代理行为的可信度验证

启发与应用

本文的核心概念对游戏 NPC 设计具有重要的参考价值,特别是在:

  • NPC 记忆系统的设计
  • 行为的真实性和可信度
  • 动态社交关系的构建
  • 环境互动的自然性

Dawid-Skene 算法

Lilian 在Thinking about High-Quality Human Data | Lil'Log 对数据标注的质量进行了一些很有远见的讨论。 这里我们主要对标签聚合算法 (真值推断) Dawid-Skene 算法进行一些较为深入讨论。

所谓标签聚合算法,是指从多个标注者的标注结果中推断出最可靠的标签。

简介

Dawid-Skene 算法最早是应用于临床医学相关的领域, 用于聚合多个临床专家对同一个病人的的判断结果。 后来被广泛应用于数据标注领域,用于聚合多个标注结果得到最可靠的标签。

终身学习:2023

终身学习 (Lifelong learning)

Lifelong learning is the "ongoing, voluntary, and self-motivated" pursuit of knowledge for either personal or professional reasons.1

本文主要是过去一年的学习记录,内容较为杂乱,主要是为备忘。