<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://zyp-up.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://zyp-up.github.io/" rel="alternate" type="text/html" /><updated>2026-04-11T05:18:11+00:00</updated><id>https://zyp-up.github.io/feed.xml</id><title type="html">Yunpeng’s Homepage</title><subtitle>Yunpeng Zhang&apos;s personal website</subtitle><author><name>Yunpeng Zhang</name><email>yunpengZhangup@outlook.com</email></author><entry><title type="html">从 PPO 到 DPO 再到 GRPO：经典大模型强化学习算法解读</title><link href="https://zyp-up.github.io/posts/2026/04/ppo-dpo-grpo/" rel="alternate" type="text/html" title="从 PPO 到 DPO 再到 GRPO：经典大模型强化学习算法解读" /><published>2026-04-15T00:00:00+00:00</published><updated>2026-04-15T00:00:00+00:00</updated><id>https://zyp-up.github.io/posts/2026/04/blog-ppo-dpo-grpo</id><content type="html" xml:base="https://zyp-up.github.io/posts/2026/04/ppo-dpo-grpo/"><![CDATA[<blockquote>
  <p><strong>TL;DR</strong>：在大语言模型（LLM）的对齐（Alignment）领域，强化学习扮演着核心角色。从 OpenAI 提出的 <a href="https://arxiv.org/abs/1707.06347">PPO</a>，到斯坦福大学提出的 <a href="https://arxiv.org/abs/2305.18290">DPO</a>，再到 DeepSeek 提出的 <a href="https://arxiv.org/abs/2402.03300">GRPO</a>，每一代算法都在解决前一代的痛点。本文将从原理、公式推导到工程实现，系统梳理这三大算法的核心思想与演进逻辑，帮助读者建立完整的技术图谱。</p>
</blockquote>

<hr />

<h1 id="1-ppo强化学习对齐的奠基石">1 PPO：强化学习对齐的奠基石</h1>

<h2 id="11-背景与动机">1.1 背景与动机</h2>

<p><a href="https://arxiv.org/abs/1707.06347">Proximal Policy Optimization（PPO）</a>最初由 Schulman 等人于 2017 年提出，<em>旨在简化 TRPO（Trust Region Policy Optimization）的复杂实现 —— 用简单的 Clip 机制替代二阶 KL 约束，在保持策略更新稳定性的同时，允许对同一批数据进行多轮复用，从而提升样本效率</em>。在 LLM 对齐场景中，PPO 被用于 RLHF（Reinforcement Learning from Human Feedback）流程的核心训练阶段——在已经通过 SFT（Supervised Fine-Tuning）和奖励模型（Reward Model）训练后，利用 RL 进一步优化模型以对齐人类偏好。
PPO 的核心思想是：<strong>在更新策略时，限制新策略与旧策略之间的偏离程度</strong>，从而在提升性能的同时保证训练稳定性。</p>

<h2 id="12-ppo-目标函数从全局视角出发">1.2 PPO 目标函数：从全局视角出发</h2>

<p>理解 PPO，最好的方式是<strong>从它的目标函数开始，自顶向下地层层剥开</strong>。与其一上来就陷入具体的技术细节，不如先看清全貌——PPO 到底在优化什么？然后我们再逐步深入，理解目标函数中每一个符号的来龙去脉。
PPO 的目标函数如下：</p>

\[\mathcal{J}_{PPO}(\theta) = \mathbb{E}[q \sim P(Q), o \sim \pi_{\theta_{old}}(O|q)] \frac{1}{|o|} \sum_{t=1}^{|o|} \min \left[ \frac{\pi_\theta(o_t | q, o_{&lt;t})}{\pi_{\theta_{old}}(o_t | q, o_{&lt;t})} A_t, \text{clip}\left(\frac{\pi_\theta(o_t | q, o_{&lt;t})}{\pi_{\theta_{old}}(o_t | q, o_{&lt;t})}, 1-\varepsilon, 1+\varepsilon\right) A_t \right]\]

<p><strong>逐项拆解</strong>：</p>

<table>
  <thead>
    <tr>
      <th>符号</th>
      <th>含义</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>\(q \sim P(Q)\)</td>
      <td>从问题分布里采样一个问题/提示（prompt），例如一句用户指令。</td>
    </tr>
    <tr>
      <td>\(o \sim \pi_{\theta_{old}}(O \mid q)\)</td>
      <td>用旧策略生成一个完整输出序列 \(o = (o_1, \dots, o_{\vert o\vert})\)</td>
    </tr>
    <tr>
      <td>\(\vert o\vert\)</td>
      <td>输出序列长度；前面的 \(\frac{1}{\vert o\vert} \sum_{t=1}^{\vert o\vert}\) 是对<strong>所有 token 取平均</strong>，避免长回答在 loss 上权重更大。</td>
    </tr>
    <tr>
      <td>\(\pi_\theta(o_t \mid q, o_{&lt;t})\)</td>
      <td>当前待更新策略 \(\pi_\theta\) 在前缀 \((q, o_{&lt;t})\) 下生成第 \(t\) 个 token 是 \(o_t\) 的概率。</td>
    </tr>
    <tr>
      <td>\(\pi_{\theta_{\text{old}}}(o_t \mid q, o_{&lt;t})\)</td>
      <td>旧策略下的对应概率，用来构造<strong>重要性采样比率</strong>：\(r_t(\theta) = \frac{\pi_\theta(o_t \mid q, o_{&lt;t})}{\pi_{\theta_{\text{old}}}(o_t \mid q, o_{&lt;t})}\)</td>
    </tr>
    <tr>
      <td>\(A_t\)</td>
      <td>第 \(t\) 个 token 的 <strong>advantage（优势函数）</strong>，一般由 GAE 计算：\(A_t \approx (\text{当前路径未来回报}) - (\text{价值网络给出的 baseline})\)</td>
    </tr>
    <tr>
      <td>\(\varepsilon\)</td>
      <td>PPO 的 clip 超参数，典型值 \(0.1 \sim 0.2\)</td>
    </tr>
  </tbody>
</table>

<p>我们先从直觉上理解它在做什么——<strong>在所有采样的 token 上，计算「新策略相比旧策略的改进幅度」与「优势值」的乘积，同时用 clip 机制防止步子迈得太大。</strong> 
这个公式里有三个关键组件：</p>

<ol>
  <li>
    <p><strong>重要性采样比率</strong> \(r_t(\theta) = \frac{\pi_\theta}{\pi_{\theta_{old}}}\)：衡量新旧策略的差异</p>
  </li>
  <li><strong>优势函数</strong> \(A_t\)：衡量这一步动作比「平均水平」好了多少
    <ul>
      <li>\(A_t &gt; 0\)：这一步比平均表现更好，应该增加对应动作概率</li>
      <li>\(A_t &lt; 0\)：这一步比平均表现差，应该减小该动作概率</li>
    </ul>
  </li>
  <li><strong>Clip 机制</strong>：给更新幅度加上「安全带」，\(\text{clip}(r_t, 1 - \varepsilon, 1 + \varepsilon)\) 把比率 \(r_t(\theta)\) 截断在区间 \([1 - \varepsilon, 1 + \varepsilon]\) 内，防止一次更新动得太狠，保证训练稳定，这样能限制单步更新幅度，避免策略离旧策略太远。
    <ul>
      <li>当 \(A_t &gt; 0\)（想鼓励这一动作）时，\(r_t\) 不允许大于 \(1 + \varepsilon\)，否则取被截断的版本</li>
      <li>当 \(A_t &lt; 0\)（想惩罚这一动作）时，\(r_t\) 不允许小于 \(1 - \varepsilon\)</li>
    </ul>
  </li>
  <li><strong>Clip机制与重要性采样比率</strong> \(r_t(\theta) = \frac{\pi_\theta(o_t \mid q, o_{&lt;t})}{\pi_{\theta_{\text{old}}}(o_t \mid q, o_{&lt;t})}\) <strong>的配合</strong></li>
</ol>

<p><strong>PPO 和下文中的 GRPO 的每一项都是用重要性采样比率来放大/缩小采样出的 logprob 梯度，再通过 clipping 限制更新幅度，这是 RL 的核心。</strong> 
其中，\(A_t\)（优势函数）是整个公式的灵魂——它决定了每个 token 的更新方向和力度。那么 \(A_t\) 到底是怎么算出来的？这就需要我们层层深入。接下来，我们先看数据是怎么采样的，然后再详细推导 \(A_t\) 的计算过程。</p>

<h2 id="13-数据采样与-a_t-计算">1.3 数据采样与 \(A_t\) 计算</h2>
<h3 id="131-采样轨迹只用-old-policy">1.3.1 采样轨迹（只用 old policy）</h3>

<p>首先，用旧策略 \(\pi_{\theta_{old}}\) 采样一条完整输出：</p>

\[o = (o_1, \cdots, o_T) \sim \pi_{\theta_{old}}(O|q)\]

<p>然后，用 Reward Model 对整条输出打分，结合 KL 惩罚得到每一步的奖励分数：</p>

\[r_{t}=r_{\varphi}(q,o_{\leq t})-\beta\log\frac{\pi_{\theta}(o_{t}|q,o_{&lt;t})}{\pi_{\text{ref}}(o_{t}|q,o_{&lt;t})}\]

<p>这里的 KL 惩罚项确保模型不会为了追求高奖励而生成与参考模型差异过大的文本。</p>

<h3 id="132-用-gae-从-reward--value-得到优势-a_t">1.3.2 用 GAE 从 reward + value 得到优势 \(A_t\)</h3>

<p>有了每一步的奖励 \(r_t\)，接下来需要回答一个问题：<strong>这一步的动作到底比「平均水平」好了多少？</strong> 这就是优势函数 \(A_t\) 要衡量的。
要算 \(A_t\)，光有奖励不够——我们还需要一个「平均水平」的参照物。这个参照物就是状态价值函数 \(V(s_t)\)，它由一个专门的 <strong>Critic 网络（也叫 Value Network）</strong> 负责输出。简单来说：</p>

<ul>
  <li>
    <p><strong>Reward Model</strong>：给完整回答打分，提供即时奖励信号 \(r_t\)（在 RL 阶段冻结不更新）</p>
  </li>
  <li>
    <p><strong>Critic 网络</strong>：预测从当前位置到序列结束的<strong>期望累积回报</strong> \(V(s_t) = \mathbb{E}[G_t \mid s_t]\)，作为计算 Advantage 的 baseline（与 Actor 同步训练）</p>
  </li>
</ul>

<blockquote>
  <p>在本节中，我们先<strong>假设 Critic 已经训好</strong>、能给出合理的 \(V(s_t)\)，专注于理解 \(A_t\) 的计算逻辑。至于 Critic 本身是怎么训练的，我们在 1.4 节详细展开。</p>
</blockquote>

<p>在强化学习中，状态价值 \(V(s_t)\) 的直观含义是：<strong>从现在开始，直到序列结束，我能拿到的所有奖励的折扣总和</strong>。</p>

\[V(s_t) \approx r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + \dots\]

<p>利用数学上的递归关系，我们可以把它写成：</p>

\[V(s_t) \approx \underbrace{r_t}_{\text{眼前的钱}} + \underbrace{\gamma V(s_{t+1})}_{\text{未来的钱}}\]

<p><strong>第一步：计算 TD Error（时序差分误差</strong> \(\delta_t\)<strong>）</strong></p>

\[\delta_t = r_t + \gamma V(s_{t+1}) - V(s_t)\]

<p>各项含义：</p>
<ul>
  <li>\(r_t\)：当前这一步获得的即时奖励（通常是 KL 惩罚，最后一步才有大分）</li>
  <li>\(V(s_t)\)：<strong>Critic 认为</strong>当前状态值多少分</li>
  <li>\(V(s_{t+1})\)：走到下一步后，<strong>Critic 认为</strong>那个新状态值多少分</li>
  <li>\(\gamma\)：折扣因子（比如 0.99），表示未来的分不如现在的分值钱
<strong>直观理解</strong>：如果 \(\delta_t &gt; 0\)，说明 \(r_t + \gamma V(s_{t+1})\)（现实情况）比 \(V(s_t)\)（Critic 的预期）要高，说明这一步走得超出预期的好。
<strong>第二步：计算 GAE 优势</strong> \(\hat{A}_t\)
TD Error 只看了一步，眼光太短浅。GAE 把当前这一步的误差，加上未来的误差（打折后）累加起来：</li>
</ul>

\[\hat{A}_t = \delta_t + (\gamma \lambda)\delta_{t+1} + (\gamma \lambda)^2 \delta_{t+2} + \cdots + (\gamma \lambda)^{T-t} \delta_T\]

<p>\(\lambda\)：这是 GAE 特有的参数（比如 0.95），用于平衡方差和偏差</p>
<ul>
  <li><strong>含义</strong>：当前这一步的优势，不仅取决于这一步走得好不好（\(\delta_t\)），还取决于它是否让后面几步也容易走好
<strong>PPO 的 Advantage 一句话总结</strong>：</li>
</ul>

\[\text{Advantage} = \text{加权累加的 (现实 - 预期)}\]

<h3 id="133-计算每个位置的真实回报">1.3.3 计算每个位置的「真实回报」</h3>

<p><strong>目标公式</strong>： \(\text{Target}_t = V(s_t) + \hat{A}_t\)
这个公式看起来简单，但其背后蕴含着深刻的数学意义。下面我们来详细推导。
<strong>准备公式</strong>：
回顾两个核心定义：</p>
<ul>
  <li>TD Error（\(\delta_t\)）： \(\delta_t = r_t + \gamma V(s_{t+1}) - V(s_t)\)</li>
  <li>GAE（\(\hat{A}_t\)）： \(\hat{A}_t = \sum_{k=0}^{\infty} (\gamma \lambda)^k \delta_{t+k} = \delta_t + (\gamma\lambda)\delta_{t+1} + (\gamma\lambda)^2\delta_{t+2} + \dots\)
<strong>展开推导</strong>：
我们把 \(\text{Target}_t = V(s_t) + \hat{A}_t\) 展开。为了看清规律，我们只写前两项，看看它是怎么「消消乐」的，但又是怎么「消不干净」的。</li>
</ul>

\[\begin{aligned} \text{Target}_t &amp;= \mathbf{V(s_t)} \\ &amp;+ \underbrace{(r_t + \gamma V(s_{t+1}) - \mathbf{V(s_t)})}_{\delta_t} \\ &amp;+ (\gamma\lambda) \underbrace{(r_{t+1} + \gamma V(s_{t+2}) - V(s_{t+1}))}_{\delta_{t+1}} \\ &amp;+ (\gamma\lambda)^2 \delta_{t+2} + \dots \end{aligned}\]

<p><strong>第一步整理</strong>：可以看到第一行的 \(V(s_t)\) 和第二行的 \(-V(s_t)\) 完美抵消了。剩下：</p>

\[\text{Target}_t = r_t + \gamma V(s_{t+1}) + (\gamma\lambda)(r_{t+1} + \gamma V(s_{t+2}) - V(s_{t+1})) + \dots\]

<p><strong>第二步关键整理（观察</strong> \(V(s_{t+1})\)<strong>）</strong>：
我们把含有 \(V(s_{t+1})\) 的项提取出来。一项是前面的 \(\gamma V(s_{t+1})\)，一项是后面的 \(-(\gamma\lambda) V(s_{t+1})\)。</p>

\[\gamma V(s_{t+1}) - \gamma\lambda V(s_{t+1}) = \gamma (1-\lambda) V(s_{t+1})\]

<p>于是公式变成了：</p>

\[\begin{aligned} \text{Target}_t &amp;= r_t + \gamma (1-\lambda)V_{t+1} \\ &amp;+ \gamma\lambda r_{t+1} + (\gamma\lambda) \gamma (1-\lambda)V_{t+2} \\ &amp;+ (\gamma\lambda)^2 \left[ r_{t+2} + \gamma (1-\lambda)V_{t+3} + \dots \right] \end{aligned}\]

<p><strong>最终的「一般形式」</strong>：如果你不断这样递归下去，会发现一个惊人的规律——</p>

\[G_t^\lambda = (1-\lambda) \sum_{n=1}^{\infty} \lambda^{n-1} G_t^{(n)}\]

<p>这里的 \(G_t^{(n)}\) 代表 n-step Return（看 \(n\) 步真实奖励，后面用预测）：</p>
<ul>
  <li>\(n=1\)： \(G_t^{(1)} = r_t + \gamma V(s_{t+1})\)（只看 1 步）</li>
  <li>\(n=2\)： \(G_t^{(2)} = r_t + \gamma r_{t+1} + \gamma^2 V(s_{t+2})\)（看 2 步）</li>
  <li>\(n=\infty\)： \(G_t^{(\infty)} = G_t\)（Monte Carlo，全看真实）
<strong>推导结论</strong>：利用 \(V_{old} + A\) 构造出来的 Target，本质上是<strong>所有可能的 n 步回报的加权平均值</strong>！权重由 \(\lambda\) 决定——越大，越重视长远的真实奖励；越小，越重视近期的预测。</li>
</ul>

<blockquote>
  <p><strong>GAE 的智慧（\(\lambda = 0.95\)）</strong>
构造 \(\text{Target} = V_{old} + A\) 是为了取其精华，去其糟粕。\(\lambda=0.95\) 时，它相当于在说：「我 95% 相信现实发生的事（后面的 \(r\)），但也保留 5% 对 Critic 预测的信任（用来平滑噪音）。」</p>
  <ul>
    <li>通过引入 \(V\)（预测）：我们削减了 \(G_t\) 中因为环境随机性带来的巨大方差</li>
    <li>通过引入 \(r\)（现实）：我们修正了 \(V\) 可能会有的偏差</li>
  </ul>
</blockquote>

<p>其中 \(\gamma\) 是折扣因子（通常接近 1）， \(r_t\) 是第 \(t\) 步获得的奖励。
\(G_t = V_{old} + A\) 构造的是 \(\lambda\)-Return：</p>

<ul>
  <li>
    <p>如果 \(\lambda = 1\)，由于数学上的抵消，它就退化为蒙特卡洛回报 \(G_t\)</p>
  </li>
  <li>
    <p>如果 \(\lambda &lt; 1\)，它是 \(G_t\) 的一个低方差近似版。我们故意用这个公式，是为了让 Critic 学得更稳，而不是完全照搬某一次采样的 \(G_t\)</p>
  </li>
</ul>

<p><strong>小结与展望</strong>：回顾一下，整个 \(A_t\) 的计算链条是：</p>

\[\text{RM 打分} \xrightarrow{r_t} \text{结合 Critic 的 } V(s_t) \xrightarrow{\text{GAE}} \hat{A}_t\]

<p>在这个链条中，<strong>Critic 提供的</strong> \(V(s_t)\) <strong>质量直接决定了</strong> \(A_t\) <strong>的准确性</strong>——如果 Critic 预测得不准，Advantage 的信噪比就会很差，Actor 的更新方向也会跟着跑偏。所以一个自然的问题是：<strong>Critic 网络本身是怎么训练的？它的训练目标是什么？</strong> 这正是下一节要回答的问题。</p>

<h2 id="14-训练-critic-网络">1.4 训练 Critic 网络</h2>

<p>在 1.3 节中，Critic 提供的 \(V(s_t)\) 贯穿了整个 Advantage 计算过程。现在我们来看它自身是怎么训练的。
<strong>Critic 的架构</strong>：在 LLM-RLHF 的典型实现中，Critic 与 Actor <strong>共享同一个 Transformer backbone</strong>，在最后一层额外接一个<strong>线性头</strong>（将 hidden state 映射到标量）。在每个时间步 \(t\)，Critic 利用当前状态 \(s_t\)（即 prompt + 已生成序列 \(o_{&lt;t}\) 经过 Transformer 编码后的隐藏表示）输出 \(V(s_t)\)，其训练目标是<strong>回归拟合从该位置出发的期望累积回报</strong>。
Value Network 的训练目标是：</p>

\[\min_{V} \mathbb{E}_{s_t, R} \left[ (V(s_t) - R)^2 \right]\]

<p>这是一个标准的 MSE 回归问题，我们想找到最优函数 \(V^*(s_t)\)。
设模型在某一状态 \(s_t\) 上预测为 \(v\)，真实未来回报是随机变量 \(R\)，则目标变成：</p>

\[\min_{v} \mathbb{E}[(v - R)^2]\]

<p>对 \(v\) 求导：</p>

\[\frac{d}{dv} \mathbb{E}[(v - R)^2] = 2\mathbb{E}[v - R] = 0\]

<p>解得：</p>

\[v = \mathbb{E}[R]\]

<p>因此，最优 \(V(s_t)\) 不是某次 \(R\)，也不是逼近 \(R\) 的趋势曲线，而是： \(V(s_t) = \mathbb{E}[R \mid s_t]\)</p>

<blockquote>
  <p><strong>关键洞察</strong>： \(V(s_t)\) 是对未来累积回报的<strong>条件期望</strong>——一个预测基线，而不是 reward 的逐步逼近值。它不是试图越来越接近某一次具体的 reward，而是<strong>根据当前 state 估计「平均而言，未来还能拿多少分」</strong>。这正是它能作为 1.3 节中 Advantage 基线的数学根基。</p>
</blockquote>

<h2 id="15-ppo-训练流程">1.5 PPO 训练流程</h2>

<p><img src="/images/从 PPO 到 DPO 再到 GRPO：大模型强化学习对齐技术全景解读/0.png" alt="" />
综上，PPO 的训练分为三个清晰的阶段
<strong>第一步：采样与打分（Rollout）</strong>
此时我们有旧的策略网络（Actor）和旧的价值网络（Critic）。</p>

<ol>
  <li>
    <p>让 Actor 去环境里跑（比如生成文本），拿到状态 \(s\)、动作 \(a\)、奖励 \(r\)</p>
  </li>
  <li>
    <p>用旧的 Critic 对这些状态打分，得到 \(V_{old}(s)\)</p>
  </li>
</ol>

<p><strong>第二步：计算优势和目标（Calculation）—— 关键步骤</strong>
在这个阶段，网络是<strong>不更新</strong>的。我们利用刚才收集的数据计算出两个<strong>固定的张量</strong>：</p>

<ol>
  <li>
    <p><strong>计算 Advantage（\(\hat{A}\)）</strong>：利用 \(r\) 和 \(V_{old}\)，套用 GAE 公式算出优势</p>
  </li>
  <li>
    <p><strong>计算 Returns（Target）</strong>：直接用公式 \(\text{Returns} = V_{old} + \hat{A}\)</p>
  </li>
</ol>

<blockquote>
  <p><strong>注意</strong>：这一步做完后，\(\hat{A}\) 和 \(\text{Returns}\) 就变成了<strong>常数</strong>（不再带有计算图的梯度），也就是我们常说的 label。</p>
</blockquote>

<p><strong>第三步：训练更新（Optimization）</strong>
现在的输入数据是：\((s, a, \hat{A}, \text{Returns})\)。
进入 PPO 的 Update Loop（通常会循环几次）：</p>

<ul>
  <li>
    <p><strong>Actor 的任务</strong>：利用第二步算好的 \(\hat{A}\) 来计算 PPO 的 Policy Loss（那个截断的 CLIP 公式），更新 Actor 参数 \(L^{CLIP}(\theta) \approx \min(\dots) \cdot \hat{A}\)</p>
  </li>
  <li>
    <p><strong>Critic 的任务</strong>：利用第二步算好的 \(\text{Returns}\) 作为真值（GT），更新 Critic 参数 \(L^{Value}(\phi) = (V_\phi(s) - \text{Returns})^2\)</p>
  </li>
</ul>

<p><strong>为什么要这样？</strong>
因为 PPO 是 <strong>On-Policy（同策略）</strong> 算法。Advantage 的含义是：”在当时那个时刻，采取这个动作比平均水平好了多少”。这个”平均水平”（基线）必须是采样时的那个 Critic 给出的。如果你先更新了 Critic，基线变了，那么你之前算的 Advantage 就没意义了（偏差会变大），数学上就不成立了。
<strong>总结流程图</strong>：</p>

<ol>
  <li>
    <p>旧 Critic → 算出 Advantage 和 Returns</p>
  </li>
  <li>
    <p>锁定这两个值（当作固定数字）</p>
  </li>
  <li>
    <p>Advantage → 用来训练 Actor</p>
  </li>
  <li>
    <p>Returns → 用来训练新 Critic</p>
  </li>
</ol>

<hr />

<h1 id="2-dpo绕过-rl-的优雅捷径">2 DPO：绕过 RL 的优雅捷径</h1>

<p><img src="/images/从 PPO 到 DPO 再到 GRPO：大模型强化学习对齐技术全景解读/1.png" alt="" /></p>

<h2 id="21-核心思想与主要发现">2.1 核心思想与主要发现</h2>

<p>在 PPO 的框架中，我们需要先训练一个 Reward Model 对回复打分，再用 RL 算法（配合 Critic 网络）去最大化这个打分。整个流程链条很长：训练 RM → RM 打分 → 计算 Advantage → 更新 Actor → 同步更新 Critic。DPO（Direct Preference Optimization）的核心洞察是：</p>

<blockquote>
  <p><em>能不能跳过 Reward Model 和 RL 过程，直接从人类偏好数据中优化策略？</em></p>
</blockquote>

<p>答案是可以的。<a href="https://arxiv.org/abs/2305.18290">DPO（Direct Preference Optimization）</a>由 Rafailov 等人于 2023 年在 NeurIPS 上提出，其核心洞察是：<strong>语言模型本身就隐含地扮演了奖励模型的角色</strong>，我们可以跳过显式的奖励建模和 RL 训练。其主要发现可以概括为两步：</p>

<ol>
  <li>
    <p><strong>KL 约束下的最优策略存在闭式解</strong>——从 RLHF 的优化目标出发，可以推导出一个显式的 \(\pi^*(y \mid x)\) 表达式；</p>
  </li>
  <li>
    <p><strong>将这个闭式解代入 Bradley-Terry 偏好模型</strong>，就能把”学习 Reward → 再做 RL”的两阶段流程，简化为一个直接在偏好数据上训练策略的分类损失。</p>
  </li>
</ol>

<p>下面我们沿着这个思路，逐步推导 DPO 的理论基础。</p>

<h3 id="211-从-kl-约束优化到最优策略的闭式解">2.1.1 从 KL 约束优化到最优策略的闭式解</h3>

<p>RLHF 的核心优化目标是：在最大化期望奖励的同时，不让策略偏离参考策略 \(\pi_{\text{ref}}\) 太远（用 KL 散度约束）：</p>

\[\max_{\pi_\theta} \; \mathbb{E}_{x \sim \mathcal{D},\, y \sim \pi_\theta(\cdot|x)} \left[ r(x, y) \right] - \beta \, \text{KL}\!\left[\pi_\theta(\cdot|x) \;\Vert \; \pi_{\text{ref}}(\cdot|x)\right]\]

