TIGER 训练¶
本指南详细介绍如何训练 TIGER 模型。
前置条件¶
1. 预训练的 RQVAE 模型¶
TIGER 需要预训练的 RQVAE 模型来生成语义 ID:
如果没有,请先完成 RQVAE 训练。
2. 数据准备¶
确保使用与 RQVAE 相同的数据集:
训练配置¶
默认配置¶
查看 TIGER 配置文件:
关键参数:
# 训练参数
train.epochs=5000 # 训练轮数
train.learning_rate=3e-4 # 学习率
train.batch_size=256 # 批量大小
train.weight_decay=0.035 # 权重衰减
# 模型参数
train.embedding_dim=128 # 嵌入维度
train.attn_dim=512 # 注意力维度
train.dropout=0.3 # Dropout率
train.num_heads=8 # 注意力头数
train.n_layers=8 # Transformer层数
# 序列参数
train.max_seq_len=512 # 最大序列长度
train.num_item_embeddings=256 # 物品嵌入数量
train.num_user_embeddings=2000 # 用户嵌入数量
train.sem_id_dim=3 # 语义ID维度
# 预训练模型路径
train.pretrained_rqvae_path="./out/rqvae/p5_amazon/beauty/checkpoint_299999.pt"
开始训练¶
基本训练命令¶
分布式训练¶
使用多GPU训练:
训练过程¶
训练过程中会看到:
- 数据加载: 序列数据集加载和语义ID生成
- 模型初始化: Transformer模型初始化
- 训练循环: 损失下降和指标监控
- 验证评估: 周期性性能评估
自定义配置¶
创建自定义配置¶
# my_tiger_config.gin
import genrec.data.p5_amazon
# 调整模型规模
train.embedding_dim=256
train.attn_dim=1024
train.n_layers=12
train.num_heads=16
# 调整训练参数
train.learning_rate=1e-4
train.batch_size=128
train.epochs=10000
# 自定义路径
train.dataset_folder="my_dataset"
train.pretrained_rqvae_path="my_rqvae/checkpoint.pt"
train.save_dir_root="my_tiger_output/"
# 实验跟踪
train.wandb_logging=True
train.wandb_project="my_tiger_experiment"
模型架构解析¶
Transformer 结构¶
TIGER 使用编码器-解码器架构:
class Tiger(nn.Module):
def __init__(self, config):
# 用户和物品嵌入
self.user_embedding = UserIdEmbedding(...)
self.item_embedding = SemIdEmbedding(...)
# Transformer 编码器-解码器
self.transformer = TransformerEncoderDecoder(...)
# 输出投影
self.output_projection = nn.Linear(...)
语义ID映射¶
TIGER 将物品转换为语义ID序列:
# 物品 -> 语义ID序列
item_id = 123
semantic_ids = rqvae.get_semantic_ids(item_features[item_id])
# semantic_ids: [45, 67, 89] # 长度为 sem_id_dim
训练监控¶
关键指标¶
- 训练损失: 序列建模损失
- 验证损失: 验证集性能
- Recall@K: Top-K 召回率
- NDCG@K: 归一化折扣累积增益
Weights & Biases 集成¶
启用实验跟踪:
查看训练曲线: - 访问 wandb.ai - 找到你的项目和实验
模型评估¶
推荐质量评估¶
from genrec.models.tiger import Tiger
from genrec.modules.metrics import TopKAccumulator
# 加载模型
model = Tiger.load_from_checkpoint("out/tiger/checkpoint.pt")
# 创建评估器
evaluator = TopKAccumulator(k=[5, 10, 20])
# 在测试集上评估
test_dataloader = DataLoader(test_dataset, batch_size=256)
metrics = evaluator.evaluate(model, test_dataloader)
print(f"Recall@10: {metrics['recall@10']:.4f}")
print(f"NDCG@10: {metrics['ndcg@10']:.4f}")
生成式推荐¶
def generate_recommendations(model, user_sequence, top_k=10):
"""为用户生成推荐"""
model.eval()
with torch.no_grad():
# 编码用户序列
sequence_embedding = model.encode_sequence(user_sequence)
# 生成推荐
logits = model.generate(sequence_embedding, max_length=top_k)
# 获取Top-K物品
recommendations = torch.topk(logits, top_k).indices
return recommendations.tolist()
# 使用示例
user_history = [item1_semantic_ids, item2_semantic_ids, ...]
recommendations = generate_recommendations(model, user_history, top_k=10)
高级功能¶
Trie约束生成¶
TIGER 支持基于Trie的约束生成:
from genrec.models.tiger import build_trie
# 构建有效物品ID的Trie
valid_items = torch.tensor([[1, 2, 3], [4, 5, 6], ...]) # 语义ID序列
trie = build_trie(valid_items)
# 约束生成
constrained_output = model.generate_with_trie(
user_sequence,
trie=trie,
max_length=10
)
序列增强¶
训练时支持序列增强:
故障排除¶
常见问题¶
Q: RQVAE检查点找不到?
A: 检查路径是否正确:
# 确认文件存在
ls -la out/rqvae/p5_amazon/beauty/checkpoint_299999.pt
# 更新配置文件中的路径
train.pretrained_rqvae_path="实际的检查点路径"
Q: 训练速度慢?
A: 优化建议:
- 增加批量大小:train.batch_size=512
- 减少序列长度:train.max_seq_len=256
- 使用多GPU训练
Q: 推荐效果差?
A: 调优建议:
- 增加模型规模:train.n_layers=12
- 调整学习率:train.learning_rate=1e-4
- 增加训练轮数:train.epochs=10000
调试技巧¶
-
检查语义ID生成:
-
监控注意力权重:
性能优化¶
内存优化¶
# 减少内存使用
train.gradient_accumulate_every=4 # 梯度累积
train.batch_size=64 # 较小批量
train.max_seq_len=256 # 较短序列
混合精度训练¶
实验建议¶
超参数网格搜索¶
# 建议的超参数范围
learning_rates = [1e-4, 3e-4, 1e-3]
batch_sizes = [128, 256, 512]
model_dims = [128, 256, 512]
n_layers = [6, 8, 12]
for lr in learning_rates:
for bs in batch_sizes:
# 创建配置并训练
config = create_config(lr=lr, batch_size=bs)
train_model(config)
A/B测试¶
比较不同架构:
# 实验A: 标准TIGER
train.n_layers=8
train.num_heads=8
# 实验B: 更深的模型
train.n_layers=12
train.num_heads=16
# 实验C: 更宽的模型
train.embedding_dim=256
train.attn_dim=1024
下一步¶
训练完成后: