---
title: "Position ID Discrepancy (位置 ID 偏差)"
created: 2025-06-02
updated: 2025-06-02
type: concept
tags: [position-encoding, multi-turn-reasoning, training]
sources: ["[[goru-one-pass-to-reason-2025]]"]
---

# Position ID Discrepancy

> 在多轮推理训练中，回复 token 在"生成时刻"与"作为上下文"两种场景下的位置不一致问题。

## 问题

考虑第 i 轮对话：

**生成时刻**（训练时的前向传播）：
```
... hi-1, ri-1, hi, [ti, ri] ← ri 跟在 ti 后面
```
ri 的绝对位置：`length(H_{<i}) + |hi| + |ti|`

**作为上下文时刻**（后续轮次训练时）：
```
... hi-1, ri-1, hi, ri, hi+1, ... ← ri 直接跟在 hi 后面，ti 已丢弃
```
ri 的绝对位置：`length(H_{<i}) + |hi|`

同一 token 在不同场景中有不同的位置编码 → 如果不加处理，模型学到的位置关系是错的。

## 根本原因

这是 [[multi-turn-reasoning|多轮推理]] 的特有现象：
- 普通多轮对话没有推理 token → ri 的位置始终一致
- 推理对话中 ti 被丢弃 → ri 的位置在两种场景中不同

## One-Pass to Reason 的解决方案

通过 [[token-duplication]] + 策略性位置 ID 分配：

```python
s_ti = s_ri_in = e_hi + 1       # ti 和 ri_in 共享同一位置起点
s_ri_out = e_ti + 1              # ri_out 从 ti 之后开始（模拟生成场景）
s_h_{i+1} = e_ri_in + 1          # 下一轮从 ri_in 后开始（模拟上下文场景）
```

这个分配方案确保：
- ri_out 与 ti 的相对位置关系正确（模拟生成）
- 后续轮次看到的位置关系正确（ri_in 在 hi 后，模拟上下文）

## 相关

- [[token-duplication]]
- [[multi-turn-reasoning]]
- [[position-encoding]]
- [[goru-one-pass-to-reason-2025|One-Pass to Reason 论文]]