<p>其中 \(r(x, y)\) 是 Reward Model 给出的奖励， \(\beta\) 控制 KL 惩罚强度。
对于这个 KL 约束优化问题，可以用变分法推导出其最优策略的闭式解：</p>

\[\pi^*(y|x) = \frac{1}{Z(x)} \, \pi_{\text{ref}}(y|x) \, \exp\!\left(\frac{r(x,y)}{\beta}\right)\]

<p><br /></p>

<p>其中 \(Z(x) = \sum_y \pi_{\text{ref}}(y \mid x) \exp\!\left(\frac{r(x,y)}{\beta}\right)\) 是归一化常数（配分函数），确保 \(\pi^*\) 仍然是合法的概率分布。</p>

<blockquote>
  <p><strong>直觉</strong>：最优策略在参考策略的基础上，按奖励大小做指数级的”re-weighting”——奖励越高的回复概率越大，但受到 \(\beta\) 的约束不会偏离太远。</p>
</blockquote>

<h3 id="212-反解出隐式奖励函数">2.1.2 反解出隐式奖励函数</h3>

<p>上面的闭式解建立了”奖励 → 最优策略”的映射，但 DPO 需要的是反方向：<strong>从策略反推出奖励</strong>。对闭式解取对数并移项，可以得到：</p>

\[r(x, y) = \beta \log \frac{\pi^*(y|x)}{\pi_{\text{ref}}(y|x)} + \beta \log Z(x)\]

<p>这就是 DPO 的关键等式——<strong>奖励可以完全用策略的对数概率比来表示，即最优模型生成某个回答的概率，正比于初始模型生成该回答的概率乘以一个由奖励函数决定的指数项。</strong> 注意 \(\beta \log Z(x)\) 只依赖于 prompt \(x\)，与具体回复 \(y\) 无关。</p>

<h3 id="213-代入-bradley-terry-模型消去配分函数">2.1.3 代入 Bradley-Terry 模型，消去配分函数</h3>

<p>人类偏好通常建模为 Bradley-Terry 模型：给定 prompt \(x\) 和一对回复 \((y_w, y_l)\)，人类更偏好 \(y_w\) 的概率为：</p>

\[p(y_w \succ y_l | x) = \sigma\!\left(r(x, y_w) - r(x, y_l)\right)\]

<p>其中 \(\sigma\) 是 sigmoid 函数。将 2.1.2 中的隐式奖励代入：</p>

\[p(y_w \succ y_l | x) = \sigma\!\left(\beta \log \frac{\pi^*(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \beta \log \frac{\pi^*(y_l|x)}{\pi_{\text{ref}}(y_l|x)}\right)\]

<p>注意发生了什么：\(\beta \log Z(x)\) <strong>在做差时完美消去了</strong>。这意味着我们不需要计算那个难以处理的配分函数，偏好概率完全由策略与参考策略的对数概率比决定。
这一步至关重要——正是配分函数的消去，使得 DPO 可以绕过 Reward Model 的显式训练，直接在偏好数据上优化策略。下一节，我们将基于这个结果写出 DPO 的训练损失函数。</p>

<h2 id="22-dpo-损失函数">2.2 DPO 损失函数</h2>

<p>有了上面的推导，DPO 的损失函数就水到渠成了。将 2.1.3 中的偏好概率取负对数似然，就得到 DPO 的训练目标：</p>

\[\mathcal{L}_{\text{DPO}}(\theta) = -\mathbb{E}_{(x, y_w, y_l) \sim \mathcal{D}} \left[ \log \sigma\!\left( \beta \log \frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} - \beta \log \frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)} \right) \right]\]

<p>这个损失函数的设计有三个精妙之处：
<strong>1. 隐式奖励差驱动优化</strong>
定义隐式奖励为 \(\hat{r}_\theta(x, y) = \beta \log \frac{\pi_\theta(y \mid x)}{\pi_{\text{ref}}(y \mid x)}\)，则损失可以简写为：</p>

\[\mathcal{L}_{\text{DPO}} = -\mathbb{E}\left[\log \sigma\!\left(\hat{r}_\theta(x, y_w) - \hat{r}_\theta(x, y_l)\right)\right]\]

<p>优化方向很清晰：<strong>拉大好回复与坏回复之间的隐式奖励差</strong>。
<strong>2. 梯度自带难度感知</strong>
对 \(\mathcal{L}_{\text{DPO}}\) 求梯度，可以得到：</p>

\[\nabla_\theta \mathcal{L}_{\text{DPO}} = -\beta \, \mathbb{E}\!\left[\underbrace{\sigma\!\left(\hat{r}_\theta(x, y_l) - \hat{r}_\theta(x, y_w)\right)}_{\text{隐式权重}} \left[\nabla_\theta \log \pi_\theta(y_w|x) - \nabla_\theta \log \pi_\theta(y_l|x)\right]\right]\]

<p>其中的隐式权重 \(\sigma(\hat{r}_\theta(x, y_l) - \hat{r}_\theta(x, y_w))\) 起到了自适应采样的作用：当模型<strong>已经能正确区分好坏回复</strong>（隐式奖励差大），这个权重趋近于 0，梯度很小；当模型<strong>判断错误</strong>（给坏回复的隐式奖励更高），权重趋近于 1，产生强烈的纠正梯度。这意味着 DPO 天然会把学习资源集中在”难样本”上。
<strong>3. 仅依赖策略概率，无需额外模型</strong>
整个损失只涉及 \(\pi_\theta\) 和 \(\pi_{\text{ref}}\) 的对数概率——不需要 Reward Model 打分，不需要 Critic 网络，不需要 GAE 计算。训练时只需做一次前向传播计算 log-prob 即可。
至此，我们已经看到了 DPO 损失函数的完整形态。但一个自然的问题是：<strong>PPO 中需要显式的 KL 散度惩罚来防止策略崩塌，DPO 的损失里没有出现任何 KL 项——它是如何保持策略稳定性的？</strong> 下一节将回答这个问题。</p>

<h2 id="23-kl-散度惩罚的隐式机制">2.3 KL 散度惩罚的隐式机制</h2>

<p>DPO 的损失函数中看不到显式的 KL 惩罚项，但这并不意味着 KL 约束不存在——它以两种方式隐含在损失设计中。</p>

<h3 id="231-隐式奖励本身就是-kl-的局部梯度">2.3.1 隐式奖励本身就是 KL 的”局部梯度”</h3>

<p>回顾隐式奖励的定义：</p>

\[\hat{r}_\theta(x, y) = \beta \log \frac{\pi_\theta(y|x)}{\pi_{\text{ref}}(y|x)}\]

<p>这个对数比值正是 KL 散度 \(\text{KL}[\pi_\theta \Vert \pi_{\text{ref}}]\) 在点 \(y\) 上的”局部贡献”。当策略 \(\pi_\theta\) 偏离参考策略时，这个值会增大，而 DPO 的梯度权重 \(\sigma(\hat{r}_\theta(y_l) - \hat{r}_\theta(y_w))\) 会自动调节：</p>

<ul>
  <li>
    <p><strong>Case 1：策略大幅偏离参考策略</strong>。此时 \(\hat{r}_\theta\) 的绝对值很大，如果偏离方向正确（好回复的隐式奖励 » 坏回复），sigmoid 趋近 0，梯度被抑制——<strong>防止策略继续偏离</strong>。</p>
  </li>
  <li>
    <p><strong>Case 2：策略接近参考策略</strong>。 \(\hat{r}_\theta\) 较小，sigmoid 接近 0.5，梯度正常更新——<strong>允许策略在参考策略附近自由探索</strong>。</p>
  </li>
</ul>

<h3 id="232-约束来源闭式解的推导前提">2.3.2 约束来源：闭式解的推导前提</h3>

<p>更根本地说，DPO 损失的推导起点就是 KL 约束优化问题（2.1.1）。整个损失函数是在 <strong>“最优策略满足 KL 约束”这一前提下</strong> 推导出来的，因此 KL 约束已经被”编码”进了损失的数学结构中：</p>

<ul>
  <li>
    <p>\(\beta\) 参数直接控制约束强度：\(\beta\) 越大，隐式奖励对策略偏离越敏感，等价于更强的 KL 惩罚；</p>
  </li>
  <li>
    <p>参考策略 \(\pi_{\text{ref}}\) 的对数概率始终作为”锚点”出现在损失中，任何偏离都会被自动计入优化目标。</p>
  </li>
</ul>

<blockquote>
  <p><strong>小结</strong>：DPO 并非”没有 KL 约束”，而是将 KL 约束从 PPO 的显式惩罚项，转化为了损失函数的内在数学结构。这种设计更优雅，但也意味着 \(\beta\) 的调参更为关键——它是唯一控制探索-利用平衡的旋钮。</p>
</blockquote>

<h2 id="24-dpo-相对于-ppo-的改进与效果">2.4 DPO 相对于 PPO 的改进与效果</h2>

<p>理解了 DPO 的理论基础和隐式约束机制后，我们可以系统地比较它与 PPO 的差异。下表总结了两者在训练流程、模型需求和优化特性上的关键区别：</p>

<table>
  <thead>
    <tr>
      <th>改进点 (Improvement Area)</th>
      <th>PPO (传统RLHF方法)</th>
      <th>DPO (直接偏好优化)</th>
      <th>带来的效果改善 (Resulting Improvement)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1. 训练流程 (Training Pipeline)</td>
      <td>复杂的三阶段流程：1. 监督微调 (SFT) 2. 训练奖励模型 (RM) 3. PPO强化学习微调</td>
      <td>简化的两阶段流程：1. 监督微调 (SFT) 2. DPO直接优化</td>
      <td>极大简化了流程，降低了工程复杂度和出错可能。不再需要维护和调试一个独立的奖励模型。</td>
    </tr>
    <tr>
      <td>2. 奖励机制 (Reward Mechanism)</td>
      <td>显式的奖励模型：需要训练一个独立的神经网络来拟合人类偏好，给生成的文本打分。这个模型是真实奖励的一个代理（Proxy）。</td>
      <td>隐式的奖励模型：不需要独立的奖励模型。奖励函数通过r ∝ log(π_θ / π_ref)被解析地、隐式地定义在策略模型本身。</td>
      <td>消除了奖励模型和策略模型可能存在的不一致性（mismatch）。同时，由于奖励和策略是联动的，有效避免了奖励过度优化（reward hacking）的风险，即模型找到奖励模型的漏洞获得高分，但实际质量很差。</td>
    </tr>
    <tr>
      <td>3. 优化算法 (Optimization Algorithm)</td>
      <td>复杂的Actor-Critic算法：PPO需要维护一个策略网络（Actor）和一个价值网络（Critic），通过复杂的优势函数（Advantage Estimation）来计算梯度，方差较大。</td>
      <td>简单的分类损失函数：DPO将问题转化为一个简单的二元交叉熵损失，这是一个非常成熟和稳定的监督学习问题，可以直接通过梯度下降优化。</td>
      <td>训练过程更稳定、收敛更快。由于是直接优化，其方差更低，结果的可复现性更强。不再需要复杂的价值函数估计。</td>
    </tr>
    <tr>
      <td>4. 训练过程中的采样 (Sampling During Training)</td>
      <td>需要在训练中动态采样：PPO的训练循环中，需要不断从当前策略模型（Actor）中采样生成新的回答，然后用奖励模型打分，计算优势值。这是一个主要的计算瓶颈。</td>
      <td>无需在训练循环中采样：DPO的训练完全基于静态的、离线的偏好数据集 (prompt, y_w, y_l) 进行。</td>
      <td>训练速度大幅提升，计算资源需求显著降低。这使得DPO在同等硬件条件下可以更快地完成训练，或者用更少的资源完成训练。</td>
    </tr>
    <tr>
      <td>5. 超参数调优 (Hyperparameter Tuning)</td>
      <td>超参数众多且敏感：需要仔细调整Actor和Critic的学习率、折扣因子gamma、GAE的lambda、PPO的clipping epsilon、KL散度惩罚系数等，调优非常困难。</td>
      <td>超参数少且鲁棒：最关键的超参数只有一个 β，它直接控制KL散度的强度，并且其含义清晰，调优相对简单得多。</td>
      <td>调参难度大大降低，更容易获得好结果。这极大地降低了研究者和开发者应用偏好对齐技术的门槛。</td>
    </tr>
    <tr>
      <td>6. 稳定性和实现难度 (Stability &amp; Implementation Complexity)</td>
      <td>实现复杂，训练不稳定：PPO的实现涉及多个组件和复杂的计算流程，代码容易出错。RL训练过程本身也可能非常不稳定。</td>
      <td>实现简单，训练过程稳健：DPO损失函数的实现非常直接（在PyTorch中可能只需几行代码），整个训练过程就像普通的监督学习一样稳定。</td>
      <td>更可靠，更容易部署和维护。简单性和稳定性使得这项关键的对齐技术能够被更广泛地应用和研究。</td>
    </tr>
  </tbody>
</table>

<p>DPO 的优势可以概括为三点：</p>

<ol>
  <li>
    <p><strong>流程大幅简化</strong>：去掉了 RM 训练和 RL 采样循环，将对齐训练简化为一个标准的监督学习过程（偏好对上的二分类）；</p>
  </li>
  <li>
    <p><strong>资源开销降低</strong>：从 4 个模型缩减到 2 个，显存需求和工程复杂度显著下降；</p>
  </li>
  <li>
    <p><strong>训练更稳定</strong>：消除了 RM 质量传导误差、Critic 网络训练不稳定、以及 on-policy 采样方差等不稳定因素。</p>
  </li>
</ol>

<p>当然，DPO 也有其局限性：它依赖离线偏好数据的质量和覆盖度，无法像 PPO 那样通过在线采样持续探索新的回复空间。这一局限后来催生了如 Online DPO、IPO 等改进工作。
<br /></p>

<p>在下一章中，我们将介绍 GRPO——它从另一个角度简化 PPO：<strong>保留 RL 框架但去掉 Critic 网络</strong>，用组内归一化的方式直接估计优势函数。</p>

<h1 id="3-grpo无-critic-的群体智慧">3 GRPO：无 Critic 的群体智慧</h1>

<p><img src="/images/从 PPO 到 DPO 再到 GRPO：大模型强化学习对齐技术全景解读/2.png" alt="" /></p>

<h2 id="31-背景与动机去掉-critic还能做-rl-吗">3.1 背景与动机：去掉 Critic，还能做 RL 吗？</h2>

<p>在前两章中，我们看到了两条通往对齐的路径：</p>

<ul>
  <li>
    <p><strong>PPO</strong>：完整的 RL 框架，效果强大但链条很长——需要 RM 打分、Critic 估值、GAE 计算、重要性采样与 Clip，同时维护 4 个模型；</p>
  </li>
  <li>
    <p><strong>DPO</strong>：彻底绕过 RL，用偏好数据直接优化策略，流程极简但放弃了在线采样的探索能力。</p>
  </li>
</ul>

<p>有没有一条中间路线——<strong>保留 RL 的在线采样优势，但去掉最沉重的 Critic 网络</strong>？
<a href="https://arxiv.org/abs/2402.03300">Group Relative Policy Optimization（GRPO）</a>正是这个思路的产物。它由 DeepSeek 团队在 2024 年的 DeepSeekMath 论文中提出，核心创新只有一句话：</p>

<blockquote>
  <p><strong>用”同一道题的多个回答之间的相对比较”来替代 Critic 网络的价值估计。</strong></p>
</blockquote>

<p>这带来两个直接好处：</p>

<ol>
  <li>
    <p><strong>节省显存</strong>：不再需要与策略模型同等规模的 Critic 网络（对于 67B 的模型，这意味着省下近一半的显存）。</p>
  </li>
  <li>
    <p><strong>简化流程</strong>：省去了 Critic 的训练、更新和同步维护，同时避免了 Critic 估值不准导致的训练不稳定。</p>
  </li>
</ol>

<p>那么问题来了：PPO 中 Critic 的核心作用是提供基线（baseline）来降低梯度方差，去掉它之后，GRPO 如何计算优势函数 \(\hat{A}_{i,t}\)？这正是下一节要回答的问题。</p>

<h2 id="32-advantage-计算grpo-的核心创新">3.2 Advantage 计算：GRPO 的核心创新</h2>

<p>回顾 PPO 中优势函数的计算链条：<strong>RM 打分 →</strong> \(r_t\) <strong>→ 结合 Critic 的</strong> \(V(s_t)\) <strong>→ TD Error → GAE →</strong> \(\hat{A}_t\)。GRPO 的做法是把中间涉及 Critic 的部分全部替换掉——不再问”这个回答比 Critic 预测的好多少”，而是问”<strong>这个回答在同一组回答中排第几</strong>“。
具体来说，GRPO 对同一个问题 \(q\) 从旧策略 \(\pi_{\theta_{\text{old}}}\) 采样 \(G\) 个完整回答 \(o_1, o_2, \dots, o_G\)（例如同一道数学题生成 16 种解法），然后根据监督信号的粒度，分为两种计算方式。</p>

<h3 id="321-结果监督outcome-supervision整条序列共享一个优势">3.2.1 结果监督（Outcome Supervision）：整条序列共享一个优势</h3>

<p>当使用 Reward Model 对每个回答给出一个整体标量分数时，计算分两步：
<strong>第一步：组内标准化（Group Normalization）</strong>
用 RM 分别对 \(G\) 个回答打分，得到 \(r_1, r_2, \dots, r_G\)，然后做标准化处理：</p>

\[\tilde{r}_i = \frac{r_i - \text{mean}(\mathbf{r})}{\text{std}(\mathbf{r})}\]

<p>标准化之后， \(\tilde{r}_i &gt; 0\) 意味着”比组内平均水平好”， \(\tilde{r}_i &lt; 0\) 意味着”比平均水平差”。这就是”相对比较”的含义——奖励信号不再是绝对值，而是相对于同组其他回答的排位。
<strong>第二步：优势广播（Broadcasting）</strong>
由于 RM 只给出整条回答的最终得分，没有逐 token 的细粒度信号，GRPO 采用最简单的策略——”<strong>一人得道，鸡犬升天</strong>“：序列中每个 token 的优势值都等于该序列的归一化得分：</p>

\[\hat{A}_{i,t} = \tilde{r}_i \quad (\text{对于序列 } i \text{ 中的所有位置 } t)\]

<blockquote>
  <p><strong>直觉</strong>：如果一道题的某个解法最终答对了（\(\tilde{r}_i\) 大），那么这个解法中的每一步推理都被视为”好的”，统一给予正向激励。这是一个粗粒度的近似，但实践中对数学推理任务效果很好。</p>
</blockquote>

<h3 id="322-过程监督process-supervision逐步累积优势">3.2.2 过程监督（Process Supervision）：逐步累积优势</h3>

<p>当使用 Process Reward Model（PRM）对每个推理步骤分别打分时，优势的计算可以更加精细：
<strong>第一步：步骤级标准化（Step-wise Normalization）</strong>
GRPO 收集组内所有回答的所有步骤奖励，计算全局均值和标准差进行标准化：</p>

\[\tilde{r}_{i,j} = \frac{r_{i,j} - \text{mean}(\text{GroupRewards})}{\text{std}(\text{GroupRewards})}\]

<p>其中 \(r_{i,j}\) 是第 \(i\) 个回答中第 \(j\) 个步骤的奖励。
<strong>第二步：计算累积优势（Accumulated Future Return）</strong>
与结果监督不同，过程监督下每一步都有独立的评分。此时 GRPO 借鉴了强化学习中”回报”（Return）的思想——当前步骤的优势不仅取决于自身得分，还要对后续所有步骤的表现负责：</p>

\[\hat{A}_{i,t} = \sum_{k=j}^{K_i} \tilde{r}_{i,k} \quad (\text{其中 token } t \text{ 属于第 } j \text{ 个步骤})\]

<p>这意味着：早期的推理步骤（如”设 \(x\) 为…”）承担了更大的优势权重，因为它们影响了后续所有步骤的方向。如果后续推理全部正确，早期步骤会获得最高的正向激励；反之，如果在某一步开始出错，该步骤及之前的步骤都会受到惩罚。</p>

<blockquote>
  <p><strong>小结</strong>：无论是结果监督还是过程监督，GRPO 的核心思想一致——<strong>用组内统计量替代 Critic 的价值估计</strong>。组均值充当了 PPO 中 Critic 的”基线”角色，标准差起到了方差归一化的作用。有了优势函数 \(\hat{A}_{i,t}\)，接下来就可以写出 GRPO 的目标函数了。</p>
</blockquote>

<hr />

<h2 id="33-grpo-目标函数">3.3 GRPO 目标函数</h2>

<p>GRPO 的目标函数在形式上与 PPO 高度相似——同样使用重要性采样比率和 Clip 机制，但在两个关键位置做了修改：</p>

\[\mathcal{J}_{GRPO}(\theta) = \mathbb{E}[q \sim P(Q), \{o_i\}_{i=1}^{G} \sim \pi_{\theta_{old}}(O|q)] \frac{1}{G} \sum_{i=1}^{G} \frac{1}{|o_i|} \sum_{t=1}^{|o_i|} \left\{ \min \left[ \rho_{i,t} \hat{A}_{i,t}, \; \text{clip}(\rho_{i,t}, 1-\varepsilon, 1+\varepsilon) \hat{A}_{i,t} \right] - \beta \, \text{KL}[\pi_\theta \Vert \pi_{\text{ref}}] \right\}\]

<p>其中 \(\rho_{i,t} = \frac{\pi_\theta(o_{i,t} \mid q, o_{i,&lt;t})}{\pi_{\theta_{old}}(o_{i,t} \mid q, o_{i,&lt;t})}\) 是重要性采样比率。
与 PPO 逐一对比，可以清晰看出 GRPO 的两处结构性变化：</p>

<h3 id="331-变化一多样本组采样与双层平均">3.3.1 变化一：多样本”组”采样与双层平均</h3>

<p>PPO 对单个 prompt 生成<strong>一条</strong>回复，在 token 维度计算优势并更新；GRPO 则对同一个问题生成 \(G\) 条回复，形成一个”组”：</p>

<ul>
  <li>
    <p><strong>外层</strong> \(\frac{1}{G}\sum_{i=1}^{G}\)：对 \(G\) 个回答求平均——这是 GRPO 特有的，PPO 中没有这一层；</p>
  </li>
  <li>
    <p><strong>内层</strong> \(\frac{1}{\vert o_i \vert}\sum_{t=1}^{\vert o_i \vert}\)：对单条回答中的 token 求平均——这与 PPO 相同，做长度归一化。</p>
  </li>
</ul>

<p>多样本采样不仅是优势计算的基础（需要组内统计量），还天然提供了更低方差的梯度估计：\(G\) 个样本的平均梯度比单样本梯度稳定得多。</p>

<h3 id="332-变化二优势函数来源完全不同">3.3.2 变化二：优势函数来源完全不同</h3>

<table>
  <thead>
    <tr>
      <th> </th>
      <th>PPO</th>
      <th>GRPO</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>优势来源</strong></td>
      <td>Critic 网络 \(V(s_t)\) + GAE</td>
      <td>组内奖励标准化</td>
    </tr>
    <tr>
      <td><strong>所需额外模型</strong></td>
      <td>Critic（与 Actor 同规模）</td>
      <td>无</td>
    </tr>
    <tr>
      <td><strong>粒度</strong></td>
      <td>逐 token（通过 TD Error 链式传播）</td>
      <td>结果监督：全序列统一；过程监督：逐步累积</td>
    </tr>
  </tbody>
</table>

<p>其余结构——重要性采样比率 \(\rho_{i,t}\)、Clip 机制、KL 散度惩罚——与 PPO 完全一致。直觉上，GRPO 的优化动力可以用一句话概括：</p>

<ul>
  <li>
    <p>组内表现高于平均的回答（\(\hat{A}_{i,t} &gt; 0\)）→ 整条序列的生成概率被<strong>放大</strong>；</p>
  </li>
  <li>
    <p>组内表现低于平均的回答（\(\hat{A}_{i,t} &lt; 0\)）→ 整条序列的生成概率被<strong>压制</strong>。</p>
  </li>
</ul>

<p>这就完成了不依赖 Critic 网络的策略优化。接下来，我们看看这个目标函数在实际训练中是如何迭代执行的。</p>

<hr />

<h2 id="34-grpo-训练流程">3.4 GRPO 训练流程</h2>

<h3 id="341-算法流程详解三层嵌套循环">3.4.1 算法流程详解：三层嵌套循环</h3>

<p><img src="/images/从 PPO 到 DPO 再到 GRPO：大模型强化学习对齐技术全景解读/3.png" alt="" />
GRPO 的训练由三层嵌套循环构成，每一层承担不同的职责：
<strong>第一层：大周期（Iteration Loop）——</strong> \(T\) <strong>轮</strong>
这是迭代式强化学习的宏观周期。每轮开始时执行两个关键操作：</p>

<ul>
  <li>
    <p><strong>更新参考模型</strong>：将当前策略 \(\pi_\theta\) 复制为 \(\pi_{\text{ref}}\)。此后在整个大周期内， \(\pi_{\text{ref}}\) 保持冻结，用于计算 KL 散度惩罚；</p>
  </li>
  <li>
    <p><strong>更新 RM</strong>（可选）：DeepSeekMath 的特色设计——边训策略边优化奖励模型 \(r_\phi\)，形成”裁判与选手共同进步”的迭代。</p>
  </li>
</ul>

<p><strong>第二层：采样周期（Step Loop）——</strong> \(N\) <strong>步</strong>
这是数据收集阶段，每步执行以下操作：</p>

<ol>
  <li>
    <p><strong>抽题</strong>：从题库中采样一批问题 \(\mathcal{D}_b\)；</p>
  </li>
  <li>
    <p><strong>快照</strong>：将当前 \(\pi_\theta\) 复制给 \(\pi_{\theta_{\text{old}}}\)，作为本轮采样的冻结副本；</p>
  </li>
  <li>
    <p><strong>组采样</strong>：用 \(\pi_{\theta_{\text{old}}}\) 对每个问题生成 \(G\) 个回答；</p>
  </li>
  <li>
    <p><strong>打分与计算优势</strong>：用 RM/PRM 打分，按 3.2 节的方法计算 \(\hat{A}_{i,t}\)；</p>
  </li>
  <li>
    <p><strong>产出</strong>：得到一批固定的训练数据——包含问题、回答、优势值、以及旧策略的概率 \(\pi_{\theta_{\text{old}}}(o_{i,t} \mid q, o_{i,&lt;t})\)。</p>
  </li>
