[ PROMPT_NODE_22346 ]
fine_tuning
[ SKILL_DOCUMENTATION ]
# 上下文扩展的微调
针对更长上下文窗口微调 Transformer 模型的完整指南。
## 目录
- 数据准备
- 训练配置
- YaRN 微调
- 位置插值微调
- 评估
- 生产部署
## 数据准备
### 长文档数据集
**上下文扩展的最佳数据集**:
python
# 1. PG-19 (书籍)
from datasets import load_dataset
pg19 = load_dataset("pg19", split="train")
# 平均长度: 50k-150k token
# 质量: 高 (文学作品)
# 2. arXiv 论文
arxiv = load_dataset("scientific_papers", "arxiv", split="train")
# 平均长度: 4k-15k token
# 质量: 高 (技术内容)
# 3. 长篇 GitHub 代码
github = load_dataset("codeparrot/github-code", split="train")
# 过滤大文件 (>5k token)
# 4. 长对话
conversations = load_dataset("HuggingFaceH4/ultrachat_200k", split="train")
# 连接多轮对话
# 5. 维基百科文章 (连接)
wikipedia = load_dataset("wikipedia", "20220301.en", split="train")
### 创建训练序列
python
def create_long_sequences(dataset, target_length=32768, tokenizer=None):
"""创建目标长度的训练序列。"""
sequences = []
for example in dataset:
# 分词
tokens = tokenizer.encode(example['text'])
# 如果单个文档足够长
if len(tokens) >= target_length:
# 切分为块
for i in range(0, len(tokens) - target_length, target_length // 2):
sequences.append(tokens[i:i + target_length])
else:
# 连接多个文档
buffer = tokens
while len(buffer) < target_length:
next_example = next(dataset)
buffer.extend(tokenizer.encode(next_example['text']))
sequences.append(buffer[:target_length])
return sequences
### 数据质量检查
python
def validate_training_data(sequences, tokenizer, min_length=8192):
"""确保上下文扩展的数据质量。"""
issues = []
for i, seq in enumerate(sequences):
# 1. 检查长度
if len(seq) < min_length:
issues.append(f"序列 {i}: 太短 ({len(seq)} token)")
# 2. 检查重复 (复制粘贴错误)
if has_excessive_repetition(seq):
issues.append(f"序列 {i}: 过度重复")
# 3. 检查截断伪影