50 lines
1.7 KiB
Markdown
50 lines
1.7 KiB
Markdown
---
|
||
title: "Token Duplication (Token 复制)"
|
||
created: 2025-06-02
|
||
updated: 2025-06-02
|
||
type: concept
|
||
tags: [training-optimization, attention-mask, multi-turn-reasoning]
|
||
sources: ["[[goru-one-pass-to-reason-2025]]"]
|
||
---
|
||
|
||
# Token Duplication
|
||
|
||
> 在多轮推理训练的 [[one-pass-fine-tuning|单遍微调]] 中,将每个助手回复的 response token 复制为两份以解决可见性冲突的技术。
|
||
|
||
## 为什么需要复制
|
||
|
||
推理模型的多轮对话中存在一个根本矛盾:
|
||
|
||
- **生成时**:ri 必须能关注 ti(推理 token)来产生正确回复
|
||
- **作为上下文时**:ri 不应关注 ti(推理 token 已被丢弃)
|
||
|
||
单一 token 序列无法同时满足这两个条件 → 需要两份副本。
|
||
|
||
## 两份副本的角色
|
||
|
||
| 副本 | 符号 | 职责 | 注意力范围 | 参与 loss |
|
||
|------|------|------|-----------|----------|
|
||
| 上下文副本 | ri_in | 为后续轮次提供历史 | A(H_{<i}, hi) — 不看 ti | ❌ |
|
||
| 生成副本 | ri_out | 实际生成+L-loss 计算 | A(H_{<i}, hi, ti) — 看 ti | ✅ |
|
||
|
||
内容上:ri_in = ri_out = ri(完全相同),差异仅在注意力行为和 loss 参与上。
|
||
|
||
## 位置 ID 分配
|
||
|
||
```
|
||
s_ti = s_ri_in = e_hi + 1 # 推理和 ri_in 都从当前人类消息后开始
|
||
s_ri_out = e_ti + 1 # ri_out 从推理 token 后开始
|
||
s_h_{i+1} = e_ri_in + 1 # 下一轮从 ri_in 后开始(模拟 N-Pass 的上下文结构)
|
||
```
|
||
|
||
## 内存代价
|
||
|
||
复制使输入长度从 (|hi|+|ti|+|ri|) ≈ 3Nℓ 增加到 ≈ 4Nℓ,带来约 33% 的额外 GPU 内存。
|
||
|
||
## 相关
|
||
|
||
- [[one-pass-fine-tuning]]
|
||
- [[block-sparse-attention]]
|
||
- [[visibility-constraint]]
|
||
- [[goru-one-pass-to-reason-2025|One-Pass to Reason 论文]]
|