</ol>

<p><strong>第三层：学习周期（GRPO Loop）——</strong> \(\mu\) <strong>轮</strong>
拿着第二层采好的固定数据，对策略模型进行 \(\mu\) 轮参数更新。数据会被切成 mini-batch，逐批计算 3.3 节的目标函数并执行梯度下降。</p>

<blockquote>
  <p><strong>为什么要分三层？</strong> 第一层控制”参考锚点的刷新频率”，第二层控制”数据采集与模型快照的节奏”，第三层控制”对同一批数据的复用程度”。三个频率解耦，使得训练的稳定性和数据效率都可以独立调节。</p>
</blockquote>

<h3 id="342-重要性采样比率ratio为什么必不可少">3.4.2 重要性采样比率（Ratio）为什么必不可少？</h3>

<p>在第三层循环中，存在一个核心矛盾：<strong>数据是用</strong> \(\pi_{\theta_{\text{old}}}\) <strong>生成的，但模型</strong> \(\pi_\theta\) <strong>在每次梯度更新后都在变化</strong>。从第一个 mini-batch 更新后， \(\pi_\theta\) 就已经不等于 \(\pi_{\theta_{\text{old}}}\) 了；到第 \(\mu\) 轮结束时，两者可能相差甚远。
重要性采样比率 \(\rho_{i,t} = \frac{\pi_\theta(o_{i,t} \mid q, o_{i,&lt;t})}{\pi_{\theta_{old}}(o_{i,t} \mid q, o_{i,&lt;t})}\) 正是为了修正这个”分布错位”：</p>

<table>
  <thead>
    <tr>
      <th>Ratio 取值</th>
      <th>含义</th>
      <th>对训练的影响</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>\(\rho &gt; 1\)</td>
      <td>新策略比旧策略更倾向于生成这个 token</td>
      <td>若 \(\hat{A} &gt; 0\)（好回答），放大梯度，强化该行为</td>
    </tr>
    <tr>
      <td>\(\rho &lt; 1\)</td>
      <td>新策略认为这个 token 不太可能出现</td>
      <td>降低该数据点的权重，减少其对更新的影响</td>
    </tr>
    <tr>
      <td>\(\rho \approx 1\)</td>
      <td>新旧策略一致</td>
      <td>无修正，正常更新</td>
    </tr>
  </tbody>
</table>

<p>Clip 机制则在 Ratio 的基础上再加一道保险：将 \(\rho_{i,t}\) 截断在 \([1{-}\varepsilon, 1{+}\varepsilon]\) 范围内，防止任何单个 token 的梯度贡献过大，确保策略更新始终在旧策略的”信任域”内。</p>

<blockquote>
  <p><strong>一句话总结</strong>：Ratio 解决的是”用旧经验训练新模型”的分布不一致问题（off-policy correction），Clip 限制的是”新模型一次能跑多远”的更新幅度——两者配合，保障了多轮复用数据时的训练稳定性。这一机制与 PPO 完全相同，是 GRPO “保留 RL 框架”的直接体现。</p>
</blockquote>

<h2 id="35-三大算法对比总览">3.5 三大算法对比总览</h2>

<p>从 PPO 到 DPO 再到 GRPO，三种算法代表了大模型对齐技术的三条不同路径：完整 RL、去 RL 化、以及轻量 RL。下表从多个维度系统对比三者的设计选择与工程特性：
<br /></p>

<table>
  <thead>
    <tr>
      <th>对比维度</th>
      <th>PPO（完整 RL 框架）</th>
      <th>DPO（直接偏好优化）</th>
      <th>GRPO（轻量 RL 框架）</th>
      <th>关键差异说明</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>1. 训练流程</strong></td>
      <td>复杂的三阶段流程：1. 监督微调（SFT）→ 2. 训练奖励模型（RM）→ 3. PPO 强化学习微调</td>
      <td>简化的两阶段流程：1. 监督微调（SFT）→ 2. DPO 直接优化</td>
      <td>与 PPO 相同的三阶段流程，但第三阶段的 RL 过程大幅简化（无需 Critic 训练）</td>
      <td>DPO 省去了独立 RM 训练阶段；GRPO 保留 RM 但简化了 RL 内部流程</td>
    </tr>
    <tr>
      <td><strong>2. 奖励机制</strong></td>
      <td><strong>显式奖励模型</strong>：需训练独立的 RM 神经网络，对生成文本打分。RM 是真实奖励的代理（Proxy）</td>
      <td><strong>隐式奖励模型</strong>：不需要独立 RM，奖励通过 \(r \propto \log(\pi_\theta / \pi_{\text{ref}})\) 被解析地、隐式地定义在策略模型本身中</td>
      <td><strong>显式奖励模型</strong>：与 PPO 相同需要独立 RM；支持结果监督（ORM）和过程监督（PRM）两种打分粒度</td>
      <td>DPO 将奖励和策略联动，消除了 RM 与策略之间的不一致性（mismatch），但也失去了独立评估回复质量的能力</td>
    </tr>
    <tr>
      <td><strong>3. 优化算法</strong></td>
      <td><strong>Actor-Critic 架构</strong>：需同时维护策略网络（Actor）和价值网络（Critic），通过 GAE 计算优势函数，梯度方差较大</td>
      <td><strong>分类损失函数</strong>：将问题转化为偏好对上的二元交叉熵损失，本质是监督学习问题，可直接通过梯度下降优化</td>
      <td><strong>Group Relative 架构</strong>：只保留 Actor，去掉 Critic，用组内奖励标准化替代 GAE 来估计优势函数</td>
      <td>GRPO 在 PPO 和 DPO 之间取得折中——保留了 RL 的策略梯度框架，但用统计方法替代了最重的 Critic 组件</td>
    </tr>
    <tr>
      <td><strong>4. 训练采样</strong></td>
      <td><strong>在线采样</strong>：需要在训练循环中不断从当前策略中采样生成回答，再用 RM 打分、计算优势值，是主要的计算瓶颈</td>
      <td><strong>无需在线采样</strong>：训练完全基于静态的、离线的偏好数据集 \((x, y_w, y_l)\) 进行，与标准监督学习流程一致</td>
      <td><strong>在线组采样</strong>：对同一问题从旧策略采样 \(G\) 个回答（如 16/64 个），组内比较后构造优势信号</td>
      <td>DPO 的离线特性大幅降低了计算需求；GRPO 虽需在线采样但多样本策略天然降低了梯度方差</td>
    </tr>
    <tr>
      <td><strong>5. 所需模型</strong></td>
      <td><strong>4 个模型</strong>：Actor + Critic + RM + Reference，显存占用极高</td>
      <td><strong>2 个模型</strong>：Policy + Reference，显存需求最低</td>
      <td><strong>3 个模型</strong>：Actor + RM + Reference（无 Critic），显存介于两者之间</td>
      <td>对于 70B 参数量的模型，去掉 Critic 可节省约 30-50% 的显存开销</td>
    </tr>
    <tr>
      <td><strong>6. 超参调优</strong></td>
      <td><strong>超参众多且敏感</strong>：Actor/Critic 学习率、GAE 的 \(\lambda\)、clip 的 \(\varepsilon\)、KL 惩罚系数 \(\beta\) 等，调参难度高</td>
      <td><strong>超参少且鲁棒</strong>：核心超参仅 \(\beta\)（控制 KL 约束强度），含义清晰，调优相对简单</td>
      <td><strong>超参适中</strong>：继承 PPO 的 clip \(\varepsilon\) 和 KL 系数 \(\beta\)，新增组大小 \(G\)，但省去了 Critic 相关超参</td>
      <td>DPO 的低调参门槛使其更易被研究者和开发者采用；GRPO 的 \(G\) 选择对性能有显著影响</td>
    </tr>
    <tr>
      <td><strong>7. KL 约束</strong></td>
      <td><strong>显式惩罚项</strong>：在目标函数中直接添加 \(\beta \cdot \text{KL}[\pi_\theta \Vert \pi_{\text{ref}}]\)</td>
      <td><strong>隐式约束</strong>：KL 惩罚被编码在损失函数的数学结构中，通过 \(\log(\pi_\theta/\pi_{\text{ref}})\) 自动实现</td>
      <td><strong>显式惩罚项</strong>：与 PPO 相同，在目标函数中直接计算 KL 散度</td>
      <td>DPO 的隐式约束更优雅，但也使得 \(\beta\) 的调参更为关键——它是唯一的稳定性旋钮</td>
    </tr>
    <tr>
      <td><strong>8. 稳定性与实现复杂度</strong></td>
      <td>实现复杂，训练不稳定：涉及多组件协同（RM 质量传导误差、Critic 估值偏差、on-policy 采样方差），RL 训练本身也容易不稳定</td>
      <td>实现简单，训练稳健：损失函数实现只需几行代码，整个训练过程就像普通的监督学习一样稳定</td>
      <td>实现中等，训练较稳定：保留了 PPO 的采样和 clip 机制，但去掉 Critic 后消除了一个主要的不稳定源</td>
      <td>GRPO 的组内标准化天然提供了低方差的优势估计，弥补了去掉 Critic 带来的精度损失</td>
    </tr>
    <tr>
      <td><strong>9. 适用场景</strong></td>
      <td>通用 RLHF：适合需要精细奖励信号和在线探索的场景</td>
      <td>有偏好数据时的快速对齐：适合离线数据充足、追求训练效率的场景</td>
      <td>可验证奖励的推理任务：特别适合数学、代码等有明确正误判定的场景</td>
      <td>三者并非替代关系，而是适配不同的资源条件和任务特性</td>
    </tr>
    <tr>
      <td><strong>10. 代表应用</strong></td>
      <td>InstructGPT, ChatGPT</td>
      <td>Llama 2, Zephyr</td>
      <td>DeepSeekMath, DeepSeek-R1</td>
      <td>—</td>
    </tr>
  </tbody>
</table>

<p><br /></p>

<h1 id="4-延伸阅读">4 延伸阅读</h1>

<p>若你对本文涉及的 PPO、DPO、GRPO 及大模型对齐技术感兴趣，以下资源值得深入阅读：</p>

<p><strong>原始论文</strong></p>

<ul>
  <li>
    <p><a href="https://arxiv.org/abs/1707.06347">Proximal Policy Optimization Algorithms (Schulman et al., 2017)</a> —— PPO 的原始论文，提出了 Clip 机制替代 TRPO 的二阶约束，奠定了现代策略梯度方法的工程基础。</p>
  </li>
  <li>
    <p><a href="https://arxiv.org/abs/2203.02155">Training language models to follow instructions with human feedback (Ouyang et al., 2022)</a> —— InstructGPT 论文，首次将 PPO 应用于 LLM 的 RLHF 对齐流程，定义了 SFT → RM → PPO 的经典三阶段范式。</p>
  </li>
  <li>
    <p><a href="https://arxiv.org/abs/2305.18290">Direct Preference Optimization: Your Language Model is Secretly a Reward Model (Rafailov et al., 2023)</a> —— DPO 原始论文，推导了从 KL 约束最优策略到偏好分类损失的完整数学链条，展示了绕过 RL 的可行性。</p>
  </li>
  <li>
    <p><a href="https://arxiv.org/abs/2402.03300">DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models (Shao et al., 2024)</a> —— GRPO 的提出论文，在数学推理任务上验证了用组内相对比较替代 Critic 网络的有效性。</p>
  </li>
  <li>
    <p><a href="https://arxiv.org/abs/2501.12948">DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning (DeepSeek-AI, 2025)</a> —— DeepSeek-R1 技术报告，展示了 GRPO 在大规模推理模型训练中的工程实践与效果。</p>
  </li>
</ul>

<p><strong>进阶与前沿扩展</strong></p>

<ul>
  <li>
    <p><a href="https://arxiv.org/abs/2310.12036">A General Theoretical Paradigm to Understand Learning from Human Feedback (Azar et al., 2023)</a> —— 提出 IPO（Identity Preference Optimization），从理论上修正了 DPO 在有限偏好数据下的过拟合问题。</p>
  </li>
  <li>
    <p><a href="https://arxiv.org/abs/2401.01335">Self-Play Fine-Tuning Converts Weak Language Models to Strong Language Models (Chen et al., 2024)</a> —— SPIN 方法，探索了无需人类偏好标注、通过自博弈实现对齐的新路径。</p>
  </li>
  <li>
    <p><a href="https://arxiv.org/abs/2405.07863">RLHF Workflow: From Reward Modeling to Online RLHF (Dong et al., 2024)</a> —— 系统梳理了从离线 DPO 到在线 RLHF 的完整工程流程与最佳实践。</p>
  </li>
  <li>
    <p><a href="https://arxiv.org/abs/2404.10719">Is DPO Superior to PPO for LLM Alignment? A Comprehensive Study (Xu et al., 2024)</a> —— 对 PPO 与 DPO 在多个基准上的系统对比实验，揭示了两者在不同任务类型下的互补优势。
<br /></p>
  </li>
</ul>

<p><em>本文为论文阅读笔记和技术深度解读，如有疏漏欢迎指正。</em></p>]]></content><author><name>Yunpeng Zhang</name><email>yunpengZhangup@outlook.com</email></author><category term="Post-training" /><category term="RL" /><summary type="html"><![CDATA[TL;DR：在大语言模型（LLM）的对齐（Alignment）领域，强化学习扮演着核心角色。从 OpenAI 提出的 PPO，到斯坦福大学提出的 DPO，再到 DeepSeek 提出的 GRPO，每一代算法都在解决前一代的痛点。本文将从原理、公式推导到工程实现，系统梳理这三大算法的核心思想与演进逻辑，帮助读者建立完整的技术图谱。]]></summary></entry><entry><title type="html">位置编码的发展历程：从绝对、相对到多模态旋转编码</title><link href="https://zyp-up.github.io/posts/2026/03/positional-encoding/" rel="alternate" type="text/html" title="位置编码的发展历程：从绝对、相对到多模态旋转编码" /><published>2026-03-25T00:00:00+00:00</published><updated>2026-03-25T00:00:00+00:00</updated><id>https://zyp-up.github.io/posts/2026/03/blog-positional-encoding</id><content type="html" xml:base="https://zyp-up.github.io/posts/2026/03/positional-encoding/"><![CDATA[<blockquote>
  <p><strong>TL;DR:</strong> 本文梳理了位置编码的四代演进：从最初的可学习绝对位置编码（<a href="https://arxiv.org/abs/1810.04805">BERT</a>、<a href="https://cdn.openai.com/research-covers/language-unsupervised/language_understanding_paper.pdf">GPT</a>）和正弦绝对编码（<a href="https://arxiv.org/abs/1706.03762">Transformer</a>）的局限性，到<a href="https://arxiv.org/abs/1803.02155">相对位置编码</a>（<a href="https://arxiv.org/abs/1910.10683">T5</a>、<a href="https://arxiv.org/abs/1901.02860">Transformer-XL</a>）的改进，再到旋转位置编码（<a href="https://arxiv.org/abs/2104.09864">RoPE</a>）的突破性创新。RoPE 通过以”绝对之形，行相对之实”的设计，同时兼得了绝对和相对编码的优点。随后的2D-RoPE 和 M-RoPE 将这一机制创造性地扩展到了视觉和多模态场景，为现代视觉语言模型（如 <a href="https://arxiv.org/abs/2409.12191">Qwen2-VL</a>、<a href="https://arxiv.org/abs/2511.21631">Qwen3-VL</a>）的多维时空位置感知提供了坚实的数学基础。本文的核心洞见是：位置编码的发展本质上是对”距离”这一根本概念理解的深化，从难以捕捉的隐式相对关系，到通过旋转矩阵显式编码的相对位置，再到能够同时处理文本、图像和视频的统一时空坐标系。</p>
</blockquote>

<hr />

<h1 id="1-引言">1. 引言</h1>
<p>在 Transformer 成为深度学习基石的今天，我们往往容易忽略一个基础但至关重要的组件——<strong>位置编码</strong><strong>（Positional Encoding）</strong>。Transformer 核心的 Self-Attention 机制本质上是对序列中所有 Token 做两两内积（\(\boldsymbol{q}_{m}^{\top} \boldsymbol{k}_{n}\)），这种由词袋模型演变而来的机制天生是”置换不变”的，完全不包含序列的位置与顺序信息。位置编码的作用，就是让这个内积的结果能够<strong>感知到两个 Token 之间的位置关系</strong>。
为了让模型能够感知到“Black Cat”和“Cat Black”的语义差异，我们必须额外引入位置信息。本文将带你回顾位置编码的发展历程，探讨它是如何从最初的绝对位置编码，演进到相对位置编码，并最终发展为现代大模型（如 LLaMA、Qwen 等）标配的旋转位置编码（RoPE）及其多模态变体的。</p>

<h1 id="2-绝对位置编码-absolute-positional-encoding">2. 绝对位置编码 (Absolute Positional Encoding)</h1>

<p><strong>核心思想</strong>：直接将每个 Token 在序列中的绝对位置信息编码成一个向量，并叠加到 Token 的词嵌入 (Word Embedding) 上。</p>

<h2 id="21-可学习的位置编码-learned-positional-encoding">2.1. 可学习的位置编码 (Learned Positional Encoding)</h2>

<p>这是最符合直觉的做法：为每个 token 的绝对位置（从 $0$ 到序列的最大长度 \(L_{max}\)）分配一个独一无二的向量。这些位置向量在模型训练过程中随机初始化，并作为模型参数一同学习和更新。</p>

<ul>
  <li>
    <p><strong>优势</strong>：灵活性极高，模型可以数据驱动地学习到最适合特定任务的位置表示。</p>
  </li>
  <li><strong>局限性</strong>：
    <ul>
      <li>
        <p><strong>无外推能力 (No Extrapolation)</strong>：训练时若最大长度设为 2048，推理时一旦遇到 2049，就会因为查表越界（没有对应的训练参数）导致模型直接失效。</p>
      </li>
      <li>
        <p><strong>缺乏平移不变性 (No Translation Invariance)</strong>：同样的短语（如 “Black Cat”）出现在句首和句尾时，叠加的位置向量完全不同，导致模型必须在不同位置重复学习相同的语义关系，极大浪费了参数容量。</p>
      </li>
      <li>
        <p><strong>参数量大</strong>：处理长文本时需要实例化大量位置向量。</p>
      </li>
    </ul>
  </li>
  <li><strong>代表模型</strong>：BERT、GPT 等早期模型及部分现代 Transformer。</li>
</ul>

<h2 id="22-正余弦位置编码-sinusoidal-positional-encoding">2.2. 正余弦位置编码 (Sinusoidal Positional Encoding)</h2>

<p>由 Transformer 原始论文《Attention Is All You Need》提出。它舍弃了参数学习，转而使用预设的正弦和余弦函数生成位置编码向量。第 \(pos\) 个位置、第 \(i\) 个维度 (\(PE_{(pos, i)}\)) 的计算公式为：</p>

\[PE_{(pos, 2i)} = \sin(pos / 10000^{2i/d_{model}})\]

\[PE_{(pos, 2i+1)} = \cos(pos / 10000^{2i/d_{model}})\]

<ul>
  <li><strong>优势</strong>：
    <ul>
      <li>
        <p><strong>理论可外推</strong>：基于解析函数生成，理论上没有绝对的最大长度限制。</p>
      </li>
      <li>
        <p><strong>零参数负担</strong>：完全基于公式计算，不增加模型参数量。</p>
      </li>
      <li>
        <p><strong>隐含相对位置信息</strong>：利用三角函数和角公式，位置 \(pos+\delta\) 的编码可以通过位置 \(pos\) 的编码线性表示，利于 Self-Attention 学习相对位置关系。</p>
      </li>
    </ul>
  </li>
  <li><strong>局限性</strong>：虽然理论上具有一定的相对位置表达能力，但简单的“相加”操作使得模型难以捕捉精确的相对距离信息，且在极长序列下，注意力的<strong>远程噪声</strong>难以消除。</li>
</ul>

<hr />

<h1 id="3-相对位置编码-relative-positional-encoding">3. 相对位置编码 (Relative Positional Encoding)</h1>

<p>既然语言的局部结构（相对距离）往往比绝对坐标更重要，研究者们提出了相对位置编码（RPE）。</p>

<ul>
  <li>
    <p><strong>核心思想</strong>：不改变 Embedding，而是直接在计算 Attention Score 时加入一个与相对距离 \((j-i)\) 相关的偏置项 (Bias)。</p>
  </li>
  <li>
    <p><strong>原理</strong>：计算 Attention Score (\(e_{ij} = q_{i} \cdot k_{j}\)) 时，额外考虑 \(j\) 相对于 \(i\) 的相对距离。公式演变为 \(e_{ij} = q_{i} \cdot (k_{j} + r_{j-i})\) 等形式，其中 \(r_{j-i}\) 即为相对距离的编码向量。</p>
  </li>
  <li><strong>优势</strong>：
    <ul>
      <li>
        <p><strong>更自然</strong>：符合 Attention 机制的特性，直接建模相对关系。</p>
      </li>
      <li>
        <p><strong>可外推</strong>：对于未见过的相对距离，可以进行泛化（通常会截断最大相对距离，例如 <code class="language-plaintext highlighter-rouge">-K</code> 到 <code class="language-plaintext highlighter-rouge">K</code>，超出范围的共享编码）。</p>
      </li>
      <li>
        <p><strong>不增加参数量或少量增加</strong>：相对距离编码通常共享或使用函数生成。</p>
      </li>
    </ul>
  </li>
  <li><strong>致命缺陷：KV Cache 推理效率低</strong>。
    <ul>
      <li><strong>原因</strong>：相对距离是动态的。在生成第 \(t\) 个词时，Cache 中第 1 个词距离它是 \(t-1\)；但在生成第 \(t+1\) 个词时，距离变成了 \(t\)。这意味着<strong>每生成一个新 token，必须重新查表计算历史所有 Token 的相对位置 Bias</strong>，无法直接利用缓存好的 KV 进行纯粹的高效矩阵乘法。</li>
    </ul>
  </li>
  <li><strong>代表模型</strong>：Transformer-XL、T5 等。</li>
</ul>

<hr />

<h1 id="4-旋转位置编码-rotary-positional-encoding-rope">4. 旋转位置编码 (Rotary Positional Encoding, RoPE)</h1>

<h2 id="41-核心思想">4.1. 核心思想</h2>

<p>总体来说，上述传统方案分为两派：</p>

<ul>
  <li>
    <p><strong>绝对</strong><strong>位置编码</strong><strong>（APE）</strong>：直接给每个位置加一个固定向量（如 Sinusoidal、Learned Embedding），简单但无法显式建模相对距离。</p>
  </li>
  <li>
    <p><strong>相对</strong><strong>位置编码</strong><strong>（RPE）</strong>：在 Attention 计算时注入相对距离偏置（如 T5 Bias），效果好但破坏了 KV Cache 的复用性。</p>
  </li>
</ul>

<p>而RoPE的核心思想是：<strong>通过绝对</strong><strong>位置编码</strong><strong>的方式实现相对位置编码。</strong>  其精妙之处在于：<strong>它在形式上是绝对的（对每个位置独立施加变换），但在效果上是相对的（内积结果只依赖相对距离）</strong>，同时兼得了两派的优势。</p>

<h2 id="42-1d-rope">4.2. 1D-ROPE</h2>

<h3 id="421-数学推导">4.2.1. 数学推导</h3>

<p><strong>Step 1：二维情形的复数视角</strong></p>

<p>考虑最简单的二维向量 \(\boldsymbol{q} = (q_{0}, q_{1})\)。将其视为复数 \(\boldsymbol{q} = q_{0} + \mathrm{i} q_{1}\)，则对位置 \(m\) 处的向量施加 RoPE，等价于乘上一个单位复数旋转因子：</p>

\[f(\boldsymbol{q}, m) = \boldsymbol{q} e^{\mathrm{i} m\theta} = \|\boldsymbol{q}\| e^{\mathrm{i}(\Theta(\boldsymbol{q}) + m\theta)}\]

<p>几何意义非常直观：<strong>把向量</strong> \(\boldsymbol{q}\) <strong>在二维平面上旋转了</strong> \(m\theta\) <strong>的角度</strong>。向量的模长 \(\|\boldsymbol{q}\|\) 保持不变，只有方向（辐角）增加了 \(m\theta\)。这就是 “旋转式位置编码” 名称的由来。</p>

<p>写成矩阵形式，就是一个标准的二维旋转矩阵左乘：</p>

\[f(\boldsymbol{q}, m) = \begin{pmatrix} \cos m\theta &amp; -\sin m\theta \\ \sin m\theta &amp; \cos m\theta \end{pmatrix} \begin{pmatrix} q_{0} \\ q_{1} \end{pmatrix}\]

<p>这是一个标准的二维旋转矩阵。</p>

<hr />

<p><strong>Step 2：推广到高维——分块对角旋转矩阵</strong></p>

<p>实际的 Transformer 中，Query/Key 向量的维度 \(d\) 远大于 2（通常为 64 或 128）。由于内积满足线性叠加性，任意偶数维的 RoPE 都可以表示为 \(d/2\) 个二维旋转的拼接。</p>

<p>具体做法是将向量的分量两两分组 \((q_{0},q_{1}),(q_{2},q_{3}),\ldots,(q_{d-2},q_{d-1})\)，对每组独立施加不同频率的旋转，得到分块对角旋转矩阵 \(\mathcal{R}_{m}\)：</p>

\[\underbrace{\begin{pmatrix} \cos m\theta_{0} &amp; -\sin m\theta_{0} &amp; 0 &amp; 0 &amp; \cdots &amp; 0 &amp; 0 \\ \sin m\theta_{0} &amp; \cos m\theta_{0} &amp; 0 &amp; 0 &amp; \cdots &amp; 0 &amp; 0 \\ 0 &amp; 0 &amp; \cos m\theta_{1} &amp; -\sin m\theta_{1} &amp; \cdots &amp; 0 &amp; 0 \\ 0 &amp; 0 &amp; \sin m\theta_{1} &amp; \cos m\theta_{1} &amp; \cdots &amp; 0 &amp; 0 \\ \vdots &amp; \vdots &amp; \vdots &amp; \vdots &amp; \ddots &amp; \vdots &amp; \vdots \\ 0 &amp; 0 &amp; 0 &amp; 0 &amp; \cdots &amp; \cos m\theta_{d/2-1} &amp; -\sin m\theta_{d/2-1} \\ 0 &amp; 0 &amp; 0 &amp; 0 &amp; \cdots &amp; \sin m\theta_{d/2-1} &amp; \cos m\theta_{d/2-1} \end{pmatrix}}_{\mathcal{R}_{m}} \begin{pmatrix} q_{0} \\ q_{1} \\ q_{2} \\ q_{3} \\ \vdots \\ q_{d-2} \\ q_{d-1} \end{pmatrix}\]

<p>这里的 \(q\) 指的是一个 Token 对应的整个 Query 向量。</p>

<p>其中每组旋转的频率 \(\theta_{i}\) 不同，定义为：</p>

\[\theta_{i} = 10000^{-2i/d}, \quad i = 0, 1, \dots, d/2-1\]

<p>这里有两个关键的变量维度需要特别注意（后续所有的优化和改进都是在这两个变量上做文章）：</p>

<ul>
  <li>
    <p><strong>Token 位置</strong> \(m\)：随着 \(m\) 增大，旋转角度增大，旋转速度变快，频率变大</p>
  </li>
  <li>
    <p><strong>分量位置</strong> \(i\)：随着 \(i\) 增大，旋转角度变小，旋转速度变慢，频率变小</p>
    <ul>
      <li>低维分量（\(i\) 小）→ \(\theta_{i}\) 大 → 旋转快 → 捕捉<strong>高频/短距离</strong>关系</li>
      <li>高维分量（\(i\) 大）→ \(\theta_{i}\) 小 → 旋转慢 → 捕捉<strong>低频/长距离</strong>关系</li>
    </ul>
  </li>
</ul>

<p>这种多频率设计使得不同维度的分量各司其职，共同构成一套完整的多尺度位置感知系统。</p>

<hr />

<p><strong>Step 3：核心恒等式 —— 为什么效果是 “相对的”</strong></p>

<p>给位置 \(m\) 的 Query 乘上 \(\mathcal{R}_{m}\)，位置 \(n\) 的 Key 乘上 \(\mathcal{R}_{n}\)，用变换后的 \(Q,K\) 序列做 Attention，那么 Attention 就自动包含相对位置信息了，因为成立恒等式：</p>

\[(\mathcal{R}_{m} \boldsymbol{q})^{\top} (\mathcal{R}_{n} \boldsymbol{k}) = \boldsymbol{q}^{\top} \mathcal{R}_{m}^{\top} \mathcal{R}_{n} \boldsymbol{k} = \boldsymbol{q}^{\top} \mathcal{R}_{n-m} \boldsymbol{k}\]

<p>关键恒等式 \(\mathcal{R}_{m}^{\top} \mathcal{R}_{n} = \mathcal{R}_{n-m}\) 成立的原因是：旋转矩阵的转置等于其逆（正交矩阵性质），而两个旋转的复合等于角度相加。因此：</p>

<blockquote>
  <p><strong>最终的内积结果只依赖相对位置</strong> \((n - m)\)<strong>，与绝对位置</strong> \(m, n\) <strong>无关。</strong></p>
</blockquote>

<p>这就是 RoPE “以绝对之形，行相对之实”的核心数学机制。</p>

<h3 id="422-工程实现利用稀疏性加速">4.2.2. 工程实现：利用稀疏性加速</h3>

<p>值得指出的是，\(\mathcal{R}_{m}\) 是一个正交矩阵，它不会改变向量的模长，因此通常来说不会改变原模型的稳定性。</p>

<p>同样也可以发现\(\mathcal{R}_{m}\) 是一个非常稀疏的矩阵 —— 绝大部分元素都是 0。如果直接用矩阵乘法来实现会很浪费算力。实际工程中，推荐通过逐位对应相乘的方式来实现 RoPE：</p>

\[\begin{pmatrix} q_{0} \\ q_{1} \\ q_{2} \\ q_{3} \\ \vdots \\ q_{d-2} \\ q_{d-1} \end{pmatrix} \otimes \begin{pmatrix} \cos m\theta_{0} \\ \cos m\theta_{0} \\ \cos m\theta_{1} \\ \cos m\theta_{1} \\ \vdots \\ \cos m\theta_{d/2-1} \\ \cos m\theta_{d/2-1} \end{pmatrix} + \begin{pmatrix} -q_{1} \\ q_{0} \\ -q_{3} \\ q_{2} \\ \vdots \\ -q_{d-1} \\ q_{d-2} \end{pmatrix} \otimes \begin{pmatrix} \sin m\theta_{0} \\ \sin m\theta_{0} \\ \sin m\theta_{1} \\ \sin m\theta_{1} \\ \vdots \\ \sin m\theta_{d/2-1} \\ \sin m\theta_{d/2-1} \end{pmatrix}\]

<p>其中 ⊗ 是逐位对应相乘（element-wise），即 Numpy、PyTorch 等框架中的 <code class="language-plaintext highlighter-rouge">*</code> 运算。这个实现只需要两次逐位乘法和一次加法，计算量远低于完整的矩阵乘法。</p>

<p>从这个实现形式也可以看到，RoPE 本质上可以视为是<strong>乘性位置编码</strong>的变体 —— 它不是把位置向量 “加” 到特征上（如 Sinusoidal APE），而是把位置信息以 “乘” 的方式编织进每个分量中。</p>

<hr />

<h3 id="423-直观理解">4.2.3. 直观理解</h3>

<p>想象一个时钟的表盘。序列中的每个 Token 都是一根指针，它的”内容”决定了指针的长度和初始方向，而它的”位置”决定了额外旋转的角度。</p>

<ul>
  <li>
    <p>第 1 个 Token 旋转 \(1\theta\)</p>
  </li>
  <li>
    <p>第 2 个 Token 旋转 \(2\theta\)</p>
  </li>
  <li>
    <p>第 m 个 Token 旋转 \(m\theta\)</p>
  </li>
</ul>

<p>当我们计算两个 Token 的内积（注意力分数）时，实际上在比较两根指针的夹角。而夹角只取决于<strong>它们旋转角度的差</strong> \((n-m)\theta\)——也就是相对距离，而不是各自的绝对位置。</p>

<p>更进一步，向量的每组分量使用不同频率 \(\theta_{i}\) 旋转，就像多个指针以不同速度转动。低维分量的指针转得快（对近距离变化敏感），高维分量的指针转得慢（对远距离变化敏感），形成了一套完整的”多尺度位置感知系统”。</p>

<p><strong>可视化示例</strong></p>

<p>下图展示了旋转位置编码的具体效果。样本包含 6 个 token：Enhanced、Transformer、with、Rotary、Position、Embedding。每个 token 对应一个 d 维向量，其分量两两分组后各自执行旋转。</p>

<p><img src="/images/位置编码的发展历程：从绝对、相对到多模态旋转编码/0.png" alt="" /></p>

<p>每个 token 的每组分量的旋转角度为 \(m\theta_{i}\)，其中 \(\theta_{i}\) 的公式为 \(\theta_{i} = 10000^{-2i/d}\)：</p>

<ul>
  <li><strong>随着 token 位置 \(m\) 增大</strong>：旋转角度增大，旋转速度变快，频率变大</li>
  <li><strong>随着分量位置 \(i\) 增大</strong>：旋转角度变小，旋转速度变慢，频率变小</li>
</ul>

<p><img src="/images/位置编码的发展历程：从绝对、相对到多模态旋转编码/1.png" alt="" /></p>

<h3 id="424-解决问题">4.2.4. 解决问题</h3>

<h4 id="解决平移不变性缺失问题">解决“平移不变性”缺失问题</h4>

<ul>
  <li>
    <p><strong>针对对象：</strong>  <strong>绝对</strong><strong>位置编码</strong> <strong>(APE)</strong>（如 BERT, GPT-2）。</p>
  </li>
  <li>
    <p><strong>问题：</strong>  同样的短语（如 “Black Cat”）在句首和句尾被加上了完全不同的位置向量，导致模型需要重复学习相同的语义关系。</p>
  </li>
  <li>
    <p><strong>RoPE 解决：</strong>  <strong>基于旋转角度差</strong>。</p>
  </li>
  <li>
    <p><strong>原理：</strong>  无论绝对位置m和n是多少，只要它们的相对距离不变，内积计算出的<strong>角度差</strong> \((n−m)\)就不变。这让模型能通过一次学习推广到任何位置。</p>
  </li>
</ul>

<h4 id="解决长序列外推能力差问题">解决“长序列外推”能力差问题</h4>

<ul>
  <li>
    <p><strong>针对对象：</strong>  <strong>可学习的</strong><strong>位置编码</strong> <strong>(Learned</strong> <strong>Embedding</strong><strong>)</strong>。</p>
  </li>
  <li>
    <p><strong>问题：</strong>  训练时最大长度（如 2048）限制了推理能力。推理时一旦超过该长度，查表越界（没有对应的训练参数），模型直接失效。</p>
  </li>
  <li>
    <p><strong>RoPE 解决：</strong>  <strong>基于数学函数</strong>。</p>
  </li>
  <li>
    <p><strong>原理：</strong> 函数具有周期性和数学连续性。即使位置索引超过了训练时的最大值，公式依然可算且保持规律，使模型能泛化到更长的序列。</p>
  </li>
</ul>

<h4 id="远程衰减--解决远程关注噪音问题">远程衰减--解决“远程关注噪音”问题</h4>

<ul>
  <li>
    <p><strong>针对对象：</strong>  <strong>标准 Attention 机制</strong>。</p>
  </li>
  <li>
    <p><strong>问题：</strong>  模型在处理超长文本时，难以自然地降低对极远距离、无关 Token 的关注度（缺乏<strong>远程衰减</strong>）。</p>
  </li>
  <li>
    <p><strong>RoPE 解决：</strong>  <strong>多频震荡抵消</strong>。</p>
  </li>
  <li>
    <p><strong>原理：</strong> 当两个 Token 距离很远（ \(n−\)很大）时，由于 \(m\)的频率不同，各个维度上的旋转在做内积求和时，正负值会相互抵消，导致 Attention 分数自然变小。这意味着 RoPE 天然赋予了模型一种“局部偏置” (Local Bias)，让模型更倾向于关注附近的上下文，这非常符合人类语言和视觉的习惯。</p>
  </li>
</ul>

<h4 id="解决kv-cache-推理效率问题">解决“KV Cache 推理效率”问题</h4>

<ul>
  <li>
    <p><strong>针对对象：</strong>  <strong>相对</strong><strong>位置编码</strong> <strong>(RPE)</strong>（如 T5）。</p>
  </li>
  <li>
    <p><strong>问题：</strong>  相对距离是动态的。推理时每生成一个新词，Cache 中所有历史 Token 距当前词的距离都变了，必须重新查表计算 Bias 并加到矩阵上，<strong>无法做纯粹的矩阵乘法</strong>。</p>
  </li>
  <li>
    <p><strong>RoPE 解决：</strong>  <strong>位置注入向量</strong>。</p>
  </li>
  <li>
    <p><strong>原理：</strong>  位置信息在存入 Cache 前就已经通过旋转“刻”进 Key 向量了。推理时，只需拿当前的 Query 和 Cache 里的 Key 直接做矩阵乘法，相对位置关系会自动通过数学性质解算出来，无需额外的查表开销</p>
  </li>
</ul>

<h2 id="43-2d-rope">4.3. 2D-ROPE</h2>

<h3 id="431-计算流程">4.3.1. 计算流程</h3>

<ul>
  <li><strong>输入 (Input)</strong>
    <ul>
      <li>
        <p>特征张量 \(X\)：形状为 (B, L, D)。</p>
      </li>
      <li>
        <p>高度索引 \(P_{h}\)：形状为 (B, L)。例如 <code class="language-plaintext highlighter-rouge">[0,0,0, 1,1,1...]</code> (代表行号)。</p>
      </li>
      <li>
        <p>宽度索引 \(P_{w}\)：形状为 (B, L)。例如 <code class="language-plaintext highlighter-rouge">[0,1,2, 0,1,2...]</code> (代表列号)。</p>
      </li>
    </ul>
  </li>
  <li><strong>参数含义 (Parameters)</strong>
    <ul>
      <li><strong>Split Ratio</strong>：切分比例，通常是 50% : 50%。即前一半维度给高度，后一半给宽度。</li>
    </ul>
  </li>
  <li><strong>如何计算 (Calculation)</strong>
    <ul>
      <li>
        <p><strong>切分 (Split)</strong>：将 \(X\) 在最后一个维度 \(D\) 上切开：</p>
      </li>
      <li>
\[X_{height} = X[\ldots, 0 : D/2]\]
      </li>
      <li>
\[X_{width} = X[\ldots, D/2 : D]\]
      </li>
      <li>
        <p><strong>独立旋转 (Rotate Independently)</strong>：</p>
      </li>
      <li>
        <p>使用 \(P_{h}\) 对 \(X_{height}\) 进行标准的 1D-RoPE 计算。</p>
      </li>
      <li>
        <p>使用 \(P_{w}\) 对 \(X_{width}\) 进行标准的 1D-RoPE 计算。</p>
      </li>
      <li>
        <p><strong>拼接 (Concat)</strong>：</p>
      </li>
      <li>\(X_{out} = \text{Concat}(X'_{height}, X'_{width}, \text{dim}=-1)\)。</li>
    </ul>
  </li>
  <li><strong>输出 (Output)</strong>
    <ul>
      <li>\(X_{out}\)：形状 (B, L, D)。此时向量的前半部分包含垂直位置信息，后半部分包含水平位置信息。</li>
    </ul>
  </li>
</ul>

<h3 id="432-解决问题">4.3.2. 解决问题</h3>

<p><strong>核心场景：</strong>  处理动态分辨率的图像。</p>

<h4 id="问题-1一维拉平破坏了二维空间邻接性">问题 1：一维拉平破坏了“二维空间邻接性”</h4>

<ul>
  <li><strong>痛点</strong>：传统方法把图片按行扫描变成一维长条。
    <ul>
      <li>
        <p>在二维网格中，点 \((0,0)\) 和点 \((1,0)\) 是紧挨着的（垂直邻居）。</p>
      </li>
      <li>
        <p>但在拉平后，如果图片宽度是 100，它俩的索引分别是 0 和 100。</p>
      </li>
      <li>
        <p><strong>后果</strong>：模型很难理解“索引差 100 的两个点其实是邻居”，空间结构被打乱了。</p>
      </li>
    </ul>
  </li>
  <li><strong>解决</strong>：2D-RoPE 通过将向量切分为 \(h, w\) 两部分，分别编码。
    <ul>
      <li>无论怎么拉平，垂直邻居在 \(h\) 分量上的角度差永远是 \(\theta_{0}\)，在 \(w\) 分量上的角度差永远是 0。<strong>几何关系被物理保留了。</strong></li>
    </ul>
  </li>
</ul>

<h4 id="问题-2动态分辨率导致的相对位置错乱">问题 2：动态分辨率导致的“相对位置错乱”</h4>

<ul>
  <li><strong>痛点</strong>：Qwen2-VL 的核心卖点是支持任意分辨率。
    <ul>
      <li>
        <p><strong>情况 A</strong>：输入一张 \(200 \times 200\) 的图。垂直邻居的索引差是 200。</p>
      </li>
      <li>
        <p><strong>情况 B</strong>：输入一张 \(400 \times 400\) 的图。垂直邻居的索引差变成了 400。</p>
      </li>
      <li>
        <p><strong>后果</strong>：如果用 1D-RoPE，模型会困惑：“到底索引差 20 是邻居，还是差 40 是邻居？”这导致模型无法适应变化的图片尺寸。</p>
      </li>
    </ul>
  </li>
  <li><strong>解决</strong>：2D-RoPE 直接使用网格坐标 \((h, w)\)。
    <ul>
      <li>
        <p>无论图片多大，垂直邻居的坐标差永远是 \(\Delta h=1, \Delta w=0\)。</p>
      </li>
      <li>
        <p><strong>模型因此具备了“分辨率无关性”，可以处理任意长宽比的图片。</strong></p>
      </li>
    </ul>
  </li>
</ul>

<h2 id="44-m-rope">4.4. M-ROPE</h2>

<p><img src="/images/位置编码的发展历程：从绝对、相对到多模态旋转编码/2.png" alt="" /></p>

<h3 id="441-计算流程">4.4.1. 计算流程</h3>

<ul>
  <li><strong>输入 (Input)</strong>
    <ul>
      <li>
        <p>特征张量 X：形状为 \((B, L, D)\)。</p>
      </li>
      <li>
        <p>时间索引 \(P_{t}\)： \((B, L)\)。视频帧号（图片/文本设为常数或序列号）。</p>
      </li>
      <li>
        <p>高度索引 \(P_{h}\)： \((B, L)\)。空间行号。</p>
      </li>
      <li>
        <p>宽度索引 \(P_{w}\)： \((B, L)\)。空间列号。</p>
      </li>
    </ul>
  </li>
  <li><strong>如何计算 (Calculation)</strong>
    <ul>
      <li>
        <p><strong>三路切分 (Split into 3)</strong>：将 \(X\) 沿 \(D\) 维切成三份：</p>
      </li>
      <li>
\[X_{t} = X[\ldots, 0 : D_{t}]\]
      </li>
      <li>
\[X_{h} = X[\ldots, D_{t} : D_{t}+D_{h}]\]
      </li>
      <li>
