From 9627870d6e8d19a90a0da8e03ca9e173c0f5f1f3 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 3 Nov 2026 19:05:41 +0000 Subject: [PATCH 1/2] Add IRL / RLHF / DPO as the third Imitation Learning note. Migrate the Notion draft into site Markdown with KaTeX-checked formulas, series cross-links, and the pipeline figure. Co-authored-by: Jingwei Yuan --- .../posts/irl-rlhf-dpo/irlhf_dpo_pipeline.png | Bin 0 -> 158316 bytes blog/active-learning/index.html | 2 +- blog/behavior-cloning-plid/index.html | 2 +- blog/distribution-matching-gail/index.html | 3 +- blog/index.html | 2 +- blog/irl-rlhf-dpo/index.html | 310 +++++++++++ content/posts/active-learning.md | 2 +- content/posts/behavior-cloning-plid.md | 2 +- content/posts/distribution-matching-gail.md | 4 + content/posts/irl-rlhf-dpo.md | 503 ++++++++++++++++++ feed.xml | 2 +- generated-files.json | 2 + sitemap.xml | 2 +- 13 files changed, 828 insertions(+), 8 deletions(-) create mode 100644 assets/posts/irl-rlhf-dpo/irlhf_dpo_pipeline.png create mode 100644 blog/irl-rlhf-dpo/index.html create mode 100644 content/posts/irl-rlhf-dpo.md diff --git a/assets/posts/irl-rlhf-dpo/irlhf_dpo_pipeline.png b/assets/posts/irl-rlhf-dpo/irlhf_dpo_pipeline.png new file mode 100644 index 0000000000000000000000000000000000000000..cdae630a56bdf4e62e61abf504d5cafb1160bf25 GIT binary patch literal 158316 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�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 PKPRRjt143>W$OPw`#!N7 literal 0 HcmV?d00001 diff --git a/blog/active-learning/index.html b/blog/active-learning/index.html index e936f30..ec87d4b 100644 --- a/blog/active-learning/index.html +++ b/blog/active-learning/index.html @@ -150,7 +150,7 @@

6. 两类不确定性

实际使用还需要留意三点。首先,BALD 的质量取决于后验或其近似是否可信;少数偏差相似的模型,并不一定能代表完整的参数不确定性。其次,信息增益不等于测试误差下降,三种方法都不保证选中带来最大性能提升的样本。最后,如果一次选择多个样本,直接取单点分数最高的若干个,可能获得大量重复信息;批量选样还需要考虑样本之间的关系。

这三种方法关注的对象不同:Uncertainty Sampling 看当前预测有多模糊,QBC 看委员会成员有多不一致,BALD 看标签预计能为参数带来多少信息。理解这个差别,比单独记住某个采集公式更有助于判断方法适合什么场景。

参考资料

-
+
© 2026 MusicaldgRSS
diff --git a/blog/behavior-cloning-plid/index.html b/blog/behavior-cloning-plid/index.html index 948e573..884ac81 100644 --- a/blog/behavior-cloning-plid/index.html +++ b/blog/behavior-cloning-plid/index.html @@ -203,7 +203,7 @@

9. 总结

\text{PLID:}\quad s\sim d_{\pi_m}

这也是从 Behavior Cloning 走向 Distribution Matching 的起点:当专家持续标注成本过高时,下一步是不再逐个纠正动作,而是直接让模型产生与专家相似的行为分布。下一篇笔记讨论 Distribution Matching 与 GAIL。

参考资料

- +
© 2026 MusicaldgRSS
diff --git a/blog/distribution-matching-gail/index.html b/blog/distribution-matching-gail/index.html index 121bb4e..aeea5c9 100644 --- a/blog/distribution-matching-gail/index.html +++ b/blog/distribution-matching-gail/index.html @@ -207,8 +207,9 @@

8. 总结

GAIL 用一个二分类器区分专家与模型,再把判别器信号转化为策略奖励。它的关键数学事实是:最优判别器的 log-odds 等于两个分布的 log density ratio;在理想条件下,对抗目标与 JS divergence 相关。

如果说 BC 是“模仿专家在这个状态下做什么”,PLID 是“让专家纠正模型实际遇到的状态”,那么 GAIL 更接近于:

让模型产生整体上无法被判别器与专家区分的行为。

+

这也是通向目标学习的一步:当分布匹配仍不够时,下一篇讨论 IRL、RLHF 与 DPO。

参考资料

- +
© 2026 MusicaldgRSS
diff --git a/blog/index.html b/blog/index.html index 0e61917..e70d792 100644 --- a/blog/index.html +++ b/blog/index.html @@ -23,7 +23,7 @@ Musicaldg -

文章

约 10 分钟

Distribution Matching 与 GAIL

从轨迹与状态—动作分布匹配出发,说明 Forward KL 为何可能退化为 BC,以及 GAIL 如何用判别器完成分布匹配。

阅读全文
约 10 分钟

Behavior Cloning 与 PLID

说明 Behavior Cloning 的状态分布偏移,并推导 PLID / DAgger 如何用交互式专家标签修正策略。

阅读全文
约 12 分钟

Active Learning

介绍主动学习的基本流程,比较不确定性采样、QBC 和 BALD 三种选样方法。

阅读全文
+

文章

约 13 分钟

IRL、RLHF 与 DPO

从逆强化学习出发,说明如何从专家行为与人类偏好学习目标,并连接到 RLHF 与 DPO。

阅读全文
约 10 分钟

Distribution Matching 与 GAIL

从轨迹与状态—动作分布匹配出发,说明 Forward KL 为何可能退化为 BC,以及 GAIL 如何用判别器完成分布匹配。

阅读全文
约 10 分钟

Behavior Cloning 与 PLID

说明 Behavior Cloning 的状态分布偏移,并推导 PLID / DAgger 如何用交互式专家标签修正策略。

阅读全文
约 12 分钟

Active Learning

介绍主动学习的基本流程,比较不确定性采样、QBC 和 BALD 三种选样方法。

阅读全文
© 2026 MusicaldgRSS
diff --git a/blog/irl-rlhf-dpo/index.html b/blog/irl-rlhf-dpo/index.html new file mode 100644 index 0000000..ff57a71 --- /dev/null +++ b/blog/irl-rlhf-dpo/index.html @@ -0,0 +1,310 @@ + + + + + + + + + + + + IRL、RLHF 与 DPO · Musicaldg + + + + + + + + +
+
+ Musicaldg + +
+
← 全部文章

IRL、RLHF 与 DPO

目录

Behavior Cloning、PLID 和 GAIL 主要学习专家如何行动。若希望模型在新环境中仍能做出合理决策,就需要进一步理解专家行为背后的目标。本文从 Inverse Reinforcement Learning 出发,说明如何从专家行为推断奖励,并连接到 RLHF 与 DPO。

+

系列前文:Behavior Cloning 与 PLID、Distribution Matching 与 GAIL。

+

IRL、RLHF 与 DPO 如何逐步改变监督信号

+

1. 问题转向

+

前两篇介绍了三种直接学习行为的方式:

+
  • Behavior Cloning 在专家访问过的状态上拟合动作;
  • PLID 让当前策略探索,再由专家标注模型实际遇到的状态;
  • GAIL 通过判别器,让模型产生难以与专家区分的状态—动作分布。
+

它们都主要回答:

+

专家在这个状态下做了什么?

+

但在环境变化、任务目标变化或专家行为存在多种合理解释时,直接复制动作可能不够。我们可能更希望理解:

+

专家为什么做这个选择?它在优化什么目标?

+

这就是 Inverse Reinforcement Learning(逆强化学习,IRL)的出发点。

+

普通强化学习的方向是:

+
R\longrightarrow\pi^*
+

给定奖励函数 R,求在该奖励下表现最好的策略 \pi^*。

+

IRL 则试图反过来:

+
\pi_E\longrightarrow\hat R_\phi\longrightarrow\hat\pi
+

先观察专家策略 \pi_E,推断一个能够解释专家行为的奖励函数 R_\phi,再在这个奖励下重新优化策略。

+

需要先强调:IRL 找到的通常是一个可以解释专家行为的奖励函数,不一定是专家真实的心理动机。

+

2. 方法对照

+

不同方法的已知信息与学习对象如下:

+
  • RL:已知奖励函数;学习策略;如何最大化已知目标?
  • BC / PLID:已知专家状态—动作;学习策略;如何直接复制专家行为?
  • GAIL:已知专家轨迹;学习策略;如何匹配行为分布?
  • IRL:已知专家行为,奖励未知;学习奖励函数,再学习策略;专家行为背后的目标是什么?
  • RLHF:已知人类偏好比较;学习奖励模型,再优化策略;哪个行为更符合人类偏好?
  • DPO:已知人类偏好比较;学习直接优化策略;能否绕过显式奖励模型?
+

这张表也说明了第三篇的主线:监督信号逐渐从具体动作变得更加抽象。

+

3. IRL 形式化

+

3.1 参数化奖励

+

假设奖励函数未知,我们用带参数的函数表示它:

+
R_\phi(s)
+

其中 \phi 是奖励函数的参数。给定策略 \pi_\theta,其期望折扣回报为:

+
J(\theta,\phi) += +\mathbb E_{\tau\sim p_{\pi_\theta}} +\left[ +\sum_{t=0}^{T-1} +\gamma^t R_\phi(s_t) +\right]
+

改变 \theta 会改变模型访问的状态;改变 \phi 会改变每个状态的价值。因此 IRL 中的策略和奖励参数通常通过交替过程共同出现。

+

3.2 线性奖励

+

为了让问题可分析,常假设奖励由状态特征线性组合而成:

+
R_\phi(s) += +\phi^\top\psi(s)
+

其中:

+
  • \psi(s)\in\mathbb R^d 是状态特征向量;
  • \phi\in\mathbb R^d 是每个特征的奖励权重。
+

例如在导航任务中,特征可以表示:

+
  • 距离目标的远近;
  • 与障碍物的距离;
  • 速度或能耗;
  • 是否发生碰撞。
+

线性假设不是说真实奖励一定线性,而是将问题限制在一个可解释、可优化的函数族中。

+

4. 特征期望匹配

+

4.1 累计特征

+

定义策略 \pi 的累计特征期望:

+
\mu_\pi += +\mathbb E_{\tau\sim p_\pi} +\left[ +\sum_{t=0}^{T-1} +\gamma^t\psi(s_t) +\right]
+

在线性奖励下,策略的期望回报可以写成:

+
J(\pi,\phi) += +\phi^\top\mu_\pi
+

推导如下:

+
\begin{aligned} +J(\pi,\phi) +&= +\mathbb E_{\tau\sim p_\pi} +\left[ +\sum_{t=0}^{T-1} +\gamma^t\phi^\top\psi(s_t) +\right]\\ +&= +\phi^\top +\mathbb E_{\tau\sim p_\pi} +\left[ +\sum_{t=0}^{T-1} +\gamma^t\psi(s_t) +\right]\\ +&= +\phi^\top\mu_\pi +\end{aligned}
+

这里使用了内积的线性性以及期望与线性变换可以交换。

+

4.2 匹配的作用

+

设专家的累计特征期望为 \mu_E,模型的累计特征期望为 \mu_\pi。在同一个奖励函数下,二者的回报差为:

+
\left| +J(\pi_E,\phi)-J(\pi,\phi) +\right| += +\left| +\phi^\top(\mu_E-\mu_\pi) +\right|
+

根据 Cauchy–Schwarz 不等式:

+
\left| +\phi^\top(\mu_E-\mu_\pi) +\right| +\leq +\|\phi\|_2 +\|\mu_E-\mu_\pi\|_2
+

因此,当模型和专家的累计特征期望接近时,在满足参数约束的一族线性奖励函数下,它们的表现差异也会受到控制。

+

这就是 Feature Expectation Matching(特征期望匹配)的核心直觉。

+

4.3 真实奖励

+

特征期望匹配并不能保证找到专家真实的奖励函数。它只说明:在选定特征和约束范围内,模型的行为统计与专家相近。

+

如果特征没有表达“安全”这一维度,即使模型和专家在已有特征上匹配,模型也可能在安全性上表现很差。这是特征设计带来的限制。

+

5. Maximum Entropy IRL

+

5.1 多种合理行为

+

现实中的专家并不一定每次都采取完全相同的动作。即使面对同一个任务,也可能存在多条都合理的路线。

+

如果我们把专家行为强行解释成唯一最优轨迹,就可能把偶然选择误认为必然目标。Maximum Entropy IRL 的思路是:在能够解释专家数据的前提下,选择额外假设最少的行为分布。

+

一种常见形式是定义轨迹分布:

+
p_\phi(\tau) += +\frac{1}{Z(\phi)} +\exp +\left( +\sum_{t=0}^{T-1} +R_\phi(s_t) +\right)
+

其中 Z(\phi) 是 partition function,用来保证所有轨迹概率之和为 1:

+
Z(\phi) += +\sum_\tau +\exp +\left( +\sum_{t=0}^{T-1} +R_\phi(s_t) +\right)
+

奖励高的轨迹概率更大,但其他轨迹仍然可能出现。

+

5.2 奖励梯度

+

给定专家轨迹数据,最大化其对数似然:

+
\mathcal L(\phi) += +\mathbb E_{\tau\sim p_E} +\left[ +\log p_\phi(\tau) +\right]
+

对参数 \phi 求梯度,得到“专家特征期望减去模型特征期望”的结构:

+
\nabla_\phi\mathcal L += +\mu_E +- +\mathbb E_{\tau\sim p_\phi} +\left[ +\mu_\tau +\right]
+

这里 \mu_\tau 表示单条轨迹的累计特征向量。

+

这条公式的直觉是:

+
  • 如果模型产生的某个特征少于专家,就提高该特征对应的奖励;
  • 如果模型产生的某个特征多于专家,就降低对应奖励;
  • 训练通过比较专家与模型的行为统计量来更新奖励函数。
+

由于模型特征期望通常需要从当前策略 rollout 中估计,IRL 往往包含“更新奖励—用 RL 优化策略—重新比较行为”的循环。

+

5.3 奖励歧义

+

奖励函数存在不可辨识性。一个极端例子是:

+
R(s,a)=0
+

在这个奖励下,所有策略的回报都相同,因此专家策略也可以被视为最优策略。但这个奖励没有解释专家究竟偏好什么。

+

因此,IRL 的目标不是机械地寻找任何一个能让专家成为最优的奖励函数,而是通过函数族限制、正则化、最大熵假设或额外偏好数据,寻找更有用的解释。

+

6. RLHF

+

6.1 偏好比较

+

在许多任务中,人类很难给一个行为指定稳定的绝对奖励,但比较两个行为的相对优劣要容易得多。

+

例如,对于同一个问题,模型生成两个回答。人类可能很难判断它们应该分别得到 8.1 分还是 8.6 分,但通常可以判断哪个回答更好。

+

RLHF(Reinforcement Learning from Human Feedback)的关键变化是:

+

不要求人类直接写出奖励函数,而是从人类对行为的偏好比较中学习奖励模型。

+

6.2 Bradley–Terry

+

设 x 是 prompt,y^+ 是人类偏好的回答,y^- 是较不受偏好的回答。偏好数据写成:

+
\mathcal D_\pm += +\left\{ +(x_n,y_n^+,y_n^-) +\right\}_{n=1}^{N}
+

奖励模型记为 r_\phi(x,y)。Bradley–Terry 模型假设:

+
P(y^+\succ y^-\mid x) += +\sigma +\left( + r_\phi(x,y^+)-r_\phi(x,y^-) +\right)
+

其中 \sigma 是 sigmoid 函数。

+

如果偏好回答的奖励比另一回答高很多,模型预测人类选择它的概率就更高。

+

于是可以用二元交叉熵训练 Reward Model:

+
\mathcal L_{\mathrm{RM}}(\phi) += +-\mathbb E_{(x,y^+,y^-)} +\left[ +\log +\sigma +\left( + r_\phi(x,y^+)-r_\phi(x,y^-) +\right) +\right]
+

奖励模型不需要让奖励值具有绝对意义。对所有回答的奖励同时加上一个常数,偏好概率不会改变,因为真正起作用的是奖励差:

+
\bigl(r(x,y^+)+c\bigr) +- +\bigl(r(x,y^-)+c\bigr) += + r(x,y^+)-r(x,y^-)
+

6.3 RLHF 流程

+

经典 RLHF 通常可以分为三步:

+
  1. 用监督微调得到初始策略 \pi_0;
  2. 让模型生成候选回答,由人类进行偏好比较,训练 Reward Model;
  3. 使用 RL 优化策略,使其获得更高奖励,同时不要偏离 reference policy 太远。
+

因此,RLHF 仍然保留了 IRL 的两阶段结构:

+
\text{行为偏好} +\longrightarrow +\text{奖励模型} +\longrightarrow +\text{策略优化}
+

它与 IRL 的区别主要在于监督形式不同:IRL 通常观察专家行为,RLHF 则直接获得人类对行为的相对偏好。

+

7. DPO

+

7.1 KL 正则化

+

经典 RLHF 的策略优化目标可以写成:

+
\max_{\pi_\theta} +\mathbb E_{y\sim\pi_\theta(\cdot\mid x)} +\left[ + r(x,y) +\right] +- +\beta +D_{\mathrm{KL}} +\left( + \pi_\theta(\cdot\mid x) +\|\pi_0(\cdot\mid x) +\right)
+

第一项鼓励模型生成高奖励回答,第二项约束当前策略不要偏离 reference policy \pi_0 太远。

+

参数 \beta>0 控制偏离惩罚:\beta 越大,策略越接近 reference policy。

+

7.2 最优策略

+

对于固定的 prompt x,KL 正则化目标的最优策略具有如下形式:

+
\pi^*(y\mid x) += +\frac{1}{Z(x)} +\pi_0(y\mid x) +\exp +\left( +\frac{r(x,y)}{\beta} +\right)
+

其中 Z(x) 是归一化因子。

+

整理可得:

+
r(x,y) += +\beta +\log +\frac{\pi^*(y\mid x)}{\pi_0(y\mid x)} ++ +\beta\log Z(x)
+

这意味着,在 KL 正则化 RL 的最优解下,奖励可以用最优策略相对于 reference policy 的 log-probability ratio 表示。

+

7.3 偏好代入

+

对一对回答 y^+ 和 y^-,奖励差中的归一化项会抵消:

+
\begin{aligned} +&r(x,y^+)-r(x,y^-)\\ +&= +\beta +\left[ +\log\frac{\pi^*(y^+\mid x)}{\pi_0(y^+\mid x)} +- +\log\frac{\pi^*(y^-\mid x)}{\pi_0(y^-\mid x)} +\right] +\end{aligned}
+

将未知的最优策略 \pi^* 用当前策略 \pi_\theta 近似,再代入 Bradley–Terry 偏好模型,就得到 DPO 的直接偏好优化目标:

+
\begin{aligned} +\mathcal L_{\mathrm{DPO}}(\theta) +=-\mathbb E_{(x,y^+,y^-)} +\Bigg[ +\log\sigma\Bigg( +\beta +\Big[ +&\log\frac{\pi_\theta(y^+\mid x)}{\pi_0(y^+\mid x)}\\ +-&\log\frac{\pi_\theta(y^-\mid x)}{\pi_0(y^-\mid x)} +\Big] +\Bigg) +\Bigg] +\end{aligned}
+

DPO 的核心含义是:

+
  • 提高偏好回答相对于 reference policy 的概率;
  • 降低非偏好回答相对于 reference policy 的概率;
  • 用偏好数据直接训练策略,而不是先单独训练 Reward Model,再使用 PPO 等 RL 算法优化策略。
+

7.4 边界

+

DPO 绕过的是显式的 Reward Model 和策略阶段的在线 RL 优化流程,但它并没有消除所有问题:

+
  • 偏好数据仍然可能有噪声和标注偏差;
  • reference policy 会影响优化结果;
  • 离线偏好数据可能无法覆盖模型部署时的状态;
  • 模型可能学习标注者偏好的表面模式,而不是真正的任务质量;
  • 长回答与短回答之间可能存在长度偏差。
+

因此,DPO 不是“无需奖励、无需假设”的方法,而是将奖励与参考策略的关系隐含进了直接偏好优化目标。

+

8. 系列串联

+

现在可以把本系列的三篇文章放在同一张图中理解:

+

监督信号从动作到偏好

+

监督信号从动作标签逐步转向行为目标与相对偏好。

+

三篇文章的分工是:

+
  1. Behavior Cloning 到 PLID:为什么专家状态分布与模型状态分布不同;
  2. Distribution Matching 到 GAIL:如何让模型整体行为接近专家分布;
  3. IRL、RLHF 与 DPO:当行为背后的目标未知时,如何从行为或偏好学习目标。
+

9. 总结

+

IRL 把模仿学习的问题从“专家做了什么”推进到“专家可能在优化什么”。在线性奖励和特征期望匹配的设定下,专家与模型的行为差异可以通过累计特征统计量来分析;Maximum Entropy IRL 则允许专家存在多种合理行为,并通过专家与模型的特征期望差异更新奖励参数。

+

RLHF 改变了监督信号:人类不必直接给出绝对奖励,只需要比较两个行为哪个更好。Reward Model 将这些相对偏好转化为可优化的奖励。

+

DPO 则进一步利用 KL 正则化 RL 的解析关系,把奖励差表示为当前策略与 reference policy 的 log-probability ratio,从而直接用偏好数据更新策略。

+

因此,第三篇的主线可以概括为:

+

从复制专家行为,到推断行为目标,再到直接利用人类偏好优化策略。

+

参考资料

+
+
© 2026 MusicaldgRSS
+
+ + diff --git a/content/posts/active-learning.md b/content/posts/active-learning.md index d82f80a..d1642e3 100644 --- a/content/posts/active-learning.md +++ b/content/posts/active-learning.md @@ -278,4 +278,4 @@ $$ - [课程讲义](https://github.com/enalisnick/enalisnick.github.io/blob/master/ML_with_Humans_Course_Notes.pdf) - [BALD 论文](https://arxiv.org/abs/1112.5745) -- 系列后续:[Behavior Cloning 与 PLID](/blog/behavior-cloning-plid/)、[Distribution Matching 与 GAIL](/blog/distribution-matching-gail/) +- 系列后续:[Imitation Learning](/series/imitation-learning/) diff --git a/content/posts/behavior-cloning-plid.md b/content/posts/behavior-cloning-plid.md index 1a64264..1b57972 100644 --- a/content/posts/behavior-cloning-plid.md +++ b/content/posts/behavior-cloning-plid.md @@ -345,6 +345,6 @@ $$ ## 参考资料 - [课程讲义](https://github.com/enalisnick/enalisnick.github.io/blob/master/ML_with_Humans_Course_Notes.pdf) -- 系列上一篇:[Active Learning](/blog/active-learning/) +- 系列:[Imitation Learning](/series/imitation-learning/) - 系列下一篇:[Distribution Matching 与 GAIL](/blog/distribution-matching-gail/) diff --git a/content/posts/distribution-matching-gail.md b/content/posts/distribution-matching-gail.md index 733eafe..a6e6fa3 100644 --- a/content/posts/distribution-matching-gail.md +++ b/content/posts/distribution-matching-gail.md @@ -335,8 +335,12 @@ GAIL 用一个二分类器区分专家与模型,再把判别器信号转化为 > 让模型产生整体上无法被判别器与专家区分的行为。 +这也是通向目标学习的一步:当分布匹配仍不够时,下一篇讨论 [IRL、RLHF 与 DPO](/blog/irl-rlhf-dpo/)。 + ## 参考资料 - [课程讲义](https://github.com/enalisnick/enalisnick.github.io/blob/master/ML_with_Humans_Course_Notes.pdf) +- 系列:[Imitation Learning](/series/imitation-learning/) - 系列上一篇:[Behavior Cloning 与 PLID](/blog/behavior-cloning-plid/) +- 系列下一篇:[IRL、RLHF 与 DPO](/blog/irl-rlhf-dpo/) diff --git a/content/posts/irl-rlhf-dpo.md b/content/posts/irl-rlhf-dpo.md new file mode 100644 index 0000000..35da83a --- /dev/null +++ b/content/posts/irl-rlhf-dpo.md @@ -0,0 +1,503 @@ +--- +title: IRL、RLHF 与 DPO +date: 2026-11-03 +summary: 从逆强化学习出发,说明如何从专家行为与人类偏好学习目标,并连接到 RLHF 与 DPO。 +draft: false +--- + +Behavior Cloning、PLID 和 GAIL 主要学习专家如何行动。若希望模型在新环境中仍能做出合理决策,就需要进一步理解专家行为背后的目标。本文从 Inverse Reinforcement Learning 出发,说明如何从专家行为推断奖励,并连接到 RLHF 与 DPO。 + +系列前文:[Behavior Cloning 与 PLID](/blog/behavior-cloning-plid/)、[Distribution Matching 与 GAIL](/blog/distribution-matching-gail/)。 + +> IRL、RLHF 与 DPO 如何逐步改变监督信号 + +## 1. 问题转向 + +前两篇介绍了三种直接学习行为的方式: + +- Behavior Cloning 在专家访问过的状态上拟合动作; +- PLID 让当前策略探索,再由专家标注模型实际遇到的状态; +- GAIL 通过判别器,让模型产生难以与专家区分的状态—动作分布。 + +它们都主要回答: + +> 专家在这个状态下做了什么? + +但在环境变化、任务目标变化或专家行为存在多种合理解释时,直接复制动作可能不够。我们可能更希望理解: + +> 专家为什么做这个选择?它在优化什么目标? + +这就是 Inverse Reinforcement Learning(逆强化学习,IRL)的出发点。 + +普通强化学习的方向是: + +$$ +R\longrightarrow\pi^* +$$ + +给定奖励函数 $R$,求在该奖励下表现最好的策略 $\pi^*$。 + +IRL 则试图反过来: + +$$ +\pi_E\longrightarrow\hat R_\phi\longrightarrow\hat\pi +$$ + +先观察专家策略 $\pi_E$,推断一个能够解释专家行为的奖励函数 $R_\phi$,再在这个奖励下重新优化策略。 + +需要先强调:IRL 找到的通常是一个**可以解释专家行为的奖励函数**,不一定是专家真实的心理动机。 + +## 2. 方法对照 + +不同方法的已知信息与学习对象如下: + +- **RL**:已知奖励函数;学习策略;如何最大化已知目标? +- **BC / PLID**:已知专家状态—动作;学习策略;如何直接复制专家行为? +- **GAIL**:已知专家轨迹;学习策略;如何匹配行为分布? +- **IRL**:已知专家行为,奖励未知;学习奖励函数,再学习策略;专家行为背后的目标是什么? +- **RLHF**:已知人类偏好比较;学习奖励模型,再优化策略;哪个行为更符合人类偏好? +- **DPO**:已知人类偏好比较;学习直接优化策略;能否绕过显式奖励模型? + +这张表也说明了第三篇的主线:监督信号逐渐从具体动作变得更加抽象。 + +## 3. IRL 形式化 + +### 3.1 参数化奖励 + +假设奖励函数未知,我们用带参数的函数表示它: + +$$ +R_\phi(s) +$$ + +其中 $\phi$ 是奖励函数的参数。给定策略 $\pi_\theta$,其期望折扣回报为: + +$$ +J(\theta,\phi) += +\mathbb E_{\tau\sim p_{\pi_\theta}} +\left[ +\sum_{t=0}^{T-1} +\gamma^t R_\phi(s_t) +\right] +$$ + +改变 $\theta$ 会改变模型访问的状态;改变 $\phi$ 会改变每个状态的价值。因此 IRL 中的策略和奖励参数通常通过交替过程共同出现。 + +### 3.2 线性奖励 + +为了让问题可分析,常假设奖励由状态特征线性组合而成: + +$$ +R_\phi(s) += +\phi^\top\psi(s) +$$ + +其中: + +- $\psi(s)\in\mathbb R^d$ 是状态特征向量; +- $\phi\in\mathbb R^d$ 是每个特征的奖励权重。 + +例如在导航任务中,特征可以表示: + +- 距离目标的远近; +- 与障碍物的距离; +- 速度或能耗; +- 是否发生碰撞。 + +线性假设不是说真实奖励一定线性,而是将问题限制在一个可解释、可优化的函数族中。 + +## 4. 特征期望匹配 + +### 4.1 累计特征 + +定义策略 $\pi$ 的累计特征期望: + +$$ +\mu_\pi += +\mathbb E_{\tau\sim p_\pi} +\left[ +\sum_{t=0}^{T-1} +\gamma^t\psi(s_t) +\right] +$$ + +在线性奖励下,策略的期望回报可以写成: + +$$ +J(\pi,\phi) += +\phi^\top\mu_\pi +$$ + +推导如下: + +$$ +\begin{aligned} +J(\pi,\phi) +&= +\mathbb E_{\tau\sim p_\pi} +\left[ +\sum_{t=0}^{T-1} +\gamma^t\phi^\top\psi(s_t) +\right]\\ +&= +\phi^\top +\mathbb E_{\tau\sim p_\pi} +\left[ +\sum_{t=0}^{T-1} +\gamma^t\psi(s_t) +\right]\\ +&= +\phi^\top\mu_\pi +\end{aligned} +$$ + +这里使用了内积的线性性以及期望与线性变换可以交换。 + +### 4.2 匹配的作用 + +设专家的累计特征期望为 $\mu_E$,模型的累计特征期望为 $\mu_\pi$。在同一个奖励函数下,二者的回报差为: + +$$ +\left| +J(\pi_E,\phi)-J(\pi,\phi) +\right| += +\left| +\phi^\top(\mu_E-\mu_\pi) +\right| +$$ + +根据 Cauchy–Schwarz 不等式: + +$$ +\left| +\phi^\top(\mu_E-\mu_\pi) +\right| +\leq +\|\phi\|_2 +\|\mu_E-\mu_\pi\|_2 +$$ + +因此,当模型和专家的累计特征期望接近时,在满足参数约束的一族线性奖励函数下,它们的表现差异也会受到控制。 + +这就是 Feature Expectation Matching(特征期望匹配)的核心直觉。 + +### 4.3 真实奖励 + +特征期望匹配并不能保证找到专家真实的奖励函数。它只说明:在选定特征和约束范围内,模型的行为统计与专家相近。 + +如果特征没有表达“安全”这一维度,即使模型和专家在已有特征上匹配,模型也可能在安全性上表现很差。这是特征设计带来的限制。 + +## 5. Maximum Entropy IRL + +### 5.1 多种合理行为 + +现实中的专家并不一定每次都采取完全相同的动作。即使面对同一个任务,也可能存在多条都合理的路线。 + +如果我们把专家行为强行解释成唯一最优轨迹,就可能把偶然选择误认为必然目标。Maximum Entropy IRL 的思路是:在能够解释专家数据的前提下,选择额外假设最少的行为分布。 + +一种常见形式是定义轨迹分布: + +$$ +p_\phi(\tau) += +\frac{1}{Z(\phi)} +\exp +\left( +\sum_{t=0}^{T-1} +R_\phi(s_t) +\right) +$$ + +其中 $Z(\phi)$ 是 partition function,用来保证所有轨迹概率之和为 1: + +$$ +Z(\phi) += +\sum_\tau +\exp +\left( +\sum_{t=0}^{T-1} +R_\phi(s_t) +\right) +$$ + +奖励高的轨迹概率更大,但其他轨迹仍然可能出现。 + +### 5.2 奖励梯度 + +给定专家轨迹数据,最大化其对数似然: + +$$ +\mathcal L(\phi) += +\mathbb E_{\tau\sim p_E} +\left[ +\log p_\phi(\tau) +\right] +$$ + +对参数 $\phi$ 求梯度,得到“专家特征期望减去模型特征期望”的结构: + +$$ +\nabla_\phi\mathcal L += +\mu_E +- +\mathbb E_{\tau\sim p_\phi} +\left[ +\mu_\tau +\right] +$$ + +这里 $\mu_\tau$ 表示单条轨迹的累计特征向量。 + +这条公式的直觉是: + +- 如果模型产生的某个特征少于专家,就提高该特征对应的奖励; +- 如果模型产生的某个特征多于专家,就降低对应奖励; +- 训练通过比较专家与模型的行为统计量来更新奖励函数。 + +由于模型特征期望通常需要从当前策略 rollout 中估计,IRL 往往包含“更新奖励—用 RL 优化策略—重新比较行为”的循环。 + +### 5.3 奖励歧义 + +奖励函数存在不可辨识性。一个极端例子是: + +$$ +R(s,a)=0 +$$ + +在这个奖励下,所有策略的回报都相同,因此专家策略也可以被视为最优策略。但这个奖励没有解释专家究竟偏好什么。 + +因此,IRL 的目标不是机械地寻找任何一个能让专家成为最优的奖励函数,而是通过函数族限制、正则化、最大熵假设或额外偏好数据,寻找更有用的解释。 + +## 6. RLHF + +### 6.1 偏好比较 + +在许多任务中,人类很难给一个行为指定稳定的绝对奖励,但比较两个行为的相对优劣要容易得多。 + +例如,对于同一个问题,模型生成两个回答。人类可能很难判断它们应该分别得到 8.1 分还是 8.6 分,但通常可以判断哪个回答更好。 + +RLHF(Reinforcement Learning from Human Feedback)的关键变化是: + +> 不要求人类直接写出奖励函数,而是从人类对行为的偏好比较中学习奖励模型。 + +### 6.2 Bradley–Terry + +设 $x$ 是 prompt,$y^+$ 是人类偏好的回答,$y^-$ 是较不受偏好的回答。偏好数据写成: + +$$ +\mathcal D_\pm += +\left\{ +(x_n,y_n^+,y_n^-) +\right\}_{n=1}^{N} +$$ + +奖励模型记为 $r_\phi(x,y)$。Bradley–Terry 模型假设: + +$$ +P(y^+\succ y^-\mid x) += +\sigma +\left( + r_\phi(x,y^+)-r_\phi(x,y^-) +\right) +$$ + +其中 $\sigma$ 是 sigmoid 函数。 + +如果偏好回答的奖励比另一回答高很多,模型预测人类选择它的概率就更高。 + +于是可以用二元交叉熵训练 Reward Model: + +$$ +\mathcal L_{\mathrm{RM}}(\phi) += +-\mathbb E_{(x,y^+,y^-)} +\left[ +\log +\sigma +\left( + r_\phi(x,y^+)-r_\phi(x,y^-) +\right) +\right] +$$ + +奖励模型不需要让奖励值具有绝对意义。对所有回答的奖励同时加上一个常数,偏好概率不会改变,因为真正起作用的是奖励差: + +$$ +\bigl(r(x,y^+)+c\bigr) +- +\bigl(r(x,y^-)+c\bigr) += + r(x,y^+)-r(x,y^-) +$$ + +### 6.3 RLHF 流程 + +经典 RLHF 通常可以分为三步: + +1. 用监督微调得到初始策略 $\pi_0$; +2. 让模型生成候选回答,由人类进行偏好比较,训练 Reward Model; +3. 使用 RL 优化策略,使其获得更高奖励,同时不要偏离 reference policy 太远。 + +因此,RLHF 仍然保留了 IRL 的两阶段结构: + +$$ +\text{行为偏好} +\longrightarrow +\text{奖励模型} +\longrightarrow +\text{策略优化} +$$ + +它与 IRL 的区别主要在于监督形式不同:IRL 通常观察专家行为,RLHF 则直接获得人类对行为的相对偏好。 + +## 7. DPO + +### 7.1 KL 正则化 + +经典 RLHF 的策略优化目标可以写成: + +$$ +\max_{\pi_\theta} +\mathbb E_{y\sim\pi_\theta(\cdot\mid x)} +\left[ + r(x,y) +\right] +- +\beta +D_{\mathrm{KL}} +\left( + \pi_\theta(\cdot\mid x) +\|\pi_0(\cdot\mid x) +\right) +$$ + +第一项鼓励模型生成高奖励回答,第二项约束当前策略不要偏离 reference policy $\pi_0$ 太远。 + +参数 $\beta>0$ 控制偏离惩罚:$\beta$ 越大,策略越接近 reference policy。 + +### 7.2 最优策略 + +对于固定的 prompt $x$,KL 正则化目标的最优策略具有如下形式: + +$$ +\pi^*(y\mid x) += +\frac{1}{Z(x)} +\pi_0(y\mid x) +\exp +\left( +\frac{r(x,y)}{\beta} +\right) +$$ + +其中 $Z(x)$ 是归一化因子。 + +整理可得: + +$$ +r(x,y) += +\beta +\log +\frac{\pi^*(y\mid x)}{\pi_0(y\mid x)} ++ +\beta\log Z(x) +$$ + +这意味着,在 KL 正则化 RL 的最优解下,奖励可以用最优策略相对于 reference policy 的 log-probability ratio 表示。 + +### 7.3 偏好代入 + +对一对回答 $y^+$ 和 $y^-$,奖励差中的归一化项会抵消: + +$$ +\begin{aligned} +&r(x,y^+)-r(x,y^-)\\ +&= +\beta +\left[ +\log\frac{\pi^*(y^+\mid x)}{\pi_0(y^+\mid x)} +- +\log\frac{\pi^*(y^-\mid x)}{\pi_0(y^-\mid x)} +\right] +\end{aligned} +$$ + +将未知的最优策略 $\pi^*$ 用当前策略 $\pi_\theta$ 近似,再代入 Bradley–Terry 偏好模型,就得到 DPO 的直接偏好优化目标: + +$$ +\begin{aligned} +\mathcal L_{\mathrm{DPO}}(\theta) +=-\mathbb E_{(x,y^+,y^-)} +\Bigg[ +\log\sigma\Bigg( +\beta +\Big[ +&\log\frac{\pi_\theta(y^+\mid x)}{\pi_0(y^+\mid x)}\\ +-&\log\frac{\pi_\theta(y^-\mid x)}{\pi_0(y^-\mid x)} +\Big] +\Bigg) +\Bigg] +\end{aligned} +$$ + +DPO 的核心含义是: + +- 提高偏好回答相对于 reference policy 的概率; +- 降低非偏好回答相对于 reference policy 的概率; +- 用偏好数据直接训练策略,而不是先单独训练 Reward Model,再使用 PPO 等 RL 算法优化策略。 + +### 7.4 边界 + +DPO 绕过的是显式的 Reward Model 和策略阶段的在线 RL 优化流程,但它并没有消除所有问题: + +- 偏好数据仍然可能有噪声和标注偏差; +- reference policy 会影响优化结果; +- 离线偏好数据可能无法覆盖模型部署时的状态; +- 模型可能学习标注者偏好的表面模式,而不是真正的任务质量; +- 长回答与短回答之间可能存在长度偏差。 + +因此,DPO 不是“无需奖励、无需假设”的方法,而是将奖励与参考策略的关系隐含进了直接偏好优化目标。 + +## 8. 系列串联 + +现在可以把本系列的三篇文章放在同一张图中理解: + +![监督信号从动作到偏好](/assets/posts/irl-rlhf-dpo/irlhf_dpo_pipeline.png) + +*监督信号从动作标签逐步转向行为目标与相对偏好。* + +三篇文章的分工是: + +1. **Behavior Cloning 到 PLID**:为什么专家状态分布与模型状态分布不同; +2. **Distribution Matching 到 GAIL**:如何让模型整体行为接近专家分布; +3. **IRL、RLHF 与 DPO**:当行为背后的目标未知时,如何从行为或偏好学习目标。 + +## 9. 总结 + +IRL 把模仿学习的问题从“专家做了什么”推进到“专家可能在优化什么”。在线性奖励和特征期望匹配的设定下,专家与模型的行为差异可以通过累计特征统计量来分析;Maximum Entropy IRL 则允许专家存在多种合理行为,并通过专家与模型的特征期望差异更新奖励参数。 + +RLHF 改变了监督信号:人类不必直接给出绝对奖励,只需要比较两个行为哪个更好。Reward Model 将这些相对偏好转化为可优化的奖励。 + +DPO 则进一步利用 KL 正则化 RL 的解析关系,把奖励差表示为当前策略与 reference policy 的 log-probability ratio,从而直接用偏好数据更新策略。 + +因此,第三篇的主线可以概括为: + +> 从复制专家行为,到推断行为目标,再到直接利用人类偏好优化策略。 + +## 参考资料 + +- [课程讲义](https://github.com/enalisnick/enalisnick.github.io/blob/master/ML_with_Humans_Course_Notes.pdf) +- 系列:[Imitation Learning](/series/imitation-learning/) +- 系列第一篇:[Behavior Cloning 与 PLID](/blog/behavior-cloning-plid/) +- 系列第二篇:[Distribution Matching 与 GAIL](/blog/distribution-matching-gail/) diff --git a/feed.xml b/feed.xml index b659527..a2f3278 100644 --- a/feed.xml +++ b/feed.xml @@ -1,2 +1,2 @@ -Musicaldghttps://musicaldg.github.ioMusicaldg 的机器学习笔记。zh-CNDistribution Matching 与 GAILhttps://musicaldg.github.io/blog/distribution-matching-gail/https://musicaldg.github.io/blog/distribution-matching-gail/从轨迹与状态—动作分布匹配出发,说明 Forward KL 为何可能退化为 BC,以及 GAIL 如何用判别器完成分布匹配。Mon, 02 Nov 2026 00:00:00 GMTBehavior Cloning 与 PLIDhttps://musicaldg.github.io/blog/behavior-cloning-plid/https://musicaldg.github.io/blog/behavior-cloning-plid/说明 Behavior Cloning 的状态分布偏移,并推导 PLID / DAgger 如何用交互式专家标签修正策略。Tue, 20 Oct 2026 00:00:00 GMTActive Learninghttps://musicaldg.github.io/blog/active-learning/https://musicaldg.github.io/blog/active-learning/介绍主动学习的基本流程,比较不确定性采样、QBC 和 BALD 三种选样方法。Tue, 29 Sep 2026 00:00:00 GMT +Musicaldghttps://musicaldg.github.ioMusicaldg 的机器学习笔记。zh-CNIRL、RLHF 与 DPOhttps://musicaldg.github.io/blog/irl-rlhf-dpo/https://musicaldg.github.io/blog/irl-rlhf-dpo/从逆强化学习出发,说明如何从专家行为与人类偏好学习目标,并连接到 RLHF 与 DPO。Tue, 03 Nov 2026 00:00:00 GMTDistribution Matching 与 GAILhttps://musicaldg.github.io/blog/distribution-matching-gail/https://musicaldg.github.io/blog/distribution-matching-gail/从轨迹与状态—动作分布匹配出发,说明 Forward KL 为何可能退化为 BC,以及 GAIL 如何用判别器完成分布匹配。Mon, 02 Nov 2026 00:00:00 GMTBehavior Cloning 与 PLIDhttps://musicaldg.github.io/blog/behavior-cloning-plid/https://musicaldg.github.io/blog/behavior-cloning-plid/说明 Behavior Cloning 的状态分布偏移,并推导 PLID / DAgger 如何用交互式专家标签修正策略。Tue, 20 Oct 2026 00:00:00 GMTActive Learninghttps://musicaldg.github.io/blog/active-learning/https://musicaldg.github.io/blog/active-learning/介绍主动学习的基本流程,比较不确定性采样、QBC 和 BALD 三种选样方法。Tue, 29 Sep 2026 00:00:00 GMT diff --git a/generated-files.json b/generated-files.json index c157bc2..8aaa90d 100644 --- a/generated-files.json +++ b/generated-files.json @@ -2,6 +2,8 @@ "index.html", "blog/index.html", "404.html", + "series/imitation-learning/index.html", + "blog/irl-rlhf-dpo/index.html", "blog/distribution-matching-gail/index.html", "blog/behavior-cloning-plid/index.html", "blog/active-learning/index.html", diff --git a/sitemap.xml b/sitemap.xml index ac5e410..053215e 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1,2 +1,2 @@ -https://musicaldg.github.io/https://musicaldg.github.io/blog/https://musicaldg.github.io/blog/distribution-matching-gail/https://musicaldg.github.io/blog/behavior-cloning-plid/https://musicaldg.github.io/blog/active-learning/ +https://musicaldg.github.io/https://musicaldg.github.io/blog/https://musicaldg.github.io/series/imitation-learning/https://musicaldg.github.io/blog/irl-rlhf-dpo/https://musicaldg.github.io/blog/distribution-matching-gail/https://musicaldg.github.io/blog/behavior-cloning-plid/https://musicaldg.github.io/blog/active-learning/ From 8bb251adca4b68d0efbeaddd3175f5f152fdc414 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 3 Nov 2026 19:05:41 +0000 Subject: [PATCH 2/2] Present Imitation Learning as an expandable home folder. Group series posts behind a folder summary on the homepage, keep standalone cards separate, and add a dedicated series page. Co-authored-by: Jingwei Yuan --- assets/home.js | 14 ++ assets/style.css | 216 ++++++++++++++++++++++++++- content/series.json | 12 ++ index.html | 6 +- scripts/build.py | 98 ++++++++++-- series/imitation-learning/index.html | 30 ++++ templates/home.html | 4 +- 7 files changed, 359 insertions(+), 21 deletions(-) create mode 100644 assets/home.js create mode 100644 content/series.json create mode 100644 series/imitation-learning/index.html diff --git a/assets/home.js b/assets/home.js new file mode 100644 index 0000000..3bf1006 --- /dev/null +++ b/assets/home.js @@ -0,0 +1,14 @@ +document.querySelectorAll('.series-folder').forEach(folder => { + const summary = folder.querySelector('summary'); + if (!summary) return; + summary.addEventListener('click', () => { + window.requestAnimationFrame(() => { + if (folder.open) { + folder.classList.add('is-open'); + } else { + folder.classList.remove('is-open'); + } + }); + }); + if (folder.open) folder.classList.add('is-open'); +}); diff --git a/assets/style.css b/assets/style.css index c8c5c81..a89cce4 100644 --- a/assets/style.css +++ b/assets/style.css @@ -78,13 +78,217 @@ main { flex: 1; } 50% { transform: scale(1.035); filter: saturate(1.12); } } .post-list { display: grid; gap: 18px; padding-bottom: 64px; } -.post-list-compact { - gap: 10px; +.post-list:empty { padding: 0; } +.home-feed { + display: grid; + gap: 12px; max-width: 560px; margin: 0 auto; padding-bottom: 56px; } -.post-list:empty { padding: 0; } +.series-folder { + border: 1px solid var(--bg-300); + border-radius: 16px; + background: + linear-gradient(180deg, color-mix(in srgb, var(--primary-100) 55%, var(--bg-100)), var(--bg-100) 42%); + box-shadow: 0 10px 28px color-mix(in srgb, var(--primary-300) 5%, transparent); + overflow: hidden; + transition: border-color .2s ease, box-shadow .2s ease, transform .2s ease; +} +.series-folder[open], +.series-folder.is-open { + border-color: var(--primary-200); + box-shadow: 0 16px 34px color-mix(in srgb, var(--accent-200) 12%, transparent); +} +.series-folder-summary { + list-style: none; + display: grid; + grid-template-columns: auto 1fr auto; + gap: 14px; + align-items: center; + cursor: pointer; + padding: 16px 18px; + user-select: none; +} +.series-folder-summary::-webkit-details-marker { display: none; } +.series-folder-mark { + position: relative; + width: 42px; + height: 34px; + flex-shrink: 0; +} +.series-folder-tab, +.series-folder-body, +.series-folder-stack { + position: absolute; + display: block; + border: 1.5px solid color-mix(in srgb, var(--accent-200) 55%, var(--primary-200)); + background: color-mix(in srgb, var(--primary-100) 70%, var(--bg-100)); +} +.series-folder-tab { + left: 2px; + top: 2px; + width: 18px; + height: 10px; + border-radius: 6px 8px 0 0; + border-bottom: 0; +} +.series-folder-body { + left: 0; + top: 10px; + width: 100%; + height: 22px; + border-radius: 8px; + background: + linear-gradient(180deg, color-mix(in srgb, var(--accent-100) 35%, var(--bg-100)), var(--bg-100)); + box-shadow: inset 0 1px 0 color-mix(in srgb, #fff 55%, transparent); + transition: transform .28s ease; +} +.series-folder-stack { + left: 6px; + top: 16px; + width: calc(100% - 12px); + height: 14px; + border-radius: 5px; + opacity: .55; + transform: translateY(0); + transition: transform .28s ease, opacity .28s ease; +} +.series-folder[open] .series-folder-body, +.series-folder.is-open .series-folder-body { + transform: translateY(-2px) rotate(-2deg); +} +.series-folder[open] .series-folder-stack, +.series-folder.is-open .series-folder-stack { + opacity: .9; + transform: translateY(4px); +} +.series-folder-copy { display: grid; gap: 2px; min-width: 0; } +.series-folder-kicker, +.series-page-kicker { + font-size: 11px; + letter-spacing: .08em; + text-transform: uppercase; + color: var(--accent-200); +} +.series-folder-title { + font: normal 22px/1.35 var(--serif); + letter-spacing: -.02em; + color: var(--text-100); +} +.series-folder-meta { + font-size: 12px; + color: var(--text-200); + font-variant-numeric: tabular-nums; +} +.series-folder-chevron { + width: 10px; + height: 10px; + border-right: 2px solid var(--accent-200); + border-bottom: 2px solid var(--accent-200); + transform: rotate(45deg); + transition: transform .28s ease; + margin-right: 4px; +} +.series-folder[open] .series-folder-chevron, +.series-folder.is-open .series-folder-chevron { + transform: rotate(225deg); +} +.series-folder-panel { + display: grid; + grid-template-rows: 0fr; + transition: grid-template-rows .36s ease; +} +.series-folder[open] .series-folder-panel, +.series-folder.is-open .series-folder-panel { + grid-template-rows: 1fr; +} +.series-folder-panel-inner { + overflow: hidden; + min-height: 0; +} +.series-folder-blurb { + margin: 0; + padding: 0 18px 12px; + color: var(--text-200); + font-size: 13px; + line-height: 1.7; +} +.series-folder-posts { + display: grid; + gap: 8px; + padding: 0 12px 12px; + position: relative; +} +.series-folder-posts::before { + content: ""; + position: absolute; + left: 28px; + top: 4px; + bottom: 18px; + width: 2px; + border-radius: 2px; + background: color-mix(in srgb, var(--accent-100) 70%, var(--primary-200)); +} +.series-folder-posts .post-card-compact { + margin-left: 8px; + display: grid; + grid-template-columns: auto 1fr; + gap: 12px; + align-items: start; + background: color-mix(in srgb, var(--bg-100) 92%, var(--primary-100)); + animation: series-card-in .34s ease both; +} +.series-folder[open] .series-folder-posts .post-card-compact:nth-child(1) { animation-delay: .04s; } +.series-folder[open] .series-folder-posts .post-card-compact:nth-child(2) { animation-delay: .1s; } +.series-folder[open] .series-folder-posts .post-card-compact:nth-child(3) { animation-delay: .16s; } +.series-folder[open] .series-folder-posts .post-card-compact:nth-child(4) { animation-delay: .22s; } +@keyframes series-card-in { + from { opacity: 0; transform: translateY(8px); } + to { opacity: 1; transform: translateY(0); } +} +.series-index { + display: grid; + place-items: center; + width: 28px; + height: 28px; + margin-top: 2px; + border-radius: 999px; + background: var(--primary-100); + color: var(--accent-200); + font-size: 12px; + font-variant-numeric: tabular-nums; + position: relative; + z-index: 1; +} +.compact-copy { min-width: 0; } +.series-folder-link { + display: inline-flex; + align-items: center; + gap: 6px; + margin: 0 18px 16px; + font-size: 13px; + color: var(--accent-200); +} +.series-page-summary { + margin: 12px 0 0; + max-width: 40rem; + color: var(--text-200); + font-size: 15px; + line-height: 1.75; +} +.series-page-list { + display: grid; + gap: 10px; + max-width: 640px; + padding-bottom: 64px; +} +.series-page-list .post-card-compact { + display: grid; + grid-template-columns: auto 1fr; + gap: 14px; + align-items: start; +} .post-card { display: block; padding: 28px 32px 26px; @@ -241,6 +445,12 @@ main { flex: 1; } .post-card:hover { transform: none; } .post-card-compact .card-summary { transition: none; } .geometry-glow { animation: none; } + .series-folder, + .series-folder-body, + .series-folder-stack, + .series-folder-chevron, + .series-folder-panel { transition: none; } + .series-folder-posts .post-card-compact { animation: none; } .prose h2, .prose h3 { transition: none; } .prose h2.heading-flash, .prose h3.heading-flash { animation: none; } diff --git a/content/series.json b/content/series.json new file mode 100644 index 0000000..8dbac03 --- /dev/null +++ b/content/series.json @@ -0,0 +1,12 @@ +[ + { + "id": "imitation-learning", + "title": "Imitation Learning", + "summary": "从行为克隆到偏好优化,理解模仿学习中监督信号如何逐步抽象。", + "posts": [ + "behavior-cloning-plid", + "distribution-matching-gail", + "irl-rlhf-dpo" + ] + } +] diff --git a/index.html b/index.html index b09ebe7..baed61e 100644 --- a/index.html +++ b/index.html @@ -14,7 +14,7 @@ - + @@ -28,8 +28,8 @@ -
-

Distribution Matching 与 GAIL

从轨迹与状态—动作分布匹配出发,说明 Forward KL 为何可能退化为 BC,以及 GAIL 如何用判别器完成分布匹配。

Behavior Cloning 与 PLID

说明 Behavior Cloning 的状态分布偏移,并推导 PLID / DAgger 如何用交互式专家标签修正策略。

Active Learning

介绍主动学习的基本流程,比较不确定性采样、QBC 和 BALD 三种选样方法。

+
+
系列Imitation Learning3 篇 · 2026-10-20 — 2026-11-03

Active Learning

介绍主动学习的基本流程,比较不确定性采样、QBC 和 BALD 三种选样方法。

© 2026 MusicaldgRSS
diff --git a/scripts/build.py b/scripts/build.py index bd0b7a6..b744ab8 100644 --- a/scripts/build.py +++ b/scripts/build.py @@ -154,10 +154,46 @@ def read_posts(): return sorted(posts, key=lambda x: (x['date'], x['slug']), reverse=True) +def read_series(posts_by_slug): + path = ROOT / 'content/series.json' + if not path.exists(): + return [] + catalog = json.loads(path.read_text(encoding='utf-8')) + series_list = [] + for entry in catalog: + for key in ('id', 'title', 'summary', 'posts'): + if not entry.get(key): + raise ValueError(f'series.json: 缺少 {key}') + if not re.fullmatch(r'[a-z0-9]+(?:-[a-z0-9]+)*', entry['id']): + raise ValueError(f'series.json: id 请使用小写英文、数字和连字符') + members = [] + for slug in entry['posts']: + post = posts_by_slug.get(slug) + if not post: + raise ValueError(f'series.json: 找不到文章 {slug}') + members.append(post) + if not members: + raise ValueError(f'series.json: {entry["id"]} 没有文章') + series_list.append({ + 'id': entry['id'], + 'title': entry['title'], + 'summary': entry['summary'], + 'posts': members, + 'count': len(members), + 'start': min(p['date'] for p in members), + 'end': max(p['date'] for p in members), + }) + return series_list + + def build(): config = json.loads((ROOT / 'site.json').read_text(encoding='utf-8')) layout = Template((ROOT / 'templates/layout.html').read_text(encoding='utf-8')) posts = read_posts() + posts_by_slug = {p['slug']: p for p in posts} + series_list = read_series(posts_by_slug) + series_slugs = {slug for series in series_list for slug in (p['slug'] for p in series['posts'])} + standalone = [p for p in posts if p['slug'] not in series_slugs] previous = json.loads((ROOT / 'generated-files.json').read_text()) if (ROOT / 'generated-files.json').exists() else [] generated = [] @@ -167,27 +203,63 @@ def write(path, content): target.write_text(content.rstrip() + '\n', encoding='utf-8') generated.append(path) - def page(path, title, description, body, current='', og_type='website'): + def page(path, title, description, body, current='', og_type='website', extra_assets=''): url_path = '/' if path == 'index.html' else '/' + path.removesuffix('index.html') - write(path, layout.substitute(name=esc(config['name']), github=esc(config['github']), year=dt.date.today().year, title=esc(title), description=esc(description), canonical=esc(config['url'] + url_path), body=body, home_current='aria-current="page"' if current == 'home' else '', blog_current='aria-current="page"' if current == 'blog' else '', og_type=og_type, page_class='article-page' if og_type == 'article' else '', article_assets='' if og_type == 'article' else '')) + article_assets = '' if og_type == 'article' else '' + write(path, layout.substitute(name=esc(config['name']), github=esc(config['github']), year=dt.date.today().year, title=esc(title), description=esc(description), canonical=esc(config['url'] + url_path), body=body, home_current='aria-current="page"' if current == 'home' else '', blog_current='aria-current="page"' if current == 'blog' else '', og_type=og_type, page_class='article-page' if og_type == 'article' else '', article_assets=article_assets + extra_assets)) def blog_rows(selected): return ''.join(f'
约 {p["minutes"]} 分钟

{esc(p["title"])}

{esc(p["summary"])}

阅读全文
' for p in selected) or EMPTY - def home_rows(selected): - return ''.join( - f'' - f'' - f'

{esc(p["title"])}

' - f'

{esc(p["summary"])}

' + def compact_card(post, index=None): + index_html = f'{index:02d}' if index is not None else '' + return ( + f'
' + f'{index_html}' + f'
' + f'

{esc(post["title"])}

' + f'

{esc(post["summary"])}

' f'
' - for p in selected - ) or EMPTY + ) + + def series_folder(series, open_by_default=False): + span = series['start'] if series['start'] == series['end'] else f'{series["start"]} — {series["end"]}' + cards = ''.join(compact_card(post, index=i) for i, post in enumerate(series['posts'], 1)) + open_attr = ' open' if open_by_default else '' + return ( + f'
' + f'' + f'' + f'系列' + f'{esc(series["title"])}' + f'{series["count"]} 篇 · {span}' + f'' + f'' + f'
' + f'

{esc(series["summary"])}

' + f'
{cards}
' + f'打开系列页 ' + f'
' + ) + + def home_feed(): + parts = [series_folder(series) for series in series_list] + parts.extend(compact_card(post) for post in standalone[:4]) + return ''.join(parts) or EMPTY - home = Template((ROOT / 'templates/home.html').read_text(encoding='utf-8')).substitute(posts=home_rows(posts[:5])) - page('index.html', config['name'], config['description'], home, 'home') + home = Template((ROOT / 'templates/home.html').read_text(encoding='utf-8')).substitute(feed=home_feed()) + page('index.html', config['name'], config['description'], home, 'home', extra_assets='') page('blog/index.html', '文章 · ' + config['name'], '机器学习笔记。', '

文章

' + blog_rows(posts) + '
', 'blog') page('404.html', '页面未找到 · ' + config['name'], '页面未找到', '

404

页面未找到

回到首页 ↗
') + for series in series_list: + cards = ''.join(compact_card(post, index=i) for i, post in enumerate(series['posts'], 1)) + body = ( + f'
← 首页' + f'

系列

{esc(series["title"])}

' + f'

{esc(series["summary"])}

' + f'
{cards}
' + ) + page(f'series/{series["id"]}/index.html', series['title'] + ' · ' + config['name'], series['summary'], body, 'home') for post in posts: toc = '' body = f'
← 全部文章

{esc(post["title"])}

目录{toc}
{post["body"]}
' @@ -209,7 +281,7 @@ def home_rows(selected): write('sitemap.xml', ET.tostring(sitemap, encoding='utf-8', xml_declaration=True).decode('utf-8')) write('robots.txt', 'User-agent: *\nAllow: /\nSitemap: ' + config['url'] + '/sitemap.xml') for obsolete in set(previous) - set(generated): - if obsolete.startswith('blog/') and obsolete.endswith('/index.html'): + if obsolete.endswith('/index.html') and (obsolete.startswith('blog/') or obsolete.startswith('series/')): target = ROOT / obsolete if target.exists(): target.unlink() diff --git a/series/imitation-learning/index.html b/series/imitation-learning/index.html new file mode 100644 index 0000000..9e4c101 --- /dev/null +++ b/series/imitation-learning/index.html @@ -0,0 +1,30 @@ + + + + + + + + + + + + Imitation Learning · Musicaldg + + + + + + + + + + + diff --git a/templates/home.html b/templates/home.html index 33ad83e..47c326f 100644 --- a/templates/home.html +++ b/templates/home.html @@ -3,6 +3,6 @@ -
-$posts +
+$feed