1.7 KiB
1.7 KiB
title, created, updated, type, tags, sources
| title | created | updated | type | tags | sources | ||||
|---|---|---|---|---|---|---|---|---|---|
| Position ID Discrepancy (位置 ID 偏差) | 2025-06-02 | 2025-06-02 | concept |
|
|
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 分配:
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 后,模拟上下文)