\[X_{w} = X[\ldots, D_{t}+D_{h} : D]\]
      </li>
      <li>
        <p><strong>三路并行旋转 (Parallel Rotation)</strong>：</p>
      </li>
      <li>
        <p>\(X'_{t} = \text{RoPE}(X_{t}, P_{t})\) —— 注入时间信息。</p>
      </li>
      <li>
        <p>\(X'_{h} = \text{RoPE}(X_{h}, P_{h})\) —— 注入高度信息。</p>
      </li>
      <li>
        <p>\(X'_{w} = \text{RoPE}(X_{w}, P_{w})\) —— 注入宽度信息。</p>
      </li>
      <li>
        <p><strong>拼接 (Concat)</strong>：</p>
      </li>
      <li>\(X_{out} = \text{Concat}(X'_{t}, X'_{h}, X'_{w}, \text{dim}=-1)\)。</li>
    </ul>
  </li>
  <li><strong>输出 (Output)</strong>
    <ul>
      <li>
        <p>\(X_{out}\)：形状 (B, L, D)。</p>
      </li>
      <li>
        <p>该向量现在是一个“全息”位置载体：</p>
        <ul>
          <li>
            <p>计算 Attention 时，如果在时间上不同（帧不同），\(X'_{t}\) 部分会产生角度差。</p>
          </li>
          <li>
            <p>如果在空间上不同（像素位置不同），\(X'_{h}\) 和 \(X'_{w}\) 部分会产生角度差。</p>
          </li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h3 id="442-解决问题">4.4.2. 解决问题</h3>

<p><strong>核心场景：</strong>  统一处理 <strong>文本、图像、长视频</strong> 的混合输入。</p>

<h4 id="问题-1多模态数据的维度不兼容">问题 1：多模态数据的“维度不兼容”</h4>

<ul>
  <li><strong>痛点</strong>：
    <ul>
      <li>
        <p>文本是 1D 的（只有前后）。</p>
      </li>
      <li>
        <p>图片是 2D 的（有高宽）。</p>
      </li>
      <li>
        <p>视频是 3D 的（有时空）。</p>
      </li>
      <li>
        <p>以前的模型通常需要给每种模态设计不同的编码器，或者暴力地全部压成 1D，导致时空信息混杂，模型难以学习。</p>
      </li>
    </ul>
  </li>
  <li><strong>解决</strong>：M-RoPE 建立了一个统一的 \((t, h, w)\) 三维坐标系。
    <ul>
      <li>
        <p>文本用 \((i, i, i)\) 模拟 1D。</p>
      </li>
      <li>
        <p>图片用 \((1, h, w)\) 模拟 2D。</p>
      </li>
      <li>
        <p>视频用 \((t, h, w)\) 模拟 3D。</p>
      </li>
      <li>
        <p><strong>结果</strong>：所有模态的数据都可以在同一个 Embedding 空间里从容交互，不需要切换编码方式。</p>
      </li>
    </ul>
  </li>
</ul>

<h4 id="问题-2长视频的索引爆炸与外推失败-the-extrapolation-problem">问题 2：长视频的“索引爆炸”与“外推失败” (The Extrapolation Problem)</h4>

<ul>
  <li><strong>痛点</strong>：视频产生的 Token 数量极多。
    <ul>
      <li>
        <p>假设一个视频有 1000 帧，每帧 256 个 Token，总 Token 数 = 256,000。</p>
      </li>
      <li>
        <p>如果用 1D 索引，位置号 \(pos\) 会一直飙升到 250,000+。</p>
      </li>
      <li>
        <p><strong>RoPE 的弱点</strong>：当推理时的位置索引 \(m\) 远超训练时的最大索引（比如训练时只见过 32k），\(\cos(m\theta)\) 的旋转角度会变得非常陌生，模型性能急剧下降。</p>
      </li>
    </ul>
  </li>
  <li><strong>解决</strong>：M-RoPE 采用了 <strong>“分治策略” (Decomposition)</strong>。
    <ul>
      <li>虽然总 Token 有 25万个，但我们把索引拆开了：
        <ul>
          <li>
            <p>时间索引 \(t\) 可能只到 1000。</p>
          </li>
          <li>
            <p>高度索引 \(h\) 可能只到 16。</p>
          </li>
          <li>
            <p>宽度索引 \(w\) 可能只到 16。</p>
          </li>
        </ul>
      </li>
      <li>
        <p><strong>结果</strong>：每一个分量上的索引数值都非常小（都在模型训练见过的”舒适区”内）。</p>
      </li>
      <li><strong>优势</strong>：这让模型能够理解比训练时长得多的视频（因为 \(t\) 增加只会导致时间分量的旋转，而不会破坏空间分量的感知），实现了强大的长距离外推能力。</li>
    </ul>
  </li>
</ul>

<hr />

<h1 id="5-总结与展望">5. 总结与展望</h1>

<h2 id="51-完整的技术演进脉络">5.1. 完整的技术演进脉络</h2>

<p>位置编码的发展史是一部不断加深对”位置”和”距离”理解的历程。从简单的可学习向量，到周期函数，再到旋转矩阵，最后到统一的多维时空坐标系，每一步都解决了前一代方案的根本限制：</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">方案</th>
      <th style="text-align: left">核心机制</th>
      <th style="text-align: left">主要优势</th>
      <th style="text-align: left">关键局限</th>
      <th style="text-align: left">代表模型</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><strong>Learned APE</strong></td>
      <td style="text-align: left">查表取位置向量</td>
      <td style="text-align: left">灵活性高</td>
      <td style="text-align: left">无外推，参数多，缺乏平移不变性</td>
      <td style="text-align: left">BERT, GPT-2</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Sinusoidal APE</strong></td>
      <td style="text-align: left">三角函数</td>
      <td style="text-align: left">零参数，有外推</td>
      <td style="text-align: left">隐式相对性，长序列下远程衰减差</td>
      <td style="text-align: left">Transformer, GPT-3</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Relative PE</strong></td>
      <td style="text-align: left">相对距离偏置</td>
      <td style="text-align: left">显式相对，自然高效</td>
      <td style="text-align: left">破坏 KV Cache，推理成本高</td>
      <td style="text-align: left">T5, Transformer-XL</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>RoPE (1D)</strong></td>
      <td style="text-align: left">旋转矩阵</td>
      <td style="text-align: left">绝对形式、相对效果、KV Cache友好</td>
      <td style="text-align: left">单维设计，难以直接扩展到多模态</td>
      <td style="text-align: left">LLaMA, Qwen-LM</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>2D/M-RoPE</strong></td>
      <td style="text-align: left">多维旋转分解</td>
      <td style="text-align: left">统一多模态坐标系、强大外推</td>
      <td style="text-align: left">实现复杂，频谱分布需优化</td>
      <td style="text-align: left">Qwen2-VL, Qwen2.5-VL</td>
    </tr>
  </tbody>
</table>

<h2 id="52-关键设计原则">5.2. 关键设计原则</h2>

<p>从这些演进中，我们可以提炼出几条关键的设计原则：</p>

<ol>
  <li>
    <p><strong>显式优于隐式</strong>：从隐含的三角函数关系到显式的旋转矩阵，从相对距离偏置到绝对位置旋转，显式的数学表示能让模型更容易学习。</p>
  </li>
  <li>
    <p><strong>正交性保证稳定性</strong>：RoPE 之所以成功，关键在于旋转矩阵是正交的，不改变向量模长，天然保护了训练稳定性。</p>
  </li>
  <li>
    <p><strong>统一的坐标系胜于多套编码方案</strong>：M-RoPE 用一套三维坐标系 (t, h, w) 统一处理文本、图像、视频，比为每种模态设计不同编码器更优雅、更高效。</p>
  </li>
  <li>
    <p><strong>分解而非拼接</strong>：M-RoPE 的成功在于将高维问题分解成多个低维旋转，而不是简单地拼接不同模态的编码。这既保留了每个维度的完整频谱，也保证了外推能力。</p>
  </li>
</ol>

<h2 id="53-未来方向">5.3. 未来方向</h2>

<p>当前的位置编码设计已经相当成熟，但仍有未来的探索空间：</p>

<ul>
  <li>
    <p><strong>自适应频率</strong>：不同的任务可能需要不同的频率分布（如密集物体检测 vs 长距离推理），能否动态调整 \(\theta_i\) 的基座？</p>
  </li>
  <li>
    <p><strong>显式时间戳与隐式时间编码的融合</strong>：Qwen3-VL 引入的显式文本时间戳很直观，但能否进一步结合 RoPE 的数学优雅性？</p>
  </li>
  <li>
    <p><strong>多粒度位置的层次化表示</strong>：目前大多数方案把所有信息都编码到位置 ID 中，能否设计分层结构来区分”全局位置” vs “局部位置”？</p>
  </li>
  <li>
    <p><strong>位置编码与注意力机制的共同设计</strong>：RoPE 本身是与 Dot-Product Attention 绑定的。对于其他注意力变体（如线性注意力、稀疏注意力），应如何重新设计位置编码？</p>
  </li>
</ul>

<hr />

<p><br /></p>

<h1 id="6-延伸阅读">6. 延伸阅读</h1>

<p>若你对本文涉及的位置编码技术感兴趣，以下资源值得深入阅读：</p>

<p><strong>深度理论讲解 (中文)</strong></p>

<ul>
  <li>
    <p><a href="https://spaces.ac.cn/archives/9431">科学空间：旋转位置编码（RoPE）</a> —— RoPE 一作苏剑林的详细推导与直观讲解。</p>
  </li>
  <li>
    <p><a href="https://spaces.ac.cn/archives/10814">科学空间：位置编码与长度外推</a> —— 长序列外推问题分析。</p>
  </li>
  <li>
    <p><a href="https://spaces.ac.cn/archives/10816">科学空间：多维旋转位置编码的推广</a> —— M-RoPE 的理论推导与应用。</p>
  </li>
</ul>

<p><br /></p>

<p><em>本文为论文阅读笔记和技术深度解读，如有疏漏欢迎指正。</em></p>]]></content><author><name>Yunpeng Zhang</name><email>yunpengZhangup@outlook.com</email></author><category term="Positional Encoding" /><category term="LLM" /><category term="VLM" /><summary type="html"><![CDATA[TL;DR: 本文梳理了位置编码的四代演进：从最初的可学习绝对位置编码（BERT、GPT）和正弦绝对编码（Transformer）的局限性，到相对位置编码（T5、Transformer-XL）的改进，再到旋转位置编码（RoPE）的突破性创新。RoPE 通过以”绝对之形，行相对之实”的设计，同时兼得了绝对和相对编码的优点。随后的2D-RoPE 和 M-RoPE 将这一机制创造性地扩展到了视觉和多模态场景，为现代视觉语言模型（如 Qwen2-VL、Qwen3-VL）的多维时空位置感知提供了坚实的数学基础。本文的核心洞见是：位置编码的发展本质上是对”距离”这一根本概念理解的深化，从难以捕捉的隐式相对关系，到通过旋转矩阵显式编码的相对位置，再到能够同时处理文本、图像和视频的统一时空坐标系。]]></summary></entry><entry><title type="html">从 Qwen-VL 到 Qwen3-VL：多模态大模型的四代进化之路</title><link href="https://zyp-up.github.io/posts/2026/03/qwen-vl/" rel="alternate" type="text/html" title="从 Qwen-VL 到 Qwen3-VL：多模态大模型的四代进化之路" /><published>2026-03-24T00:00:00+00:00</published><updated>2026-03-24T00:00:00+00:00</updated><id>https://zyp-up.github.io/posts/2026/03/blog-qwenvl</id><content type="html" xml:base="https://zyp-up.github.io/posts/2026/03/qwen-vl/"><![CDATA[<blockquote>
  <p><strong>TL;DR:</strong>  本文系统梳理了 Qwen-VL 系列四代视觉语言模型的技术演进——从基础的视觉-语言对齐（<a href="https://arxiv.org/abs/2308.12966">Qwen-VL</a>），到原生动态分辨率与多模态位置编码（<a href="https://arxiv.org/abs/2409.12191">Qwen2-VL</a>），再到工程级推理效率优化（<a href="https://arxiv.org/abs/2502.13923">Qwen2.5-VL</a>），最终走向更深层的视觉-语言融合（<a href="https://arxiv.org/abs/2511.21631">Qwen3-VL</a>）。</p>
</blockquote>

<p>多模态大模型（Multimodal Large Language Models, MLLMs）正在成为 AI 领域最活跃的研究方向之一。在众多视觉语言模型中，阿里巴巴的 Qwen-VL 系列以其清晰的迭代路径和扎实的工程设计备受关注。从 2023 年初代 Qwen-VL 的发布到 2025 年 Qwen3-VL 的亮相，四代模型在架构设计、位置编码方案和训练策略上展现出一条连贯且富有洞见的演进主线。
本文将沿时间线逐一解析每代模型的核心技术贡献。全文结构如下：</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">章节</th>
      <th style="text-align: left">模型</th>
      <th style="text-align: left">核心关键词</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">Part I</td>
      <td style="text-align: left"><a href="https://arxiv.org/abs/2308.12966">Qwen-VL (2023)</a></td>
      <td style="text-align: left">三阶段渐进训练、视觉-语言对齐、多任务统一</td>
    </tr>
    <tr>
      <td style="text-align: left">Part II</td>
      <td style="text-align: left"><a href="https://arxiv.org/abs/2409.12191">Qwen2-VL (2024)</a></td>
      <td style="text-align: left">M-RoPE、3D卷积、原生动态分辨率</td>
    </tr>
    <tr>
      <td style="text-align: left">Part III</td>
      <td style="text-align: left"><a href="https://arxiv.org/abs/2502.13923">Qwen2.5-VL (2025)</a></td>
      <td style="text-align: left">窗口注意力、动态FPS、拒绝采样与CoT</td>
    </tr>
    <tr>
      <td style="text-align: left">Part IV</td>
      <td style="text-align: left"><a href="https://arxiv.org/abs/2511.21631">Qwen3-VL (2025)</a></td>
      <td style="text-align: left">Interleaved MRoPE、DeepStack、显式时间戳</td>
    </tr>
  </tbody>
</table>

<hr />

<h1 id="1-part-i-qwen-vl--奠基之作2023">1. Part I: <a href="https://arxiv.org/abs/2308.12966">Qwen-VL</a> —— 奠基之作（2023）</h1>

<p><img src="/images/Qwen-vl/0.png" alt="" />
Qwen-VL 是整个系列的起点。基于 Qwen-7B 语言模型，它最核心的贡献并非某项单点技术突破，而是建立了一套<strong>三阶段渐进式训练范式</strong>——先对齐（Align）、再增强（Enhance）、后对话（Chat）。这一训练哲学深刻影响了后续所有版本的设计。</p>

<h2 id="11-核心训练思想渐进式能力构建">1.1. 核心训练思想：渐进式能力构建</h2>

<ol>
  <li>
    <p><strong>先对齐 (Align)</strong>：在第一阶段，让模型建立最基础的“图像-文本”映射关系。</p>
  </li>
  <li>
    <p><strong>再增强 (Enhance)</strong>：在第二阶段，通过更复杂、更精细的任务，赋予模型高级技能，如定位、识别文字等。</p>
  </li>
  <li>
    <p><strong>后对话 (Align with Humans)</strong>：在第三阶段，将模型的能力与人类的交互习惯对齐，使其成为一个好用的对话助手。</p>
  </li>
</ol>

<h2 id="12-阶段一预训练-stage-1-pre-training">1.2. 阶段一：预训练 (Stage 1: Pre-training)</h2>

<ul>
  <li>
    <p><strong>🎯 目标</strong>: <strong>建立基础的视觉-语言对齐 (Basic Vision-Language Alignment)</strong>。</p>
  </li>
  <li><strong>🧱 数据构造 (Data Construction)</strong>:
    <ul>
      <li>
        <p><strong>来源</strong>: 主要使用大规模、噪声较大的网页抓取图文对，如 LAION、DataComp、Coyo 等。论文中提到，经过清洗后使用了约 <strong>14亿</strong> 个图文对。</p>
      </li>
      <li>
        <p><strong>特点</strong>: 数据量巨大，但标签质量参差不齐（“弱标签”）。例如，一张图片可能只配了几个简单的关键词作为描述。</p>
      </li>
      <li>
        <p><strong>格式</strong>: 这是最简单的数据格式。每个训练样本由一张图片和一段对应的文本描述组成。在输入给模型时，格式如下：</p>
      </li>
    </ul>

    <p>  <code class="language-plaintext highlighter-rouge">&lt;img&gt; [视觉特征序列] &lt;/img&gt; [文本描述] &lt;eos&gt;</code></p>

    <ul>
      <li>
        <p>&lt;/img&gt;: 特殊标记，用于告诉LLM被包裹在中间的是视觉信息。</p>
      </li>
      <li>
        <p>[视觉特征序列]: 图片经过视觉编码器和适配器处理后得到的256个向量。</p>
      </li>
      <li>
        <p>[文本描述]: 与图片配对的文本。</p>
      </li>
      <li>
        <eos>: 文本结束标记。
    
  
</eos>
      </li>
    </ul>
  </li>
  <li><strong>⚙️ 训练方法与目标达成</strong>:
    <ul>
      <li>
        <p><strong>模型状态</strong>: <strong>冻结 (Freeze) 大语言模型 (LLM)</strong>，只训练<strong>视觉编码器 (ViT)</strong> 和 <strong>视觉-语言适配器</strong>。</p>
      </li>
      <li><strong>为什么冻结LLM?</strong>:
        <ul>
          <li>
            <p><strong>效率</strong>: 训练整个大模型的成本极高。只训练较小的视觉部分可以大幅提升训练速度。</p>
          </li>
          <li>
            <p><strong>稳定性</strong>: 强大的预训练LLM已经具备了丰富的世界知识和语言能力。如果一开始就用噪声很大的网页数据去训练它，可能会破坏其原有的知识结构。冻结LLM可以保护它不被“污染”。</p>
          </li>
        </ul>
      </li>
      <li>
        <p><strong>训练任务</strong>: <strong>文本生成 (Text Generation)</strong>。具体来说，是自回归预测。模型在接收到图像特征后，需要逐字预测出对应的文本描述。</p>
      </li>
      <li><strong>损失函数</strong>: <strong>交叉熵损失 (Cross-Entropy Loss)</strong>。</li>
    </ul>
  </li>
</ul>

<h2 id="13-阶段二多任务预训练-stage-2-multi-task-pre-training">1.3. 阶段二：多任务预训练 (Stage 2: Multi-task Pre-training)</h2>

<p><img src="/images/Qwen-vl/1.png" alt="" /></p>

<ul>
  <li><strong>🎯 目标</strong>: <strong>注入高级和细粒度的视觉能力 (Injecting Advanced &amp; Fine-grained Skills)</strong>。
    <ul>
      <li>在第一阶段的基础上，让模型从“看得懂大概”进化到“看得清细节”。这包括理解物体在图片中的具体位置、识别图片中的文字、理解图表等。</li>
    </ul>
  </li>
  <li><strong>🧱 数据构造 (Data Construction)</strong>:
    <ul>
      <li><strong>来源</strong>: 使用多种高质量、人工标注的数据集，涵盖了7种不同的任务。
        <ul>
          <li>
            <p><strong>黑色文本 (Prefix Sequence without loss)</strong>: 这部分是模型的<strong>输入</strong>或<strong>上下文提示 (Prompt)</strong>。</p>
          </li>
          <li>
            <p><strong>蓝色文本 (Ground Truth Labels with loss)</strong>: 这部分是模型的<strong>学习目标</strong>或<strong>正确答案 (Ground Truth)</strong>。</p>
          </li>
        </ul>
      </li>
      <li><strong>格式</strong>: 针对不同任务，设计了不同的文本格式，核心是<strong>将所有任务都统一为序列到序列的文本生成问题</strong>。
        <ul>
          <li><strong>Image Captioning (图像描述)</strong>
            <ol>
              <li>
                <p><strong>输入 (黑)</strong>: <img />…&lt;/img&gt;Generate the caption in English: (图像 + 生成描述的指令)</p>
              </li>
              <li>
                <p><strong>目标 (蓝)</strong>: the beautiful flowers for design.<eos> (一句描述性的话)</eos></p>
              </li>
              <li>
                <p><strong>解读</strong>: 这是最基础的任务。模型学习根据指令为图片生成一句通顺的描述。</p>
              </li>
            </ol>
          </li>
          <li><strong>Vision Question Answering (视觉问答)</strong>
            <ol>
              <li>
                <p><strong>输入 (黑)</strong>: <img />…&lt;/img&gt;Does the bandage have a different color than the wrist band? Answer: (图像 + 问题)</p>
              </li>
              <li>
                <p><strong>目标 (蓝)</strong>: No, both the bandage and the wrist band are white.<eos> (问题的答案)</eos></p>
              </li>
              <li>
                <p><strong>解读</strong>: 模型学习理解关于图像内容的问题，并生成相应的回答。</p>
              </li>
            </ol>
          </li>
          <li><strong>OCR VQA (基于文字的视觉问答)</strong>
            <ol>
              <li>
                <p><strong>输入 (黑)</strong>: <img />…&lt;/img&gt;What is the title of this book? Answer: (图像 + 关于图中文字的问题)</p>
              </li>
              <li>
                <p><strong>目标 (蓝)</strong>: Asi Se Dice!, Volume 2: … (Spanish Edition)<eos> (从图中识别出的文字作为答案)</eos></p>
              </li>
              <li>
                <p><strong>解读</strong>: 这是VQA的变种，要求模型具备OCR能力，能够“阅读”并理解图片中的文字来回答问题。</p>
              </li>
            </ol>
          </li>
          <li><strong>Caption with Grounding (带定位的描述)</strong>
            <ol>
              <li>
                <p><strong>输入 (黑)</strong>: <img />…&lt;/img&gt;Generate the caption in English with grounding: (图像 + 生成带定位描述的指令)</p>
              </li>
              <li>
                <p><strong>目标 (蓝)</strong>: Beautiful shot of <ref>bees</ref><box>(...)</box> gathering nectars from <ref>an apricot flower</ref><box>(...)</box><eos></eos></p>
              </li>
              <li>
                <p><strong>解读</strong>: 这是高级能力。模型不仅要生成描述，还要在描述中用特殊标签 <ref>...</ref> 标记出物体，并紧接着用 <box>(坐标)</box> 生成其在图中的边界框坐标。这教会了模型<strong>将语言概念（如“蜜蜂”）和视觉空间位置联系起来</strong>。</p>
              </li>
            </ol>
          </li>
          <li><strong>Referring Grounding (指代定位)</strong>
            <ol>
              <li>
                <p><strong>输入 (黑)</strong>: <img />…&lt;/img&gt;<ref>the ear on a giraffe</ref> (图像 + 一个物体的文字描述)</p>
              </li>
              <li>
                <p><strong>目标 (蓝)</strong>: <box>(176,106),(232,160)</box><eos> (该物体的边界框坐标)</eos></p>
              </li>
              <li>
                <p><strong>解读</strong>: 这个任务反了过来。模型接收一个物体的描述，它的任务就是直接生成这个物体的位置坐标。这<strong>直接训练了模型的定位能力</strong>。</p>
              </li>
            </ol>
          </li>
          <li><strong>Grounded Captioning (基于定位的描述)</strong>
            <ol>
              <li>
                <p><strong>输入 (黑)</strong>: <img />…&lt;/img&gt;<ref>This</ref><box>(360,542),(476,705)</box> is (图像 + 一个边界框)</p>
              </li>
              <li>
                <p><strong>目标 (蓝)</strong>: Yellow cross country ski racing gloves<eos> (对框内物体的描述)</eos></p>
              </li>
              <li>
                <p><strong>解读</strong>: 这再次反转了任务。模型看到一个特定的区域，需要描述出这个区域里是什么。这<strong>训练了模型对局部图像的细粒度理解能力</strong>。</p>
              </li>
            </ol>
          </li>
          <li><strong>OCR (光学字符识别)</strong>
            <ol>
              <li>
                <p><strong>输入 (黑)</strong>: <img />…&lt;/img&gt;OCR with grounding: (图像 + OCR指令)</p>
              </li>
              <li>
                <p><strong>目标 (蓝)</strong>: <ref>It is managed</ref> <quad>(...)</quad>…<eos></eos></p>
              </li>
              <li>
                <p><strong>解读</strong>: 类似于带定位的描述，但专门针对文字。模型需要生成识别出的文本，并用 <quad>(四点坐标)</quad> 给出文字的精确位置（使用四边形坐标是为了处理倾斜或透视的文本）。</p>
              </li>
            </ol>
          </li>
          <li><strong>纯文本数据</strong>: 这一阶段也混合了大量的纯文本数据。目的是为了<strong>防止灾难性遗忘 (Catastrophic Forgetting)</strong>，确保模型在学习视觉能力的同时，不会丢失其原有的强大语言能力。</li>
        </ul>
      </li>
    </ul>
  </li>
  <li><strong>⚙️ 训练方法与目标达成</strong>:
    <ul>
      <li>
        <p><strong>模型状态</strong>: <strong>解锁 (Unfreeze) 整个模型</strong>。视觉编码器、适配器和LLM<strong>全部参与训练</strong>。</p>
      </li>
      <li>
        <p><strong>为什么全部训练?</strong>: 因为这些高级任务（如定位和推理）需要视觉和语言深度融合。LLM不仅要知道图片里有什么，还需要理解空间关系、文本指令的意图，这要求LLM自身也进行微调，以更好地整合来自适配器的细粒度视觉信息。</p>
      </li>
      <li>
        <p><strong>训练任务</strong>: <strong>统一的文本生成任务</strong>。无论是回答问题、生成坐标还是识别文字，都被模型视为生成一个特定的文本序列。</p>
      </li>
      <li>
        <p><strong>损失函数</strong>: 仍然是<strong>交叉熵损失 (Cross-Entropy Loss)</strong>。</p>
      </li>
    </ul>
  </li>
</ul>

<hr />

<h2 id="14-阶段三监督微调-stage-3-supervised-fine-tuning-sft">1.4. 阶段三：监督微调 (Stage 3: Supervised Fine-tuning, SFT)</h2>

<ul>
  <li><strong>🎯 目标</strong>: <strong>对齐人类意图，优化对话能力 (Aligning with Human Intent for Dialogue)</strong>。
    <ul>
      <li>让模型从一个强大的“能力集合”转变为一个易于使用的“对话助手”（即Qwen-VL-Chat）。模型需要学会理解指令、遵循对话流程、并以自然、有帮助的方式回答。</li>
    </ul>
  </li>
  <li><strong>🧱 数据构造 (Data Construction)</strong>:
    <ul>
      <li>
        <p><strong>来源</strong>: 高质量的多模态指令遵循和对话数据集。部分数据由人工编写，部分通过更强大的模型（如GPT-4）辅助生成（即“LLM自指令”）。</p>
      </li>
      <li>
        <p><strong>特点</strong>: 数据形式为多轮对话，可能包含一张或多张图片。</p>
      </li>
      <li>
        <p><strong>格式</strong>: 采用特定的对话格式，如论文中提到的ChatML格式。codeCode</p>
      </li>
    </ul>
  </li>
</ul>

<p><img src="/images/Qwen-vl/2.png" alt="" /></p>

<ul>
  <li><strong>⚙️ 训练方法与目标达成</strong>:
    <ul>
      <li>
        <p><strong>模型状态</strong>: <strong>再次冻结 (Freeze) 视觉编码器</strong>，只训练<strong>适配器</strong>和<strong>大语言模型 (LLM)</strong>。</p>
      </li>
      <li>
        <p><strong>为什么冻结视觉编码器?</strong>: 经过前两个阶段，视觉编码器已经能够很好地提取图像特征了。这个阶段的重点是调整模型的“行为”和“说话方式”，这是LLM的任务，所以只需要微调语言相关的部分。</p>
      </li>
      <li>
        <p><strong>训练任务与损失函数</strong>: 同样是使用<strong>交叉熵损失</strong>的文本生成任务，但有一个关键区别：在训练期间，我们通过<strong>只监督（计算损失）答案和特殊标记（示例中的蓝色部分）</strong>，而不监督角色名称或问题提示，来确保预测和训练分布的一致性。</p>
      </li>
    </ul>
  </li>
</ul>

<hr />

<blockquote>
  <p><strong>Part I 小结：</strong>  Qwen-VL 通过三阶段渐进式训练，首次为 Qwen 系列建立了完整的视觉-语言能力体系。但它也留下了几个关键瓶颈：<strong>固定的图像分辨率</strong>（所有图片都被 resize 到 448×448）限制了细粒度感知，<strong>缺乏原生视频理解能力</strong>，以及<strong>绝对位置编码</strong>在多模态场景下的局限性。这些问题，正是下一代 Qwen2-VL 要着力解决的。</p>
</blockquote>

<hr />

<h1 id="2-part-ii-qwen2-vl--原生动态分辨率与多模态位置编码2024">2. Part II: <a href="https://arxiv.org/abs/2409.12191">Qwen2-VL</a> —— 原生动态分辨率与多模态位置编码（2024）</h1>

<p><img src="/images/Qwen-vl/3.png" alt="" /></p>

<h2 id="21-相对于qwen-vl的创新">2.1. 相对于qwen-vl的创新：</h2>

<ol>
  <li>
    <p><strong>去除了原始的绝对位置嵌入，并引入了 2D-RoPE，来捕获图像的二维位置信息，支持Native Dynamic Resolution</strong></p>
  </li>
  <li>
    <p><strong>M-RoPE (Multimodal Rotary Position Embedding)，</strong></p>
  </li>
  <li>
    <p><strong>3D 卷积：</strong>  引入深度为 2 的 3D 卷积来处理视频输入，将 2D patches 变为 <strong>3D tubes</strong>。这意味着模型一次可以处理视频中的连续帧，而不是单帧，增强视频理解能力并支持长视频</p>
  </li>
  <li>
    <p><strong>多语言能力的提升</strong></p>
  </li>
</ol>

<p>Qwen2-VL 对架构进行了大刀阔斧的改造。它不再满足于在 LLM 前面简单「接」一个视觉编码器，而是从位置编码的底层数学出发，构建了一套真正适配多模态数据的统一坐标体系。这一部分我们将从 RoPE 的基础原理讲起，逐步推导到 Qwen2-VL 的核心创新——M-RoPE。</p>

<h2 id="22-m-rope">2.2. M-ROPE</h2>

<p><strong>对一个单模态的 patch 进行编码，使其被映射到一个统一的‘多维时空坐标系’中，从而能够与视频、文本等其他模态的数据在同一个空间内进行对齐和交互。</strong> 
<img src="/images/Qwen-vl/4.png" alt="" /></p>

<h3 id="221-计算流程">2.2.1. 计算流程</h3>
<ul>
  <li><strong>输入 (Input)</strong>
    <ul>
      <li>特征张量 X：形状为 \((B, L, D)\)。</li>
      <li>时间索引 \(P_t\)： \((B, L)\)。视频帧号（图片/文本设为常数或序列号）。</li>
      <li>高度索引 \(P_h\)： \((B, L)\)。空间行号。</li>
      <li>宽度索引 \(P_w\)： \((B, L)\)。空间列号。</li>
    </ul>
  </li>
  <li><strong>如何计算 (Calculation)</strong>
    <ul>
      <li><strong>三路切分 (Split into 3)</strong>：将 \(X\) 沿 \(D\) 维切成三份：</li>
      <li>
\[X_t = X[\ldots, 0 : D_t)\]
      </li>
      <li>
\[X_h = X[\ldots, D_t : D_t+D_h)\]
      </li>
      <li>
\[X_w = X[\ldots, D_t+D_h : D)\]
      </li>
      <li><strong>三路并行旋转 (Parallel Rotation)</strong>：</li>
      <li>\(X'_t = \text{RoPE}(X_t, P_t)\) —— 注入时间信息。</li>
      <li>\(X'_h = \text{RoPE}(X_h, P_h)\) —— 注入高度信息。</li>
      <li>\(X'_w = \text{RoPE}(X_w, P_w)\) —— 注入宽度信息。</li>
      <li><strong>拼接 (Concat)</strong>：</li>
      <li>\(X_{out} = \text{Concat}(X'_t, X'_h, X'_w, \text{dim}=-1)\)。</li>
    </ul>
  </li>
  <li><strong>输出 (Output)</strong>
    <ul>
      <li>\(X_{out}\)：形状 (B, L, D)。</li>
      <li>该向量现在是一个“全息”位置载体：
        <ul>
          <li>计算 Attention 时，如果在时间上不同（帧不同），\(X'_t\)部分会产生角度差。</li>
          <li>如果在空间上不同（像素位置不同），\(X'_h\) 和 \(X'_w\) 部分会产生角度差。</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h3 id="222-解决问题">2.2.2. 解决问题</h3>
<h4 id="2221-多模态数据的维度不兼容">2.2.2.1. 多模态数据的”维度不兼容”</h4>
<ul>
  <li><strong>痛点</strong>：
    <ul>
      <li>
        <p>文本是 1D 的（只有前后）。</p>
      </li>
      <li>
        <p>图片是 2D 的（有高宽）。</p>
      </li>
      <li>
        <p>视频是 3D 的（有时空）。</p>
      </li>
      <li>
        <p>以前的模型通常需要给每种模态设计不同的编码器，或者暴力地全部压成 1D，导致时空信息混杂，模型难以学习。</p>
      </li>
    </ul>
  </li>
  <li><strong>解决</strong>：M-RoPE 建立了一个统一的 \((t, h, w)\) 三维坐标系。
    <ul>
      <li>
        <p>文本用 \((i, i, i)\) 模拟 1D。</p>
      </li>
      <li>
        <p>图片用 \((1, h, w)\) 模拟 2D。</p>
      </li>
      <li>
        <p>视频用 \((t, h, w)\) 模拟 3D。</p>
      </li>
      <li>
        <p><strong>结果</strong>：所有模态的数据都可以在同一个 Embedding 空间里从容交互，不需要切换编码方式。</p>
      </li>
    </ul>
  </li>
</ul>

<h4 id="2222-长视频的索引爆炸与外推失败-the-extrapolation-problem">2.2.2.2. 长视频的“索引爆炸”与“外推失败” (The Extrapolation Problem)</h4>

<ul>
  <li><strong>痛点</strong>：视频产生的 Token 数量极多。
    <ul>
      <li>
        <p>假设一个视频有 1000 帧，每帧 256 个 Token，总 Token 数 = 256,000。</p>
      </li>
      <li>
        <p>如果用 1D 索引，位置号 \(m\) 会一直飙升到 250,000+。</p>
      </li>
      <li>
        <p><strong>RoPE 的弱点</strong>：当推理时的位置索引 \(m\) 远超训练时的最大索引（比如训练时只见过 32k）， \(\cos(m\theta)\) 的旋转角度会变得非常陌生，模型性能急剧下降。</p>
      </li>
    </ul>
  </li>
  <li><strong>解决</strong>：M-RoPE 采用了 <strong>“分治策略” (Decomposition)</strong>。
    <ul>
      <li>虽然总 Token 有 25万个，但我们把索引拆开了：
        <ul>
          <li>
            <p>时间索引 \(t\) 可能只到 1000。</p>
          </li>
          <li>
            <p>高度索引 \(h\) 可能只到 16。</p>
          </li>
          <li>
            <p>宽度索引 \(w\) 可能只到 16。</p>
          </li>
        </ul>
      </li>
      <li>
        <p><strong>结果</strong>：每一个分量上的索引数值都非常小（都在模型训练见过的“舒适区”内）。</p>
      </li>
      <li><strong>优势</strong>：这让模型能够理解比训练时长得多的视频（因为 \(t\) 增加只会导致时间分量的旋转，而不会破坏空间分量的感知），实现了强大的长距离外推能力。</li>
    </ul>
  </li>
</ul>

<h3 id="223-3d卷积时空降采样-temporal-downsampling-模块">2.2.3. 3D卷积–<strong>时空降采样 (Temporal Downsampling)</strong> 模块</h3>

<h4 id="2231-目的">2.2.3.1. 目的</h4>

<p>核心目的是 <strong>压缩 Token 数量，提升计算效率</strong>。</p>

<ul>
  <li>
    <p><strong>无损压缩</strong>：视频中相邻的两帧通常非常相似（比如背景不动，只有人在动）。如果每一帧都独立编码，会有大量的信息冗余。</p>
  </li>
  <li>
    <p><strong>减半序列长度</strong>：通过 3D 卷积，模型将 <strong>2 个时间帧</strong> 融合成 <strong>1 个特征向量（Token）</strong>。</p>
    <ul>
      <li><strong>结果</strong>：在同样的 Token 预算（显存限制）下，Qwen2-VL 可以读取 <strong>2倍时长</strong> 的视频。或者说，处理同样时长的视频，它的计算量减少了一半</li>
    </ul>
  </li>
</ul>

<h4 id="2232-实现">2.2.3.2. 实现</h4>

<ul>
  <li><strong>传统 ViT (2D 处理)</strong>：处理视频时，通常是一帧一帧处理。每帧图片被切成 \(14 \times 14\) 的小方块（Patches）。
    <ul>
      <li>
        <p>第 1 帧 -&gt; 产生 N 个 Token。</p>
      </li>
      <li>
        <p>第 2 帧 -&gt; 产生 N 个 Token。</p>
      </li>
      <li>
        <p>总 Token 数 = 帧数 \(\times\) N。</p>
      </li>
    </ul>
  </li>
  <li><strong>Qwen2-VL 的 3D 卷积 (3D 处理)</strong>：它使用了一个 <strong>深度为 2 (Depth = 2)</strong> 的 3D 卷积核。这意味着它一次性”吐揉”时间上相邻的<strong>两帧</strong>画面。它不再提取平面的 Patch，而是提取立体的 “3D Tube” (时空管)。这个 Tube 的维度是：\(2 \times 14 \times 14\)</li>
</ul>

<h2 id="23-训练">2.3. 训练</h2>

<h3 id="231-核心训练原则">2.3.1. 核心训练原则</h3>

<ul>
  <li>
    <p><strong>训练目标</strong>：Next-Token Prediction（下一词预测）。</p>
  </li>
  <li>
    <p><strong>损失计算 (Loss)</strong>：仅计算<strong>文本 Token</strong> 的交叉熵损失，<strong>视觉 Token</strong> 被 Mask 掉（权重为0）。</p>
  </li>
  <li>
    <p><strong>初始化</strong>：</p>
    <ul>
      <li>
        <p><strong>LLM</strong>：使用 Qwen2 (1.5B/7B/72B) 初始化。</p>
      </li>
      <li>
        <p><strong>ViT</strong>：初始化自 DFN，但去掉了绝对位置编码，改为 <strong>2D-RoPE</strong>。</p>
      </li>
    </ul>
  </li>
</ul>

<h4 id="2311-第一阶段视觉编码器预训练-vit-training">2.3.1.1. 第一阶段：视觉编码器预训练 (ViT Training)</h4>

<ul>
  <li>
    <p><strong>目标</strong>：让视觉编码器（ViT）学会“看图”，并与 LLM 的语义空间对齐。</p>
  </li>
  <li><strong>参数状态</strong>：
    <ul>
      <li>
        <p><strong>训练</strong>：ViT + Adapter。</p>
      </li>
      <li>
        <p><strong>冻结</strong>：LLM。</p>
      </li>
    </ul>
  </li>
  <li>
    <p><strong>数据</strong>：600B tokens，大规模弱标注的<strong>图像-文本对</strong>。</p>
  </li>
  <li><strong>关键点</strong>：ViT 开始适应 2D-RoPE 机制。</li>
</ul>

<h4 id="2312-第二阶段全参数预训练-full-parameter-pre-training">2.3.1.2. 第二阶段：全参数预训练 (Full Parameter Pre-training)</h4>

<ul>
  <li>
    <p><strong>目标</strong>：提升细粒度视觉感知（如 OCR、图表）及视频理解能力。</p>
  </li>
  <li>
    <p><strong>参数状态</strong>：<strong>全参数解冻</strong>（ViT + LLM + Adapter 全部参与训练）。</p>
  </li>
  <li><strong>数据</strong>：800B tokens（累计 1.4T）。
    <ul>
      <li>
        <p>类型丰富：混合图文、OCR 数据、交错图文文章、<strong>视频数据</strong>。</p>
      </li>
      <li>
        <p>混入纯文本数据以维持语言能力。</p>
      </li>
    </ul>
  </li>
  <li><strong>关键机制启用</strong>：
    <ul>
      <li>
        <p><strong>Naive Dynamic Resolution</strong>：输入任意分辨率图片。</p>
      </li>
      <li>
        <p><strong>M-RoPE</strong>：统一处理图/文/视频位置信息。</p>
      </li>
      <li>
        <p><strong>3D 卷积</strong>：将图片复制为两帧，或将视频两帧压为一组，统一输入接口。</p>
      </li>
    </ul>
  </li>
</ul>

<h4 id="2313-第三阶段指令微调-instruction-fine-tuning">2.3.1.3. 第三阶段：指令微调 (Instruction Fine-tuning)</h4>

<ul>
  <li>
    <p><strong>目标</strong>：对齐人类意图，获得对话、指令遵循及 Agent 能力。</p>
  </li>
  <li><strong>参数状态</strong>：
    <ul>
      <li>
        <p><strong>冻结</strong>：ViT（认为感知能力已足够）。</p>
      </li>
      <li>
        <p><strong>训练</strong>：LLM。</p>
      </li>
    </ul>
  </li>
  <li><strong>数据</strong>：<strong>ChatML 格式</strong>对话数据。
    <ul>
      <li>包含：多模态对话、长视频问答、Agent 操作序列、纯文本指令。</li>
    </ul>
  </li>
  <li><strong>Loss 特性</strong>：进一步 Mask 掉 <code class="language-plaintext highlighter-rouge">&lt;|im_start|&gt;user</code> 部分，<strong>仅计算 Assistant 回复的 Loss</strong>。</li>
</ul>

<hr />

<blockquote>
  <p><strong>Part II 小结：</strong>  Qwen2-VL 实现了从初代到真正多模态原生模型的跨越——M-RoPE 统一了文本、图像、视频的位置编码体系，3D 卷积将视频处理效率提升了一倍，原生动态分辨率让模型彻底摆脱了固定尺寸的束缚。然而，随着输入分辨率的提升，ViT 全局注意力的二次复杂度成为新的瓶颈，同时模型在长视频场景下的时间感知仍依赖相对帧索引，缺乏对真实物理时间的理解。</p>
</blockquote>

<hr />

<h1 id="3-part-iii-qwen25-vl--工程优化与训练范式的全面升级2025">3. Part III: <a href="https://arxiv.org/abs/2502.13923">Qwen2.5-VL</a> —— 工程优化与训练范式的全面升级（2025）</h1>

<h2 id="31-相对于qwen2-vl的核心创新">3.1. 相对于Qwen2-VL的核心创新</h2>

<ul>
  <li>
    <p>窗口注意力机制，以优化推理效率</p>
  </li>
  <li>
    <p>动态FPS采样，将动态分辨率扩展到时间维度，从而能够全面理解各种采样率下的视频</p>
  </li>
  <li>
    <p>通过与绝对时间对齐，升级了时间域中的MRoPE，从而促进了更复杂的时间序列学习</p>
  </li>
</ul>

<p><img src="/images/Qwen-vl/5.png" alt="" /></p>

<h2 id="32-窗口注意力机制-window-attention">3.2. 窗口注意力机制 (Window Attention)</h2>

<p>为了解决高分辨率图像处理中计算复杂度爆炸的问题。传统 ViT 的全局注意力复杂度是 \(O(N^2\)，而窗口注意力将其降低为 \(O(N\)（线性）。</p>

<h3 id="321-实现原理与计算流程">3.2.1. <strong>实现原理与计算流程</strong></h3>

<p><strong>Step 1: 动态分辨率输入与切片 (Patching)</strong></p>

<ul>
  <li>
    <p><strong>输入：</strong>  假设输入图像为 \(H \times W\)。Qwen2.5-VL 强制将 \(H, W\) resize 为 28 的倍数。</p>
  </li>
  <li>
    <p><strong>切片：</strong>  Patch Size 为 \(14 \times 14\)。</p>
  </li>
  <li>
    <p><strong>Token 数量：</strong>  总 Token 数 \(L = (H/14) \times (W/14)\)。</p>
  </li>
  <li>
    <p><strong>维度变化：</strong>  输入 \((1, 3, H, W) \rightarrow \text{Flatten Patch} \rightarrow (1, L, D)\)，其中 \(D\) 是 Hidden Size (如 1280)。<strong>Step 2: 窗口划分 (Window Partitioning)</strong></p>
  </li>
  <li><strong>参数含义：</strong>
    <ul>
      <li>
        <p><strong>Window Size (像素级):</strong>  \(112 \times 112\)。</p>
      </li>
      <li>
        <p><strong>Window Size (Patch级):</strong>  \(112 / 14 = 8\)。即每个窗口包含 \(8 \times 8 = 64\) 个 Patch。</p>
      </li>
    </ul>
  </li>
  <li>
    <p><strong>逻辑：</strong>  将整张图的 Token 矩阵切分成多个不重叠的窗口。</p>
  </li>
  <li>
    <p><strong>计算：</strong> 窗口数量 \(N_{win} = \frac{L}{8 \times 8} = \frac{L}{64}\)。</p>
  </li>
  <li><strong>维度变化：</strong> \((1, L, D) \rightarrow (N_{win}, 64, D)\)。*注意：原来的 Batch Size 1 变成了 N_{win}，相当于把每个窗口当作一个独立的”小图片”并行处理。</li>
</ul>

<p><strong>Step 3:</strong> <strong>局部注意力计算 (Local Attention)</strong></p>

<ul>
  <li><strong>推理：</strong>  在每个 \(64 \times 64\) 的窗口内部计算 Self-Attention。</li>
</ul>

\[\text{Attention}(Q, K, V) = \text{Softmax}(\frac{QK^T}{\sqrt{d_k}})\]

<ul>
  <li><strong>复杂度：</strong>  \(N_{win} \times (64)^2\)。因为 \(N_{win}\) 与 \(L\) 成正比，所以整体复杂度随图像面积线性增长，不再是指数级。</li>
</ul>

<p><strong>Step 4: 全局信息交互 (Global Interaction)</strong></p>

<ul>
  <li>
    <p>如果只做窗口注意力，窗口之间无法传递信息。</p>
  </li>
  <li>
    <p><strong>实现：</strong>  Qwen2.5-VL 在特定的层（索引为 {7, 15, 23, 31} 的层）保留了全注意力 (Full Self-Attention)。</p>
  </li>
  <li>
    <p><strong>作用：</strong>  在这些层，不做窗口划分，让全图 Token 交互，打通全局语义。</p>
  </li>
</ul>

<h2 id="33-动态fps采样-dynamic-fps-sampling">3.3. 动态FPS采样 (Dynamic FPS Sampling)</h2>

<p>为了让模型能够原生处理视频的时间维度，而不受固定帧率的束缚。</p>

<h3 id="331-实现原理与计算流程">3.3.1. <strong>实现原理与计算流程</strong></h3>

<p><strong>Step 1: 3D Tube 处理单元</strong></p>

<ul>
  <li><strong>参数含义：</strong>
    <ul>
      <li>
        <p><strong>空间 Patch:</strong>  \(14 \times 14\)。</p>
      </li>
      <li>
        <p><strong>时间 Stride:</strong>  2（即每 2 帧聚合一次）。</p>
      </li>
    </ul>
  </li>
  <li>
    <p><strong>实现：</strong>  以前处理图片是 2D Patch，现在处理视频是 3D Tube。</p>
  </li>
  <li>
    <p><strong>计算：</strong>  取视频中连续的 2 帧，在相同空间位置切出的 Patch 组合成一个 Token。</p>
  </li>
  <li><strong>维度变化：</strong>
    <ul>
      <li>
        <p>假设视频采样了 \(T\) 帧，分辨率 \(H \times W\)。</p>
      </li>
      <li>
        <p>总 Patch 数并不是 \(T \times (H/14) \times (W/14)\)。</p>
      </li>
      <li>
        <p>而是 \(\frac{T}{2} \times (H/14) \times (W/14)\)。</p>
      </li>
    </ul>
  </li>
  <li><strong>意义：</strong>  Token 数量减半，计算效率提升一倍，且单个 Token 包含了短时间（2帧）内的动态变化信息。</li>
</ul>

<p><strong>Step 2: 动态采样策略</strong></p>

<ul>
  <li>
    <p><strong>推理：</strong>  模型不强制要求固定的 FPS（如必须 1fps）。它可以接受 0.5fps 的慢节奏视频，也可以接受 2fps 的快节奏视频。</p>
  </li>
  <li>
    <p><strong>实现：</strong>  将采样到的帧序列视为一个长序列输入，结合下文提到的“绝对时间编码”来告知模型每两帧之间的时间跨度</p>
  </li>
</ul>

<h2 id="34-绝对时间-mrope-multimodal-rotary-position-embedding-with-absolute-time">3.4. 绝对时间 MRoPE (Multimodal Rotary Position Embedding with Absolute Time)</h2>

<h4 id="背景qwen2-vl-的相对做法-vs-qwen25-vl-的绝对做法"><strong>背景：Qwen2-VL 的相对做法 vs Qwen2.5-VL 的绝对做法</strong></h4>

<ul>
  <li><strong>Qwen2-VL (旧版):</strong>  给帧打标签为 Frame ID: 0, 1, 2…
    <ul>
      <li>问题： Frame 1 到 Frame 2 是过了 0.1秒还是 10秒？模型不知道。</li>
    </ul>
  </li>
  <li><strong>Qwen2.5-VL (新版):</strong>  Frame ID 直接映射到绝对时间戳。</li>
</ul>

<h3 id="341-实现原理与计算流程">3.4.1. <strong>实现原理与计算流程</strong></h3>

<p><strong>Step 1: 位置编码分解 (Decomposition)</strong>
MRoPE 将位置编码分为三个正交的部分：</p>

<ol>
  <li>
    <p><strong>Temporal (时间):</strong>  \(ID_t\)</p>
  </li>
  <li>
    <p><strong>Height (高度):</strong>  \(ID_h\)</p>
  </li>
  <li>
    <p><strong>Width (宽度):</strong>  \(ID_w\)</p>
  </li>
</ol>

<p><strong>Step 2: 绝对时间对齐 (Alignment)</strong>
对于第 \(i\) 帧，其时间位置 ID 不是简单的 k，而是：\(ID_t = \text{Round}(t_{abs} \times v)\)，其中
\(t_{abs}\): 某一帧在视频中的真实时间（秒），\(v\): 帧率（例如每秒对应多少个 ID 单位）。</p>

<ul>
  <li>示例： \(v=2\)
    <ul>
      <li>
        <p>帧1 (0.0s): \(ID_t = 0\)</p>
      </li>
      <li>
        <p>帧2 (0.5s): \(ID_t = 1\)</p>
      </li>
      <li>
        <p>帧3 (2.0s): \(ID_t = 4\)</p>
      </li>
    </ul>
  </li>
  <li><strong>推理差异：</strong>  在传统的 Transformer 中，位置 ID 通常是连续的 \((0, 1, 2)\)。但在 Qwen2.5-VL 处理视频时， \(ID_t\) 序列可能是跳跃的 \((0, 12, 48)\)。</li>
</ul>

<p><strong>Step 3: 旋转应用 (Rotation)</strong></p>

<ul>
  <li>在 Attention 计算 \(Q, K, V\) 时，分别对特征向量的不同部分应用旋转：
    <ul>
      <li>
        <p>向量的前一部分应用 \(ID_t\) 的旋转矩阵。</p>
      </li>
      <li>
        <p>中间部分应用 \(ID_h\) 的旋转矩阵。</p>
      </li>
      <li>
        <p>后一部分应用 \(ID_w\) 的旋转矩阵。</p>
      </li>
    </ul>
  </li>
  <li><strong>推理效果：</strong>  当计算 Attention Score \(QK^T\) 时，由于 RoPE 的相对位置特性，模型感知到的”距离”直接对应物理世界的”时间差”。
    <ul>
      <li>
        <p>帧1和帧2的距离 \(\Delta = 1\)。</p>
      </li>
      <li>
        <p>帧2和帧3的距离 \(\Delta = 3\)。</p>
      </li>
      <li>
        <p>模型因此“知道”帧2到帧3的时间跨度比帧1到帧2长得多，从而理解了视频的节奏（Tempo）。</p>
      </li>
    </ul>
  </li>
</ul>

<h2 id="35-总结三者如何协同工作">3.5. <strong>总结：三者如何协同工作？</strong></h2>

<ol>
  <li>
    <p><strong>输入端：</strong>  视频被切分为 2 帧一组的 3D Tubes（动态FPS采样）。</p>
  </li>
  <li>
    <p><strong>位置编码：</strong>  每个 Tube 根据其代表的真实秒数，被赋予跳跃的、真实的 绝对时间 ID（MRoPE）。</p>
  </li>
  <li>
    <p><strong>编码器：</strong>  这些 Token 进入 ViT，在大部分层中只在 \(8 \times 8\) 的 窗口内计算注意力（Window Attention），极低成本地提取特征，只在少数几层进行全局时空信息融合。</p>
  </li>
</ol>

<h2 id="36-与swin-transformer-移动窗口shifted-window注意力的不同">3.6. <strong>与Swin Transformer “移动窗口（Shifted Window）”注意力的不同</strong></h2>

<h3 id="361-核心区别信息的跨窗口交互方式">3.6.1. 核心区别：信息的“跨窗口”交互方式</h3>

<ul>
  <li><strong>Swin Transformer 的方式 (Shifted Window):</strong>
    <ul>
      <li>
        <p>为了让不同窗口之间的信息能够交流，Swin 采用交替策略：第 \(l\) 层使用标准窗口，第 \(l+1\) 层使用移动窗口（Shifted Window）。</p>
      </li>
      <li>
        <p>通过移动窗口的重叠部分，信息在下一层传播到相邻窗口。它从未真正进行过全图的 Full Attention。</p>
      </li>
    </ul>
  </li>
  <li><strong>Qwen2.5-VL 的方式 (Interleaved Full Attention):</strong>
    <ul>
      <li>
        <p>它<strong>不使用移动窗口</strong>。它的窗口在大部分层是固定的（不重叠，不移动）。</p>
      </li>
      <li>
        <p>为了解决“窗口之间信息不互通”的问题，它<strong>每隔几层插入一个全全局注意力（Full Self-Attention）层</strong>。</p>
      </li>
      <li>
        <p><strong>机制：</strong>  在窗口层提取局部细节，在全注意力层进行一次彻底的全局信息交换。</p>
      </li>
    </ul>
  </li>
</ul>

<h3 id="362-为什么不选-swin-的-shifted-window">3.6.2. 为什么不选 Swin 的 Shifted Window？</h3>

<p>Qwen2.5-VL比 Swin 更适合Native Dynamic Resolution</p>

<ul>
  <li><strong>动态分辨率的适配性：</strong>
    <ul>
      <li>
        <p>Swin Transformer 的 Shifted Window 在处理固定尺寸图片时很有效，但 Qwen2.5-VL 强调 <strong>Native Dynamic Resolution（原生动态分辨率）</strong>，输入图片的宽高比千变万化。</p>
      </li>
      <li>
        <p>在动态分辨率下实现“移动窗口”需要极其复杂的 Padding（填充）和 Masking（掩码）操作，尤其是当图片边缘切分不整齐时，计算效率会大打折扣。</p>
      </li>
      <li>
        <p>相比之下，<strong>固定窗口 + 稀疏的全注意力层</strong> 实现起来更简单、高效，且利用 FlashAttention 等加速算子，那几个全注意力层的开销是完全可控的。</p>
      </li>
    </ul>
  </li>
  <li><strong>计算复杂度控制：</strong>
    <ul>
      <li>
        <p>报告提到：“Only four layers employ full self-attention… computational cost scales linearly…”（只有四层使用全注意力…计算成本呈线性增长）。</p>
      </li>
      <li>
        <p>这种设计在保留了 ViT 全局建模能力的“上限”（通过那4层全关注层）的同时，将整体 FLOPs 压低到了接近 Swin 的水平。</p>
      </li>
    </ul>
  </li>
</ul>

<h2 id="37-训练">3.7. 训练</h2>

<p>Qwen2.5-VL 的训练过程是一个从”视觉感知”到”多模态理解”再到”指令遵循与对齐”的递进过程。整个流程分为 <strong>预训练（Pre-training）</strong> 和 <strong>后训练（Post-training）</strong> 两大板块，共计 5 个关键阶段。</p>

<h3 id="371-预训练-pre-training">3.7.1. 预训练 (Pre-Training)</h3>

<p><strong>目标：</strong> 让模型学会”看”世界，并建立视觉与语言的基础连接。
<strong>数据规模：</strong>  从上一代的 1.2T 扩展到了 <strong>4.1T tokens</strong>。</p>

<h4 id="阶段-1vit-初始对齐-visual-encoder-initialization"><strong>阶段 1：ViT 初始对齐 (Visual Encoder Initialization)</strong></h4>

<ul>
  <li>
    <p><strong>训练对象：</strong>  <strong>只训练 Vision Transformer (ViT)</strong>，LLM 部分不参与或被冻结。</p>
  </li>
  <li>
    <p><strong>任务目标：</strong>  让重头设计（从零训练）的 ViT 具备将像素转化为语义特征的能力，并初步与语言空间对齐。</p>
  </li>
  <li><strong>训练数据：</strong>
    <ul>
      <li>
        <p>大量的基础图文对（Image-Caption）。</p>
      </li>
      <li>
        <p>视觉知识数据（如百科图片）。</p>
      </li>
      <li>
        <p>OCR 数据（文字识别）。</p>
      </li>
    </ul>
  </li>
  <li><strong>关键点：</strong>  这是为了让 ViT 在进入复杂任务前，先学会提取“有意义”的视觉特征。</li>
</ul>

<h4 id="阶段-2全参数多模态预训练-multimodal-pre-training"><strong>阶段 2：全参数多模态预训练 (Multimodal Pre-Training)</strong></h4>

<ul>
  <li>
    <p><strong>训练对象：</strong>  <strong>解冻所有参数</strong>（ViT + LLM 全量训练）。</p>
  </li>
  <li>
    <p><strong>任务目标：</strong>  建立视觉特征与语言逻辑的深度连接，让 LLM 真正理解 ViT 传进来的东西是什么。</p>
  </li>
  <li><strong>训练数据：</strong>  数据变得更复杂、逻辑性更强。
    <ul>
      <li>
        <p><strong>图文交错数据 (Interleaved Image-Text):</strong>  类似网页截图或教材，图片和文字穿插出现，学习上下文关联。</p>
      </li>
      <li>
        <p><strong>视觉问答 (VQA):</strong>  一问一答。</p>
      </li>
      <li>
        <p><strong>多任务学习数据:</strong>  包括数学、代码等。</p>
      </li>
      <li>
        <p><strong>纯文本数据:</strong>  保持 LLM 的语言能力不退化。</p>
      </li>
    </ul>
  </li>
  <li><strong>序列长度：</strong>  此时上下文长度限制在 <strong>8,192 (8k)</strong>。</li>
</ul>

<h4 id="阶段-3长上下文与高分辨率强化-long-context-pre-training"><strong>阶段 3：长上下文与高分辨率强化 (Long-Context Pre-Training)</strong></h4>

<ul>
  <li>
    <p><strong>训练对象：</strong>  全量训练 (ViT + LLM)。</p>
  </li>
  <li>
    <p><strong>任务目标：</strong>  解决“看不全”和“记不住”的问题，专门提升处理高分辨率大图、长视频和复杂推理的能力。</p>
  </li>
  <li>
    <p><strong>关键变化：</strong>  <strong>序列长度从 8k 扩展到 32,768 (32k)</strong>。</p>
  </li>
  <li><strong>训练数据：</strong>
    <ul>
      <li>
        <p><strong>长视频 (Long Video):</strong>  需要跨度很大的时间记忆。</p>
      </li>
      <li>
        <p><strong>Agent 数据:</strong>  多步操作的轨迹。</p>
      </li>
      <li>
        <p><strong>高分辨率文档:</strong>  需要细致的细节识别。</p>
      </li>
    </ul>
  </li>
  <li><strong>技术细节：</strong>  为了解决不同图片尺寸导致的计算负载不均衡，使用了动态打包 (Dynamic Packing) 技术，将不同长度的数据拼在一起塞进 GPU，保证计算效率。</li>
</ul>

<h3 id="372-第二板块后训练-post-training">3.7.2. 第二板块：后训练 (Post-Training)</h3>

<p><strong>目标：</strong> 让模型学会”听懂指令”，并符合人类的偏好（有用、无害）。</p>

<h4 id="阶段-4监督微调-supervised-fine-tuning-sft"><strong>阶段 4：监督微调 (Supervised Fine-Tuning, SFT)</strong></h4>

<ul>
  <li><strong>训练对象：</strong>  <strong>冻结 ViT，只微调 LLM</strong>。
    <ul>
      <li><em>原因：</em>  经过预训练，ViT 的感知能力已经足够强，此时重点是教 LLM 如何根据视觉信息回答人类的特定指令。</li>
    </ul>
  </li>
  <li>
    <p><strong>数据格式：</strong>  ChatML 格式（User/Assistant 对话），显式注入视觉 Embedding。</p>
  </li>
  <li><strong>数据量与构成：</strong>  约 <strong>200万 (2M)</strong> 条数据。
    <ul>
      <li>
        <p>50% 纯文本对话（保持语言能力）。</p>
      </li>
      <li>
        <p>50% 多模态对话（图文、视频文）。</p>
      </li>
    </ul>
  </li>
  <li><strong>关键技术：数据过滤与增强</strong>
    <ul>
      <li>
        <p><strong>自动化过滤：</strong>  使用基于规则的方法（去除重复、破损数据）和基于模型的方法（用一个 72B 的模型给数据打分，剔除图文不相关的低质量数据）。</p>
      </li>
      <li>
        <p><strong>拒绝采样 (Rejection Sampling):</strong>  针对数学、代码等硬核推理任务。让模型生成多个答案，用 Ground Truth 验证，把答对且推理过程清晰的样本保留下来作为训练数据。这能显著增强<strong>思维链 (CoT)</strong> 能力。</p>
      </li>
    </ul>
  </li>
</ul>

<h4 id="阶段-5直接偏好优化-direct-preference-optimization-dpo">阶段 5：直接偏好优化 (Direct Preference Optimization, DPO)</h4>

<ul>
  <li>
    <p><strong>训练对象：</strong>  <strong>冻结 ViT，优化 LLM</strong>。</p>
  </li>
  <li>
    <p><strong>任务目标：</strong>  对齐人类价值观，减少幻觉，提升安全性。</p>
  </li>
  <li><strong>训练数据：</strong>  偏好对数据（Preference Pairs）。
    <ul>
      <li>即：给模型同一个问题，提供两个回答（一个好 \(y_w\)，一个差 \(y_l\)），训练模型以此为目标优化。</li>
    </ul>
  </li>
  <li><strong>策略：</strong>  仅针对图像-文本和纯文本数据进行 DPO。</li>
</ul>

<h3 id="373-拒绝采样">3.7.3. 拒绝采样</h3>

<p>简单来说，它的核心逻辑是：”广撒网，优中选优，以战养战”。通常我们也把它称为 <strong>Best-of-N</strong> 策略。</p>

<h4 id="3731-通俗易懂的比喻">3.7.3.1. 通俗易懂的比喻</h4>

<p>想象你要教一个学生（模型）解高难度的奥数题：</p>

<ul>
  <li><strong>普通教学 (SFT):</strong>  你直接把标准答案抄给他看，让他背下来。
    <ul>
      <li><em>缺点：</em>  学生可能只记住了答案，没学会中间的推理逻辑。</li>
    </ul>
  </li>
  <li><strong>拒绝采样 (Rejection Sampling):</strong>
    <ul>
      <li>
        <p>你让学生自己试着做这道题，允许他做100 遍，每次尝试不同的解题思路。</p>
      </li>
      <li>
        <p>你拿着标准答案（Ground Truth）去批改。</p>
      </li>
      <li>
        <p>其中 95 次都做错了，你直接拒绝（Reject） / 扔掉。</p>
      </li>
      <li>
        <p>有 5 次做对了，而且步骤写得很清楚。</p>
      </li>
      <li>
        <p>你把这 5 个“通过自己思考做对的完美步骤”整理出来，作为新的教材，让他重新学习。</p>
      </li>
    </ul>
  </li>
</ul>

<h4 id="3732-qwen25-vl-中具体的实施步骤">3.7.3.2. Qwen2.5-VL 中具体的实施步骤</h4>

<p>在论文中，这个过程主要针对 <strong>数学问题</strong>、<strong>代码生成</strong> 和 <strong>领域特定的 VQA</strong> 任务。
<strong>Step 1: 生成 (Generation)</strong></p>

<ul>
  <li>
    <p>使用一个中间版本的 Qwen2.5-VL 模型。</p>
  </li>
  <li>
    <p>针对同一个问题（Prompt），让模型生成 \(N\) 个不同的回答。</p>
  </li>
  <li>
    <p>利用<strong>思维链 (Chain-of-Thought, CoT)</strong> 技术，强制模型一步步写出推理过程。</p>
  </li>
</ul>

<p><strong>Step 2: 验证与筛选 (Verification &amp; Rejection)</strong>
这是最关键的一步，如何判断这 \(N\) 个回答哪个是好的？</p>

<ul>
  <li><strong>硬性标准（答案正确性）：</strong>  拿 Ground Truth（标准答案）去比对。
    <ul>
      <li>
        <p>比如数学题答案是 “42”，那么生成内容最后得出的也是 “42” 的保留，得不出 “42” 的统统<strong>拒绝 (Reject)</strong>。</p>
      </li>
      <li>
        <p>代码题则运行一下代码，看能不能跑通测试用例。</p>
      </li>
    </ul>
  </li>
  <li><strong>软性标准（质量过滤）：</strong>  论文中提到，即使答案对了，有些回答质量也很差，需要过滤：
    <ul>
      <li>
        <p><strong>Code-switching:</strong>  比如中英文夹杂得很乱的，拒绝。</p>
      </li>
      <li>
        <p><strong>Repetitive patterns:</strong>  像复读机一样重复一句话的，拒绝。</p>
      </li>
      <li>
        <p><strong>Excessive length:</strong>  废话连篇太长的，拒绝。</p>
      </li>
    </ul>
  </li>
</ul>

<p><strong>Step 3: 构造数据集 (Dataset Construction)</strong></p>

<ul>
  <li>把经过筛选后留下的那些<strong>高质量、带推理过程、且答案正确</strong>的样本，加入到 SFT 的训练数据集中。</li>
</ul>

<p><strong>Step 4: 微调 (Fine-Tuning)</strong></p>

<ul>
  <li>用这些“精选”出来的数据去微调模型。</li>
</ul>

<h4 id="3733-解决了两个痛点">3.7.3.3. 解决了两个痛点：</h4>

<p><strong>1. 标准答案通常太简略，缺乏“思维链”</strong></p>

<ul>
  <li>
    <p><strong>数据现状：</strong>  很多数据集（如数学题库）只有 Question 和 Final Answer，没有中间的 step-by-step 推理过程。</p>
  </li>
  <li>
    <p><strong>拒绝采样的作用：</strong>  强迫模型自己把中间过程补全，并且通过答案验证来确保补全的过程是对的。这就<strong>自动生产了昂贵的 CoT 数据</strong>。</p>
  </li>
</ul>

<p><strong>2. 消除“分布偏移” (Distribution Shift)</strong></p>

<ul>
  <li>
    <p><strong>问题：</strong>  人类写的标准推理过程，有时候过于跳跃，或者用词习惯模型并不熟悉。模型“死记硬背”会很难受。</p>
  </li>
  <li>
    <p><strong>拒绝采样的作用：</strong>  既然是模型自己生成的（Self-generated），那么其语言风格、推理节奏完全符合模型自身的概率分布。模型学习“自己生成的高质量数据”比学习“人类写的数据”效率更高，效果更好。</p>
  </li>
</ul>

<h4 id="3734-cot产生及其过滤">3.7.3.4. CoT产生及其过滤</h4>

<h5 id="如何强制模型一步步写出推理过程">如何“强制”模型一步步写出推理过程？</h5>

<p>依靠Prompt Engineering（提示工程）和Few-Shot Prompting（少样本提示）。</p>

<ol>
  <li>系统级指令 (System Prompting)在输入给模型的 Prompt 中，强行加入要求推理的指令。</li>
  <li>
    <p><strong>普通指令：</strong>  “图片里有几只猫？”</p>
  </li>
  <li>
    <p><strong>CoT 诱导指令：</strong>  “请仔细观察图片，<strong>逐步思考（Think step-by-step）</strong>。首先，检测图片中所有的动物；其次，分辨哪些是猫；最后，数出猫的数量并给出最终答案。”</p>
  </li>
  <li>格式约束 (Format Enforcement)为了方便后续提取和清洗，通常会要求模型按照特定格式输出。<strong>示例格式：</strong></li>
</ol>

<pre><code class="language-Markdown">&lt;thinking&gt;
第一步：识别图像左上角，发现一个红色物体...
第二步：根据形状判断这是一个苹果...
...
&lt;/thinking&gt;
&lt;answer&gt;
这是一个苹果
&lt;/answer&gt;
</code></pre>

<p><strong>实现：</strong>  如果模型不按这个格式输出，程序可以直接报错并要求重试，或者在预训练微调阶段就让模型见过大量这种格式的数据。</p>

<ul>
  <li>少样本示范 (Few-Shot Demonstration)。<strong>Prompt 内容：</strong></li>
</ul>

<blockquote>
  <p>&gt; <strong>问题：</strong>  图中的三角形面积是多少？
&gt; <strong>回答：</strong>  首先，我看到底边长为4，高为3。根据三角形面积公式 1/2*底*高… 计算得出 1/2*4*3=6。答案是6。
&gt;
&gt; <strong>问题（当前任务）：</strong>  图中的圆形面积是多少？
&gt; <strong>回答：</strong>  … (模型会模仿上面的语气和步骤开始写)</p>
</blockquote>

<h5 id="如何通过软性标准判断-cot-的质量">如何通过“软性标准”判断 CoT 的质量？</h5>

<h5 id="基于规则的过滤-rule-based-filtering">基于规则的过滤 (Rule-Based Filtering)</h5>

<p>这些是写死在代码里的硬规则，用来快速剔除明显的垃圾数据。论文中明确提到的标准包括：</p>

<ul>
  <li><strong>代码混用 (Code-switching):</strong>
    <ul>
      <li>
        <p><em>烂 CoT：</em>  “First, 我们需要 calculate the area…“（中英文频繁无意义切换，语序混乱）。</p>
      </li>
      <li>
        <p><em>判断：</em>  检测句子中语言种类的切换频率，太高则丢弃。</p>
      </li>
    </ul>
  </li>
  <li><strong>重复模式 (Repetitive patterns):</strong>
    <ul>
      <li>
        <p><em>烂 CoT：</em>  “因此我们得到3，因此我们得到3，因此我们得到3…”</p>
      </li>
      <li>
        <p><em>判断：</em>  使用 n-gram 算法检测文本重复率。</p>
      </li>
    </ul>
  </li>
  <li><strong>过度冗长 (Excessive length):</strong>
    <ul>
      <li>
        <p><em>烂 CoT：</em>  一个简单的加法写了 5000 字的废话。</p>
      </li>
      <li>
        <p><em>判断：</em>  设置 Token 长度阈值，或者计算“信息密度”。</p>
      </li>
    </ul>
  </li>
  <li><strong>格式错误:</strong>  没有按照 <code class="language-plaintext highlighter-rouge">&lt;thinking&gt;</code> 标签闭合的，直接丢弃。</li>
</ul>

<h5 id="基于模型的过滤-model-based-filtering--查逻辑分">基于模型的过滤 (Model-Based Filtering) —— 查“逻辑分”</h5>

<p>规则查不出逻辑漏洞，这时候需要用一个更强的模型（或同等级模型）作为“判卷老师”（Reward Model 或 Verifier）。Qwen2.5-VL 使用了自己的 72B 版本或专门训练的 Reward Model 来给生成的 CoT 打分。打分维度通常包括：</p>

<ul>
  <li><strong>视觉-文本一致性 (Visual-Text Alignment):</strong>  <strong>(这是 VLM 特有的)</strong>
    <ul>
      <li>
        <p><em>烂 CoT：</em>  “因为图片左上角有一只<strong>蓝色的狗</strong>…“（实际上图里是一只红色的猫）。</p>
      </li>
      <li>
        <p><em>判断：</em>  判卷模型会同时看图和文字，发现文字描述与图片事实不符（幻觉），直接打低分剔除。这是最关键的一点，防止模型瞎编乱造。</p>
      </li>
    </ul>
  </li>
  <li><strong>逻辑连贯性 (Logical Coherence):</strong>
    <ul>
      <li>
        <p><em>烂 CoT：</em>  “因为 1+1=2，所以天空是蓝色的。”（前后步骤没有因果关系）。</p>
      </li>
      <li>
        <p><em>判断：</em>  判卷模型评估 Step A 能否推导出 Step B。</p>
      </li>
    </ul>
  </li>
  <li><strong>有用性与安全性 (Helpfulness &amp; Safety):</strong>
    <ul>
      <li>确保推理过程没有包含有害信息或绕弯子。</li>
    </ul>
  </li>
</ul>

<hr />

<blockquote>
  <p><strong>Part III 小结：</strong>  Qwen2.5-VL 完成了一次全方位的工程升级：窗口注意力将 ViT 的计算复杂度从二次降为线性，动态 FPS 采样让时间维度实现了原生动态处理，绝对时间 MRoPE 赋予了模型真实的时间感知能力。在训练层面，拒绝采样机制大幅提升了推理数据质量和模型的 CoT 能力。Qwen3-VL 则在此基础上进一步探索更深层的视觉-语言融合机制。</p>
</blockquote>

<hr />

<h1 id="4-part-iv-qwen3-vl--走向更深层的视觉-语言融合2025">4. Part IV: <a href="https://arxiv.org/abs/2511.21631">Qwen3-VL</a> —— 走向更深层的视觉-语言融合（2025）</h1>

<p>Qwen3-VL 不再仅仅满足于将视觉特征拼接到语言模型的输入端，而是让视觉信息真正的流入到 LLM 的每一层计算中。它的三项核心创新分别解决了位置编码、视觉融合深度和时间感知三个维度的问题。
<img src="/images/Qwen-vl/6.png" alt="" /></p>

<h2 id="41-核心架构创新">4.1. 核心架构创新</h2>

<h3 id="411-interleaved-mrope交错式多维旋转位置编码">4.1.1. Interleaved MRoPE（交错式多维旋转位置编码）</h3>

<ul>
  <li>
    <p><strong>Qwen2.5-VL的做法：</strong>  使用标准的MRoPE。它将位置嵌入维度分块（chunking），分别分配给时间（t）、高度（h）和宽度（w）。</p>
  </li>
  <li>
    <p><strong>存在的问题：</strong>  这种分块方式会导致<strong>频谱不平衡（Imbalanced frequency spectrum）</strong>。即某些空间或时间维度只能接触到特定的频率范围，这会损害模型对长视频的理解能力。</p>
  </li>
  <li>
    <p><strong>Qwen3-VL的创新：</strong>  采用<strong>Interleaved MRoPE</strong>。</p>
    <ul>
      <li>
        <p><strong>方法：</strong>  不再简单分块，而是将时间、高度、宽度的分量**交错（Interleave）**分布在整个嵌入维度中。</p>
      </li>
      <li>
        <p><strong>解决的问题：</strong>  确保了每个时空轴（t, h, w）都能均匀地覆盖低频和高频波段。这显著提升了模型在<strong>长视频理解</strong>和精细空间建模上的表现。</p>
      </li>
    </ul>
  </li>
</ul>

<h3 id="412-deepstack深层视觉融合机制">4.1.2. DeepStack（深层视觉融合机制）</h3>

<ul>
  <li>
    <p><strong>Qwen2.5-VL的做法：</strong>  传统的视觉-语言对齐通常只使用Vision Transformer (ViT) 最后一层的输出，或者通过简单的MLP投影连接到LLM。</p>
  </li>
  <li>
    <p><strong>存在的问题：</strong>  ViT的深层特征虽然语义丰富，但往往丢失了底层的细粒度视觉信息（如纹理、微小物体）。单层融合导致视觉信息损失。</p>
  </li>
  <li>
    <p><strong>Qwen3-VL的创新：</strong>  引入<strong>DeepStack</strong>机制（受Meng et al., 2024启发）。</p>
    <ul>
      <li>
        <p><strong>方法：</strong>  从Vision Encoder（SigLIP-2）的<strong>不同层级（低层到高层）提取视觉Token。这些多层级的Token经过投影后，通过残差连接直接注入到LLM的前三层</strong>中。</p>
      </li>
      <li>
        <p><strong>解决的问题：</strong>  <strong>收紧了视觉与语言的对齐（Tighter alignment）</strong>。模型既能获得高层语义，又能保留低层视觉细节，且<strong>不增加额外的上下文长度</strong>（因为是并行注入而非串行拼接）。</p>
      </li>
    </ul>
  </li>
</ul>

<h3 id="413-explicit-video-timestamp显式文本时间戳">4.1.3. Explicit Video Timestamp（显式文本时间戳）</h3>

<ul>
  <li>
    <p><strong>Qwen2.5-VL的做法：</strong> 使用基于绝对时间的<strong>位置编码</strong>（Time-synchronized MRoPE）来表示时间。</p>
  </li>
  <li><strong>存在的问题：</strong>
    <ul>
      <li>
        <p>对于长视频，产生的位置ID非常大且稀疏，导致模型难以理解长跨度的时间上下文。</p>
      </li>
      <li>
        <p>数据构建成本高，需要均匀采样帧率。</p>
      </li>
    </ul>
  </li>
  <li><strong>Qwen3-VL的创新：</strong>  采用<strong>基于文本的显式时间戳（Textual token-based time encoding）</strong>。
    <ul>
      <li>
        <p>**方法：**使用长度自适应采样 (Length-Adaptive Sampling)，并直接在视频帧组前插入文本格式的时间戳Token（例如 <code class="language-plaintext highlighter-rouge">&lt;3.0 seconds&gt;</code>）。训练时混合使用秒数和HMS（时:分:秒）格式，<strong>秒格式：</strong>  <code class="language-plaintext highlighter-rouge">"&lt;125.5 seconds&gt;</code> <strong>HMS格式：</strong>  <code class="language-plaintext highlighter-rouge">"&lt;00:02:05&gt;"</code></p>
      </li>
      <li>
        <p><strong>解决的问题：</strong>  提供了更直接、更精确的时间感知能力，大幅提升了视频定位（Video Grounding）和密集描述（Dense Captioning）的能力，同时降低了对采样率的敏感度。</p>
      </li>
    </ul>
  </li>
</ul>

<hr />

<h1 id="5-总结与展望">5. 总结与展望</h1>

<h2 id="51-四代模型的技术演进脉络">5.1. 四代模型的技术演进脉络</h2>

<p>回顾 Qwen-VL 系列的四代演进，可以清晰地看到一条从<strong>能看</strong>到<strong>看得好</strong>再到<strong>看得快且深</strong>的技术主线：</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">维度</th>
      <th style="text-align: left">Qwen-VL (2023)</th>
      <th style="text-align: left">Qwen2-VL (2024)</th>
      <th style="text-align: left">Qwen2.5-VL (2025)</th>
      <th style="text-align: left">Qwen3-VL (2025)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><strong>视觉编码器</strong></td>
      <td style="text-align: left">ViT + 固定分辨率</td>
      <td style="text-align: left">ViT + 原生动态分辨率</td>
      <td style="text-align: left">ViT + 窗口注意力</td>
      <td style="text-align: left">SigLIP-2 + DeepStack</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>位置编码</strong></td>
      <td style="text-align: left">绝对位置编码</td>
      <td style="text-align: left">M-RoPE (分块式)</td>
      <td style="text-align: left">M-RoPE + 绝对时间</td>
      <td style="text-align: left">Interleaved MRoPE</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>视频处理</strong></td>
      <td style="text-align: left">不支持</td>
      <td style="text-align: left">3D卷积时空降采样</td>
      <td style="text-align: left">动态FPS采样</td>
      <td style="text-align: left">显式文本时间戳</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>训练范式</strong></td>
      <td style="text-align: left">三阶段渐进训练</td>
      <td style="text-align: left">三阶段（ViT→全参→SFT）</td>
      <td style="text-align: left">五阶段（+长上下文+DPO）</td>
      <td style="text-align: left">延续并深化</td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>核心突破</strong></td>
      <td style="text-align: left">建立基础范式</td>
      <td style="text-align: left">多模态统一位置编码</td>
      <td style="text-align: left">工程效率与数据质量</td>
      <td style="text-align: left">深层视觉融合</td>
    </tr>
  </tbody>
</table>

<h2 id="52-关键设计哲学">5.2. 关键设计哲学</h2>

<p>纵观整个系列，有几条贯穿始终的设计哲学值得特别关注：</p>

<ol>
  <li>
    <p><strong>渐进式训练的稳定性优先</strong>：每一代都严格遵循「先冻结后解冻」的训练策略，确保每个模块在被联合训练之前已经具备足够的基础能力。</p>
  </li>
  <li>
    <p><strong>统一的序列化范式</strong>：无论是定位坐标、OCR文本还是视频时间戳，所有信息都被统一表示为文本序列，充分利用了 LLM 的序列建模能力。</p>
  </li>
  <li>
    <p><strong>从相对到绝对的时间感知</strong>：时间编码经历了「无时间→相对帧索引→绝对时间位置编码→显式文本时间戳」的演进，每一步都让模型对时间的理解更加直接和精确。</p>
  </li>
  <li>
    <p><strong>数据质量驱动的能力提升</strong>：从简单的图文对到拒绝采样生成的 CoT 数据，数据工程的精细化程度与模型能力的提升高度正相关。</p>
  </li>
</ol>

<h2 id="53-展望">5.3. 展望</h2>

<p>Qwen-VL 系列的演进为我们提供了一个观察多模态大模型发展趋势的绝佳窗口。从 Qwen3-VL 的 DeepStack 机制可以看到，未来的方向正在从「在 LLM 前面接一个视觉编码器」转向「让视觉信息深度参与语言模型的每一层计算」。随着视觉与语言的融合越来越深入，多模态模型与纯语言模型之间的界限也将越来越模糊。
期待 Qwen-VL 系列的下一步演进。</p>

<hr />

<p><br /></p>

<h1 id="6-延伸阅读">6. 延伸阅读</h1>

<p>如果你对本文涉及的技术细节感兴趣，以下论文值得进一步阅读：
<strong>视觉</strong><strong>编码器</strong><strong>基础</strong></p>

<ul>
  <li>
    <p><a href="https://arxiv.org/abs/2010.11929">An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale</a> (ViT, Dosovitskiy et al., 2020) —— Qwen-VL 全系列所依赖的视觉编码器骨干，开创了将 Transformer 直接应用于图像 patch 序列的范式。</p>
  </li>
  <li>
    <p><a href="https://arxiv.org/abs/2103.14030">Swin Transformer: Hierarchical Vision Transformer using Shifted Windows</a> (Liu et al., 2021) —— 文中讨论 Qwen2.5-VL 窗口注意力时的重要对比对象，其 Shifted Window 机制与 Qwen2.5-VL 的 2D-RoPE 窗口注意力形成有趣对照。</p>
  </li>
  <li>
    <p><a href="https://arxiv.org/abs/2303.15343">Sigmoid Loss for Language Image Pre-Training</a> (SigLIP, Zhai et al., 2023) —— Qwen3-VL 将视觉编码器从 ViT 切换为 SigLIP-2，SigLIP 用 sigmoid 损失替代 softmax 对比损失，在效率和性能上带来显著提升。</p>
  </li>
</ul>

<p><strong>位置编码</strong><strong>与</strong><strong>序列建模</strong></p>

<ul>
  <li>
    <p><a href="https://arxiv.org/abs/2104.09864">RoFormer: Enhanced Transformer with Rotary Position Embedding</a> (Su et al., 2021) —— M-RoPE 的理论基础，旋转位置编码（RoPE）已成为现代大模型的标准组件，Qwen-VL 系列将其创造性地扩展到多模态场景。</p>
  </li>
  <li>
    <p><a href="https://arxiv.org/abs/2103.15691">ViViT: A Video Vision Transformer</a> (Arnab et al., 2021) —— 理解 Qwen2-VL 3D 卷积时间降采样设计的重要参考，探索了将 ViT 扩展到视频理解的多种架构方案。</p>
  </li>
</ul>

<p><strong>视觉-语言融合架构</strong></p>

<ul>
  <li>
    <p><a href="https://arxiv.org/abs/2204.14198">Flamingo: a Visual Language Model for Few-Shot Learning</a> (Alayrac et al., 2022) —— 多模态大模型的里程碑工作，其 cross-attention 融合机制是理解 Qwen3-VL DeepStack 深层视觉融合的重要背景。</p>
  </li>
  <li>
    <p><a href="https://arxiv.org/abs/2406.04334">DeepStack: Deeply Stacking Visual Tokens is Surprisingly Simple and Effective for LMMs</a> (Meng et al., 2024) —— Qwen3-VL 核心创新之一，通过将视觉 token 分组注入 LLM 不同层实现深层融合，本文 Part IV 有详细解析。</p>
  </li>
  <li>
    <p><a href="https://arxiv.org/abs/2304.08485">Visual Instruction Tuning</a> (LLaVA, Liu et al., 2023) —— 视觉指令微调的开创性工作，确立了「视觉编码器 + 投影层 + LLM」的经典多模态架构范式，也是 Qwen-VL 系列架构设计的重要参照。</p>
  </li>
</ul>

<p><strong>训练策略与对齐</strong></p>

<ul>
  <li>
    <p><a href="https://arxiv.org/abs/2305.18290">Direct Preference Optimization: Your Language Model is Secretly a Reward Model</a> (DPO, Rafailov et al., 2023) —— Qwen2.5-VL 训练流程的关键技术，跳过显式奖励模型直接从偏好数据优化策略，本文 Part III 中有详细讨论。</p>
  </li>
  <li>
    <p><a href="https://arxiv.org/abs/2401.10020">Self-Rewarding Language Models</a> (Yuan et al., 2024) —— 与 Qwen2.5-VL 的拒绝采样策略密切相关，探索了让模型自我评估和迭代提升的训练范式。</p>
  </li>
</ul>

<p><strong>动态分辨率处理</strong></p>

<ul>
  <li><a href="https://arxiv.org/abs/2307.06304">Patch n’ Pack: NaViT, a Vision Transformer for any Aspect Ratio and Resolution</a> (Dehghani et al., 2023) —— 理解 Qwen2-VL 原生动态分辨率设计的重要参考，NaViT 通过 sequence packing 实现任意分辨率输入，与 Qwen 系列的动态分辨率方案异曲同工。</li>
</ul>

<p><strong>同期竞品对比</strong></p>

<ul>
  <li><a href="https://arxiv.org/abs/2312.14238">InternVL: Scaling up Vision Foundation Models and Aligning for Generic Visual-Linguistic Tasks</a> (Chen et al., 2023) —— 将视觉编码器扩展到 6B 参数的代表性工作，与 Qwen-VL 系列在架构设计和训练策略上形成有意义的对比。</li>
</ul>

<p><br /></p>

<p><strong>特别推荐：旋转</strong><strong>位置编码</strong><strong>（RoPE）的提出者苏剑林先生的个人博客</strong> <strong><a href="https://spaces.ac.cn/">科学空间</a></strong><strong>，其中对 RoPE 的数学推导、NTK-aware 外推、多</strong><strong>模态</strong><strong>位置编码扩展等主题有极为深入且直觉友好的讲解，是理解本文 M-RoPE 及其各代变体不可多得的中文参考资源，此外苏剑林先生的每一篇文章都非常值得仔细拜读，干活满满</strong>
<br /></p>

<p><em>本文为个人论文阅读笔记整理，如有疏漏欢迎指正。</em></p>]]></content><author><name>Yunpeng Zhang</name><email>yunpengZhangup@outlook.com</email></author><category term="VLM" /><category term="Qwen" /><category term="Multimodal" /><summary type="html"><![CDATA[TL;DR: 本文系统梳理了 Qwen-VL 系列四代视觉语言模型的技术演进——从基础的视觉-语言对齐（Qwen-VL），到原生动态分辨率与多模态位置编码（Qwen2-VL），再到工程级推理效率优化（Qwen2.5-VL），最终走向更深层的视觉-语言融合（Qwen3-VL）。]]></summary></entry><entry><title type="html">CapRL: 用强化学习激发视觉语言模型的描述能力</title><link href="https://zyp-up.github.io/posts/2026/03/CapRL/" rel="alternate" type="text/html" title="CapRL: 用强化学习激发视觉语言模型的描述能力" /><published>2026-03-18T00:00:00+00:00</published><updated>2026-03-18T00:00:00+00:00</updated><id>https://zyp-up.github.io/posts/2026/03/blog-CapRL</id><content type="html" xml:base="https://zyp-up.github.io/posts/2026/03/CapRL/"><![CDATA[<blockquote>
  <p><strong>Paper</strong>: <a href="https://arxiv.org/pdf/2509.22647">CapRL: Stimulating Dense Image Caption Capabilities via Reinforcement Learning</a> (CVPR 2025)<br />
<strong>Authors</strong>: Xing et al.<br />
<strong>TL;DR</strong>: CapRL提出了一种新颖的强化学习框架，通过将主观的”描述好不好”问题转化为客观的”问题能否答对”问题，有效解决了图像描述任务中的reward hacking难题，显著提升了模型生成稠密、准确（Dense and Accurate）描述的能力。</p>
</blockquote>

<hr />

<h1 id="1-引言一个简单任务的深层挑战">1. 引言：一个“简单”任务的深层挑战</h1>

<p>图像描述（Image Captioning）看似是一个直观的任务——给定一张图片，让模型生成一段描述文字。然而，当我们追问”什么样的描述才是好的描述”时，事情变得复杂起来。这篇论文致力于解决图像描述生成领域的一个核心难题：如何让模型生成既信息丰富（Dense）<strong>又</strong>准确无误（Accurate）的图像描述。
传统方法通常采用<strong>监督式微调（</strong><strong>SFT</strong><strong>）</strong>，让模型学习”模仿”人类标注的描述。但这种方法面临几个根本性问题：
<img src="/images/CapRL/0.png" alt="" />
<img src="/images/CapRL/1.png" alt="" /></p>

<ul>
  <li>
    <p><strong>成本高昂且扩展性差</strong>：获取大规模、高质量的标注数据既昂贵又耗时，限制了模型的进一步发展。</p>
  </li>
  <li>
    <p><strong>缺乏泛化性和创造性</strong>：模型倾向于“背诵”训练数据中的特定描述，导致生成的描述比较单一，难以覆盖同一张图片可能存在的多种合理解释，创造性和多样性不足。</p>
  </li>
  <li>
    <p><strong>主观性难题</strong>：对于同一张图片，什么样的描述才算“好”本身就是一个主观问题。传统的评价指标（如BLEU、ROUGE）难以评估描述的丰富性和准确性。</p>
  </li>
</ul>

<p>为了克服SFT的局限性，研究者自然想到用强化学习（RL）来打破这些限制——让模型在探索中学习，而非死记硬背。但这引出了一个更棘手的问题：<strong>如何定义</strong><strong>奖励函数</strong><strong>（Reward Function）？</strong></p>

<hr />

<h1 id="2-现有rl方法的困境reward-hacking">2. 现有RL方法的困境：Reward Hacking</h1>

<p>早期的尝试，例如使用另一个大型视觉语言模型（LVLM）作为“裁判”（LVLM-as-a-Judge）来打分，被证明存在固有的偏见（例如，可能偏爱更长或更简短的描述），容易发生Reward Hacking，导致训练不稳定甚至崩溃。
<img src="/images/CapRL/2.png" alt="" /></p>

<h2 id="21-裁判的偏见">2.1 “裁判”的偏见</h2>

<p>任何模型都有其内在偏好：</p>

<ul>
  <li>
    <p><strong>通用LVLM</strong>往往偏爱冗长、详细的描述</p>
  </li>
  <li>
    <p><strong>通用</strong><strong>奖励模型</strong>可能被训练得偏好简洁的输出</p>
  </li>
</ul>

<h2 id="22-策略模型的钻空子">2.2 策略模型的”钻空子”</h2>

<p>聪明的策略模型很快学会了利用裁判的偏见：</p>

<pre><code class="language-undefined"># 面对偏爱冗长的裁判
输出: "我的描述组织得很好，结构很完善，首先我要说明..."
结果: 高分！但完全没描述图像内容

# 面对偏爱简洁的裁判  
输出: "图中有三只动物"
结果: 高分！但信息量极低
</code></pre>

<p>这就是臭名昭著的<strong>Reward Hacking</strong>——模型找到了获取高奖励的”捷径”，却完全偏离了我们的真实目标。
更糟糕的是，这种现象会导致训练过程极不稳定，甚至<strong>训练崩溃（Training Collapse）</strong>。因此，<strong>该论文的核心目标是为图像描述任务设计一个客观、可验证且可扩展的</strong><strong>强化学习</strong><strong>框架，从而激发模型生成更密集、更准确描述的能力</strong>。</p>

<hr />

<h1 id="3-caprl的核心洞见">3. CapRL的核心洞见</h1>

<p>CapRL提出了一个精妙的思路来重新定义”好描述”：</p>

<blockquote>
  <p><strong>一个高质量的图像描述，应该能让一个无法看到图像的纯</strong><strong>语言模型</strong><strong>，仅凭该描述就能准确回答关于图像的各种问题。</strong></p>
</blockquote>

<p>这个定义的巧妙之处在于：</p>

<ol>
  <li>
    <p><strong>客观可验证</strong>：问题回答对错是二元的，没有主观模糊空间</p>
  </li>
  <li>
    <p><strong>难以作弊</strong>：无法通过套话获得高分，必须包含实质信息</p>
  </li>
  <li>
    <p><strong>自然鼓励稠密性</strong>：覆盖更多细节 → 能回答更多问题 → 更高奖励</p>
  </li>
</ol>

<p><img src="/images/CapRL/3.png" alt="" /></p>

<h2 id="a-subjective-caption-reward-主观的描述奖励---阐述问题">(a) Subjective Caption Reward (主观的描述奖励) - 阐述问题</h2>

<p>这部分展示了当前主流的、基于“裁判模型”（LVLM as a Judge）的强化学习方法及其固有缺陷。</p>

<ul>
  <li>
    <p><strong>流程</strong>：一个强化学习智能体（Reinforcement Learning Agent）生成一个图像描述（Caption）。然后，这个描述被发送给一个大型视觉语言模型（LVLM as a Judge），这个“裁判”模型会根据图像给描述打一个主观的综合分数，这个分数作为奖励（Reward）返回给智能体，指导其后续学习。</p>
  </li>
  <li><strong>核心缺陷：内在偏见 (Inherent</strong> <strong>Bias</strong><strong>)</strong>：这个“裁判”本身是有偏见的。
    <ul>
      <li>
        <p>有些通用的LVLM可能<strong>偏爱更详细、更冗长的描述 (Prefer Verbosity)</strong>。</p>
      </li>
      <li>
        <p>有些通用的奖励模型（Unified Reward Model）可能经过训练后<strong>偏爱更简洁的描述 (Prefer Brevity)</strong>。</p>
      </li>
    </ul>
  </li>
  <li><strong>结果：Reward Hacking</strong>：policy模型发现并利用“裁判”的这些偏见来“钻空子”，而不是真正学习如何生成好的描述。
    <ul>
      <li>
        <p>为了迎合偏爱冗长的裁判，模型会生成一些“冗长但无关” (Lengthy Irrelevant) 的描述，比如“我的描述组织得很好，结构很完善…”，这些话术虽然能得到高分，但完全没有描述图像内容。</p>
      </li>
      <li>
        <p>为了迎合偏爱简洁的裁判，模型会生成“简短但不完整” (Brief Incomplete) 的描述，比如“图中有三只动物”，信息量极低。</p>
      </li>
    </ul>
  </li>
</ul>

<h2 id="b-objective-caption-reward-ours-客观的描述奖励---我们的方法---提出方">(b) Objective Caption Reward (Ours) (客观的描述奖励 - 我们的方法) - 提出方</h2>

<p>这部分详细介绍了论文提出的CapRL方法，它构建了一个客观、可验证的奖励机制。</p>

<ul>
  <li>
    <p><strong>核心思想：通过</strong><strong>解耦</strong><strong>的视觉问答（Decoupled</strong> <strong>VQA</strong><strong>）来验证奖励</strong>。<strong>一个好的描述，应该能让一个看不见图像的模型仅凭描述就能回答关于图像的问题。</strong></p>
  </li>
  <li>
    <p><strong>优势：难以被攻击 (Hard to Hack)</strong>：智能体无法通过生成无关的套话来获得高分。它必须生成包含问题答案所需信息的“密集且全面” (Dense and Comprehensive) 的描述，才能让LLM正确回答问题。CapRL方法将主观的“描述好不好”问题，巧妙地转化为了客观的“问题能否答对”的问题，从而创建了一个稳健、可靠的奖励信号。</p>
  </li>
</ul>

<h2 id="c-training-curve-and-caption-quality-comparison-训练曲线和描述质量对比---验证效果">(c) Training Curve and Caption Quality Comparison (训练曲线和描述质量对比) - 验证效果</h2>

<p>这部分通过实验数据，从“过程”和“结果”两个维度证明了CapRL方法的优越性。</p>

<ul>
  <li><strong>左侧图（Reward/奖励曲线）和中间图（Caption Length/描述长度曲线）</strong>：展示了训练过程的稳定性。
    <ul>
      <li>
        <p><strong>蓝色曲线 (Qwen2.5-VL-3B as a Judge)</strong>：奖励迅速达到1.0，但描述长度也急剧增加。这完美印证了(a)中提到的“奖励被攻击”，模型通过生成冗长无用的内容轻易获得了满分奖励。</p>
      </li>
      <li>
        <p><strong>橙色曲线 (Unified</strong> <strong>Reward Model</strong> <strong>as a Judge)</strong>：训练非常不稳定，奖励在上升后突然“训练崩溃” (Training collapse)，描述长度也骤降到几乎为零。</p>
      </li>
      <li>
        <p><strong>红色曲线 (Our CapRL)</strong>：奖励曲线平滑、稳定地增长，没有被轻易“攻击”，描述长度也保持在一个合理的范围内。这表明CapRL提供了一个有意义且稳定的学习信号。</p>
      </li>
    </ul>
  </li>
  <li><strong>右侧雷达图 (Performance in</strong> <strong>Prism</strong> <strong>Framework)</strong>：展示了最终模型的性能。
    <ul>
      <li>
        <p>这是一个在多个基准测试（如ChartQA, MathVerse, SEED等）上的性能对比图，<strong>越靠外圈表示性能越好</strong>。</p>
      </li>
      <li>
        <p><strong>红色线 (Our CapRL)</strong> 在几乎所有维度上都显著优于其他模型，包括作为基线的原始模型（绿色）、以及其他两种奖励模型（蓝色和橙色）。</p>
      </li>
    </ul>
  </li>
</ul>

<p><strong>小结</strong>：这部分用数据证明，相比于现有的主观奖励方法，CapRL不仅训练过程更稳定，而且最终训练出的模型在各项任务上性能也更强大。</p>

<h1 id="4-高质量mcq数据集构建">4. 高质量MCQ数据集构建</h1>

<p>由于奖励机制的有效性高度依赖于问答数据的质量。研究团队首先构建了一个高质量的、与图像内容紧密相关的<strong>多项选择题问答（Multiple-Choice Questions, MCQs）数据集</strong>。这个数据集经过了严格的筛选，确保问题必须依靠图像信息才能回答，排除了仅靠常识或问题本身线索就能解答的“泄露”问题。</p>

<h2 id="41-第一阶段图像收集-image-collection">4.1 第一阶段：图像收集 (Image Collection)</h2>

<p>这一步的目标是确保图像的<strong>多样性、高质量和安全性</strong>。</p>

<ul>
  <li><strong>来源</strong>：从多个渠道收集图像，以确保模型能够处理各种类型的视觉信息。主要来源包括：
    <ul>
      <li>
        <p><strong>现有的高质量开源数据集</strong>：如ShareGPT4V-1M和DenseFusion-1M，这些数据集本身已经经过了一轮筛选。</p>
      </li>
      <li>
        <p><strong>网络搜集</strong>：涵盖了自然照片、文档、图表、用户界面等多种类别。</p>
      </li>
    </ul>
  </li>
  <li><strong>质量和安全过滤</strong>：对收集到的图像进行严格的过滤，去除低分辨率、过于简单、或包含暴力、色情等不安全内容的图片。同时，他们还移除了与常见评测基准中的图像高度相似的图片，以防止数据泄露（Benchmark Leakage）。</li>
</ul>

<h2 id="42-第二阶段问答对生成-qa-generation">4.2 第二阶段：问答对生成 (QA Generation)</h2>

<p>在收集好图像之后，为每张图片生成相应的问题和答案.</p>

<ul>
  <li>
    <p><strong>生成模型</strong>：使用 <strong>Qwen2.5-VL-72B</strong></p>
  </li>
  <li>
    <p><strong>生成过程</strong>：对于数据集中的每一张图片，将图片输入Qwen2.5-VL-72B，并提示它生成多个与图片内容相关的多项选择题及其正确答案。</p>
  </li>
</ul>

<p><img src="/images/CapRL/4.png" alt="" /></p>

<h2 id="43-第三阶段问答对筛选-qa-filtering">4.3 第三阶段：问答对筛选 (QA Filtering)</h2>

<p>这是整个流程中最核心、最巧妙的一步。其目标是<strong>消除信息泄露（Information Leakage）</strong>，确保每个留下的问题都<strong>必须通过看图才能回答</strong>。
“信息泄露”指的是，有些问题仅凭常识或问题本身的措辞就能回答，并不需要看图。例如，一张包含“Eiffel Tower”标志的图片，如果问题是“What is the capital of France?”，那么模型不需要看图就能回答“Paris”。这种问题对于评估描述质量是无效的。为了解决这个问题，设计了一个<strong>一正一反的双重验证机制</strong>：</p>

<ul>
  <li><strong>正向验证 (保证问题可答)</strong>：
    <ul>
      <li>
        <p><strong>测试方法</strong>：将“图片 + 问题”*一同输入给一个LVLM（论文中提到为了节约成本，筛选时用的是Qwen2.5-VL-3B）。</p>
      </li>
      <li>
        <p><strong>通过条件</strong>：模型<strong>必须能够正确回答</strong>问题。这确保了问题与图片内容相关，并且答案可以在图片中找到。</p>
      </li>
    </ul>
  </li>
  <li><strong>反向验证 (保证视觉依赖)</strong>：
    <ul>
      <li>
        <p><strong>测试方法</strong>：<strong>只将“问题”</strong> 输入给同一个LVLM，不给它看图片。</p>
      </li>
      <li>
        <p><strong>通过条件</strong>：模型<strong>必须回答错误</strong>。这确保了问题不能仅凭语言逻辑或常识来回答，图像信息是回答问题的<strong>必要条件</strong>。</p>
      </li>
    </ul>
  </li>
</ul>

<p><strong>一个问答对</strong> <strong><code class="language-plaintext highlighter-rouge">(q, a)</code></strong> <strong>只有同时满足以上两个条件才会被保留下来。</strong> 
用论文中的公式表达就是：
<img src="/images/CapRL/5.png" alt="" /></p>

<ul>
  <li>
    <p><code class="language-plaintext highlighter-rouge">Q</code> 是最终筛选出的数据集</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">(q, a)</code> 是一个问答对</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">D</code> 是初始生成的总数据集</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">Mv(q, I) = a</code> 表示模型在看到图片<code class="language-plaintext highlighter-rouge">I</code>和问题<code class="language-plaintext highlighter-rouge">q</code>时，能答对答案<code class="language-plaintext highlighter-rouge">a</code>（正向验证）</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">Mv(q) ≠ a</code> 表示模型只看到问题<code class="language-plaintext highlighter-rouge">q</code>时，答不对答案<code class="language-plaintext highlighter-rouge">a</code>（反向验证）</p>
  </li>
</ul>

<h1 id="5-方法详解">5. 方法详解</h1>

<p>既然CapRL的核心思想是：<strong>重新定义“好”描述的标准，</strong> 一个高质量的图像描述，应该能让一个<strong>无法看到图像的纯</strong><strong>语言模型</strong><strong>（vision-free</strong> <strong>LLM</strong><strong>）</strong> 仅凭该描述就能准确回答关于这幅图像的各种问题。那么基于这个思想，我们可以设计一个解耦的<strong>两阶段流程</strong>来生成客观的奖励信号，并以此来训练图像描述模型。
<img src="/images/CapRL/6.png" alt="" /></p>

<h2 id="51-第一阶段lvlm生成图像描述-caption-generation">5.1 第一阶段：LVLM生成图像描述 (Caption Generation)</h2>

<p>在这个阶段，一个大型视觉语言模型（LVLM），也就是我们需要训练策略模型（Policy Model，论文中为Qwen2.5-VL-3B），会接收一张输入的图像，并根据指令（例如“详细描述这张图片”）生成一段候选的图像描述。</p>

<h2 id="52-第二阶段vision-free-llm回答问题以评估描述质量-reward-calculation">5.2 第二阶段：Vision-Free LLM回答问题以评估描述质量 (Reward Calculation)</h2>

<p>将第一阶段生成的候选描述，与该图像对应的MCQ（详见<a href="#4-高质量mcq数据集构建">第 4 章节</a>），一同输入到一个<strong>独立的、无法访问图像的纯文本</strong><strong>大语言模型</strong><strong>（</strong><strong>LLM</strong><strong>）</strong><strong>Qwen2.5-3B-instruct</strong> 中，注意这里是<strong>纯文本大语言模型（LLM）</strong>，它是看不到图像的，这一步完成了RL中的VQA奖励机制的解耦。
<img src="/images/CapRL/7.png" alt="" /></p>

<h2 id="53-奖励计算">5.3 奖励计算</h2>

<p>这个纯文本LLM会仅根据候选描述来尝试回答问题。它的<strong>回答准确率</strong>就被直接用作奖励信号。如果LLM能够根据描述正确回答问题，就给予一个正向奖励（例如+1）；反之，则为0。为了保证奖励的稳定性，模型会针对一张图片的多个问题进行回答，并计算平均准确率作为最终的奖励分数。</p>

<p>对于生成的描述 \(c\) 和问题集合 \(\{q_1, q_2, ..., q_n\}\)：</p>

\[R(c) = \frac{1}{n}\sum_{i=1}^{n}\mathbb{1}\left[\text{LLM}(c, q_i) = a_i\right]\]

<p>其中：</p>
<ul>
  <li>\(c\) 是生成的图像描述</li>
  <li>\(q_1, q_2, ..., q_n\) 是对应的问题集合</li>
  <li>\(a_i\) 是第 \(i\) 个问题的正确答案</li>
  <li>\(\mathbb{1}[\cdot]\) 是示性函数（当条件为真时取1，否则取0）</li>
</ul>

<p>即：纯文本LLM根据描述回答所有问题的平均准确率。
通过这种方式，CapRL成功地将一个主观的“描述好不好”的问题，转化为了一个客观的“问题能不能答对”的问题。一个描述如果包含了图像中更多的细节、更准确地刻画了物体间的关系，那么纯文本LLM依据它来回答问题的准确率自然就更高，从而获得更高的奖励。</p>

<h2 id="54-模型优化与训练">5.4 模型优化与训练</h2>

<p>有了客观的奖励信号后，CapRL使用<strong>GRPO</strong>算法来更新图像描述模型（即第一阶段的LVLM）。模型会不断尝试生成新的描述，并通过第二阶段的奖励机制获得反馈，从而学习如何生成能够获得更高奖励（即更高问答准确率）的描述。
整个流程形成了一个闭环：<strong>生成描述 -&gt; 客观评估 -&gt; 获得奖励 -&gt; 优化模型 -&gt; 生成更好的描述</strong>。</p>

<h1 id="6-caprl解决了什么问题">6. CapRL解决了什么问题？</h1>

<p>总的来说，CapRL框架主要解决了以下几个关键问题：</p>

<ol>
  <li>
    <p><strong>克服了</strong><strong>SFT</strong><strong>的局限性</strong>：通过强化学习，模型不再局限于模仿固定的标注答案，而是可以在探索中学习生成更多样化、更具创造性的高质量描述，摆脱了对昂贵标注数据的依赖。</p>
  </li>
  <li>
    <p><strong>解决了主观任务的客观奖励设计难题</strong>：CapRL创新性地利用“下游任务（回答问题）”的性能来定义和量化一个开放式、主观任务（生成描述）的质量，创建了一个稳健、客观且不易被攻击的奖励机制。</p>
  </li>
  <li>
    <p><strong>提升了描述的信息密度和准确性</strong>：由于奖励直接与描述能否支持回答具体问题挂钩，该框架能有效激励模型关注并描述图像中的关键细节和复杂关系，从而生成信息更丰富、事实更准确的描述。从论文的图2可以看出，经过CapRL训练后，模型对图表和复杂场景的描述在结构、覆盖范围和准确性上都有了显著提升。</p>
  </li>
  <li>
    <p><strong>实现了可扩展的训练范式</strong>：CapRL的整个流程是自动化的，可以大规模地应用于各种图像数据，为训练更强大的视觉语言模型提供了一条高效且低成本的路径。</p>
  </li>
</ol>

<h1 id="7-深层思考">7. 深层思考</h1>

<h2 id="71-为什么caprl能够奏效">7.1 为什么CapRL能够奏效？</h2>

<p>CapRL的成功并非偶然，其背后蕴含着几个值得深思的设计原则：
<strong>奖励与任务本质的对齐</strong>：图像描述的核心目标是<strong>信息传递</strong>——将视觉信息无损地转化为文字信息。传统的主观评分试图直接评价「描述写得好不好」，而CapRL则巧妙地转向评价「信息传递得完不完整」。通过问答验证，它直接度量了描述对原始视觉信息的保真程度。
<strong>将开放问题转化为封闭验证</strong>：「生成好的描述」是一个开放性任务，难以定义边界；而「回答问题是否正确」是一个封闭性验证，答案非对即错。这种转化消除了奖励信号中的主观模糊性，使得强化学习的优化目标变得清晰可追踪。
<strong>解耦</strong><strong>设计的</strong><strong>鲁棒性</strong>：通过将「生成」与「评估」解耦到两个独立模型，CapRL避免了单一模型自我评价时的内在偏见。纯文本LLM作为评估者，天然无法被视觉无关的「套话」所欺骗。</p>

<h2 id="72-方法论的普适性">7.2 方法论的普适性</h2>

<p>CapRL的核心思想——<strong>通过下游任务的表现来定义上游任务的质量</strong>——具有广泛的迁移潜力：</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">任务</th>
      <th style="text-align: left">类比应用</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">文档摘要</td>
      <td style="text-align: left">好的摘要应能支持回答关于原文的问题</td>
    </tr>
    <tr>
      <td style="text-align: left">知识图谱构建</td>
      <td style="text-align: left">好的KG应能支持多跳推理查询</td>
    </tr>
    <tr>
      <td style="text-align: left">代码文档生成</td>
      <td style="text-align: left">好的文档应能帮助开发者正确使用API</td>
    </tr>
    <tr>
      <td style="text-align: left">数据标注</td>
      <td style="text-align: left">好的标注应能支持下游模型的准确预测</td>
    </tr>
  </tbody>
</table>

<p>这种思路的本质是：<strong>当直接评价质量困难时，转而评价其功能性表现</strong>。</p>

<h2 id="73-局限性与未来方向">7.3 局限性与未来方向</h2>

<p>尽管CapRL展现了显著的优势，仍有几点值得关注：
<strong>MCQ覆盖范围的偏见</strong>：模型的「注意力分配」受限于问题集的设计。如果问题集偏重某类信息（如物体识别），模型可能忽视其他维度（如氛围、情感）。未来可探索更多样化的问题生成策略。
<strong>描述质量的多维性</strong>：问答准确率主要衡量信息完整性，但优秀的描述还应具备流畅性、可读性、逻辑组织等特质。如何在奖励函数中平衡这些维度，是一个开放问题。
<strong>评估模型的能力天花板</strong>：纯文本LLM的推理能力和指令遵循能力直接影响奖励信号的质量。随着LLM能力的提升，CapRL的效果有望进一步增强。
<strong>计算开销</strong>：两阶段的解耦设计增加了推理成本，如何在保持奖励质量的同时提升效率，值得探索。</p>

<hr />

<h1 id="8-总结">8. 总结</h1>

<p>CapRL为图像描述任务的强化学习训练提供了一个优雅而实用的解决方案。</p>

<h2 id="81-核心贡献">8.1 核心贡献</h2>

<ol>
  <li>
    <p><strong>提出了可验证奖励范式</strong>：将主观的描述质量评估转化为客观的问答验证，从根本上解决了Reward Hacking问题</p>
  </li>
  <li>
    <p><strong>设计了</strong><strong>鲁棒</strong><strong>的数据筛选机制</strong>：通过一正一反的双重验证，确保问题集的质量和有效性</p>
  </li>
  <li>
    <p><strong>实现了稳定可扩展的训练</strong>：无需人工标注，可大规模自动化训练</p>
  </li>
</ol>

<h2 id="82-更广泛的启示">8.2 更广泛的启示</h2>

<p>这篇工作的价值不仅在于图像描述任务本身，更在于它展示了一种<strong>务实的</strong><strong>RL</strong><strong>奖励设计哲学</strong>：</p>

<blockquote>
  <p>与其试图直接量化主观质量，不如找到一个客观可验证的代理指标，让它自然地引导模型向正确方向优化。</p>
</blockquote>

<p>这一原则在当前大模型强化学习的研究浪潮中尤为重要。无论是RLHF、RLAIF还是RLVR，如何设计一个既能真实反映任务目标、又不易被模型「游戏」的奖励函数，始终是核心挑战之一。CapRL的设计思路为这一问题提供了有益的参考。</p>

<hr />

<h1 id="9-延伸阅读">9. 延伸阅读</h1>
<p>如果你对RLHF和奖励模型设计感兴趣，以下工作值得进一步了解：</p>

<ul>
  <li>
    <p><strong>RLAIF</strong>：<a href="https://arxiv.org/abs/2212.08073">Constitutional AI</a>, Anthropic 2023 —— 使用AI反馈替代人类反馈</p>
  </li>
  <li>
    <p><strong>RLVR</strong>：<a href="https://arxiv.org/abs/2501.12948">DeepSeek-R1</a> —— 基于可验证奖励的强化学习</p>
  </li>
  <li>
    <p><strong>Self-Rewarding LM</strong>：<a href="https://arxiv.org/abs/2401.10020">Meta 2024</a> —— 让模型自我评判以实现迭代改进</p>
  </li>
</ul>]]></content><author><name>Yunpeng Zhang</name><email>yunpengZhangup@outlook.com</email></author><category term="VLM" /><category term="RL" /><summary type="html"><![CDATA[Paper: CapRL: Stimulating Dense Image Caption Capabilities via Reinforcement Learning (CVPR 2025) Authors: Xing et al. TL;DR: CapRL提出了一种新颖的强化学习框架，通过将主观的”描述好不好”问题转化为客观的”问题能否答对”问题，有效解决了图像描述任务中的reward hacking难题，显著提升了模型生成稠密、准确（Dense and Accurate）描述的能力。]]></summary></entry></feed>