# Diffutslator 实现计划 基于扩散模型的中英互译系统 ## 一、架构概述 ``` ┌─────────────────────────────────────────────────────────────────┐ │ 噪声空间 (共享) │ │ [L×D] │ │ ┌─────────────────────────┐ │ │ │ │ │ │ 中文扩散 ↗ 语言切换判断器 ↖ 英文扩散 │ │ (加噪) [分类器] (加噪) │ │ │ │ │ │ └─────────────────────────┘ │ │ ↓ ↓ │ │ 中文逆扩散 英文逆扩散 │ │ (去噪) (去噪) │ │ ↓ ↓ │ │ ┌────────────┐ ┌────────────┐ │ │ │ 中文解码器 │ │ 英文解码器 │ │ │ └────────────┘ └────────────┘ │ │ ↓ ↓ │ │ 中文输出 英文输出 │ └─────────────────────────────────────────────────────────────────┘ ``` ### 核心设计决策 | 问题 | 决策 | 理由 | |------|------|------| | 扩散空间 | 词嵌入连续空间 | 实现成熟、CPU友好、训练稳定 | | 长度处理 | 变长序列 + 长度嵌入 | 扩散可变长,逆扩散收敛到目标长度 | | 双向切换 | 可学习分类器 | 让模型自己判断何时切换 | ## 二、模块设计 ### 2.1 分词器 (tokenizer.py) **中文分词**:字符级 + BPE - 字符级处理中文字符 - BPE处理罕见词和数字 **英文分词**:BPE - 使用相同的BPE算法 - 与中文共享词表大小设置 **词表**: - 中文词表:8000 tokens - 英文词表:8000 tokens - 特殊token:``, ``, ``, ``, `` ### 2.2 嵌入层 (embedding.py) ```python class LanguageEmbedding: """语言特定的嵌入层""" - token_embedding: [vocab_size, d_model] - position_embedding: [max_len, d_model] - length_embedding: [max_len, d_model] # 长度编码 ``` **参数**: - `d_model = 256`(CPU环境下适中) - `max_len = 128`(最大序列长度) ### 2.3 扩散核心 (diffusion.py) **前向扩散(加噪)**: ```python def forward_diffusion(x_0, t): """ x_0: 初始嵌入 [batch, len, d_model] t: 时间步 [batch] 返回: x_t, noise """ # 线性噪声调度 alpha_t = 1 - t / T # 简化调度 noise = randn_like(x_0) x_t = sqrt(alpha_t) * x_0 + sqrt(1 - alpha_t) * noise return x_t, noise ``` **反向扩散(去噪)**: ```python def reverse_diffusion(x_t, t, model): """ x_t: 当前噪声状态 t: 当前时间步 model: 噪声预测网络 """ predicted_noise = model(x_t, t) x_t_minus_1 = denoise_step(x_t, predicted_noise, t) return x_t_minus_1 ``` **时间调度**: - 训练时:T = 1000 步 - 推理时:DDIM加速,可降到 10-50 步 ### 2.4 噪声预测网络 (model.py) ```python class DiffusionTransformer: """预测噪声的Transformer""" - 输入: x_t [batch, len, d_model], t [batch] - 输出: predicted_noise [batch, len, d_model] 结构: - 语言特定的输入投影 - 时间步嵌入 (sinusoidal) - N层 Transformer blocks - 语言特定的输出投影 ``` **参数**(CPU优化): - `n_layers = 4` - `n_heads = 4` - `d_ff = 512` - 总参数量:约 2M ### 2.5 语言切换器 (switcher.py) ```python class LanguageSwitcher: """判断当前噪声更接近哪种语言""" - 输入: x_t [batch, len, d_model] - 输出: 语言概率 [batch, 2] # [中文, 英文] 结构: - 全局平均池化 - 2层MLP - Softmax输出 ``` ### 2.6 训练流程 (train.py) ``` 训练步骤: 1. 加载中英平行句对 (zh, en) 2. 分别嵌入到连续空间 3. 随机采样时间步 t 4. 对中文嵌入做前向扩散到 t 步 → zh_t 5. 对英文嵌入做前向扩散到 t 步 → en_t 6. 训练噪声预测网络预测噪声 7. 训练切换器判断语言 8. 反向传播更新参数 ``` **损失函数**: ```python L_total = L_noise_zh + L_noise_en + λ * L_switcher L_noise: 噪声预测MSE损失 L_switcher: 语言分类交叉熵损失 ``` ### 2.7 推理流程 (inference.py) **中文→英文翻译**: ``` 1. 中文输入 → 中文嵌入 2. 完整前向扩散到纯噪声 (T步) 3. 迭代反向扩散: for t in [T, T-1, ..., 1]: - 切换器判断当前语言 - 若判断为中文→用中文去噪 - 若判断为英文→切换到英文去噪 - 输出当前步骤状态(可视化) 4. 最终噪声状态 → 英文解码 → 英文输出 ``` **英文→中文翻译**:对称过程 ## 三、文件结构 ``` diffutslator/ ├── TASK.md # 任务描述 ├── PLAN.md # 本文件 ├── config.py # 超参数配置 ├── tokenizer.py # 分词器 ├── embedding.py # 嵌入层 ├── model.py # 扩散模型 ├── diffusion.py # 扩散过程 ├── switcher.py # 语言切换器 ├── dataset.py # 数据集加载 ├── train.py # 训练脚本 ├── inference.py # 推理脚本 ├── main.py # 主入口 ├── utils.py # 工具函数 └── checkpoints/ # 模型检查点 ``` ## 四、实现步骤 ### Phase 1: 基础框架(确保可训练) 1. **配置文件** - 定义所有超参数 2. **分词器** - 实现中英文分词 3. **数据集** - 加载tatoeba数据 4. **嵌入层** - 简单的token嵌入 5. **扩散核心** - 前向和反向扩散 6. **简单模型** - 基础噪声预测网络 7. **训练脚本** - 带进度条的训练循环 **验证目标**:能在少量数据上跑通训练,loss下降 ### Phase 2: 完整架构 1. **语言切换器** - 实现切换判断 2. **变长处理** - 实现长度嵌入 3. **完整模型** - 整合所有模块 4. **推理脚本** - 可视化扩散过程 **验证目标**:完整训练流程,能输出翻译结果 ### Phase 3: 优化加速 1. **DDIM采样** - 减少推理步数 2. **训练加速** - 混合精度、梯度累积 3. **模型调优** - 调整超参数 **验证目标**:提升训练和推理速度,改善翻译质量 ## 五、训练策略 ### 快速验证模式 ```bash # 使用tatoeba前1000条数据 # batch_size=8, epochs=10 python train.py --quick --samples 1000 ``` ### 完整训练模式 ```bash # 使用全部数据 # 支持暂停/继续 python train.py --full # Ctrl+C 暂停,自动保存检查点 # python train.py --resume 继续训练 ``` ### 训练输出 ``` Epoch 1/10: 100%|████████| 125/125 [02:30<00:00, loss=0.452] 预计剩余: 22:30 | 速度: 0.5 it/s 最新检查点: checkpoints/model_epoch1.pt 按 Ctrl+C 停止训练(自动保存) ``` ## 六、推理展示 ``` $ python inference.py --zh "你好世界" 翻译模式: 中文 → 英文 输入: 你好世界 扩散过程: Step 1000: [噪声状态 - 切换器: 中文 95%] Step 900: [噪声状态 - 切换器: 中文 78%] Step 800: [噪声状态 - 切换器: 中文 52%] Step 700: [噪声状态 - 切换器: 英文 61%] ← 语言切换! Step 600: [噪声状态 - 切换器: 英文 89%] ... Step 50: [接近完整句子 - 切换器: 英文 99%] Step 1: [完整句子] 输出: Hello world ``` ## 七、环境适配 针对CPU环境的优化: 1. **小模型**:参数量控制在2-5M 2. **小批量**:batch_size = 4-16 3. **梯度累积**:模拟更大batch 4. **简单架构**:减少层数和维度 5. **内存优化**:及时释放中间变量 ## 八、预期效果 | 指标 | 目标 | |------|------| | 训练速度 | 1-2 it/s (CPU) | | 推理速度 | 1-5秒/句 (DDIM 50步) | | 翻译质量 | 简单句子可理解 | | 模型大小 | < 50MB | --- *计划制定完成,待用户确认后开始实现*