| # Diffutslator 实现计划 |
|
|
| 基于扩散模型的中英互译系统 |
|
|
| ## 一、架构概述 |
|
|
| ``` |
| ┌─────────────────────────────────────────────────────────────────┐ |
| │ 噪声空间 (共享) │ |
| │ [L×D] │ |
| │ ┌─────────────────────────┐ │ |
| │ │ │ │ |
| │ 中文扩散 ↗ 语言切换判断器 ↖ 英文扩散 │ |
| │ (加噪) [分类器] (加噪) │ |
| │ │ │ │ |
| │ └─────────────────────────┘ │ |
| │ ↓ ↓ │ |
| │ 中文逆扩散 英文逆扩散 │ |
| │ (去噪) (去噪) │ |
| │ ↓ ↓ │ |
| │ ┌────────────┐ ┌────────────┐ │ |
| │ │ 中文解码器 │ │ 英文解码器 │ │ |
| │ └────────────┘ └────────────┘ │ |
| │ ↓ ↓ │ |
| │ 中文输出 英文输出 │ |
| └─────────────────────────────────────────────────────────────────┘ |
| ``` |
|
|
| ### 核心设计决策 |
|
|
| | 问题 | 决策 | 理由 | |
| |------|------|------| |
| | 扩散空间 | 词嵌入连续空间 | 实现成熟、CPU友好、训练稳定 | |
| | 长度处理 | 变长序列 + 长度嵌入 | 扩散可变长,逆扩散收敛到目标长度 | |
| | 双向切换 | 可学习分类器 | 让模型自己判断何时切换 | |
|
|
| ## 二、模块设计 |
|
|
| ### 2.1 分词器 (tokenizer.py) |
|
|
| **中文分词**:字符级 + BPE |
| - 字符级处理中文字符 |
| - BPE处理罕见词和数字 |
|
|
| **英文分词**:BPE |
| - 使用相同的BPE算法 |
| - 与中文共享词表大小设置 |
|
|
| **词表**: |
| - 中文词表:8000 tokens |
| - 英文词表:8000 tokens |
| - 特殊token:`<pad>`, `<sos>`, `<eos>`, `<mask>`, `<unk>` |
|
|
| ### 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 | |
| |
| --- |
| |
| *计划制定完成,待用户确认后开始实现* |
| |